diff --git a/src/Famix-Python-Entities/FamixPythonClass.class.st b/src/Famix-Python-Entities/FamixPythonClass.class.st index 94ea553..e78ac9e 100644 --- a/src/Famix-Python-Entities/FamixPythonClass.class.st +++ b/src/Famix-Python-Entities/FamixPythonClass.class.st @@ -18,6 +18,7 @@ ### Outgoing dependencies | Relation | Origin | Opposite | Type | Comment | |---| +| `accesses` | `FamixTWithAccesses` | `accessor` | `FamixTAccess` | Accesses to variables made by this behaviour.| | `superInheritances` | `FamixTWithInheritances` | `subclass` | `FamixTInheritance` | Superinheritance relationships, i.e. known superclasses of this type.| ### Incoming dependencies @@ -53,8 +54,8 @@ Class { #name : 'FamixPythonClass', #superclass : 'FamixPythonType', - #traits : 'FamixTClass + FamixTImportable + FamixTShadowable + FamixTShadower + FamixTWithAnnotationInstances + FamixTWithLambdas', - #classTraits : 'FamixTClass classTrait + FamixTImportable classTrait + FamixTShadowable classTrait + FamixTShadower classTrait + FamixTWithAnnotationInstances classTrait + FamixTWithLambdas classTrait', + #traits : 'FamixTClass + FamixTImportable + FamixTShadowable + FamixTShadower + FamixTWithAccesses + FamixTWithAnnotationInstances + FamixTWithLambdas', + #classTraits : 'FamixTClass classTrait + FamixTImportable classTrait + FamixTShadowable classTrait + FamixTShadower classTrait + FamixTWithAccesses classTrait + FamixTWithAnnotationInstances classTrait + FamixTWithLambdas classTrait', #instVars : [ '#instancedClasses => FMMany type: #FamixPythonClass opposite: #metaclass', '#isMetaclass => FMProperty', diff --git a/src/Famix-Python-Entities/FamixPythonLambda.class.st b/src/Famix-Python-Entities/FamixPythonLambda.class.st index c03b5c1..950c308 100644 --- a/src/Famix-Python-Entities/FamixPythonLambda.class.st +++ b/src/Famix-Python-Entities/FamixPythonLambda.class.st @@ -46,8 +46,8 @@ Class { #name : 'FamixPythonLambda', #superclass : 'FamixPythonContainerEntity', - #traits : 'FamixTLambda + FamixTWithComments + FamixTWithImplicitVariables + FamixTWithInvocations + FamixTWithLambdas', - #classTraits : 'FamixTLambda classTrait + FamixTWithComments classTrait + FamixTWithImplicitVariables classTrait + FamixTWithInvocations classTrait + FamixTWithLambdas classTrait', + #traits : 'FamixTLambda + FamixTWithAccesses + FamixTWithComments + FamixTWithImplicitVariables + FamixTWithInvocations + FamixTWithLambdas', + #classTraits : 'FamixTLambda classTrait + FamixTWithAccesses classTrait + FamixTWithComments classTrait + FamixTWithImplicitVariables classTrait + FamixTWithInvocations classTrait + FamixTWithLambdas classTrait', #category : 'Famix-Python-Entities-Entities', #package : 'Famix-Python-Entities', #tag : 'Entities' diff --git a/src/Famix-Python-Entities/FamixPythonModule.class.st b/src/Famix-Python-Entities/FamixPythonModule.class.st index 00408bf..add0459 100644 --- a/src/Famix-Python-Entities/FamixPythonModule.class.st +++ b/src/Famix-Python-Entities/FamixPythonModule.class.st @@ -19,6 +19,7 @@ ### Outgoing dependencies | Relation | Origin | Opposite | Type | Comment | |---| +| `accesses` | `FamixTWithAccesses` | `accessor` | `FamixTAccess` | Accesses to variables made by this behaviour.| | `outgoingInvocations` | `FamixTWithInvocations` | `sender` | `FamixTInvocation` | Outgoing invocations sent by this behaviour.| ### Incoming dependencies @@ -32,8 +33,8 @@ Class { #name : 'FamixPythonModule', #superclass : 'FamixPythonContainerEntity', - #traits : 'FamixTImportable + FamixTModule + FamixTPackageable + FamixTWithComments + FamixTWithFunctions + FamixTWithGlobalVariables + FamixTWithInvocations + FamixTWithLambdas', - #classTraits : 'FamixTImportable classTrait + FamixTModule classTrait + FamixTPackageable classTrait + FamixTWithComments classTrait + FamixTWithFunctions classTrait + FamixTWithGlobalVariables classTrait + FamixTWithInvocations classTrait + FamixTWithLambdas classTrait', + #traits : 'FamixTImportable + FamixTModule + FamixTPackageable + FamixTWithAccesses + FamixTWithComments + FamixTWithFunctions + FamixTWithGlobalVariables + FamixTWithInvocations + FamixTWithLambdas', + #classTraits : 'FamixTImportable classTrait + FamixTModule classTrait + FamixTPackageable classTrait + FamixTWithAccesses classTrait + FamixTWithComments classTrait + FamixTWithFunctions classTrait + FamixTWithGlobalVariables classTrait + FamixTWithInvocations classTrait + FamixTWithLambdas classTrait', #category : 'Famix-Python-Entities-Entities', #package : 'Famix-Python-Entities', #tag : 'Entities' diff --git a/src/Famix-Python-Entities/FamixPythonPackage.class.st b/src/Famix-Python-Entities/FamixPythonPackage.class.st index 8b78f9b..308f944 100644 --- a/src/Famix-Python-Entities/FamixPythonPackage.class.st +++ b/src/Famix-Python-Entities/FamixPythonPackage.class.st @@ -16,6 +16,11 @@ | `globalVariables` | `FamixTWithGlobalVariables` | `parentScope` | `FamixTGlobalVariable` | Global variables defined in the scope, if any.| | `lambdas` | `FamixTWithLambdas` | `lambdaContainer` | `FamixTLambda` | Lambdas defined in the container, if any.| +### Outgoing dependencies +| Relation | Origin | Opposite | Type | Comment | +|---| +| `accesses` | `FamixTWithAccesses` | `accessor` | `FamixTAccess` | Accesses to variables made by this behaviour.| + ### Incoming dependencies | Relation | Origin | Opposite | Type | Comment | |---| @@ -39,8 +44,8 @@ Class { #name : 'FamixPythonPackage', #superclass : 'FamixPythonContainerEntity', - #traits : 'FamixTImportable + FamixTPackage + FamixTPackageable + FamixTWithComments + FamixTWithFunctions + FamixTWithGlobalVariables + FamixTWithLambdas', - #classTraits : 'FamixTImportable classTrait + FamixTPackage classTrait + FamixTPackageable classTrait + FamixTWithComments classTrait + FamixTWithFunctions classTrait + FamixTWithGlobalVariables classTrait + FamixTWithLambdas classTrait', + #traits : 'FamixTImportable + FamixTPackage + FamixTPackageable + FamixTWithAccesses + FamixTWithComments + FamixTWithFunctions + FamixTWithGlobalVariables + FamixTWithLambdas', + #classTraits : 'FamixTImportable classTrait + FamixTPackage classTrait + FamixTPackageable classTrait + FamixTWithAccesses classTrait + FamixTWithComments classTrait + FamixTWithFunctions classTrait + FamixTWithGlobalVariables classTrait + FamixTWithLambdas classTrait', #category : 'Famix-Python-Entities-Entities', #package : 'Famix-Python-Entities', #tag : 'Entities' diff --git a/src/Famix-Python-Generator/FamixPythonGenerator.class.st b/src/Famix-Python-Generator/FamixPythonGenerator.class.st index 284cd72..7ba82a9 100644 --- a/src/Famix-Python-Generator/FamixPythonGenerator.class.st +++ b/src/Famix-Python-Generator/FamixPythonGenerator.class.st @@ -88,6 +88,7 @@ FamixPythonGenerator >> defineHierarchy [ class --|> #TWithLambdas. class --|> #TShadowable. class --|> #TShadower. + class --|> #TWithAccesses. containerEntity --|> namedEntity. containerEntity --|> #TWithClasses. @@ -111,6 +112,7 @@ FamixPythonGenerator >> defineHierarchy [ lambda --|> #TWithImplicitVariables. lambda --|> #TWithInvocations. lambda --|> #TWithLambdas. + lambda --|> #TWithAccesses. globalVariable --|> namedEntity. globalVariable --|> #TGlobalVariable. @@ -158,6 +160,7 @@ FamixPythonGenerator >> defineHierarchy [ module --|> #TWithInvocations. module --|> #TWithGlobalVariables. module --|> #TWithLambdas. + module --|> #TWithAccesses. namedEntity --|> sourcedEntity. namedEntity --|> #TInvocationsReceiver. @@ -171,6 +174,7 @@ FamixPythonGenerator >> defineHierarchy [ package --|> #TWithGlobalVariables. package --|> #TWithFunctions. package --|> #TWithLambdas. + package --|> #TWithAccesses. parameter --|> namedEntity. parameter --|> #TParameter. diff --git a/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st b/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st index 84c0f62..2065e78 100644 --- a/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st +++ b/src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st @@ -2109,6 +2109,23 @@ FamixPythonProject1Test >> testSuperclass2 [ self deny: class superclass isStub ] +{ #category : 'tests - accesses' } +FamixPythonProject1Test >> testWriteAccess [ + + | ivar method access | + ivar := self attributeNamed: 'dog_name'. + method := (self classNamed: 'Dog') methods detect: #isConstructor. + + access := ivar incomingAccesses detect: [ :anAccess | anAccess accessor = method ]. + + self assert: access class equals: FamixPythonAccess. + self assert: access source equals: method. + self assert: access accessor equals: method. + self assert: access target equals: ivar. + self assert: access variable equals: ivar. + self assert: access isWrite +] + { #category : 'tests - local variables' } FamixPythonProject1Test >> testlocalVariableInFunctionAreDefinedOnlyOnce [ "We should have only one global even if it is assigned multiple times." diff --git a/src/Famix-Python-Importer/FamixPythonImporterVisitor.class.st b/src/Famix-Python-Importer/FamixPythonImporterVisitor.class.st index ff4b360..96ea770 100644 --- a/src/Famix-Python-Importer/FamixPythonImporterVisitor.class.st +++ b/src/Famix-Python-Importer/FamixPythonImporterVisitor.class.st @@ -671,7 +671,19 @@ FamixPythonImporterVisitor >> visitAssignmentStatement: anAssignmentStatement [ | oldValue | oldValue := isInLeftSideOfAssignation. isInLeftSideOfAssignation := true. - [ self acceptNode: anAssignmentStatement lhs ] ensure: [ isInLeftSideOfAssignation := oldValue ]. + [ + | variable | + variable := self acceptNode: anAssignmentStatement lhs. + variable isMooseEntity + ifTrue: [ + | access | + access := model newAccess. + access + variable: variable; + accessor: self currentEntity; + isWrite: true. + self setSourceAnchor: access from: anAssignmentStatement ] + ifFalse: [ self flag: #todo "Is it normal?" ] ] ensure: [ isInLeftSideOfAssignation := oldValue ]. ^ super visitAssignmentStatement: anAssignmentStatement ]