Skip to content

Commit

Permalink
Must also write out MCTraitDefinition if MCClassTraitDefinition is ch…
Browse files Browse the repository at this point in the history
…anged

Actually if it is changed, there will be one removal for the old
MCClassTraitDefinition and an addition for the new MCClassTraitDefinition.
In any case, the MCTraitDefinition must be written so that the
properties.json file in the trait directory gets updated.

Moreover there is a bug in Squeak's Monticello: when you write the
trait definition but not the corresponding class trait definition, the
"classTrait" gets trimmed away in the properties.json. The cause is
that MCTraitDefinition overrides #classTraitCompositionString incorrectly.
See MCFileTreeStCypressWriter>>#writeTraitDefinition:
  • Loading branch information
j4yk committed Aug 7, 2022
1 parent 479b8b1 commit 20ecbad
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/Squot.package/.squot-contents
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
SquotTrackedObjectMetadata {
#objectClassName : #PackageInfo,
#id : UUID [ '7e0624d4d6eca84f879c365f65ae74be' ],
#objectsReplacedByNames : true,
#slotOverrides : { },
#objectsReplacedByNames : true,
#serializer : #SquotCypressCodeSerializer
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ private
delete: aMCDefinition
aMCDefinition isMethodDefinition ifTrue: [^ self deleteMethod: aMCDefinition].
aMCDefinition isClassDefinition ifTrue: [^ self deleteClassifier: aMCDefinition].
"isClassDefinition is also true for MCTraitDefinition"
aMCDefinition isScriptDefinition ifTrue: [^ self deleteScript: aMCDefinition].
(aMCDefinition isKindOf: MCClassTraitDefinition) ifTrue: [^ self "nothing to delete, but the base trait definition must be written out"].
self halt.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Squot serialization
writeDiff: aSquotArtifactDiff
| directory mcPatch newDefinitions classDefinitions missingClasses removedMethods removedClasses removedOthers allMethods allClasses extensions |
| directory mcPatch newDefinitions classifierDefinitions missingClassifiers removedMethods removedClassifiers removedClassTraits removedOthers allMethods allClassifiers extensions classTraits missingClassTraits |
aSquotArtifactDiff isAddition ifTrue: [^ self write: aSquotArtifactDiff right].
aSquotArtifactDiff isRemoval ifTrue: [^ self notYetImplemented].
self assert: aSquotArtifactDiff isModification.
Expand All @@ -10,55 +10,77 @@ writeDiff: aSquotArtifactDiff
ifFalse: [rootDirectory resolve: aSquotArtifactDiff path].
self initializeFileTreeWritersInPackageDirectory: directory.
removedMethods := Dictionary new.
removedClasses := Dictionary new.
removedClassifiers := Dictionary new.
removedClassTraits := Dictionary new.
removedOthers := Dictionary new.
classTraits := Dictionary new.
mcPatch := aSquotArtifactDiff content startDiff patch.
newDefinitions := OrderedCollection new: mcPatch operations size.
mcPatch operations do:
[:each |
each isRemoval
ifTrue: [ each definition isMethodDefinition ifTrue: [removedMethods at: each definition description put: each definition].
each definition isClassDefinition ifTrue: [removedClasses at: each definition description put: each definition].
(each definition isMethodDefinition not and: [each definition isClassDefinition not])
each definition isClassDefinition ifTrue: [removedClassifiers at: each definition description put: each definition].
(each definition isTraitDefinition and: [each definition isClassDefinition not]) ifTrue: [removedClassTraits at: each baseTrait put: each definition].
(each definition isMethodDefinition not and: [each definition isClassDefinition not and: [each definition isTraitDefinition not]])
ifTrue: [removedOthers at: each definition description put: each definition]].
each isAddition ifTrue: [newDefinitions add: each definition].
each isModification ifTrue: [newDefinitions add: each modification]].
"Add missing class definitions or the cypress writer will treat methods as extensions."
classDefinitions := (newDefinitions select: [:each | each isClassDefinition]) collect: [:each | each className -> each] as: Dictionary.
allClasses := classDefinitions copy.
"If class traits are modified, there is both an addition and a removal for them, instead of a modification."
(newDefinitions select: [:each | each isTraitDefinition and: [each isClassDefinition not]])
do: [:each |
classTraits at: each baseTrait put: each.
removedClassTraits removeKey: each baseTrait ifAbsent: []].
"Add missing class definitions or the cypress writer will treat methods as extensions. Also, to remove or change class traits definitions, the base trait must be written out."
classifierDefinitions := (newDefinitions select: [:each | each isClassDefinition "also covers baseTraits, but not classTraits (no problem)"]) collect: [:each | each className -> each] as: Dictionary.
allClassifiers := classifierDefinitions copy.
aSquotArtifactDiff content startDiff working definitions do:
[:each | (each isClassDefinition and: [(removedClasses includesKey: each description) not]) ifTrue: [allClasses at: each className ifAbsentPut: [each]]].
missingClasses := ((((newDefinitions select: [:each | each isMethodDefinition and: [(classDefinitions includesKey: each className) not]]),
(removedMethods values select: [:each | (classDefinitions includesKey: each className) not]))
[:each | (each isClassDefinition and: [(removedClassifiers includesKey: each description) not])
ifTrue: [allClassifiers at: each className ifAbsentPut: [each]].
(each isTraitDefinition and: [each isClassDefinition not])
ifTrue: [classTraits at: each baseTrait ifAbsentPut: [each]]].
missingClassifiers := ((((newDefinitions select: [:each | (each isMethodDefinition and: [(classifierDefinitions includesKey: each className) not]) or: [each summary endsWith: ' classTrait']]),
(removedMethods values select: [:each | (classifierDefinitions includesKey: each className) not]),
(removedClassTraits values select: [:each | (each summary endsWith: ' classTrait') and: [(classifierDefinitions includesKey: each className) not]]))
collect: [:each | each className] as: Set) asArray
collect: [:each | allClasses at: each ifAbsent: []])
collect: [:each | allClassifiers at: each ifAbsent: []])
reject: [:each | each isNil].
cypressWriter writeDefinitions: newDefinitions, missingClasses.
missingClassTraits := OrderedCollection new.
newDefinitions do:
[:each | | classTrait |
(each isTraitDefinition and: [each isClassDefinition "i. e. is a baseTrait"])
ifTrue:
[classTrait := classTraits at: each className.
(newDefinitions includes: classTrait) ifFalse: [missingClassTraits add: classTrait]]].
(missingClassifiers select: [:each | each isTraitDefinition])
do: [:each | | classTrait | classTrait := classTraits at: each className.
(newDefinitions includes: classTrait) ifFalse: [missingClassTraits add: classTrait]].
cypressWriter writeDefinitions: newDefinitions, missingClassifiers, missingClassTraits.
"Fix up methodProperties.json files (they now only include the methods that were newly written)."
allMethods := (newDefinitions select: [:each | each isMethodDefinition]) collect: [:each | each description -> each] as: Dictionary.
aSquotArtifactDiff content startDiff working definitions do:
[:each | (each isMethodDefinition and: [(removedMethods includesKey: each description) not]) ifTrue: [allMethods at: each description ifAbsentPut: [each]]].
allMethods := allMethods groupBy: [:each | each className].
classDefinitions asArray, missingClasses do:
classifierDefinitions asArray, missingClassifiers do:
[:each |
cypressWriter writeInDirectoryName: each className, (each isTraitDefinition ifTrue: ['.trait'] ifFalse: ['.class']), cypressWriter fileUtils pathNameDelimiter
fileName: 'methodProperties'
extension: cypressWriter propertyFileExtension
visit: [cypressWriter writeMethodProperties: (allMethods at: each className ifAbsent: [#()])]].
"Fix up methodProperties.json for class extensions"
extensions := allMethods keys reject: [:each | allClasses includesKey: each].
extensions := allMethods keys reject: [:each | allClassifiers includesKey: each].
extensions do:
[:each |
cypressWriter writeInDirectoryName: each, '.extension', cypressWriter fileUtils pathNameDelimiter asString
fileName: 'methodProperties'
extension: cypressWriter propertyFileExtension
visit: [cypressWriter writeMethodProperties: (allMethods at: each)]].
"Delete removed items"
definitions := allMethods values concatenation, allClasses values.
removedOthers, removedMethods, removedClasses do: [:each | self delete: each].
definitions := allMethods values concatenation, allClassifiers values.
removedOthers, removedMethods, removedClassTraits, removedClassifiers do: [:each | self delete: each].
"Delete empty extensions"
((((removedMethods groupBy: [:each | each className]) keys
copyWithoutAll: allMethods keys) "to preserve still existing extensions"
copyWithoutAll: allClasses keys) "to preserve classes (not extensions) without methods"
copyWithoutAll: (removedClasses collect: [:each | each className] as: Array)) "these are not extensions"
copyWithoutAll: allClassifiers keys) "to preserve classes (not extensions) without methods"
copyWithoutAll: (removedClassifiers collect: [:each | each className] as: Array)) "these are not extensions"
do: [:each | self deleteExtension: each].
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"userFriendlyTitle" : "jr 3/16/2019 15:52" },
"instance" : {
"canWriteDiffs" : "jr 11/20/2021 15:06",
"delete:" : "jr 11/20/2021 15:40",
"delete:" : "jr 8/7/2022 22:38",
"deleteClassifier:" : "jr 11/20/2021 12:27",
"deleteExtension:" : "jr 11/20/2021 12:42",
"deleteMethod:" : "jr 11/20/2021 11:46",
Expand All @@ -22,7 +22,7 @@
"write:" : "jr 5/9/2017 18:24",
"writeClass:" : "jr 9/3/2020 22:48",
"writeDefinitions:" : "jr 1/29/2017 21:08",
"writeDiff:" : "jr 1/16/2022 16:03",
"writeDiff:" : "jr 8/7/2022 23:33",
"writeMCSnapshot:forPackageNamed:from:" : "jr 3/16/2019 23:35",
"writePackage:" : "jr 9/3/2020 22:47",
"writePropertiesIfExists" : "jr 9/3/2020 22:47" } }

0 comments on commit 20ecbad

Please sign in to comment.