diff --git a/src/FAST-Core-Tools-Tests/FASTCopyVisitorCodeGeneratorTest.class.st b/src/FAST-Core-Tools-Tests/FASTCopyVisitorCodeGeneratorTest.class.st new file mode 100644 index 0000000..3d06594 --- /dev/null +++ b/src/FAST-Core-Tools-Tests/FASTCopyVisitorCodeGeneratorTest.class.st @@ -0,0 +1,81 @@ +" +A FASTCopyVisitorCodeGeneratorTest is a test class for testing the behavior of FASTCopyVisitorCodeGenerator +" +Class { + #name : #FASTCopyVisitorCodeGeneratorTest, + #superclass : #TestCase, + #instVars : [ + 'visitorClass', + 'visitorMethods', + 'generator' + ], + #category : #'FAST-Core-Tools-Tests-VisitorGenerator' +} + +{ #category : #running } +FASTCopyVisitorCodeGeneratorTest >> assertGeneratedMethod: aBlock [ + + visitorMethods + detect: [ :asso | aBlock value: asso key ] + ifNone: [ self fail ] +] + +{ #category : #running } +FASTCopyVisitorCodeGeneratorTest >> setUp [ + super setUp. + + generator := FASTCopyVisitorCodeGenerator new. + + visitorClass := Mock named: 'visitor'. + visitorMethods := OrderedCollection new. + + (visitorClass stub compile: Any classified: Any) will: [ :method :category | + visitorMethods add: method -> category ] +] + +{ #category : #tests } +FASTCopyVisitorCodeGeneratorTest >> testGenerateCopyMethod [ + + generator rootClass: FmxTraitsTestGenerateAccessorBEntity visitorClass: visitorClass. + + self assertGeneratedMethod: [ :methodCode | + methodCode beginsWith: 'copy: ' ] +] + +{ #category : #tests } +FASTCopyVisitorCodeGeneratorTest >> testShouldCopyPropertyFor [ + + | property | + + property := FmxTraitsTestGenerateAccessorBClassA asMooseDescription + allProperties detect: [ :prop | prop name = 'relationToB' ]. + + generator package: (FmxTraitsTestGenerateAccessorBClassA metamodel packages detect: [ :p | p name = 'Famix-MetamodelBuilder-TestsTraitsResources-A' ]). + self assert: (generator shouldCopyProperty: property for: FmxTraitsTestGenerateAccessorBClassA). + + +] + +{ #category : #tests } +FASTCopyVisitorCodeGeneratorTest >> testShouldNotCopyDerivedProperty [ + + | property | + + property := FmxTraitsTestGenerateAccessorBClassB asMooseDescription + allProperties detect: [ :prop | prop name = 'relationToA' ]. + + self assert: property isDerived. + self deny: (generator shouldCopyProperty: property for: FmxTraitsTestGenerateAccessorBClassB) +] + +{ #category : #tests } +FASTCopyVisitorCodeGeneratorTest >> testShouldNotCopyPropertyFromOtherPackage [ + + | property | + + property := FmxTraitsTestGenerateAccessorBClassB asMooseDescription + allProperties detect: [ :prop | prop name = 'relationToA' ]. + + generator package: (FmxTraitsTestGenerateAccessorBClassA metamodel packages detect: [ :p | p name = 'Famix-MetamodelBuilder-TestsTraitsResources-B' ]). + self assert: (generator shouldCopyProperty: property for: FmxTraitsTestGenerateAccessorBClassA) +] diff --git a/src/FAST-Core-Tools-Tests/FASTLocalResolverVisitorTest.class.st b/src/FAST-Core-Tools-Tests/FASTLocalResolverVisitorTest.class.st index b4d2865..e70f644 100644 --- a/src/FAST-Core-Tools-Tests/FASTLocalResolverVisitorTest.class.st +++ b/src/FAST-Core-Tools-Tests/FASTLocalResolverVisitorTest.class.st @@ -93,20 +93,6 @@ FASTLocalResolverVisitorTest >> testLocalDeclarationFor [ self assert: declNode localUses first equals: refNode ] -{ #category : #tests } -FASTLocalResolverVisitorTest >> testNonLocalDeclarationWithName [ - "testing helper method #nonLocalDeclaration:withName:" - | node | - node := FASTEntity new. - localResolver resetScopes. - - localResolver nonLocalDeclaration: node withName: 'blah'. - - self assert: node localDeclaration notNil. - self assert: node localDeclaration class equals: FASTNonLocalDeclaration. - self assert: node localDeclaration name equals: 'blah' -] - { #category : #tests } FASTLocalResolverVisitorTest >> testResetScopes [ localResolver resetScopes. diff --git a/src/FAST-Core-Tools/FASTCopyVisitorCodeGenerator.class.st b/src/FAST-Core-Tools/FASTCopyVisitorCodeGenerator.class.st index d9a8ae9..65728f5 100644 --- a/src/FAST-Core-Tools/FASTCopyVisitorCodeGenerator.class.st +++ b/src/FAST-Core-Tools/FASTCopyVisitorCodeGenerator.class.st @@ -109,7 +109,7 @@ FASTCopyVisitorCodeGenerator >> generateVisit: aModelClass in: aVisitorClass [ self generateVisitBody: aModelClass in: outputStream. ]. - aVisitorClass compile: code classified: AbstractProtocol unclassified + aVisitorClass compile: code classified: Protocol unclassified ] { #category : #'code generation' } @@ -136,6 +136,30 @@ FASTCopyVisitorCodeGenerator >> isSamePackage: aFMProperty [ ^package = aFMProperty mmClass package ] +{ #category : #'accessing - private tests' } +FASTCopyVisitorCodeGenerator >> metamodel [ + + ^ metamodel +] + +{ #category : #'accessing - private tests' } +FASTCopyVisitorCodeGenerator >> metamodel: anObject [ + + metamodel := anObject +] + +{ #category : #'accessing - private tests' } +FASTCopyVisitorCodeGenerator >> package [ + + ^ package +] + +{ #category : #'accessing - private tests' } +FASTCopyVisitorCodeGenerator >> package: anObject [ + + package := anObject +] + { #category : #run } FASTCopyVisitorCodeGenerator >> rootClass: aFASTEntityClass visitorClass: aFASTVisitorClass [ @@ -152,12 +176,6 @@ FASTCopyVisitorCodeGenerator >> rootClass: aFASTEntityClass visitorClass: aFASTV { #category : #'code generation' } FASTCopyVisitorCodeGenerator >> shouldCopyProperty: property for: aModelClass [ - "Dealing with some special cases (errors in the meta-model, they should be marked #isContainer)" - (property name beginsWith: 'parent') ifTrue: [ ^false ]. - - (#(assignedIn invokedIn container) anySatisfy: [ :specialCase | property name = specialCase ]) - ifTrue: [ ^false ]. - (#(startPos endPos) anySatisfy: [ :specialCase | property name = specialCase ]) ifTrue: [ ^true ]. diff --git a/src/FAST-Core-Tools/FASTLocalResolverVisitor.class.st b/src/FAST-Core-Tools/FASTLocalResolverVisitor.class.st index 14b0c9e..029a20d 100644 --- a/src/FAST-Core-Tools/FASTLocalResolverVisitor.class.st +++ b/src/FAST-Core-Tools/FASTLocalResolverVisitor.class.st @@ -28,9 +28,13 @@ FASTLocalResolverVisitor >> currentScope [ { #category : #private } FASTLocalResolverVisitor >> findDeclaration: aName [ + "search for 'aName' in the current scope and its parent. + Returns nil if not found" + ^self currentScope at: aName ifAbsent: [ |scope decl| + decl := nil. scope := self popScope. self hasScopes ifTrue: [ decl := self findDeclaration: aName ]. @@ -57,12 +61,6 @@ FASTLocalResolverVisitor >> localDeclaration: declarationNode for: referingNode declarationNode addLocalUse: referingNode ] -{ #category : #private } -FASTLocalResolverVisitor >> nonLocalDeclaration: referingNode withName: name [ - self localDeclaration: (self scopeAddNonLocalDeclaration: name) for: referingNode - -] - { #category : #api } FASTLocalResolverVisitor >> on: aFASTBehaviouralEntity [ @@ -141,17 +139,11 @@ FASTLocalResolverVisitor >> visitFASTIdentifierExpression: aFASTIdentifier [ - if not found, creates a NonLocalDeclaration for it - binds this reference to the declaration" - (self findDeclaration: aFASTIdentifier name) - ifNil: [ - self - nonLocalDeclaration: aFASTIdentifier - withName: aFASTIdentifier name - ] - ifNotNil: [ :decl | - self - localDeclaration: decl - for: aFASTIdentifier - ] + self + localDeclaration: ( + (self findDeclaration: aFASTIdentifier name) + ifNil: [ self scopeAddNonLocalDeclaration: aFASTIdentifier name ]) + for: aFASTIdentifier ] { #category : #visiting } @@ -171,6 +163,9 @@ FASTLocalResolverVisitor >> visitFASTScopeChildren: childrenNodes [ "creates a new scope and visit its children nodes Order of nodes is important to ensure declarations are visited before statements" +self shouldNotImplement. +"Actually does not seem to be used anywhere ..." + self pushScope. (childrenNodes sorted: [:a :b | a startPos < b startPos]) @@ -179,7 +174,7 @@ FASTLocalResolverVisitor >> visitFASTScopeChildren: childrenNodes [ ^self popScope ] -{ #category : #generated } +{ #category : #visiting } FASTLocalResolverVisitor >> visitFASTTStatementBlock: aFASTJavaStatementBlock [ self pushScope.