I'm so tired of RPackage... :(
I can imagine. This notification stuff is so brittle. This is why I like doru's idea to have a one to one mapping and we are getting there. We should kill this dependency on announcement. I can try to help but again RPackage is working this is just the system around and this is why I would like to avoid to have new requirements for RPackage. Stef
In fact what is intriguing is that
RPackageOrganizer default packageNamed: 'Refactoring-Core'
in the image used to generate the configuration
classExtensionSelectors is correct defined a Dictionary(#ClassTrait->a Set(#soleInstance) #TClassDescription->a Set(#whichSelectorsReallyRead:) )
So either the package is wrongly saved but this is not the case. Or while reloading it the logic is wrong. May be it should not raise systemMethodRecategorizedActionFrom: because it may be not be a recatogiration (or may be it was a override).
Stef
On Oct 2, 2013, at 9:28 PM, Stéphane Ducasse <Stephane.Ducasse@inria.fr> wrote:
esteban
tomorrow I can show you the bug I found.
during the test of the correct reloading of RB
(ConfigurationOfRefactoring project version: #stable) load
in my noNautilus and no RB I got
systemMethodRecategorizedActionFrom: ann "a protocol has been renamed a method has been removed. // WILL BE TREATED WITH SystemMethodRemovedAnnouncement a method has been moved to another category -maybe from the classic category to an extending package -maybe from an extending package to another extending package -maybe from an extending package to a classic category - maybe from a classic category to another classic category"
| oldProtocol newProtocol method methodPackage destinationPackage |
oldProtocol := ann oldProtocol. "old protocol might be nil:" oldProtocol asString ifNil: [oldProtocol := '']. newProtocol := ann newProtocol. method := ann methodRecategorized.
"1). See compiledMethod >> packageFromOrganizer:"
"we have to pay attention that this announcement can come from TraitDescription>>updateOrganizationSelector:oldCategory:newCategory: . In this context, it can happen that the method referenced by the event is nil. In this case I think we should change nothing"
method isNil ifFalse: [ "If the method origin is not the one of the event, we do not care about that method" method origin = ann methodClass ifFalse: [^ self].
methodPackage := method packageFromOrganizer: self. "if newProtocol is nil, it means that we are in a 'methodRemoved' case. Nothing should be modified (all the work will be done when catching methodRemovedAnnouncement) " newProtocol isNil ifTrue: [^self]. "it can happen that oldProtocol is Nil. in this case we should do nothing" oldProtocol ifNil: [^ self]. "maybe the category has changed" newProtocol asLowercase = oldProtocol asLowercase ifFalse: [ "according the extension specified is valid or not, the method will be defined as an extension of an external package or in the class parent package" destinationPackage := (self hasPackageForProtocol: newProtocol inClass: method methodClass) ifTrue: [ self packageForProtocol: newProtocol inClass: method methodClass ] ifFalse: [ (newProtocol beginsWith: '*') ifTrue: [ self ensureExistAndRegisterPackageNamed: newProtocol allButFirst capitalized ] ifFalse: [ method methodClass package ] ]. methodPackage := (self hasPackageForProtocol: oldProtocol inClass: method methodClass) ifTrue: [ self packageForProtocol: oldProtocol inClass: method methodClass ] ifFalse: [ method methodClass package ].
"then, we will remove the method from the method package, and add it to the destination package (we check before that the source package and the destination package are different)." methodPackage = destinationPackage ifFalse: [ (methodPackage methods includes: method) ifTrue: [ methodPackage removeMethod: method ]. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ where method was ClassTrait>>#soleInstance and apparently it does not exit raising an error
classDefinitionSelectors in RPackage is a Set(#instanceVariableNames: #classTrait #copy #adoptInstance:from: #compile:classified:withStamp:notifying:logSource: #baseTrait #name #baseTrait: #isClassTrait #definition #classTrait: #initializeWithBaseTrait: #new #isBaseTrait)
classExtensionSelectors is Set new and after investigation: soleInstance on ClassTrait is defined as an extension on *refactoring-core =>
destinationPackage addMethod: method.
SystemAnnouncer uniqueInstance methodRepackaged: method from: methodPackage to: destinationPackage. ] ] ]