Skip to content

Commit

Permalink
Start to manage write accesses
Browse files Browse the repository at this point in the history
  • Loading branch information
jecisc committed Nov 19, 2024
1 parent 3256432 commit b1cda8c
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 9 deletions.
5 changes: 3 additions & 2 deletions src/Famix-Python-Entities/FamixPythonClass.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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',
Expand Down
4 changes: 2 additions & 2 deletions src/Famix-Python-Entities/FamixPythonLambda.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
5 changes: 3 additions & 2 deletions src/Famix-Python-Entities/FamixPythonModule.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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'
Expand Down
9 changes: 7 additions & 2 deletions src/Famix-Python-Entities/FamixPythonPackage.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
|---|
Expand All @@ -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'
Expand Down
4 changes: 4 additions & 0 deletions src/Famix-Python-Generator/FamixPythonGenerator.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ FamixPythonGenerator >> defineHierarchy [
class --|> #TWithLambdas.
class --|> #TShadowable.
class --|> #TShadower.
class --|> #TWithAccesses.

containerEntity --|> namedEntity.
containerEntity --|> #TWithClasses.
Expand All @@ -111,6 +112,7 @@ FamixPythonGenerator >> defineHierarchy [
lambda --|> #TWithImplicitVariables.
lambda --|> #TWithInvocations.
lambda --|> #TWithLambdas.
lambda --|> #TWithAccesses.

globalVariable --|> namedEntity.
globalVariable --|> #TGlobalVariable.
Expand Down Expand Up @@ -158,6 +160,7 @@ FamixPythonGenerator >> defineHierarchy [
module --|> #TWithInvocations.
module --|> #TWithGlobalVariables.
module --|> #TWithLambdas.
module --|> #TWithAccesses.

namedEntity --|> sourcedEntity.
namedEntity --|> #TInvocationsReceiver.
Expand All @@ -171,6 +174,7 @@ FamixPythonGenerator >> defineHierarchy [
package --|> #TWithGlobalVariables.
package --|> #TWithFunctions.
package --|> #TWithLambdas.
package --|> #TWithAccesses.

parameter --|> namedEntity.
parameter --|> #TParameter.
Expand Down
17 changes: 17 additions & 0 deletions src/Famix-Python-Importer-Tests/FamixPythonProject1Test.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -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."
Expand Down
14 changes: 13 additions & 1 deletion src/Famix-Python-Importer/FamixPythonImporterVisitor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -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
]

Expand Down

0 comments on commit b1cda8c

Please sign in to comment.