Skip to content

Commit

Permalink
add SmaCCMethodNodeSourceIntervalFinder
Browse files Browse the repository at this point in the history
  • Loading branch information
JurajKubelka committed May 14, 2024
1 parent deaaa3b commit a9e6c0c
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
Class {
#name : #SmaCCMethodNodeSourceIntervalFinder,
#superclass : #Object,
#instVars : [
'methodNode',
'sourceString',
'sourceAst',
'sourceNode',
'sourceInterval'
],
#category : #'SmaCC_Rewrite_Engine_UI-Context'
}

{ #category : #finding }
SmaCCMethodNodeSourceIntervalFinder >> equivalentNodeTo: aNode in: otherTree [
"Taken from GtSmaCCTransformationToolkitDebuggerElement>>#equivalentNodeTo:in:"

| equivParent nodeIndex equivNode |
aNode isMethod ifTrue: [ ^ otherTree ].
(aNode parent isReturn and: [ aNode parent parent parent isMethod ])
ifTrue: [ equivNode := otherTree isSequence
ifTrue: [ otherTree statements last ]
ifFalse: [ otherTree ].
^ equivNode isReturn ifTrue: [ equivNode value ] ifFalse: [ equivNode ] ].
aNode parent isMethod
ifTrue: [ otherTree isSequence ifTrue: [ ^ otherTree ] ifFalse: [ ^ otherTree parent ] ].
equivParent := self equivalentNodeTo: aNode parent in: otherTree.
equivParent ifNil: [ ^ nil ].
nodeIndex := aNode parent children identityIndexOf: aNode.
^ equivParent children at: nodeIndex ifAbsent: [ nil ]
]

{ #category : #finding }
SmaCCMethodNodeSourceIntervalFinder >> find [
"Adopted from GtSmaCCTransformationToolkitDebuggerElement>>#intervalFromMethodNode:inSource:"

<return: #Interval>
sourceAst := RBParser
parseExpression: sourceString
onError: [ :msg :pos | ^ sourceInterval := 1 to: 0 ].
sourceNode := self equivalentNodeTo: methodNode in: sourceAst.
sourceNode ifNil: [ ^ sourceInterval := 1 to: 0 ].
^ sourceInterval := sourceNode start to: sourceNode stop
]

{ #category : #accessing }
SmaCCMethodNodeSourceIntervalFinder >> methodNode [
^ methodNode
]

{ #category : #accessing }
SmaCCMethodNodeSourceIntervalFinder >> methodNode: anObject [
methodNode := anObject
]

{ #category : #'accessing - computed' }
SmaCCMethodNodeSourceIntervalFinder >> sourceAst [
^ sourceAst
]

{ #category : #'accessing - computed' }
SmaCCMethodNodeSourceIntervalFinder >> sourceInterval [
^ sourceInterval
]

{ #category : #'accessing - computed' }
SmaCCMethodNodeSourceIntervalFinder >> sourceNode [
^ sourceNode
]

{ #category : #accessing }
SmaCCMethodNodeSourceIntervalFinder >> sourceString [
^ sourceString
]

{ #category : #accessing }
SmaCCMethodNodeSourceIntervalFinder >> sourceString: anObject [
sourceString := anObject
]
Original file line number Diff line number Diff line change
Expand Up @@ -70,28 +70,12 @@ SmaCCTransformationToolkitDebugSession >> currentRewriteContext [
^ nil
]

{ #category : #private }
SmaCCTransformationToolkitDebugSession >> equivalentNodeTo: aNode in: otherTree [
| equivParent nodeIndex equivNode |
aNode isMethod ifTrue: [ ^ otherTree ].
(aNode parent isReturn and: [ aNode parent parent parent isMethod ])
ifTrue:
[ equivNode := otherTree isSequence ifTrue: [ otherTree statements last ] ifFalse: [ otherTree ].
^ equivNode isReturn ifTrue: [ equivNode value ] ifFalse: [ equivNode ] ].
aNode parent isMethod ifTrue: [ otherTree isSequence ifTrue: [ ^ otherTree ] ifFalse: [ ^ otherTree parent ] ].
equivParent := self equivalentNodeTo: aNode parent in: otherTree.
equivParent ifNil: [ ^ nil ].
nodeIndex := aNode parent children identityIndexOf: aNode.
^ equivParent children at: nodeIndex ifAbsent: [ nil ]
]

{ #category : #private }
SmaCCTransformationToolkitDebugSession >> intervalFromMethodNode: aNode inSource: aString [
| otherTree otherNode |
otherTree := RBParser parseExpression: aString onError: [ :msg :pos | ^ 1 to: 0 ].
otherNode := self equivalentNodeTo: aNode in: otherTree.
otherNode ifNil: [ ^ 1 to: 0 ].
^ otherNode start to: otherNode stop
^ SmaCCMethodNodeSourceIntervalFinder new
methodNode: aNode;
sourceString: aString;
find
]

{ #category : #testing }
Expand Down

0 comments on commit a9e6c0c

Please sign in to comment.