Skip to content

Commit

Permalink
add parenthesis when reference
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiovandewaeter committed Jul 3, 2024
1 parent b497c8c commit d55b885
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 30 deletions.
15 changes: 15 additions & 0 deletions src/Famix-Value-Entities-Extensions/FamixValueOfType.extension.st
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,21 @@ FamixValueOfType >> containsObject [
^ false
]

{ #category : #'*Famix-Value-Entities-Extensions' }
FamixValueOfType >> isReferencedInLoop [

| count |
count := self referenceCount.
^ count > 1 or: [ self isRoot and: [ count = 1 ] ]
]

{ #category : #'*Famix-Value-Entities-Extensions' }
FamixValueOfType >> isRoot [

^ self argumentInSpan isNotNil or: [
self resultInSpan isNotNil or: [ self receiverInSpan isNotNil ] ]
]

{ #category : #'*Famix-Value-Entities-Extensions' }
FamixValueOfType >> mooseNameOn: aStream [

Expand Down
81 changes: 51 additions & 30 deletions src/Famix-Value-Exporter/FamixValue2PharoVisitor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,36 @@ Class {
#category : #'Famix-Value-Exporter'
}

{ #category : #visiting }
FamixValue2PharoVisitor >> addParenthesis: aNode [
"add parenthesis when the node as multiple references"

| receiver newNode |
receiver := RBAssignmentNode new
variable: aNode variable;
value: (aNode value messages at: 1) receiver.
newNode := aNode value.
(newNode messages at: 1) receiver: receiver.
^ newNode
]

{ #category : #testing }
FamixValue2PharoVisitor >> ensureVisited: value [

| node |
self varNameDict
at: value
ifPresent: [ :name | ^ RBVariableNode named: name ]
ifAbsentPut: [
node := value accept: self.
value referenceCount > 1
ifTrue: [
| name |
name := self varNameFor: value.
node := RBAssignmentNode
variable: (RBVariableNode named: name)
value: node.
name ]
ifFalse: [ nil ] ].
^ node
^ self varNameDict
at: value
ifPresent: [ :name | RBVariableNode named: name ]
ifAbsent: [
| name node |
value isOfPrimitiveType ifFalse: [
self varNameDict at: value put: (name := self varNameFor: value) ].
node := value accept: self.
value isReferencedInLoop
ifTrue: [
RBAssignmentNode
variable: (RBVariableNode named: name)
value: node ]
ifFalse: [ node ] ]
]

{ #category : #ast }
Expand Down Expand Up @@ -80,7 +91,12 @@ FamixValue2PharoVisitor >> visitCollection: collection [
| collectionNode |
collectionNode := RBArrayNode statements:
(collection value collect: [ :element |
self ensureVisited: element value ]).
| newNode |
newNode := self ensureVisited: element value.
(element value isReferencedInLoop and: [
newNode isVariable not ])
ifTrue: [ newNode addParenthesisToVariable]
ifFalse: [ newNode ] ]).
^ collection type name = 'Array'
ifTrue: [ collectionNode ]
ifFalse: [
Expand Down Expand Up @@ -139,20 +155,25 @@ FamixValue2PharoVisitor >> visitObject: object [
{ #category : #visiting }
FamixValue2PharoVisitor >> visitObjectAttribute: attribute [

| newNode |
attribute attribute ifNil: [ "ignore unknown attributes" ^ nil ].
^ (attribute object type findSetterOf: attribute attribute)
ifNotNil: [ :setter |
RBMessageNode
receiver: RBVariableNode new
selector: setter name
arguments: { (self ensureVisited: attribute value) } ]
ifNil: [ "Use reflectivity"
RBMessageNode
receiver: RBVariableNode new
selector: #instVarNamed:put:
arguments: {
(RBVariableNode named: '#' , attribute attribute name).
(self ensureVisited: attribute value) } ]
(attribute object type findSetterOf: attribute attribute)
ifNotNil: [ :setter |
newNode := RBMessageNode
receiver: RBVariableNode new
selector: setter name
arguments: { (self ensureVisited: attribute value) } ]
ifNil: [ "Use reflectivity"
newNode := RBMessageNode
receiver: RBVariableNode new
selector: #instVarNamed:put:
arguments: {
(RBVariableNode named: '#' , attribute attribute name).
(self ensureVisited: attribute value) } ].

attribute value isReferencedInLoop ifTrue: [
^ newNode addParenthesisToVariable].
^ newNode
]

{ #category : #visiting }
Expand Down
14 changes: 14 additions & 0 deletions src/Famix-Value-Exporter/RBAssignmentNode.extension.st
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
Extension { #name : #RBAssignmentNode }

{ #category : #'*Famix-Value-Exporter' }
RBAssignmentNode >> addParenthesisToVariable [
"add parenthesis because the node as multiple references"

| receiver newNode |
receiver := RBAssignmentNode new
variable: self variable;
value: (self value messages at: 1) receiver.
newNode := self value.
(newNode messages at: 1) receiver: receiver.
^ newNode
]

0 comments on commit d55b885

Please sign in to comment.