Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bug in Epicea management #13857

Merged
merged 1 commit into from
May 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/Calypso-SystemQueries/MethodRecategorized.extension.st
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ MethodRecategorized >> shouldBeConsideredByCalypsoEnvironment [
This issue means that repackaging is not performed correctly. But repackaging will be announced with separate event MethodRepackaged. So it is safe to skip recategorization.
In future this refactoring should be fixed. All objects should be in valid state when any event is triggered"

^ (oldProtocol isExtensionProtocol and: [ self newProtocol isUnclassifiedProtocol ]) not
"The nil check happens when we remove the method."
^ (oldProtocol isExtensionProtocol and: [ self newProtocol isNotNil and: [ self newProtocol isUnclassifiedProtocol ] ]) not
]
4 changes: 2 additions & 2 deletions src/Epicea/EpMonitor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -514,8 +514,8 @@ EpMonitor >> methodRemoved: aMethodRemovedAnnouncement [
self addEvent: (EpMethodRemoval method: (aMethodRemovedAnnouncement methodAffected asEpiceaRingDefinition
protocol: aMethodRemovedAnnouncement protocol name;
package:
(Smalltalk organization packageForProtocol: aMethodRemovedAnnouncement protocol name inClass: aMethodRemovedAnnouncement methodAffected methodClass)
name;
((Smalltalk organization packageForProtocol: aMethodRemovedAnnouncement protocol name inClass: aMethodRemovedAnnouncement methodAffected methodClass)
ifNil: [ aMethodRemovedAnnouncement methodAffected methodClass package ]) name;
yourself)) ]
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,76 +214,76 @@ RPackageExtensionMethodsSynchronisationTest >> testMoveClassInPackageWithExtensi
RPackageExtensionMethodsSynchronisationTest >> testRemoveAllExtensionMethodsFromMetaAndInstanceSideUpdateOrganizerExtensionsMapping [
"test that In a class (from the meta and the instance side ), when we remove all the method extended by the same external package, the class get unregistered from the classExtendingPackagesMapping of the organizer "

|XPackage class YPackage|
| xPackage class yPackage |
self addXYCategory.
XPackage := self organizer packageNamed: #XXXXX.
YPackage := self organizer packageNamed: #YYYYY.
xPackage := self organizer packageNamed: #XXXXX.
yPackage := self organizer packageNamed: #YYYYY.

class := self createNewClassNamed: 'NewClass' inCategory: 'XXXXX'.
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod2' inClass: class classSide inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod2' inClass: class classSide inCategory: '*yyyyy'.

class removeSelector: #stubMethod.
class classSide removeSelector: #stubMethod2.
"there should be no differences made between class and metaClass:"
self deny: ((self organizer extendingPackagesOf: class) includes: YPackage).
self deny: ((self organizer extendingPackagesOf: class classSide) includes: YPackage).
self deny: ((self organizer extendingPackagesOf: class) includes: yPackage).
self deny: ((self organizer extendingPackagesOf: class classSide) includes: yPackage)
]

{ #category : #'tests - operations on methods' }
RPackageExtensionMethodsSynchronisationTest >> testRemoveAllExtensionMethodsRemoveTheClassFromExtendedClasses [
"test that In a class, when we remove all the method extended by the same external package, the class get unregistered from the extended classes of the external package "

|XPackage class YPackage|
| xPackage class yPackage |
self addXYCategory.
XPackage := self organizer packageNamed: #XXXXX.
YPackage := self organizer packageNamed: #YYYYY.
xPackage := self organizer packageNamed: #XXXXX.
yPackage := self organizer packageNamed: #YYYYY.
class := self createNewClassNamed: 'NewClass' inCategory: 'XXXXX'.
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod2' inClass: class inCategory: '*yyyyy'.
self assert: (YPackage includesExtensionSelector: #stubMethod ofClass: class).
self assert: (YPackage includesExtensionSelector: #stubMethod2 ofClass: class).
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod2' inClass: class inCategory: '*yyyyy'.

self assert: (yPackage includesExtensionSelector: #stubMethod ofClass: class).
self assert: (yPackage includesExtensionSelector: #stubMethod2 ofClass: class).

class removeSelector: #stubMethod.
class removeSelector: #stubMethod2.
self deny: (YPackage extendsClass: class).
self deny: (YPackage extendsClass: class classSide).
self deny: (yPackage extendsClass: class).
self deny: (yPackage extendsClass: class classSide)
]

{ #category : #'tests - operations on methods' }
RPackageExtensionMethodsSynchronisationTest >> testRemoveExtensionMethodDoesNotRemoveExtendingPackage [
"test that when we remove a method that is an extension from an external package, the package is not removed from the the class extending packages if another extension still exist"

|XPackage class YPackage|
| xPackage class yPackage |
self addXYCategory.
XPackage := self organizer packageNamed: #XXXXX.
YPackage := self organizer packageNamed: #YYYYY.
xPackage := self organizer packageNamed: #XXXXX.
yPackage := self organizer packageNamed: #YYYYY.
class := self createNewClassNamed: 'NewClass' inCategory: 'XXXXX'.
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod2' inClass: class inCategory: '*yyyyy'.
self assert: (YPackage includesExtensionSelector: #stubMethod ofClass: class).
self assert: (YPackage includesExtensionSelector: #stubMethod2 ofClass: class).
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod2' inClass: class inCategory: '*yyyyy'.

self assert: (yPackage includesExtensionSelector: #stubMethod ofClass: class).
self assert: (yPackage includesExtensionSelector: #stubMethod2 ofClass: class).

"If we only remove one of the extension methods, the package should still be extending the class."
class removeSelector: #stubMethod.
self assert: (YPackage extendsClass: class).
self assert: (YPackage extendsClass: class classSide).
self assert: (yPackage extendsClass: class).
self assert: (yPackage extendsClass: class classSide)
]

{ #category : #'tests - operations on methods' }
RPackageExtensionMethodsSynchronisationTest >> testRemoveExtensionMethodRemoveMethodFromItsPackage [
"test that when we remove a method that is an extension from an external package, the method is removed from this package"

|XPackage class YPackage|
| xPackage class yPackage |
self addXYCategory.
XPackage := self organizer packageNamed: #XXXXX.
YPackage := self organizer packageNamed: #YYYYY.
xPackage := self organizer packageNamed: #XXXXX.
yPackage := self organizer packageNamed: #YYYYY.

class := self createNewClassNamed: 'NewClass' inCategory: 'XXXXX'.
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.
self createMethodNamed: 'stubMethod' inClass: class inCategory: '*yyyyy'.

class removeSelector: #stubMethod.
self deny: (YPackage includesExtensionSelector: #stubMethod ofClass: class).
self deny: (yPackage includesExtensionSelector: #stubMethod ofClass: class)
]