#FEATURE by cg
authorClaus Gittinger <cg@exept.de>
Sat, 09 May 2020 13:23:13 +0200
changeset 4667 243c16a9e51a
parent 4650 e9b212d470ff
child 4668 ddbc1fbebe8e
#FEATURE by cg class: Parser added: #unknownVariableResolver comment/format in: #correctVariable:atPosition:to: changed: #variableOrError:
Parser.st
--- a/Parser.st	Sun May 03 23:44:59 2020 +0200
+++ b/Parser.st	Sat May 09 13:23:13 2020 +0200
@@ -3780,7 +3780,7 @@
 
     "Modified: / 22-01-1998 / 16:34:01 / stefan"
     "Modified: / 29-07-2013 / 23:11:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 21-06-2017 / 22:08:36 / cg"
+    "Modified: / 09-05-2020 / 13:16:45 / cg"
 !
 
 correctWith:correctionOperation from:pos1 to:pos2
@@ -9613,7 +9613,10 @@
 
     |varIndex aClass searchBlock args vars
      tokenSymbol space classVarIndex holder node
-     checkSharedPoolAction checkSharedPoolByNameAction varNameAsSymbolOrNil|
+     checkSharedPoolAction checkSharedPoolByNameAction varNameAsSymbolOrNil
+     endPosition|
+
+    endPosition := tokenPosition + varName size - 1.
 
     "is it a block-arg or block-var ?"
     searchBlock := currentBlock.
@@ -9625,7 +9628,7 @@
                 ^ (VariableNode type:#BlockVariable name:varName 
                         token:(vars at:varIndex) index:varIndex 
                         block:searchBlock from:currentBlock)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                    startPosition:tokenPosition endPosition:endPosition
             ].
         ].
 
@@ -9636,7 +9639,7 @@
                 ^ (VariableNode type:#BlockArg name:varName
                         token:(args at:varIndex) index:varIndex
                         block:searchBlock from:currentBlock)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                    startPosition: tokenPosition endPosition:endPosition
             ].
 
         ].
@@ -9667,7 +9670,7 @@
                 varIndex ~~ 0 ifTrue:[
                     ^ (VariableNode type:#ContextVariable name:varName
                             context:con index:varIndex)
-                        startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                        startPosition:tokenPosition endPosition:endPosition
                 ].
             ].
             con := con home.
@@ -9679,7 +9682,7 @@
             (sharedPool includesKey:varName) ifTrue:[
                 parseForCode ifFalse:[self rememberGlobalUsed:(sharedPool name , ':' , varName)].
                 ^ (VariableNode type:#PoolVariable class:sharedPool name:varName)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                    startPosition: tokenPosition endPosition:endPosition
             ].
         ].
 
@@ -9713,7 +9716,7 @@
                         self
                             warning:('there is both a class variable and a class-instance variable named "%1" (in %2).\\Refering to the class-instance variable here.' withCRs
                                         bindWith:varName with:(self whichClassIncludesClassVar:varName) name)
-                            position:tokenPosition to:tokenPosition+varName size-1.
+                            position:tokenPosition to:endPosition.
                         alreadyWarnedClassInstVarRefs add:varName.
                     ].
                 ].
@@ -9721,7 +9724,7 @@
             parseForCode ifFalse:[self rememberInstVarUsed:varName].
             ^ (VariableNode type:#InstanceVariable name:varName
                     index:varIndex selfValue:selfValue)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                    startPosition:tokenPosition endPosition:endPosition
         ].
 
         "/ see if there is a corresponding classVar (for the warning)
@@ -9747,7 +9750,7 @@
 
                             ^ (VariableNode type:#ClassInstanceVariable name:varName
                                     index:varIndex selfClass:aClass)
-                                startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                                startPosition:tokenPosition endPosition:endPosition
                         ].
                         self parseError:'access to class-inst-var from inst method is not allowed'.
                         ^ #Error.
@@ -9779,7 +9782,7 @@
             aClass notNil ifTrue:[
                 parseForCode ifFalse:[self rememberClassVarUsed:varName].
                 ^ (VariableNode type:#ClassVariable class:aClass name:varName)
-                        startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                        startPosition:tokenPosition endPosition:endPosition
             ].
             "/ self halt:'oops - should not happen'.
         ].
@@ -9792,7 +9795,7 @@
             (aClass privateClassesAt:varName) notNil ifTrue:[
                 parseForCode ifFalse:[self rememberGlobalUsed:(aClass name , '::' , varName)].
                 ^ (VariableNode type:#PrivateClass class:aClass name:varName)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                    startPosition:tokenPosition endPosition:endPosition
             ].
         ].
 
@@ -9809,7 +9812,7 @@
         (varNameAsSymbolOrNil := varName asSymbolIfInterned) notNil ifTrue:[          
             (Processor activeProcess environmentIncludesKey:varNameAsSymbolOrNil) ifTrue:[
                 ^ (VariableNode type:#ThreadLocal name:varName)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size -1
+                    startPosition:tokenPosition endPosition:endPosition
             ].    
         ].    
     ].
@@ -9821,13 +9824,13 @@
             parseForCode ifFalse:[self rememberGlobalUsed:(space name , '::' , varName)].
             space isNameSpace ifTrue:[
                 ^ (VariableNode globalNamed:(space name , '::' , varName))
-                        startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                        startPosition:tokenPosition endPosition:endPosition
             ].
             ^ (VariableNode type:#PrivateClass class:space name:varName)
-                startPosition: tokenPosition endPosition: tokenPosition + varName size -1
+                startPosition:tokenPosition endPosition:endPosition
         ].
         parseForCode ifFalse:[self rememberGlobalUsed:varName].
-        ^ (VariableNode globalNamed:varName) startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+        ^ (VariableNode globalNamed:varName) startPosition:tokenPosition endPosition:endPosition
     ].
 
     "is it a global-variable ?"
@@ -9835,7 +9838,7 @@
     tokenSymbol notNil ifTrue:[
         (Smalltalk includesKey:tokenSymbol) ifTrue:[
             parseForCode ifFalse:[self rememberGlobalUsed:varName].
-            ^ (VariableNode globalNamed:tokenSymbol) startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+            ^ (VariableNode globalNamed:tokenSymbol) startPosition:tokenPosition endPosition:endPosition
         ]
     ].
 
@@ -9850,30 +9853,32 @@
     "/ workspace variables must be found!!
     
     "/ (autoDefineVariables ~~ false) 
-    self isDoIt 
-    ifTrue:[
+    self isDoIt ifTrue:[
         "is it a workspace variable ?"
 
         (Workspace notNil
         and:[(holder := Workspace workspaceVariableHolderAt:varName) notNil])
         ifTrue:[
             ^ (VariableNode type:#WorkspaceVariable holder:holder name:varName)
-                startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
+                startPosition:tokenPosition endPosition:endPosition
         ].
         "/ self isDoIt 
-        (autoDefineVariables ~~ false) 
-        ifTrue:[
+        (autoDefineVariables ~~ false) ifTrue:[
             "is it a doIt variable ?"
 
             (doItTemporaries notNil
             and:[(holder := doItTemporaries at:varName asSymbol ifAbsent:nil) notNil])
             ifTrue:[
                 ^ (VariableNode type:#DoItTemporary holder:holder name:varName)
-                    startPosition: tokenPosition endPosition: tokenPosition + varName size - 1
-            ].
-        ].
-    ].
-    
+                    startPosition:tokenPosition endPosition:endPosition
+            ].
+        ].
+    ].
+
+    self unknownVariableResolver notNil ifTrue:[
+        ^ self unknownVariableResolver variableNodeFor:varName startPosition:tokenPosition endPosition:endPosition 
+    ].
+
     "/ do not raise parseError here, but instead report it via the old stupid #Error token.
     "/ this is required here so that the caller can check for an assignment,
     "/ and autodefine workspace- and doIt variables.
@@ -9882,9 +9887,9 @@
 
     "Modified: / 25-08-2011 / 13:53:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
     "Modified: / 05-10-2011 / 15:25:20 / az"
-    "Modified (comment): / 14-06-2017 / 15:11:42 / cg"
     "Modified (format): / 04-12-2018 / 11:28:12 / Stefan Vogel"
     "Modified: / 08-06-2019 / 18:27:36 / Claus Gittinger"
+    "Modified: / 09-05-2020 / 13:22:04 / cg"
 ! !
 
 !Parser methodsFor:'parsing-primitives & pragmas'!
@@ -11199,6 +11204,12 @@
 "/    ^ selfNode
 
     "Modified: / 19-07-2011 / 17:22:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+unknownVariableResolver
+    ^ nil
+
+    "Created: / 09-05-2020 / 13:16:19 / cg"
 ! !
 
 !Parser methodsFor:'queries'!