4738 ]. |
4738 ]. |
4739 self markSelector:sel from:pos to:(pos + sel size - 1) receiverNode:receiver. |
4739 self markSelector:sel from:pos to:(pos + sel size - 1) receiverNode:receiver. |
4740 |
4740 |
4741 arg := self unaryExpression. |
4741 arg := self unaryExpression. |
4742 (arg == #Error) ifTrue:[^ #Error]. |
4742 (arg == #Error) ifTrue:[^ #Error]. |
4743 theReceiver := receiver. |
4743 |
4744 |
4744 expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants. |
4745 try := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants. |
4745 expr isErrorNode ifTrue:[ |
4746 (try isMemberOf:String) ifTrue:[ |
4746 self parseError:(expr errorString) position:pos to:tokenPosition. |
4747 self parseError:try position:pos to:tokenPosition. |
|
4748 errorFlag := false. "ok, user wants it - so he'll get it" |
4747 errorFlag := false. "ok, user wants it - so he'll get it" |
4749 receiver := BinaryNode receiver:receiver selector:sel arg:arg fold:nil. |
4748 expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil. |
4750 ] ifFalse:[ |
4749 ]. |
4751 receiver := try |
4750 note := self plausibilityCheck:expr. |
4752 ]. |
|
4753 note := self plausibilityCheck:receiver. |
|
4754 note notNil ifTrue:[ |
4751 note notNil ifTrue:[ |
4755 self warning:note position:pos to:tokenPosition |
4752 self warning:note position:pos to:tokenPosition |
4756 ]. |
4753 ]. |
4757 receiver lineNumber:lno. |
4754 expr lineNumber:lno. |
4758 receiver selectorPosition:pos. |
4755 expr selectorPosition:pos. |
4759 parseForCode ifFalse:[ |
4756 parseForCode ifFalse:[ |
4760 self rememberSelectorUsed:sel receiver:theReceiver |
4757 self rememberSelectorUsed:sel receiver:receiver |
4761 ]. |
4758 ]. |
|
4759 receiver := expr. "/ for next message |
|
4760 |
4762 ]. |
4761 ]. |
4763 ^ receiver |
4762 ^ receiver |
4764 |
4763 |
4765 "Modified: / 9.1.1998 / 19:05:18 / stefan" |
4764 "Modified: / 9.1.1998 / 19:05:18 / stefan" |
4766 "Modified: / 19.1.2000 / 16:22:04 / cg" |
4765 "Modified: / 19.1.2000 / 16:22:04 / cg" |
5197 |
5196 |
5198 keywordExpression ::= binaryexpression |
5197 keywordExpression ::= binaryexpression |
5199 | { KEYWORD-PART binaryExpression } |
5198 | { KEYWORD-PART binaryExpression } |
5200 " |
5199 " |
5201 |
5200 |
5202 |lastReceiver receiver sel arg args posR1 posR2 pos1 pos2 try lno note positions| |
5201 |expr receiver sel arg args posR1 posR2 pos1 pos2 lno note positions| |
5203 |
5202 |
5204 receiver := receiverArg. |
5203 receiver := receiverArg. |
5205 posR1 := tokenPosition. |
5204 posR1 := tokenPosition. |
5206 (tokenType == #Keyword) ifTrue:[ |
5205 (tokenType == #Keyword) ifFalse:[^ receiver]. |
5207 pos1 := posR2 := tokenPosition. |
5206 |
|
5207 pos1 := posR2 := tokenPosition. |
|
5208 pos2 := tokenPosition + tokenName size - 1. |
|
5209 positions := OrderedCollection with:(pos1 to:pos2). |
|
5210 sel := tokenName. |
|
5211 lno := tokenLineNr. |
|
5212 self nextToken. |
|
5213 arg := self binaryExpression. |
|
5214 (arg == #Error) ifTrue:[^ #Error]. |
|
5215 args := Array with:arg. |
|
5216 [tokenType == #Keyword] whileTrue:[ |
|
5217 sel := sel , tokenName. |
5208 pos2 := tokenPosition + tokenName size - 1. |
5218 pos2 := tokenPosition + tokenName size - 1. |
5209 positions := OrderedCollection with:(pos1 to:pos2). |
5219 positions add:(tokenPosition to:pos2). |
5210 sel := tokenName. |
|
5211 lno := tokenLineNr. |
|
5212 self nextToken. |
5220 self nextToken. |
5213 arg := self binaryExpression. |
5221 arg := self binaryExpression. |
5214 (arg == #Error) ifTrue:[^ #Error]. |
5222 (arg == #Error) ifTrue:[^ #Error]. |
5215 args := Array with:arg. |
5223 args := args copyWith:arg. |
5216 [tokenType == #Keyword] whileTrue:[ |
5224 ]. |
5217 sel := sel , tokenName. |
5225 |
5218 pos2 := tokenPosition + tokenName size - 1. |
5226 positions do:[:p | |
5219 positions add:(tokenPosition to:pos2). |
5227 self markSelector:sel from:p start to:p stop receiverNode:receiver. |
5220 self nextToken. |
5228 ]. |
5221 arg := self binaryExpression. |
5229 sel := self selectorCheck:sel for:receiver positions:positions. |
5222 (arg == #Error) ifTrue:[^ #Error]. |
5230 |
5223 args := args copyWith:arg. |
5231 ignoreErrors ifFalse:[ |
5224 ]. |
5232 (Class definitionSelectors includes:sel) ifTrue:[ |
5225 |
5233 receiver isVariable ifTrue:[ |
5226 positions do:[:p | |
5234 receiver isUndeclared ifTrue:[ |
5227 self markSelector:sel from:p start to:p stop receiverNode:receiver. |
5235 self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2. |
5228 ]. |
5236 ]. |
5229 sel := self selectorCheck:sel for:receiver positions:positions. |
5237 ] |
5230 |
5238 ]. |
5231 ignoreErrors ifFalse:[ |
5239 ]. |
5232 (Class definitionSelectors includes:sel) ifTrue:[ |
5240 |
5233 receiver isVariable ifTrue:[ |
5241 expr := MessageNode receiver:receiver selector:sel args:args fold:foldConstants. |
5234 receiver isUndeclared ifTrue:[ |
5242 expr isErrorNode ifTrue:[ |
5235 self parseError:('undefined superclass: ' , receiver name) position:pos1 to:pos2. |
5243 self parseError:(expr errorString) position:pos1 to:pos2. |
5236 ]. |
5244 errorFlag := false. "ok, user wants it - so he'll get it" |
5237 ] |
5245 expr := MessageNode receiver:receiver selector:sel args:args fold:nil. |
5238 ]. |
5246 ]. |
5239 ]. |
5247 expr lineNumber:lno. |
5240 |
5248 note := self plausibilityCheck:expr. |
5241 lastReceiver := receiver. |
5249 note notNil ifTrue:[ |
5242 try := MessageNode receiver:receiver selector:sel args:args fold:foldConstants. |
5250 self warning:note position:pos1 to:pos2 |
5243 (try isMemberOf:String) ifTrue:[ |
5251 ]. |
5244 self parseError:try position:pos1 to:pos2. |
5252 parseForCode ifFalse:[ |
5245 errorFlag := false. "ok, user wants it - so he'll get it" |
5253 self rememberSelectorUsed:sel receiver:receiver |
5246 receiver := MessageNode receiver:receiver selector:sel args:args fold:nil. |
5254 ]. |
5247 ] ifFalse:[ |
|
5248 receiver := try |
|
5249 ]. |
|
5250 note := self plausibilityCheck:receiver. |
|
5251 note notNil ifTrue:[ |
|
5252 self warning:note position:pos1 to:pos2 |
|
5253 ]. |
|
5254 receiver lineNumber:lno. |
|
5255 parseForCode ifFalse:[ |
|
5256 self rememberSelectorUsed:sel receiver:lastReceiver |
|
5257 ]. |
|
5258 |
5255 |
5259 "/ (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[ "/ do not check this for doits |
5256 "/ (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[ "/ do not check this for doits |
5260 "/ receiver isSuper ifTrue:[ |
5257 "/ receiver isSuper ifTrue:[ |
5261 "/ sel ~= selector ifTrue:[ |
5258 "/ sel ~= selector ifTrue:[ |
5262 "/ self warnCommonMistake:'possible bad super message (selector should be same as in current method) ?' |
5259 "/ self warnCommonMistake:'possible bad super message (selector should be same as in current method) ?' |
5263 "/ position:posR1 to:posR2-1 |
5260 "/ position:posR1 to:posR2-1 |
5264 "/ ]. |
5261 "/ ]. |
5265 "/ ]. |
5262 "/ ]. |
5266 "/ ]. |
5263 "/ ]. |
5267 "/ |
5264 "/ |
5268 (sel = #and: or:[sel = #or:]) ifTrue:[ |
5265 (sel = #and: or:[sel = #or:]) ifTrue:[ |
5269 receiver arg1 isBlock ifFalse:[ |
5266 expr arg1 isBlock ifFalse:[ |
5270 self warnCommonMistake:'(possible common mistake) missing block brackets ?' |
5267 self warnCommonMistake:'(possible common mistake) missing block brackets ?' |
5271 position:pos2+1 to:tokenPosition-1 |
5268 position:pos2+1 to:tokenPosition-1 |
5272 ] |
5269 ] |
5273 ]. |
5270 ]. |
5274 (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[ |
5271 (sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[ |
5275 receiver receiver isBlock ifFalse:[ |
5272 expr receiver isBlock ifFalse:[ |
5276 self warnCommonMistake:'(possible common mistake) missing block brackets ?' |
5273 self warnCommonMistake:'(possible common mistake) missing block brackets ?' |
5277 position:posR1 to:posR2-1 |
5274 position:posR1 to:posR2-1 |
5278 ] |
5275 ] |
5279 ]. |
5276 ]. |
5280 ]. |
5277 ^ expr. |
5281 ^ receiver |
|
5282 |
5278 |
5283 "Modified: / 19.1.2000 / 16:22:22 / cg" |
5279 "Modified: / 19.1.2000 / 16:22:22 / cg" |
5284 ! |
5280 ! |
5285 |
5281 |
5286 nodeForMethodArg:varName |
5282 nodeForMethodArg:varName |
6178 ! |
6174 ! |
6179 |
6175 |
6180 unaryExpressionFor:receiverArg |
6176 unaryExpressionFor:receiverArg |
6181 "parse a unary-expression; return a node-tree, nil or #Error" |
6177 "parse a unary-expression; return a node-tree, nil or #Error" |
6182 |
6178 |
6183 |receiver thisReceiver sel pos pos2 try note| |
6179 |receiver expr sel pos pos2 note lNr arguments| |
6184 |
6180 |
6185 receiver := receiverArg. |
6181 receiver := receiverArg. |
6186 (receiver == #Error) ifTrue:[^ #Error]. |
6182 (receiver == #Error) ifTrue:[^ #Error]. |
6187 [ self isValidUnarySelector:tokenType ] whileTrue:[ |
6183 [ self isValidUnarySelector:tokenType ] whileTrue:[ |
6188 pos := tokenPosition. |
6184 pos := tokenPosition. |
6189 pos2 := pos + tokenName size - 1. |
6185 pos2 := pos + tokenName size - 1. |
6190 self markSelector:tokenName from:pos to:pos2 receiverNode:receiver. |
6186 lNr := tokenLineNr. |
6191 sel := tokenName. |
6187 sel := tokenName. |
|
6188 |
|
6189 self markSelector:sel from:pos to:pos2 receiverNode:receiver. |
|
6190 |
|
6191 self nextToken. |
|
6192 tokenType == $( ifTrue:[ |
|
6193 allowSqueakExtensions == true ifTrue:[ |
|
6194 "/ croquet/squeak extension - c/java-style arguments |
|
6195 arguments := self functionCallArgList. |
|
6196 "/ synthetic selector: foo[:[with:[with:[...]]]] |
|
6197 arguments notEmpty ifTrue:[ |
|
6198 sel := sel , ':'. |
|
6199 arguments size - 1 timesRepeat:[ sel := sel , 'with:' ]. |
|
6200 ]. |
|
6201 sel := self selectorCheck:sel for:receiver position:pos to:pos2. |
|
6202 expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants. |
|
6203 expr isErrorNode ifTrue:[ |
|
6204 self parseError:(expr errorString) position:pos to:pos2. |
|
6205 errorFlag := false. "ok, user wants it - so he'll get it" |
|
6206 expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil. |
|
6207 ]. |
|
6208 expr lineNumber:lNr. |
|
6209 note := self plausibilityCheck:receiver. |
|
6210 note notNil ifTrue:[ |
|
6211 self warning:note position:pos to:pos2 |
|
6212 ]. |
|
6213 parseForCode ifFalse:[ |
|
6214 self rememberSelectorUsed:sel receiver:receiver |
|
6215 ]. |
|
6216 ^ expr. |
|
6217 ]. |
|
6218 ]. |
|
6219 |
6192 sel := self selectorCheck:sel for:receiver position:pos to:pos2. |
6220 sel := self selectorCheck:sel for:receiver position:pos to:pos2. |
6193 thisReceiver := receiver. |
6221 expr := UnaryNode receiver:receiver selector:sel fold:foldConstants. |
6194 try := UnaryNode receiver:receiver selector:sel fold:foldConstants. |
6222 expr isErrorNode ifTrue:[ |
6195 (try isMemberOf:String) ifTrue:[ |
6223 self parseError:(expr errorString) position:pos to:pos2. |
6196 self parseError:try position:pos to:pos2. |
|
6197 errorFlag := false. "ok, user wants it - so he'll get it" |
6224 errorFlag := false. "ok, user wants it - so he'll get it" |
6198 receiver := UnaryNode receiver:receiver selector:sel fold:nil. |
6225 expr := UnaryNode receiver:receiver selector:sel fold:nil. |
6199 ] ifFalse:[ |
6226 ]. |
6200 receiver := try |
6227 expr lineNumber:lNr. |
6201 ]. |
6228 |
6202 note := self plausibilityCheck:receiver. |
6229 note := self plausibilityCheck:receiver. |
6203 note notNil ifTrue:[ |
6230 note notNil ifTrue:[ |
6204 self warning:note position:pos to:pos2 |
6231 self warning:note position:pos to:pos2 |
6205 ]. |
6232 ]. |
6206 receiver lineNumber:tokenLineNr. |
|
6207 parseForCode ifFalse:[ |
6233 parseForCode ifFalse:[ |
6208 self rememberSelectorUsed:sel receiver:thisReceiver |
6234 self rememberSelectorUsed:sel receiver:receiver |
6209 ]. |
6235 ]. |
6210 self nextToken. |
6236 |
|
6237 receiver := expr. "/ for next message |
6211 ]. |
6238 ]. |
6212 ^ receiver |
6239 ^ receiver |
6213 |
6240 |
6214 "Modified: / 6.2.2000 / 14:54:20 / cg" |
6241 "Modified: / 6.2.2000 / 14:54:20 / cg" |
6215 ! |
6242 ! |