Navigation Menu

Skip to content

Commit

Permalink
Fixing problem with class trait compositions with parens.
Browse files Browse the repository at this point in the history
When monticello was saving the traits, it was not able to handle complex trait compositions with parentensis.
This was also affecting Iceberg and Tonel, as both of them relies in the MC model.

- Adding the node of withPrecedenceOf: in the Class parser
- The trait definition has to have the class trait composition.
- Improving the handling of parentheses.
- Updating the version of iceberg and Tonel
  • Loading branch information
tesonep committed Mar 13, 2020
1 parent 0932da8 commit cf1e66e
Show file tree
Hide file tree
Showing 7 changed files with 109 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/BaselineOfIDE/BaselineOfIDE.class.st
Expand Up @@ -192,7 +192,7 @@ BaselineOfIDE >> baseline: spec [
BaselineOfIDE >> loadIceberg [
Metacello new
baseline: 'Iceberg';
repository: 'github://pharo-vcs/iceberg:v1.6.5';
repository: 'github://pharo-vcs/iceberg:v1.6.7';
onConflictUseLoaded;
load.
(Smalltalk classNamed: #Iceberg) enableMetacelloIntegration: true.
Expand Down
9 changes: 9 additions & 0 deletions src/ClassParser/CDTraitCompositionSequenceNode.class.st
Expand Up @@ -33,3 +33,12 @@ CDTraitCompositionSequenceNode >> toString [
^ res

]

{ #category : #precedence }
CDTraitCompositionSequenceNode >> withPrecedenceOf: aCDTraitNode [

^ CDTraitPrecedenceCompositionNode new
sequence: sequence;
preferedTrait: aCDTraitNode;
yourself
]
22 changes: 22 additions & 0 deletions src/ClassParser/CDTraitPrecedenceCompositionNode.class.st
@@ -0,0 +1,22 @@
"
I represent the trait composition node used when an sequence of traits has to define precedence for one of the traits.
I am a syntax sugar to declare traits, as my behavior is exactly the same than removing all the messages of the prefered trait from the rest of the composition.
"
Class {
#name : #CDTraitPrecedenceCompositionNode,
#superclass : #CDTraitCompositionSequenceNode,
#instVars : [
'preferedTrait'
],
#category : #'ClassParser-Model'
}

{ #category : #accessing }
CDTraitPrecedenceCompositionNode >> preferedTrait [
^ preferedTrait
]

{ #category : #accessing }
CDTraitPrecedenceCompositionNode >> preferedTrait: anObject [
preferedTrait := anObject
]
73 changes: 68 additions & 5 deletions src/Monticello/MCTraitDefinition.class.st
Expand Up @@ -17,6 +17,20 @@ MCTraitDefinition class >> name: classNameString traitComposition: traitComposit
commentStamp: commentStamp
]

{ #category : #'instance creation' }
MCTraitDefinition class >> name: classNameString traitComposition: traitCompositionString category: categoryString instVarNames: ivarArray classInstVarNames: civarArray classTraitComposition: classTraitCompositionString comment: commentString commentStamp: commentStamp [

^ self new
initializeWithName: classNameString
traitComposition: traitCompositionString
category: categoryString
instVarNames: ivarArray
classTraitComposition: classTraitCompositionString
classInstVarNames: civarArray
comment: commentString
commentStamp: commentStamp
]

{ #category : #'instance creation' }
MCTraitDefinition class >> name: classNameString traitComposition: traitCompositionString category: categoryString instVarNames: ivarArray classInstVarNames: civarArray comment: commentString commentStamp: commentStamp [
^ self new
Expand All @@ -40,6 +54,18 @@ MCTraitDefinition class >> name: classNameString traitComposition: traitComposit
commentStamp: commentStamp
]

{ #category : #'instance creation' }
MCTraitDefinition class >> name: classNameString traitComposition: traitCompositionString classTraitComposition: classTraitComposition category: categoryString comment: commentString commentStamp: commentStamp [

^ self new
initializeWithName: classNameString
traitComposition: traitCompositionString
classTraitComposition: classTraitComposition
category: categoryString
comment: commentString
commentStamp: commentStamp
]

{ #category : #comparing }
MCTraitDefinition >> = aDefinition [
self flag: #traits. "Ugly we harcoded the super superclass method. We will have to refactor the definition hierarchy"
Expand Down Expand Up @@ -140,6 +166,21 @@ MCTraitDefinition >> initializeWithName: classNameString
self addVariables: civarArray ofType: MCClassInstanceVariableDefinition.
]

{ #category : #initializing }
MCTraitDefinition >> initializeWithName: classNameString traitComposition: traitCompositionString category: categoryString instVarNames: ivarArray classTraitComposition: classTraitCompositionString classInstVarNames: civarArray comment: commentString commentStamp: commentStampString [

self
initializeWithName: classNameString
traitComposition: traitCompositionString
category: categoryString
instVarNames: ivarArray
classInstVarNames: civarArray
comment: commentString
commentStamp: commentStampString.

classTraitComposition := classTraitCompositionString
]

{ #category : #initializing }
MCTraitDefinition >> initializeWithName: classNameString
traitComposition: traitCompositionString
Expand All @@ -158,6 +199,26 @@ MCTraitDefinition >> initializeWithName: classNameString

]

{ #category : #initializing }
MCTraitDefinition >> initializeWithName: classNameString
traitComposition: traitCompositionString
classTraitComposition: aClassTraitComposition
category: categoryString
instVarNames: ivarArray
comment: commentString
commentStamp: commentStampString [

name := classNameString asSymbol.
traitComposition := traitCompositionString.
category := categoryString.
comment := commentString withInternalLineEndings.
commentStamp := commentStampString ifNil: [self defaultCommentStamp].
variables := OrderedCollection new.
self addVariables: ivarArray ofType: MCInstanceVariableDefinition.

classTraitComposition := aClassTraitComposition
]

{ #category : #printing }
MCTraitDefinition >> printClassDefinitionOn: stream [

Expand Down Expand Up @@ -193,11 +254,13 @@ MCTraitDefinition >> requirements [
testing for the first character beeing an uppercase character
(and thus not a special character such as {, # etc.)"

| tokens traitNames |
self hasTraitComposition ifFalse: [ ^Array new ].
tokens := traitComposition parseLiterals.
traitNames := tokens select: [:each | each first isUppercase].
^traitNames asArray
self hasTraitComposition
ifFalse: [ ^Array new ].

^ (((RBParser parseExpression: self traitCompositionString)
allChildren select: [ :e | e isVariable ])
collect: [ :e | e name ]
as: Set) asArray
]

{ #category : #printing }
Expand Down
7 changes: 7 additions & 0 deletions src/Monticello/Trait.extension.st
Expand Up @@ -2,13 +2,19 @@ Extension { #name : #Trait }

{ #category : #'*Monticello' }
Trait >> asClassDefinition [

| classTraitCompositionToUse |

classTraitCompositionToUse := self class traitCompositionString.

self needsSlotClassDefinition ifFalse: [
^ MCTraitDefinition
name: self name
traitComposition: self traitCompositionString
category: self category
instVarNames: (self localSlots collect: #name)
classInstVarNames: (self class localSlots collect: #name)
classTraitComposition: classTraitCompositionToUse
comment: self organization classComment asString
commentStamp: self organization commentStamp ].

Expand All @@ -18,6 +24,7 @@ Trait >> asClassDefinition [
category: self category
instVarNames: (self localSlots collect: #definitionString)
classInstVarNames: (self classSide localSlots collect: #definitionString)
classTraitComposition: classTraitCompositionToUse
comment: self organization classComment asString
commentStamp: self organization commentStamp.

Expand Down
15 changes: 0 additions & 15 deletions src/Ring-Definitions-Monticello/MCTraitDefinition.extension.st
Expand Up @@ -26,21 +26,6 @@ MCTraitDefinition >> classDefinitionString [
^String streamContents: [:stream | self printMetaDefinitionOn: stream]
]

{ #category : #'*Ring-Definitions-Monticello' }
MCTraitDefinition >> classTraitCompositionString [
^self traitComposition
ifNil: [ '{}' ]
ifNotNil: [ :source| | tokens tcs |
tcs := ''.
tokens := source parseLiterals.
tokens do:[ :each|
each first isUppercase
ifTrue: [ tcs := tcs, each, ' classTrait + ' ] ].
tcs isEmpty
ifTrue: [ '{}' ]
ifFalse:[ tcs copyFrom: 1 to: tcs size - 3 ] ]
]

{ #category : #'*Ring-Definitions-Monticello' }
MCTraitDefinition >> printMetaDefinitionOn: stream [

Expand Down
2 changes: 2 additions & 0 deletions src/TraitsV2/TaPrecedenceComposition.class.st
Expand Up @@ -28,6 +28,8 @@ TaPrecedenceComposition >> copyWithoutTrait: aTrait [

newMembers := members collect: [ :e | e copyWithoutTrait: aTrait ] thenReject: #isEmpty.

newMembers ifEmpty: [ ^ (self class withAll: newMembers) ].

^ (self class withAll: newMembers)
preferedTrait: (preferedTrait copyWithoutTrait: aTrait);
yourself
Expand Down

0 comments on commit cf1e66e

Please sign in to comment.