ParseNodeVisitor.st
author Claus Gittinger <cg@exept.de>
Sat, 17 Aug 2019 14:36:09 +0200
changeset 4482 64eb770b276e
parent 4470 8e9fd99e36d9
child 4497 25868e8ec797
permissions -rw-r--r--
#FEATURE by exept class: Parser changed: #primary warnings for typed array

"{ Encoding: utf8 }"

"{ Package: 'stx:libcomp' }"

"{ NameSpace: Smalltalk }"

Object subclass:#ParseNodeVisitor
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'System-Compiler-Support'
!

ParseNodeVisitor subclass:#ParseNodeChildCollector
	instanceVariableNames:'topNode children'
	classVariableNames:''
	poolDictionaries:''
	privateIn:ParseNodeVisitor
!

!ParseNodeVisitor class methodsFor:'documentation'!

documentation
"
    a whitebox expandable abstract parsenode visitor.
    Subclasses should redefine those acceptXXX methods, in which they are interested.
"    
! !

!ParseNodeVisitor class methodsFor:'utilities'!

collectChildrenOf:aNode
    |collector|

    collector := ParseNodeChildCollector new topNode:aNode.
    aNode acceptVisitor:collector.
    ^ collector children
! !

!ParseNodeVisitor methodsFor:'visiting'!

visit:anObject 
    | stmt lastResult |

    anObject isStatementNode ifTrue:[
        stmt := anObject.
        [ stmt isNil ] whileFalse:[
            lastResult := stmt acceptVisitor:self.
            stmt := stmt nextStatement.
        ].
        ^ lastResult
    ] ifFalse:[
        ^ anObject acceptVisitor: self.
    ]

    "Modified: / 25-07-2011 / 22:33:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitAssignmentNode:anObject 

    self visit: anObject variable.
    self visit: anObject expression.

    "Modified: / 25-07-2011 / 22:30:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitBinaryNode:anObject 

    ^self visitMessageNode: anObject

    "Modified: / 25-07-2011 / 22:30:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitBlockNode:anObject 

    anObject statements ifNotNil:[
        self visit: anObject statements
    ].

    "Modified: / 25-07-2011 / 22:45:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitCascadeNode:anObject 

    self visitMessageNode: anObject.

    "Modified: / 25-07-2011 / 22:37:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitConstantNode:anObject

    "Modified: / 25-07-2011 / 22:41:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitECompletionConstantNode:anObject 
    "dispatched back from the visited eCompletionConstantNode-object (visitor pattern)"

    "fall back to general object-case - please change as required"

    ^ self visitObject:anObject
!

visitMessageNode:anObject 

    self visit: anObject receiver.
    anObject arguments do:[:arg|
        self visit: arg.
    ]

    "Modified: / 25-07-2011 / 22:37:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitObject:anObject 
    "dispatched back from the visited objects (visitor pattern)"

    "general fallBack - please change as required"

    self halt:'not yet implemented'
!

visitParseErrorNode:anObject

    "Modified: / 25-07-2011 / 22:38:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitPrimitiveNode:anObject

    "Modified: / 25-07-2011 / 22:38:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

visitReturnNode:anObject 
    self visit: anObject expression.
!

visitSelfNode:anObject 
    "/ to be redefined in subclasses
!

visitStatementNode:anObject 
    |expr|

    (expr := anObject expression) notNil ifTrue:[
        self visit: expr.
    ]
!

visitSuperNode:anObject 
    "/ to be redefined in subclasses
!

visitUnaryNode:anObject 
    ^self visitMessageNode: anObject
!

visitVariableNode:anObject 
    "/ to be redefined in subclasses
! !

!ParseNodeVisitor methodsFor:'visiting - javaScript'!

visitFunctionCallNode:anObject
    self visitMessageNode:anObject
!

visitImplicitFunctionCallNode:aNode
    self visitFunctionCallNode:aNode
!

visitJavaScriptFunctionNode:aNode
    |stmt|

    stmt := aNode statements.
    [ stmt notNil ] whileTrue:[
        self visit:stmt.
        stmt := stmt nextStatement.
    ].
!

visitJavaScriptStatementNode:aNode
    self visitStatementNode:aNode
!

visitJavaScriptVariableNode:aNode
    self visitVariableNode:aNode
!

visitThisNode:aNode
    self visitSelfNode:aNode
! !

!ParseNodeVisitor::ParseNodeChildCollector class methodsFor:'documentation'!

documentation
"
    documentation to be added.

    class:
        <a short class summary here, describing what instances represent>

    responsibilities:    
        <describing what my main role is>

    collaborators:    
        <describing with whom and how I talk to>

    API:
        <public api and main messages>
        
    example:
        <a one-line examples on how to use - can also be in a separate example method>

    implementation:
        <implementation points>

    [author:]
        exept MBP

    [instance variables:]

    [class variables:]

    [see also:]

"
! !

!ParseNodeVisitor::ParseNodeChildCollector class methodsFor:'instance creation'!

new
    "return an initialized instance"

    ^ self basicNew initialize.
! !

!ParseNodeVisitor::ParseNodeChildCollector methodsFor:'accessing'!

children
    ^ children
!

topNode:something
    topNode := something.
! !

!ParseNodeVisitor::ParseNodeChildCollector methodsFor:'initialization'!

initialize
    children := IdentitySet new.
! !

!ParseNodeVisitor::ParseNodeChildCollector methodsFor:'visiting'!

visit:anObject 
    anObject parent == topNode ifTrue:[
        children add:anObject.
        "/ do not go deeper
    ] ifFalse:[
        super visit:anObject
    ].
! !

!ParseNodeVisitor class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !