CascadeNode.st
changeset 2693 7fbb7817a5e2
parent 2593 557c0dddfd66
child 2700 f894f188aefc
--- a/CascadeNode.st	Mon Sep 12 02:20:31 2011 +0200
+++ b/CascadeNode.st	Mon Sep 12 10:18:55 2011 +0200
@@ -44,6 +44,46 @@
 "
 ! !
 
+!CascadeNode methodsFor:'*VMMaker-C translation'!
+
+asTranslatorNodeIn: aTMethod
+        "make a CCodeGenerator equivalent of me"
+
+        ^Squeak::TStmtListNode new
+                setArguments: #()
+                statements:
+                        (Array streamContents:
+                                [:s| | receiverNode |
+                                receiverNode := self realReceiver "receiver" asTranslatorNodeIn: aTMethod.   
+                                receiverNode isLeaf ifFalse:
+                                        [| varNode |
+                                         varNode := aTMethod newCascadeTempFor: receiverNode.
+                                         s nextPut: (Squeak::TAssignmentNode new
+                                                                setVariable: varNode
+                                                                expression: receiverNode).
+                                        receiverNode := varNode].
+                                self messages do:
+                                        [ :msg | s nextPut: ((msg asTranslatorNodeIn: aTMethod) receiver: receiverNode)]]);
+                comment: (comments firstIfEmpty:nil)
+
+    "Modified: / 12-09-2011 / 10:18:44 / cg"
+!
+
+realReceiver
+    "return the real receiver
+     (sigh; ST/X encodes things differently)"
+
+    |r|
+
+    r := receiver.
+    [r isCascade] whileTrue:[
+        r := r receiver.
+    ].
+    ^ r
+
+    "Created: / 12-09-2011 / 10:01:48 / cg"
+! !
+
 !CascadeNode methodsFor:'code generation'!
 
 codeForCascadeOn:aStream inBlock:b for:aCompiler
@@ -59,6 +99,37 @@
 
 !CascadeNode methodsFor:'enumerating'!
 
+messages
+    "helper for parse tree walking"
+
+    "/ sigh; ST/X encodes things differently ...
+
+    |r nd msgs msg|
+
+    msgs := OrderedCollection new.
+
+    r := receiver.
+    [r isCascade] whileTrue:[
+        r := r receiver.
+    ].
+    r := r receiver.
+
+    nd := self.
+    [nd isCascade] whileTrue:[
+        msg := MessageNode new.
+        msg receiver:r selector:nd selector args:nd args lineno:nd lineNumber.
+        msgs addFirst:msg.
+        nd := nd receiver.
+    ].
+    msg := MessageNode new.
+    msg receiver:r selector:nd selector args:nd args lineno:nd lineNumber.
+    msgs addFirst:msg.
+
+    ^ msgs
+
+    "Created: / 12-09-2011 / 10:04:31 / cg"
+!
+
 nodeDo:anEnumerator
     "helper for parse tree walking"
 
@@ -136,6 +207,8 @@
     |selectorParts|
 
     selectorParts := selector asCollectionOfSubstringsSeparatedBy:$:.
+    selectorParts last isEmpty ifTrue:[selectorParts := selectorParts copyWithoutLast:1].
+
     receiver printOn:aStream indent:i.
     aStream nextPutAll:'; '.
     argArray size == 0 ifTrue:[
@@ -152,7 +225,7 @@
             ]
     ]
 
-    "Modified: / 20-04-2005 / 14:35:39 / cg"
+    "Modified: / 12-09-2011 / 09:46:45 / cg"
 ! !
 
 !CascadeNode methodsFor:'testing'!
@@ -177,9 +250,9 @@
 !CascadeNode class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.29 2011-07-25 22:32:34 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.30 2011-09-12 08:18:55 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.29 2011-07-25 22:32:34 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/CascadeNode.st,v 1.30 2011-09-12 08:18:55 cg Exp $'
 ! !