I'm so tired of RPackage... :(

On Oct 2, 2013, at 9:36 PM, Stéphane Ducasse <[email protected]> wrote:

> 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.
>>                                              ]
>>                              ]
>>              ]
> 
> 


Reply via email to