initial checkin
authorClaus Gittinger <cg@exept.de>
Fri, 09 Oct 2009 15:10:15 +0200
changeset 2216 2298fbeddb0e
parent 2215 8ae61b93c7eb
child 2217 a505d0b7d544
initial checkin
PluggableProgramNodeEnumerator.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PluggableProgramNodeEnumerator.st	Fri Oct 09 15:10:15 2009 +0200
@@ -0,0 +1,88 @@
+"{ Package: 'stx:libcomp' }"
+
+ProgramNodeEnumerator subclass:#PluggableProgramNodeEnumerator
+	instanceVariableNames:'plugs'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'System-Compiler'
+!
+
+
+!PluggableProgramNodeEnumerator methodsFor:'configuration'!
+
+nodesForWhich:aCheckBlock do:actionBlock
+    plugs isNil ifTrue:[
+        plugs := OrderedCollection new.
+    ].
+    plugs add:{ aCheckBlock. actionBlock. }.
+! !
+
+!PluggableProgramNodeEnumerator methodsFor:'enumeration callbacks'!
+
+doAssignment:aNode variable:var value:val
+    self evaluatePlugsFor:aNode.
+    self doNode:val.
+!
+
+doBlock:aNode arguments:args body:seq
+    self evaluatePlugsFor:aNode.
+    seq notNil ifTrue:[
+        self doNode:seq.
+    ]
+!
+
+doCascade:aNode receiver:rcvr messages:msgs
+    self evaluatePlugsFor:aNode.
+    msgs do:[:eachMessage | 
+        self doNode:eachMessage
+    ].
+!
+
+doLiteral:aNode value:lit
+    self evaluatePlugsFor:aNode.
+!
+
+doMessage:aNode receiver:rcvr selector:sel arguments:args
+    self evaluatePlugsFor:aNode.
+    self doNode:rcvr.
+    args do:[:eachArg |
+        self doNode:eachArg
+    ].
+!
+
+doMethod:aNode selector:sel primitive:prim block:block
+    self evaluatePlugsFor:aNode.
+!
+
+doPrimitive:aNode code:code primitiveIndex:primNumber
+    self evaluatePlugsFor:aNode.
+!
+
+doReturn:aNode value:value
+    self evaluatePlugsFor:aNode.
+    self doNode:value
+!
+
+doVariable:aNode name:nameString
+    self evaluatePlugsFor:aNode.
+! !
+
+!PluggableProgramNodeEnumerator methodsFor:'private'!
+
+evaluatePlugsFor:aNode
+    plugs do:[:eachPair |
+        |check action|
+        
+        check := eachPair first.
+        action := eachPair second.
+        (check value:aNode) ifTrue:[
+            action value:aNode.
+        ].
+    ].
+! !
+
+!PluggableProgramNodeEnumerator class methodsFor:'documentation'!
+
+version_CVS
+    ^ '$Header: /cvs/stx/stx/libcomp/PluggableProgramNodeEnumerator.st,v 1.1 2009-10-09 13:10:15 cg Exp $'
+! !