error handling refactored
authorClaus Gittinger <cg@exept.de>
Thu, 02 May 2002 11:09:10 +0200
changeset 1259 c3d7847b92c1
parent 1258 138039453522
child 1260 50e4668049aa
error handling refactored
Parser.st
--- a/Parser.st	Thu May 02 10:44:30 2002 +0200
+++ b/Parser.st	Thu May 02 11:09:10 2002 +0200
@@ -3038,6 +3038,18 @@
 
 !Parser methodsFor:'error handling'!
 
+blockArgRedefined:tokenName from:pos1 to:pos2
+    "argname reuse"
+
+    self isSyntaxHighlighter ifTrue:[
+        self markBadIdentifierFrom:pos1 to:pos2.
+    ] ifFalse:[
+        self 
+            syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
+            position:pos1 to:pos2
+    ].
+!
+
 exitWith:something
     "this is the longjump out of evaluation via a return expression"
 
@@ -3056,6 +3068,18 @@
     ^ #Error
 !
 
+methodArgRedefined:tokenName from:pos1 to:pos2
+    "argname reuse"
+
+    self isSyntaxHighlighter ifTrue:[
+        self markBadIdentifierFrom:pos1 to:pos2.
+    ] ifFalse:[
+        self 
+            syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
+            position:pos1 to:pos2
+    ].
+!
+
 showErrorMessage:aMessage position:pos
     "redefined since parser can give more detailed info about
      the class & selector where the error occured."
@@ -3236,14 +3260,7 @@
                 argNames := Array with:tokenName.
             ] ifFalse:[
                 (argNames includes:tokenName) ifTrue:[
-                    "/ argname reuse
-                    self isSyntaxHighlighter ifTrue:[
-                        self markBadIdentifierFrom:tokenPosition to:pos2.
-                    ] ifFalse:[
-                        self 
-                            syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
-                            position:tokenPosition to:pos2
-                    ]
+                    self blockArgRedefined:tokenName from:tokenPosition to:pos2
                 ].
                 args := args copyWith:arg.
                 argNames := argNames copyWith:tokenName.
@@ -3485,6 +3502,47 @@
     "Created: / 14.12.1999 / 15:11:37 / cg"
 !
 
+parseExtendedMethodSpec
+    |pos1 pos2 var|
+
+    "/ EXPERIMENTAL
+false ifTrue:[
+    (tokenType == #Symbol) ifTrue:[
+        pos1 := tokenPosition.
+        selector := token asSymbol.
+        self nextToken.
+        self markMethodSelectorFrom:pos1 to:(tokenPosition-1).
+        endOfSelectorPosition := tokenPosition.
+
+        tokenType == $( ifTrue:[
+            self nextToken.
+            [ tokenType ~~ $) ] whileTrue:[
+
+                (tokenType ~~ #Identifier) ifTrue:[^ #Error].
+                pos2 := tokenPosition+tokenName size-1.
+                self markArgumentIdentifierFrom:tokenPosition to:pos2.
+                var := Variable name:tokenName.
+                methodArgs isNil ifTrue:[
+                    methodArgs := Array with:var.
+                    methodArgNames := Array with:tokenName
+                ] ifFalse:[
+                    (methodArgNames includes:tokenName) ifTrue:[
+                        self methodArgRedefined:tokenName from:tokenPosition to:pos2
+                    ].
+                    methodArgs := methodArgs copyWith:var.
+                    methodArgNames := methodArgNames copyWith:tokenName
+                ].
+                self nextToken.
+            ].
+            self nextToken.
+        ].
+
+        ^ self
+    ].
+].
+    ^ #Error
+!
+
 parseMethod
     "parse a method.
      Return the parseTree or #Error.
@@ -3686,7 +3744,11 @@
             selector := selector , tokenName.
             self nextToken.
 
-            (tokenType ~~ #Identifier) ifTrue:[^ #Error].
+            (tokenType ~~ #Identifier) ifTrue:[
+                "/ ^ #Error].
+                ^ self identifierExpectedIn:'method-arg declaration'
+            ].
+
             pos2 := tokenPosition+tokenName size-1.
             self markArgumentIdentifierFrom:tokenPosition to:pos2.
             var := Variable name:tokenName.
@@ -3695,14 +3757,7 @@
                 methodArgNames := Array with:tokenName
             ] ifFalse:[
                 (methodArgNames includes:tokenName) ifTrue:[
-                    "/ argname reuse
-                    self isSyntaxHighlighter ifTrue:[
-                        self markBadIdentifierFrom:tokenPosition to:pos2.
-                    ] ifFalse:[
-                        self 
-                            syntaxError:'redefinition of ''' , tokenName , ''' in argument list.'
-                            position:tokenPosition to:pos2
-                    ]
+                    self methodArgRedefined:tokenName from:tokenPosition to:pos2
                 ].
                 methodArgs := methodArgs copyWith:var.
                 methodArgNames := methodArgNames copyWith:tokenName
@@ -3720,7 +3775,6 @@
         endOfSelectorPosition := tokenPosition.
         ^ self
     ].
-
     "/ special handling for |, which is also a lexical token
     tokenType == $| ifTrue:[
         tokenType := #BinaryOperator.
@@ -3747,7 +3801,7 @@
         ^ self
     ].
 
-    ^ #Error
+    ^ self parseExtendedMethodSpec
 
     "Modified: / 31.3.1998 / 17:31:59 / cg"
 !
@@ -6325,6 +6379,6 @@
 !Parser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.327 2002-03-05 17:55:45 tm Exp $'
+    ^ '$Header: /cvs/stx/stx/libcomp/Parser.st,v 1.328 2002-05-02 09:09:10 cg Exp $'
 ! !
 Parser initialize!