Hi guys
I found a problem with method renaming. The scenario is the following one:
� � � � - you have a message browser open with a list a methods (resulting from a sender/implementor).
� � � � - you rename a method and you get an error
why because the message browser does not replace the currently changed method.
and �the RGMethodDefinition that represented the renamed method defines the code like that
MessageBrowser>>wrapItem: anItem
� � � � | s |
� � � � s :=String streamContents: [ :aStream |
� � � � � � � � 3 to: (cachedHierarchy at: anItem) size do: [:i | aStream << ' � �'].
� � � � � � � � aStream
� � � � � � � � � � � � << anItem methodClass name << ' ('.
� � � � � � � � anItem isFromTrait
� � � � � � � � � � � � ifTrue: [ aStream << anItem compiledMethod origin name; space ].
� � � � � � � � aStream << (anItem category ifNil: ['']) <<')'].
� � � � � � � � � � � � � � � � ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
� � � � ^ {s. anItem selector}.
RGMethodDefinition>>compiledMethod
� � � � "Retrieves the compiled method of this definition if exists"
� � � � | rClass |
� � � � (rClass := self realClass) notNil
� � � � � � � � ifTrue: [ (rClass includesSelector: self selector)
� � � � � � � � � � � � ifTrue: [ ^rClass >> self selector ] ].
� � � � ^nil
category
� � � � ^ self protocol
protocol
� � � � self isActive
� � � � � � � � ifTrue: [ ^ self compiledMethod �category ]].
� � � � self isHistorical
� � � � � � � � ifTrue: [ ^ self protocolAtPointer ifNil:[ self compiledMethod ifNil:[ protocol ] ifNotNil:[ :cm| cm category ] ] ].
� � � � ^ protocol
So I patched the protocol method as follows
protocol
� � � � self isActive
� � � � � � � � ifTrue: [ ^ self compiledMethod ifNil: [ ' '] ifNotNilDo: [ :cm | cm �category ]].
� � � � � � � � "I hate this ifNil test, the problem is that when we rename a method, a method definition in a list may still refers to
� � � � � � � � the old selector and the definition of compiled method is that case is not finding the associated method because it holds the
� � � � � � � � old selector and not the one corresponding to the one defined in the class."
� � � � self isHistorical
� � � � � � � � ifTrue: [ ^ self protocolAtPointer ifNil:[ self compiledMethod ifNil:[ protocol ] ifNotNil:[ :cm| cm category ] ] ].
� � � � ^ protocol
I imagine that the best solution would be that the tools update their contents but I wanted to know your point of view.
Stef