squeak extension: c/java style arguments
authorClaus Gittinger <cg@exept.de>
Wed, 07 Jul 2004 11:17:08 +0200
changeset 1531 47f714bc1981
parent 1530 ed400d564510
child 1532 9c2adf12f271
squeak extension: c/java style arguments
Parser.st
--- a/Parser.st	Wed Jul 07 11:16:49 2004 +0200
+++ b/Parser.st	Wed Jul 07 11:17:08 2004 +0200
@@ -4698,7 +4698,7 @@
 binaryExpressionFor:receiverArg
     "parse a binary-expression; return a node-tree, nil or #Error"
 
-    |receiver theReceiver arg sel pos try lno note|
+    |receiver expr arg sel pos lno note|
 
     receiver := receiverArg.
     (receiver == #Error) ifTrue:[^ #Error].
@@ -4740,25 +4740,24 @@
 
         arg := self unaryExpression.
         (arg == #Error) ifTrue:[^ #Error].
-        theReceiver := receiver.
-
-        try := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
-        (try isMemberOf:String) ifTrue:[
-            self parseError:try position:pos to:tokenPosition.
+
+        expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
+        expr isErrorNode ifTrue:[
+            self parseError:(expr errorString) position:pos to:tokenPosition.
             errorFlag := false. "ok, user wants it - so he'll get it"
-            receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
-        ] ifFalse:[
-            receiver := try
-        ].
-        note := self plausibilityCheck:receiver.
+            expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
+        ].
+        note := self plausibilityCheck:expr.
         note notNil ifTrue:[
             self warning:note position:pos to:tokenPosition
         ].
-        receiver lineNumber:lno.
-        receiver selectorPosition:pos.
+        expr lineNumber:lno.
+        expr selectorPosition:pos.
         parseForCode ifFalse:[
-            self rememberSelectorUsed:sel receiver:theReceiver
-        ].
+            self rememberSelectorUsed:sel receiver:receiver
+        ].
+        receiver := expr.   "/ for next message
+
     ].
     ^ receiver
 
@@ -5199,62 +5198,60 @@
                            | { KEYWORD-PART binaryExpression }
     "
 
-    |lastReceiver receiver sel arg args posR1 posR2 pos1 pos2 try lno note positions|
+    |expr receiver sel arg args posR1 posR2 pos1 pos2 lno note positions|
 
     receiver := receiverArg.
     posR1 := tokenPosition.
-    (tokenType == #Keyword) ifTrue:[
-        pos1 := posR2 := tokenPosition.
+    (tokenType == #Keyword) ifFalse:[^ receiver].
+
+    pos1 := posR2 := tokenPosition.
+    pos2 := tokenPosition + tokenName size - 1.
+    positions := OrderedCollection with:(pos1 to:pos2).
+    sel := tokenName.
+    lno := tokenLineNr.
+    self nextToken.
+    arg := self binaryExpression.
+    (arg == #Error) ifTrue:[^ #Error].
+    args := Array with:arg.
+    [tokenType == #Keyword] whileTrue:[
+        sel := sel , tokenName.
         pos2 := tokenPosition + tokenName size - 1.
-        positions := OrderedCollection with:(pos1 to:pos2).
-        sel := tokenName.
-        lno := tokenLineNr.
+        positions add:(tokenPosition to:pos2).
         self nextToken.
         arg := self binaryExpression.
         (arg == #Error) ifTrue:[^ #Error].
-        args := Array with:arg.
-        [tokenType == #Keyword] whileTrue:[
-            sel := sel , tokenName.
-            pos2 := tokenPosition + tokenName size - 1.
-            positions add:(tokenPosition to:pos2).
-            self nextToken.
-            arg := self binaryExpression.
-            (arg == #Error) ifTrue:[^ #Error].
-            args := args copyWith:arg.
-        ].
-
-        positions do:[:p |
-            self markSelector:sel from:p start to:p stop receiverNode:receiver.
-        ].
-        sel := self selectorCheck:sel for:receiver positions:positions.
-
-        ignoreErrors ifFalse:[
-            (Class definitionSelectors includes:sel) ifTrue:[
-                receiver isVariable ifTrue:[
-                    receiver isUndeclared ifTrue:[
-                        self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2.
-                    ].
-                ]
-            ].
-        ].
-
-        lastReceiver := receiver.
-        try := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
-        (try isMemberOf:String) ifTrue:[
-            self parseError:try position:pos1 to:pos2.
-            errorFlag := false. "ok, user wants it - so he'll get it"
-            receiver := MessageNode receiver:receiver selector:sel args:args fold:nil.
-        ] ifFalse:[
-            receiver := try
-        ].
-        note := self plausibilityCheck:receiver.
-        note notNil ifTrue:[
-            self warning:note position:pos1 to:pos2
-        ].
-        receiver lineNumber:lno.
-        parseForCode ifFalse:[
-            self rememberSelectorUsed:sel receiver:lastReceiver
-        ].
+        args := args copyWith:arg.
+    ].
+
+    positions do:[:p |
+        self markSelector:sel from:p start to:p stop receiverNode:receiver.
+    ].
+    sel := self selectorCheck:sel for:receiver positions:positions.
+
+    ignoreErrors ifFalse:[
+        (Class definitionSelectors includes:sel) ifTrue:[
+            receiver isVariable ifTrue:[
+                receiver isUndeclared ifTrue:[
+                    self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2.
+                ].
+            ]
+        ].
+    ].
+
+    expr := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
+    expr isErrorNode ifTrue:[
+        self parseError:(expr errorString) position:pos1 to:pos2.
+        errorFlag := false. "ok, user wants it - so he'll get it"
+        expr := MessageNode receiver:receiver selector:sel args:args fold:nil.
+    ].
+    expr lineNumber:lno.
+    note := self plausibilityCheck:expr.
+    note notNil ifTrue:[
+        self warning:note position:pos1 to:pos2
+    ].
+    parseForCode ifFalse:[
+        self rememberSelectorUsed:sel receiver:receiver
+    ].
 
 "/        (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[    "/ do not check this for doits
 "/            receiver isSuper ifTrue:[
@@ -5265,20 +5262,19 @@
 "/            ].
 "/        ].
 "/
-        (sel = #and: or:[sel = #or:]) ifTrue:[
-            receiver arg1 isBlock ifFalse:[
-                self warnCommonMistake:'(possible common mistake) missing block brackets ?'
-                              position:pos2+1 to:tokenPosition-1
-            ]
-        ].
-        (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
-            receiver receiver isBlock ifFalse:[
-                self warnCommonMistake:'(possible common mistake) missing block brackets ?'
-                              position:posR1 to:posR2-1
-            ]
-        ].
-    ].
-    ^ receiver
+    (sel = #and: or:[sel = #or:]) ifTrue:[
+        expr arg1 isBlock ifFalse:[
+            self warnCommonMistake:'(possible common mistake) missing block brackets ?'
+                          position:pos2+1 to:tokenPosition-1
+        ]
+    ].
+    (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
+        expr receiver isBlock ifFalse:[
+            self warnCommonMistake:'(possible common mistake) missing block brackets ?'
+                          position:posR1 to:posR2-1
+        ]
+    ].
+    ^ expr.
 
     "Modified: / 19.1.2000 / 16:22:22 / cg"
 !
@@ -6180,34 +6176,65 @@
 unaryExpressionFor:receiverArg
     "parse a unary-expression; return a node-tree, nil or #Error"
 
-    |receiver thisReceiver sel pos pos2 try note|
+    |receiver expr sel pos pos2 note lNr arguments|
 
     receiver := receiverArg.
     (receiver == #Error) ifTrue:[^ #Error].
     [ self isValidUnarySelector:tokenType ] whileTrue:[
         pos := tokenPosition.
         pos2 := pos + tokenName size - 1.
-        self markSelector:tokenName from:pos to:pos2 receiverNode:receiver.
+        lNr := tokenLineNr.
         sel := tokenName.
+
+        self markSelector:sel from:pos to:pos2 receiverNode:receiver.
+
+        self nextToken.
+        tokenType == $( ifTrue:[
+            allowSqueakExtensions == true ifTrue:[
+                "/ croquet/squeak extension - c/java-style arguments
+                arguments := self functionCallArgList.
+                "/ synthetic selector: foo[:[with:[with:[...]]]]
+                arguments notEmpty ifTrue:[
+                    sel := sel , ':'.
+                    arguments size - 1 timesRepeat:[ sel := sel , 'with:' ].
+                ].
+                sel := self selectorCheck:sel for:receiver position:pos to:pos2.
+                expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants.
+                expr isErrorNode ifTrue:[
+                    self parseError:(expr errorString) position:pos to:pos2.
+                    errorFlag := false. "ok, user wants it - so he'll get it"
+                    expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
+                ].
+                expr lineNumber:lNr.
+                note := self plausibilityCheck:receiver.
+                note notNil ifTrue:[
+                    self warning:note position:pos to:pos2
+                ].
+                parseForCode ifFalse:[
+                    self rememberSelectorUsed:sel receiver:receiver
+                ].
+                ^ expr.
+            ].
+        ].
+
         sel := self selectorCheck:sel for:receiver position:pos to:pos2.
-        thisReceiver := receiver.
-        try := UnaryNode receiver:receiver selector:sel fold:foldConstants.
-        (try isMemberOf:String) ifTrue:[
-            self parseError:try position:pos to:pos2.
+        expr := UnaryNode receiver:receiver selector:sel fold:foldConstants.
+        expr isErrorNode ifTrue:[
+            self parseError:(expr errorString) position:pos to:pos2.
             errorFlag := false. "ok, user wants it - so he'll get it"
-            receiver := UnaryNode receiver:receiver selector:sel fold:nil.
-        ] ifFalse:[
-            receiver := try
-        ].
+            expr := UnaryNode receiver:receiver selector:sel fold:nil.
+        ].
+        expr lineNumber:lNr.
+
         note := self plausibilityCheck:receiver.
         note notNil ifTrue:[
             self warning:note position:pos to:pos2
         ].
-        receiver lineNumber:tokenLineNr.
         parseForCode ifFalse:[
-            self rememberSelectorUsed:sel receiver:thisReceiver
-        ].
-        self nextToken.
+            self rememberSelectorUsed:sel receiver:receiver
+        ].
+
+        receiver := expr.   "/ for next message
     ].
     ^ receiver
 
@@ -7588,7 +7615,7 @@
 !Parser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.431 2004-06-28 07:22:50 ca Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.432 2004-07-07 09:17:08 cg Exp $'
 ! !
 
 Parser initialize!