#FEATURE by cg
class: Parser
added: #unknownVariableResolver
comment/format in: #correctVariable:atPosition:to:
changed: #variableOrError:
--- 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'!