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 <[email protected]> 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.
> ]
> ]
> ]