SyntaxHighlighter2.st
changeset 13844 c2938013239e
parent 13313 de38ade7083d
child 14056 1b0f6f3c4bbd
equal deleted inserted replaced
13843:9cebfd34c0f4 13844:c2938013239e
    24 OTHER DEALINGS IN THE SOFTWARE.
    24 OTHER DEALINGS IN THE SOFTWARE.
    25 "
    25 "
    26 "{ Package: 'stx:libtool' }"
    26 "{ Package: 'stx:libtool' }"
    27 
    27 
    28 SyntaxHighlighter subclass:#SyntaxHighlighter2
    28 SyntaxHighlighter subclass:#SyntaxHighlighter2
    29 	instanceVariableNames:'elements lastVariableElements lastSelectorElement'
    29 	instanceVariableNames:'elements lastVariableElements lastSelectorElement
       
    30 		ignoreBadIdentifier'
    30 	classVariableNames:''
    31 	classVariableNames:''
    31 	poolDictionaries:''
    32 	poolDictionaries:''
    32 	category:'Interface-CodeView-Syntax'
    33 	category:'Interface-CodeView-Syntax'
    33 !
    34 !
    34 
    35 
   130 
   131 
   131 formatExpression:aString in:aClass elementsInto: elements
   132 formatExpression:aString in:aClass elementsInto: elements
   132     "format (recolor) an expression in a given class.
   133     "format (recolor) an expression in a given class.
   133      Return the text containing font changes and color information."
   134      Return the text containing font changes and color information."
   134 
   135 
   135     ^ self 
   136     |parser tree text endPos|
   136         format:aString parsingWith:[:parser | parser expression]
   137 
   137         in:aClass elementsInto:elements
   138     aString isNil ifTrue:[^ nil].
       
   139 
       
   140     parser := self for:(ReadStream on:aString string) in:aClass.
       
   141     parser elements: elements.
       
   142     parser ignoreErrors:true.
       
   143     parser ignoreWarnings:true.
       
   144     parser sourceText:(text := aString string asText).
       
   145     "/ use an array here - this can be changed much faster using #at:put:
       
   146     text emphasisCollection:(Array new:aString size).
       
   147 
       
   148     parser nextToken.
       
   149     tree := parser "expression"statementList.
       
   150     "/ now, convert the emphasis-array to a runArray
       
   151     text emphasisCollection:(text emphasis asRunArray).
       
   152 
       
   153     tree == #Error ifTrue:[
       
   154 	"/ mhmh - which is better ...
       
   155 	"/ alternative1: color rest after error in red
       
   156 "/        text
       
   157 "/            emphasizeFrom:(parser sourceStream position)
       
   158 "/            to:text size
       
   159 "/            with:(#color->Color red).
       
   160 
       
   161 
       
   162 	"/ alternative2: take original emphasis for rest
       
   163 
       
   164 	endPos := parser sourceStream position1Based.
       
   165 	endPos >= text size ifTrue:[
       
   166 	    ^ text
       
   167 	].
       
   168 	^ ((text copyTo:endPos) , (aString copyFrom:(endPos+1))).
       
   169 
       
   170 	"/ alternative3: no emphasis for rest.
       
   171 
       
   172 "/        ^ text "/ aString
       
   173     ].
       
   174     ^ text
   138 
   175 
   139     "
   176     "
   140      self
   177      self
   141         formatExpression:'(1 + 2) max:5' 
   178 	formatExpression:'(1 + 2) max:5'
   142         in:UndefinedObject
   179 	in:UndefinedObject
   143         elementsInto:(OrderedCollection new)
       
   144     "
   180     "
       
   181 
       
   182     "Created: / 25-07-2010 / 08:56:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   183     "Modified: / 25-07-2010 / 10:57:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   145 !
   184 !
   146 
   185 
   147 formatMethod:aString in:aClass using:preferencesOrNil elementsInto: elements
   186 formatMethod:aString in:aClass using:preferencesOrNil elementsInto: elements
   148     "format (recolor) a method in a given class.
   187     "format (recolor) a method in a given class.
   149      Return the text containing font changes and color information."
   188      Return the text containing font changes and color information."
   167 
   206 
   168     aString isNil ifTrue:[^ nil].
   207     aString isNil ifTrue:[^ nil].
   169 
   208 
   170     Error handle:[:ex |
   209     Error handle:[:ex |
   171         ex creator isHandled ifTrue:[
   210         ex creator isHandled ifTrue:[
   172             ex reject.    
   211             ex reject.
   173         ].
   212         ].
   174         (self parseErrorSignal handles:ex) ifFalse:[
   213         (self parseErrorSignal handles:ex) ifFalse:[
   175             "Parse error may happen when re-formatting incomplete code while editing"
   214             "Parse error may happen when re-formatting incomplete code while editing"
   176             ('SyntaxHighlighter [info]: error during highlight: ' , ex description) infoPrintCR.
   215             ('SyntaxHighlighter [info]: error during highlight: ' , ex description) infoPrintCR.
   177             "/ ex suspendedContext fullPrintAll.
   216             "/ ex suspendedContext fullPrintAll.
   194         tree == #Error ifTrue:[
   233         tree == #Error ifTrue:[
   195             eColor := UserPreferences current errorColor.
   234             eColor := UserPreferences current errorColor.
   196             eColor notNil ifTrue:[
   235             eColor notNil ifTrue:[
   197                 "/ mhmh - which is better ...
   236                 "/ mhmh - which is better ...
   198                 "/ alternative1: color rest after error in red
   237                 "/ alternative1: color rest after error in red
   199                 text 
   238                 text
   200                     emphasizeFrom:(highlighter sourceStream position + 1) 
   239                     emphasizeFrom:(highlighter sourceStream position + 1) 
   201                     to:text size 
   240                     to:text size
   202                     with:(#color->eColor).
   241                     with:(#color->eColor).
   203             ] ifFalse:[
   242             ] ifFalse:[
   204                 "/ alternative2: take original emphasis for rest
   243                 "/ alternative2: take original emphasis for rest
   205 
   244 
   206                 endPos := highlighter sourceStream position + 1.
   245                 endPos := highlighter sourceStream position + 1.
   209                 ].
   248                 ].
   210                 ^ ((text copyTo:endPos) , (aString copyFrom:(endPos+1)))
   249                 ^ ((text copyTo:endPos) , (aString copyFrom:(endPos+1)))
   211             ].
   250             ].
   212             "/ alternative3: no emphasis for rest.
   251             "/ alternative3: no emphasis for rest.
   213         ].
   252         ].
   214         ^text 
   253         ^text
   215     ]
   254     ]
   216     "
   255     "
   217      self
   256      self
   218         formatMethod:'foo 
   257         formatMethod:'foo
   219     ^ self bar:''hello''.
   258     ^ self bar:''hello''.
   220 
   259 
   221     ' , (Character doubleQuote asString) , 'some comment' , (Character doubleQuote asString) , '
   260     ' , (Character doubleQuote asString) , 'some comment' , (Character doubleQuote asString) , '
   222 '
   261 '
   223         in:UndefinedObject
   262         in:UndefinedObject
   224     "
   263     "
   225 
   264 
   226     "Modified: / 22-08-2006 / 13:32:04 / cg"
   265     "Modified: / 22-08-2006 / 13:32:04 / cg"
   227     "Created: / 05-07-2011 / 10:39:21 / cg"
   266     "Created: / 05-07-2011 / 10:39:21 / cg"
       
   267     "Modified: / 28-05-2013 / 22:45:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   228 !
   268 !
   229 
   269 
   230 formatStatementList:aString in:aClass elementsInto: elements
   270 formatStatementList:aString in:aClass elementsInto: elements
   231     "format (recolor) a statement list in a given class.
   271     "format (recolor) a statement list in a given class.
   232      Return the text containing font changes and color information."
   272      Return the text containing font changes and color information."
   247 
   287 
   248 elements
   288 elements
   249     ^ elements
   289     ^ elements
   250 !
   290 !
   251 
   291 
   252 elements:something
   292 elements:aParseTreeIndex
   253     "the element collection, to collect variables, selectors etc. into"
   293     "the element collection, to collect variables, selectors etc. into"
   254 
   294 
   255     elements := something.
   295     elements := aParseTreeIndex.
   256 
   296 
   257     "Modified (comment): / 21-08-2011 / 09:13:31 / cg"
   297     "Modified (comment): / 21-08-2011 / 09:13:31 / cg"
       
   298 !
       
   299 
       
   300 tree: aParseNode
       
   301     super tree: aParseNode.
       
   302     elements tree: aParseNode
       
   303 
       
   304     "Created: / 16-02-2012 / 09:56:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   258 ! !
   305 ! !
   259 
   306 
   260 !SyntaxHighlighter2 methodsFor:'initialization'!
   307 !SyntaxHighlighter2 methodsFor:'initialization'!
   261 
   308 
   262 initialize
   309 initialize
   263 
   310 
   264     super initialize.
   311     super initialize.
   265     elements := SortedCollection new.
   312     elements := ParseTreeIndex new.
   266     lastVariableElements := Dictionary new.
   313     lastVariableElements := Dictionary new.
   267 
   314 
   268     "Created: / 14-02-2010 / 13:08:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   315     "Created: / 14-02-2010 / 13:08:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   269     "Modified: / 25-06-2010 / 13:04:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   270     "Modified: / 21-08-2011 / 09:37:35 / cg"
   316     "Modified: / 21-08-2011 / 09:37:35 / cg"
       
   317     "Modified: / 16-02-2012 / 09:59:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   271 ! !
   318 ! !
   272 
   319 
   273 !SyntaxHighlighter2 methodsFor:'parsing-expressions'!
   320 !SyntaxHighlighter2 methodsFor:'parsing-expressions'!
       
   321 
       
   322 _binaryExpressionFor:receiverArg
       
   323     "parse a binary-expression; return a node-tree, nil or #Error"
       
   324 
       
   325     |receiver expr arg sel pos1 pos2 lno|
       
   326 
       
   327     receiver := receiverArg.
       
   328     (receiver == #Error) ifTrue:[^ #Error].
       
   329 
       
   330     "special kludge: since Scanner cannot know if -digit is a binary
       
   331      expression or a negative constant, handle cases here"
       
   332 
       
   333     [(tokenType == #BinaryOperator)
       
   334      or:[(tokenType == $|)
       
   335      or:[(tokenType == $^ and:[parserFlags allowCaretAsBinop])
       
   336 	 or:[((tokenType == #Integer) or:[tokenType == #Float])
       
   337 	     and:[tokenValue < 0]]]]
       
   338     ] whileTrue:[
       
   339 	"/ kludge alarm: in a function-call argList, #, is not a binarySelector
       
   340 	inFunctionCallArgument == true ifTrue:[
       
   341 	    ((tokenType == #BinaryOperator) and:[tokenName = ',']) ifTrue:[
       
   342 		^ receiver
       
   343 	    ].
       
   344 	].
       
   345 
       
   346 	pos1 := tokenPosition.
       
   347 	lno := tokenLineNr.
       
   348 
       
   349 	"/ kludge alarm: bar, caret and minus are not scanned as binop
       
   350 	(tokenType == $|) ifTrue:[
       
   351 	    sel := '|'.
       
   352 	    sel := self selectorCheck:sel for:receiver position:tokenPosition to:tokenPosition.
       
   353 	    self nextToken.
       
   354 	] ifFalse:[
       
   355 	    (tokenType == $^) ifTrue:[
       
   356 		sel := '^'.
       
   357 		sel := self selectorCheck:sel for:receiver position:tokenPosition to:tokenPosition.
       
   358 		self nextToken.
       
   359 	    ] ifFalse:[
       
   360 		(tokenType == #BinaryOperator) ifTrue:[
       
   361 		    sel := tokenName.
       
   362 		    sel := self selectorCheck:sel for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
       
   363 		    self nextToken
       
   364 		] ifFalse:[
       
   365 		    sel := '-'.
       
   366 		    token := tokenValue := tokenValue negated.
       
   367 		    tokenPosition := tokenPosition + 1. "/ to skip the sign
       
   368 		]
       
   369 	    ].
       
   370 	].
       
   371 
       
   372 	pos2 := pos1 + sel size - 1.
       
   373 	self markSelector:sel from:pos1 to:pos2 receiverNode:receiver.
       
   374 	lastSelectorElement := nil.
       
   375 
       
   376 	arg := self unaryExpression.
       
   377 	(arg == #Error) ifTrue:[^ #Error].
       
   378 
       
   379 	expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
       
   380 	expr isErrorNode ifTrue:[
       
   381 	    self parseError:(expr errorString) position:pos1 to:tokenPosition.
       
   382 	    errorFlag := false. "ok, user wants it - so he'll get it"
       
   383 	    expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
       
   384 	].
       
   385 	expr lineNumber:lno.
       
   386 	expr selectorPosition:pos1.
       
   387 
       
   388 	self checkPlausibilityOf:expr from:pos1 to:pos2.
       
   389 	parseForCode ifFalse:[
       
   390 	    self rememberSelectorUsed:sel receiver:receiver
       
   391 	].
       
   392 	receiver := expr.   "/ for next message
       
   393     ].
       
   394     ^ receiver
       
   395 
       
   396     "Modified: / 09-01-1998 / 19:05:18 / stefan"
       
   397     "Modified: / 14-02-2010 / 17:54:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   398     "Modified: / 19-01-2012 / 10:46:49 / cg"
       
   399     "Created: / 16-02-2012 / 21:54:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   400 !
       
   401 
       
   402 _keywordExpressionFor:receiverArg
       
   403     "parse a keyword-expression; return a node-tree, nil or #Error.
       
   404 
       
   405      keywordExpression ::= binaryexpression
       
   406 			   | { KEYWORD-PART binaryExpression }
       
   407     "
       
   408 
       
   409     |expr receiver sel arg args posR1 posR2 pos1 pos2 lno positions constVal|
       
   410 
       
   411     receiver := receiverArg.
       
   412     posR1 := tokenPosition.
       
   413     (tokenType == #Keyword) ifFalse:[^ receiver].
       
   414 
       
   415     pos1 := posR2 := tokenPosition.
       
   416     pos2 := tokenPosition + tokenName size - 1.
       
   417     positions := OrderedCollection with:(pos1 to:pos2).
       
   418     sel := tokenName.
       
   419     lno := tokenLineNr.
       
   420     self nextToken.
       
   421     arg := self binaryExpression.
       
   422     (arg == #Error) ifTrue:[^ #Error].
       
   423     args := Array with:arg.
       
   424     [tokenType == #Keyword] whileTrue:[
       
   425 	sel := sel , tokenName.
       
   426 	pos2 := tokenPosition + tokenName size - 1.
       
   427 	positions add:(tokenPosition to:pos2).
       
   428 	self nextToken.
       
   429 	arg := self binaryExpression.
       
   430 	(arg == #Error) ifTrue:[^ #Error].
       
   431 	args := args copyWith:arg.
       
   432     ].
       
   433 
       
   434     positions do:[:p |
       
   435 	self markSelector:sel from:p start to:p stop receiverNode:receiver.
       
   436     ].
       
   437     lastSelectorElement := nil.
       
   438     sel := self selectorCheck:sel for:receiver positions:positions.
       
   439 
       
   440     ignoreWarnings ifFalse:[
       
   441 	(Class definitionSelectors includes:sel) ifTrue:[
       
   442 	    (receiver isVariable and:[receiver isUndeclared]) ifTrue:[
       
   443 		"this is not an error - the undefined class may be loaded after this code!!"
       
   444 		self warning:('as yet undefined superclass: ' , receiver name) position:pos1 to:pos2.
       
   445 	    ].
       
   446 	].
       
   447     ].
       
   448 
       
   449     expr := MessageNode receiver:receiver selector:sel args:args fold:foldConstants.
       
   450     expr isErrorNode ifTrue:[
       
   451 	self parseError:(expr errorString) position:pos1 to:pos2.
       
   452 	errorFlag := false. "ok, user wants it - so he'll get it"
       
   453 	expr := MessageNode receiver:receiver selector:sel args:args fold:nil.
       
   454     ].
       
   455     expr lineNumber:lno.
       
   456     self checkPlausibilityOf:expr from:pos1 to:pos2.
       
   457     parseForCode ifFalse:[
       
   458 	self rememberSelectorUsed:sel receiver:receiver
       
   459     ].
       
   460 
       
   461 "/        (contextToEvaluateIn isNil and:[selfValue isNil]) ifTrue:[    "/ do not check this for doits
       
   462 "/            receiver isSuper ifTrue:[
       
   463 "/                sel ~= selector ifTrue:[
       
   464 "/                    self warnCommonMistake:'possible bad super message (selector should be same as in current method) ?'
       
   465 "/                                  position:posR1 to:posR2-1
       
   466 "/                ].
       
   467 "/            ].
       
   468 "/        ].
       
   469 "/
       
   470 
       
   471     (sel = #ifTrue: or:[sel = #ifFalse: or:[sel = #ifTrue:ifFalse: or:[sel = #ifFalse:ifTrue:]]]) ifTrue:[
       
   472 	(expr receiver withConstantValueDo:[:val | constVal := val]) ifTrue:[
       
   473 	    |indexOfArgNotExecuted|
       
   474 
       
   475 	    "/ receiver evaluates to a constant
       
   476 	    constVal == true ifTrue:[
       
   477 		(sel startsWith: #ifFalse:) ifTrue:[
       
   478 		    indexOfArgNotExecuted := 1.
       
   479 		] ifFalse:[
       
   480 		    indexOfArgNotExecuted := 2.
       
   481 		]
       
   482 	    ].
       
   483 	    constVal == false ifTrue:[
       
   484 		(sel startsWith: #ifTrue:) ifTrue:[
       
   485 		    indexOfArgNotExecuted := 1.
       
   486 		] ifFalse:[
       
   487 		    indexOfArgNotExecuted := 2.
       
   488 		]
       
   489 	    ].
       
   490 	    indexOfArgNotExecuted == 2 ifTrue:[
       
   491 		args size == 1 ifTrue:[ indexOfArgNotExecuted := nil]
       
   492 	    ].
       
   493 
       
   494 	    indexOfArgNotExecuted notNil ifTrue:[
       
   495 		|argIsNotExecuted|
       
   496 
       
   497 		"/ self warning:'receiver is constant; arg',indexOfArgNotExecuted printString,' is never executed' position:pos1 to:tokenPosition.
       
   498 		argIsNotExecuted := expr args at:indexOfArgNotExecuted.
       
   499 		argIsNotExecuted isBlockNode ifTrue:[
       
   500 		    self markCommentFrom:argIsNotExecuted startPosition to:argIsNotExecuted endPosition.
       
   501 		].
       
   502 	    ].
       
   503 	].
       
   504     ].
       
   505 
       
   506     (ignoreErrors or:[ignoreWarnings]) ifFalse:[
       
   507 	(sel = #and: or:[sel = #or:]) ifTrue:[
       
   508 	    expr arg1 isBlock ifFalse:[
       
   509 		(expr arg1 isVariable
       
   510 		and:[ (expr arg1 name asLowercase includesString:'block')]) ifFalse:[
       
   511 		    self warnCommonMistake:'(possible common mistake) missing block brackets ?'
       
   512 			      position:pos2+1 to:tokenPosition-1
       
   513 		]
       
   514 	    ].
       
   515 	    ^ expr.
       
   516 	].
       
   517 
       
   518 	(sel = #whileTrue: or:[sel = #whileFalse:]) ifTrue:[
       
   519 	    expr receiver isBlock ifFalse:[
       
   520 		(expr receiver isVariable
       
   521 		and:[ (expr receiver name asLowercase includesString:'block')]) ifFalse:[
       
   522 		    self warnCommonMistake:'(possible common mistake) missing block brackets ?'
       
   523 			      position:pos1 to:pos2
       
   524 		]
       
   525 	    ].
       
   526 	    ^ expr.
       
   527 	].
       
   528 
       
   529 	(sel = #ifTrue: or:[sel = #ifFalse:]) ifTrue:[
       
   530 	    expr receiver isMessage ifTrue:[
       
   531 		(expr receiver selector = #whileTrue or:[expr receiver selector = #whileFalse]) ifTrue:[
       
   532 		    self warnCommonMistake:'strange receiver expression'
       
   533 			      position:pos1 to:pos2
       
   534 		].
       
   535 	    ].
       
   536 	    ^ expr
       
   537 	].
       
   538     ].
       
   539 
       
   540     ^ expr.
       
   541 
       
   542     "Modified: / 14-02-2010 / 17:58:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   543     "Modified: / 19-01-2012 / 10:47:01 / cg"
       
   544     "Created: / 16-02-2012 / 21:54:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   545 !
       
   546 
       
   547 _unaryExpressionFor:receiverArg
       
   548     "parse a unary-expression; return a node-tree, nil or #Error"
       
   549 
       
   550     |receiver expr sel pos pos2 lNr arguments|
       
   551 
       
   552     receiver := receiverArg.
       
   553     (receiver == #Error) ifTrue:[^ #Error].
       
   554 
       
   555     [ self isValidUnarySelector:tokenType ] whileTrue:[
       
   556 	pos := tokenPosition.
       
   557 	pos2 := pos + tokenName size - 1.
       
   558 	lNr := tokenLineNr.
       
   559 	sel := tokenName.
       
   560 
       
   561 	self markSelector:sel from:pos to:pos2 receiverNode:receiver.
       
   562 	lastSelectorElement := nil.
       
   563 
       
   564 	self nextToken.
       
   565 	tokenType == $( ifTrue:[
       
   566 	    parserFlags allowSqueakExtensions == true ifTrue:[
       
   567 		"/ croquet/squeak extension - c/java-style arguments
       
   568 		arguments := self functionCallArgList.
       
   569 		"/ synthetic selector: foo[:[with:[with:[...]]]]
       
   570 		arguments notEmpty ifTrue:[
       
   571 		    sel := sel , ':'.
       
   572 		    arguments size - 1 timesRepeat:[ sel := sel , 'with:' ].
       
   573 		].
       
   574 		sel := self selectorCheck:sel for:receiver position:pos to:pos2.
       
   575 		expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants.
       
   576 		expr isErrorNode ifTrue:[
       
   577 		    self parseError:(expr errorString) position:pos to:pos2.
       
   578 		    errorFlag := false. "ok, user wants it - so he'll get it"
       
   579 		    expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
       
   580 		].
       
   581 		expr lineNumber:lNr.
       
   582 		self checkPlausibilityOf:expr from:pos to:pos2.
       
   583 		parseForCode ifFalse:[
       
   584 		    self rememberSelectorUsed:sel receiver:receiver
       
   585 		].
       
   586 		^ expr.
       
   587 	    ].
       
   588 	].
       
   589 
       
   590 	sel := self selectorCheck:sel for:receiver position:pos to:pos2.
       
   591 	expr := UnaryNode receiver:receiver selector:sel fold:foldConstants.
       
   592 	expr isErrorNode ifTrue:[
       
   593 	    self warning:(expr errorString , '.\\If you proceed, that error will happen at runtime.') withCRs position:pos to:pos2.
       
   594 	    errorFlag := false. "ok, user wants it - so he'll get it"
       
   595 	    expr := UnaryNode receiver:receiver selector:sel fold:nil.
       
   596 	].
       
   597 	expr lineNumber:lNr.
       
   598 
       
   599 	self checkPlausibilityOf:expr from:pos to:pos2.
       
   600 	parseForCode ifFalse:[
       
   601 	    self rememberSelectorUsed:sel receiver:receiver
       
   602 	].
       
   603 
       
   604 	receiver := expr.   "/ for next message
       
   605     ].
       
   606     ^ receiver
       
   607 
       
   608     "Modified: / 14-02-2010 / 17:56:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   609     "Modified: / 19-01-2012 / 10:47:37 / cg"
       
   610     "Created: / 16-02-2012 / 21:54:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   611 !
       
   612 
       
   613 binaryExpression
       
   614     | node savedLastSelectorElement |
       
   615 
       
   616     savedLastSelectorElement := lastSelectorElement.
       
   617     lastSelectorElement := nil.
       
   618     node := super binaryExpression.
       
   619     (lastSelectorElement notNil and:[node ~~ #Error and:[node isMessage]]) ifTrue:[
       
   620 	lastSelectorElement node parent: node.
       
   621     ].
       
   622     lastSelectorElement := savedLastSelectorElement.
       
   623     ^node
       
   624 
       
   625     "Modified: / 19-01-2000 / 16:22:16 / cg"
       
   626     "Created: / 16-02-2012 / 21:56:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   627 !
   274 
   628 
   275 binaryExpressionFor:receiverArg
   629 binaryExpressionFor:receiverArg
   276     "parse a binary-expression; return a node-tree, nil or #Error"
   630     "parse a binary-expression; return a node-tree, nil or #Error"
   277 
   631 
   278     |receiver expr arg sel pos1 pos2 lno|
   632     |receiver expr arg sel pos1 pos2 lno|
   347     "Modified: / 14-02-2010 / 17:54:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   701     "Modified: / 14-02-2010 / 17:54:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   348     "Modified: / 19-01-2012 / 10:46:49 / cg"
   702     "Modified: / 19-01-2012 / 10:46:49 / cg"
   349 !
   703 !
   350 
   704 
   351 expression
   705 expression
   352     "parse a cascade-expression; return a node-tree, nil or #Error.
   706     | node savedLastSelectorElement |
   353 
   707 
   354      expression ::= keywordExpression
   708     savedLastSelectorElement := lastSelectorElement.
   355                     | keywordExpression cascade
   709     lastSelectorElement := nil.
   356 
   710     node := super expression.
   357      cascade ::= ';' expressionSendPart
   711     ((node ~~ #Error) and:[node isMessage]) ifTrue:[
   358                  | cascade ';' expressionSendPart
   712         [ lastSelectorElement notNil ] whileTrue:[
   359 
   713             lastSelectorElement node parent: node.
   360      expressionSendPart ::= { KEYWORD binaryExpression }
   714             lastSelectorElement := lastSelectorElement prev.
   361                             | BINARYOPERATOR unaryExpression
   715         ].
   362                             | IDENTIFIER
   716     ].
   363     "
   717     lastSelectorElement := savedLastSelectorElement.
   364 
   718     ^node
   365     |receiver arg sel args pos pos2 lno tokenEnd realReceiver positions|
       
   366 
       
   367     pos := tokenPosition.
       
   368     receiver := self keywordExpression.
       
   369     (receiver == #Error) ifTrue:[^ #Error].
       
   370     (tokenType == $;) ifTrue:[
       
   371         receiver isMessage ifFalse:[
       
   372             self syntaxError:'left side of cascade must be a message expression'
       
   373                     position:pos to:tokenPosition.
       
   374             realReceiver := receiver. "/ only to allow continuing.
       
   375         ] ifTrue:[
       
   376             realReceiver := receiver receiver.
       
   377         ].
       
   378         [tokenType == $;] whileTrue:[
       
   379             self nextToken.
       
   380             (tokenType == #Identifier) ifTrue:[
       
   381                 tokenEnd := tokenPosition + tokenName size - 1.
       
   382                 self markSelector:tokenName from:tokenPosition to:tokenEnd receiverNode:realReceiver.
       
   383                 sel := tokenName.
       
   384                 sel := self selectorCheck:tokenName for:realReceiver position:tokenPosition to:tokenEnd.
       
   385                 receiver := CascadeNode receiver:receiver selector:sel.
       
   386                 receiver lineNumber:tokenLineNr.
       
   387                 self nextToken.
       
   388             ] ifFalse:[
       
   389                 (tokenType == #BinaryOperator) ifTrue:[
       
   390                     tokenEnd := tokenPosition + tokenName size - 1.
       
   391                     self markSelector:tokenName from:tokenPosition to:tokenEnd receiverNode:realReceiver.
       
   392                     lastSelectorElement := nil.
       
   393                     sel := tokenName.
       
   394                     sel := self selectorCheck:tokenName for:realReceiver position:tokenPosition to:tokenEnd.
       
   395                     lno := tokenLineNr. 
       
   396                     self nextToken.
       
   397                     arg := self unaryExpression.
       
   398                     (arg == #Error) ifTrue:[^ #Error].
       
   399                     receiver := CascadeNode receiver:receiver selector:sel arg:arg.
       
   400                     receiver lineNumber:lno.
       
   401                 ] ifFalse:[
       
   402                     (tokenType == #Keyword) ifTrue:[
       
   403                         tokenEnd := tokenPosition + tokenName size - 1.
       
   404                         positions := OrderedCollection with:(tokenPosition to:tokenEnd).
       
   405                         pos := tokenPosition.
       
   406                         pos2 := tokenEnd.
       
   407                         lno := tokenLineNr. 
       
   408                         sel := tokenName.
       
   409                         self nextToken.
       
   410                         arg := self binaryExpression.
       
   411                         (arg == #Error) ifTrue:[^ #Error].
       
   412                         args := Array with:arg.
       
   413                         [tokenType == #Keyword] whileTrue:[
       
   414                             tokenEnd := tokenPosition + tokenName size - 1.
       
   415                             positions add:(tokenPosition to:tokenEnd).
       
   416                             sel := sel , tokenName.
       
   417                             self nextToken.
       
   418                             arg := self binaryExpression.
       
   419                             (arg == #Error) ifTrue:[^ #Error].
       
   420                             args := args copyWith:arg.
       
   421                             pos2 := tokenEnd
       
   422                         ].
       
   423                         positions do:[:p |
       
   424                             self markSelector:sel from:p start to:p stop receiverNode:realReceiver.
       
   425                         ].
       
   426                         lastSelectorElement := nil.                                
       
   427 
       
   428                         sel := self selectorCheck:sel for:realReceiver position:pos to:pos2.
       
   429 
       
   430                         receiver := CascadeNode receiver:receiver selector:sel args:args.
       
   431                         receiver lineNumber:lno.
       
   432                     ] ifFalse:[
       
   433                         (tokenType == #Error) ifTrue:[^ #Error].
       
   434                         self syntaxError:('invalid cascade; ' , tokenType printString , ' unexpected')
       
   435                                 position:tokenPosition to:source position.
       
   436                         ^ #Error
       
   437                     ]
       
   438                 ]
       
   439             ]
       
   440         ].
       
   441 
       
   442         "obscure (unspecified ?) if selector follows; Question:
       
   443 
       
   444         is
       
   445                 'expr sel1; sel2 sel3'
       
   446 
       
   447         to be parsed as: 
       
   448                 (t := expr.
       
   449                  t sel1.
       
   450                  t sel2) sel3
       
   451 
       
   452          or:
       
   453                 (t := expr.
       
   454                  t sel1.
       
   455                  t sel2 sel3)
       
   456         "
       
   457         ((tokenType == #Identifier) 
       
   458          or:[(tokenType == #BinaryOperator)
       
   459              or:[tokenType == #Keyword]]) ifTrue:[
       
   460             self syntaxError:'ambigous cascade - please group using (...)'
       
   461                     position:tokenPosition to:source position.
       
   462             ^ #Error
       
   463 "/            self warning: "syntaxError:" 'possibly ambigous cascade - please group using (...)'
       
   464 "/                    position:tokenPosition to:source position - 1.
       
   465 "/            tokenType == #Identifier ifTrue:[
       
   466 "/                ^ self unaryExpressionFor:receiver
       
   467 "/            ].
       
   468 "/            tokenType == #BinaryOperator ifTrue:[
       
   469 "/                ^ self binaryExpressionFor:receiver
       
   470 "/            ].
       
   471 "/            ^ self keywordExpressionFor:receiver
       
   472         ]
       
   473     ].
       
   474     ^ receiver
       
   475 
   719 
   476     "Modified: / 19-01-2000 / 16:22:16 / cg"
   720     "Modified: / 19-01-2000 / 16:22:16 / cg"
   477     "Modified: / 14-02-2010 / 17:58:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   721     "Modified: / 16-02-2012 / 23:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   478 !
   722 !
   479 
   723 
   480 keywordExpressionFor:receiverArg
   724 keywordExpressionFor:receiverArg
   481     "parse a keyword-expression; return a node-tree, nil or #Error.
   725     "parse a keyword-expression; return a node-tree, nil or #Error.
   482 
   726 
   619 !
   863 !
   620 
   864 
   621 unaryExpressionFor:receiverArg
   865 unaryExpressionFor:receiverArg
   622     "parse a unary-expression; return a node-tree, nil or #Error"
   866     "parse a unary-expression; return a node-tree, nil or #Error"
   623 
   867 
   624     |receiver expr sel pos pos2 lNr arguments|
   868     |receiver expr sel pos pos2 lNr arguments savedLastSelectorElement|
   625 
   869 
       
   870     savedLastSelectorElement := lastSelectorElement.
   626     receiver := receiverArg.
   871     receiver := receiverArg.
   627     (receiver == #Error) ifTrue:[^ #Error].
   872     (receiver == #Error) ifTrue:[^ #Error].
   628 
   873 
   629     [ self isValidUnarySelector:tokenType ] whileTrue:[
   874     [ self isValidUnarySelector:tokenType ] whileTrue:[
   630         pos := tokenPosition.
   875 	pos := tokenPosition.
   631         pos2 := pos + tokenName size - 1.
   876 	pos2 := pos + tokenName size - 1.
   632         lNr := tokenLineNr.
   877 	lNr := tokenLineNr.
   633         sel := tokenName.
   878 	sel := tokenName.
   634 
   879 
   635         self markSelector:sel from:pos to:pos2 receiverNode:receiver.
   880 	lastSelectorElement := nil.
   636         lastSelectorElement := nil.
   881 	self markSelector:sel from:pos to:pos2 receiverNode:receiver.
   637 
   882 
   638         self nextToken.
   883 	self nextToken.
   639         tokenType == $( ifTrue:[
   884 	tokenType == $( ifTrue:[
   640             parserFlags allowSqueakExtensions == true ifTrue:[
   885 	    parserFlags allowSqueakExtensions == true ifTrue:[
   641                 "/ croquet/squeak extension - c/java-style arguments
   886 		"/ croquet/squeak extension - c/java-style arguments
   642                 arguments := self functionCallArgList.
   887 		arguments := self functionCallArgList.
   643                 "/ synthetic selector: foo[:[with:[with:[...]]]]
   888 		"/ synthetic selector: foo[:[with:[with:[...]]]]
   644                 arguments notEmpty ifTrue:[
   889 		arguments notEmpty ifTrue:[
   645                     sel := sel , ':'.
   890 		    sel := sel , ':'.
   646                     arguments size - 1 timesRepeat:[ sel := sel , 'with:' ].
   891 		    arguments size - 1 timesRepeat:[ sel := sel , 'with:' ].
   647                 ].
   892 		].
   648                 sel := self selectorCheck:sel for:receiver position:pos to:pos2.
   893 		sel := self selectorCheck:sel for:receiver position:pos to:pos2.
   649                 expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants.
   894 		expr := MessageNode receiver:receiver selector:sel args:arguments fold:foldConstants.
   650                 expr isErrorNode ifTrue:[
   895 		expr isErrorNode ifTrue:[
   651                     self parseError:(expr errorString) position:pos to:pos2.
   896 		    self parseError:(expr errorString) position:pos to:pos2.
   652                     errorFlag := false. "ok, user wants it - so he'll get it"
   897 		    errorFlag := false. "ok, user wants it - so he'll get it"
   653                     expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
   898 		    expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
   654                 ].
   899 		].
   655                 expr lineNumber:lNr.
   900 		lastSelectorElement node parent: expr.
   656                 self checkPlausibilityOf:expr from:pos to:pos2.
   901 		expr lineNumber:lNr.
   657                 ^ expr.
   902 		self checkPlausibilityOf:expr from:pos to:pos2.
   658             ].
   903 		parseForCode ifFalse:[
   659         ].
   904 		    self rememberSelectorUsed:sel receiver:receiver
   660 
   905 		].
   661         sel := self selectorCheck:sel for:receiver position:pos to:pos2.
   906 		^ expr.
   662         expr := UnaryNode receiver:receiver selector:sel fold:foldConstants.
   907 	    ].
   663         expr isErrorNode ifTrue:[
   908 	].
   664             self warning:(expr errorString , '.\\If you proceed, that error will happen at runtime.') withCRs position:pos to:pos2.
   909 
   665             errorFlag := false. "ok, user wants it - so he'll get it"
   910 	sel := self selectorCheck:sel for:receiver position:pos to:pos2.
   666             expr := UnaryNode receiver:receiver selector:sel fold:nil.
   911 	expr := UnaryNode receiver:receiver selector:sel fold:foldConstants.
   667         ].
   912 	expr isErrorNode ifTrue:[
   668         expr lineNumber:lNr.
   913 	    self warning:(expr errorString , '.\\If you proceed, that error will happen at runtime.') withCRs position:pos to:pos2.
   669 
   914 	    errorFlag := false. "ok, user wants it - so he'll get it"
   670         self checkPlausibilityOf:expr from:pos to:pos2.
   915 	    expr := UnaryNode receiver:receiver selector:sel fold:nil.
   671 
   916 	].
   672         receiver := expr.   "/ for next message
   917 	expr lineNumber:lNr.
   673     ].
   918 	lastSelectorElement node parent: expr.
       
   919 
       
   920 	self checkPlausibilityOf:expr from:pos to:pos2.
       
   921 	parseForCode ifFalse:[
       
   922 	    self rememberSelectorUsed:sel receiver:receiver
       
   923 	].
       
   924 
       
   925 	receiver := expr.   "/ for next message
       
   926     ].
       
   927     lastSelectorElement := savedLastSelectorElement.
   674     ^ receiver
   928     ^ receiver
   675 
   929 
   676     "Modified: / 14-02-2010 / 17:56:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   677     "Modified: / 19-01-2012 / 10:47:37 / cg"
   930     "Modified: / 19-01-2012 / 10:47:37 / cg"
       
   931     "Created: / 16-02-2012 / 23:50:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   932 !
       
   933 
       
   934 variable
       
   935     | node |
       
   936 
       
   937     ignoreBadIdentifier := classToCompileFor isNil.
       
   938     node := super variable.
       
   939     ignoreBadIdentifier := false.
       
   940     node isVariable ifTrue:[
       
   941 	| el prevEl |
       
   942 
       
   943 	el := elements newElementFor: node.
       
   944 	prevEl := lastVariableElements at:node name ifAbsent:[nil].
       
   945 	prevEl notNil ifTrue:[prevEl next:el].
       
   946 	lastVariableElements at:node name put:el.
       
   947 	elements add: el.
       
   948     ].
       
   949     ^node
       
   950 
       
   951     "Modified: / 19-01-2000 / 16:22:16 / cg"
       
   952     "Created: / 16-02-2012 / 22:21:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   678 ! !
   953 ! !
   679 
   954 
   680 !SyntaxHighlighter2 methodsFor:'syntax detection'!
   955 !SyntaxHighlighter2 methodsFor:'syntax detection'!
       
   956 
       
   957 markArgumentIdentifierFrom:pos1 to:pos2
       
   958     | node el prevEl |
       
   959 
       
   960     super markArgumentIdentifierFrom:pos1 to:pos2.
       
   961     node := VariableNode methodArgumentNamed:(sourceText string copyFrom: pos1 to: pos2).
       
   962     node startPosition: pos1 endPosition: pos2.
       
   963     el := elements newElementFor: node.
       
   964     prevEl := lastVariableElements at:node name ifAbsent:[nil].
       
   965     prevEl notNil ifTrue:[prevEl next:el].
       
   966     lastVariableElements at:node name put:el.
       
   967     elements add: el.
       
   968 
       
   969     "Created: / 24-07-2010 / 09:25:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   970     "Modified: / 21-08-2011 / 09:27:26 / cg"
       
   971     "Modified: / 16-02-2012 / 22:34:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   972 !
   681 
   973 
   682 markAssignedVariable:v from:pos to:endPos
   974 markAssignedVariable:v from:pos to:endPos
   683     super markAssignedVariable:v from:pos to:endPos.
   975     super markAssignedVariable:v from:pos to:endPos.
   684     (v type == #GlobalVariable) ifTrue:[^self].
   976     (v type == #GlobalVariable) ifTrue:[^self].
   685 
   977 
   686     self rememberVariableElementFor:v name type:v type from:pos to:endPos assigned:true
   978     self rememberVariableElementFor:v name type:v type from:pos to:endPos assigned:true
       
   979 !
       
   980 
       
   981 markBadIdentifierFrom:pos1 to:pos2
       
   982 
       
   983     super markBadIdentifierFrom:pos1 to:pos2
       
   984 
       
   985     "Created: / 17-03-2012 / 19:02:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   687 !
   986 !
   688 
   987 
   689 markGlobalClassIdentifierFrom:pos1 to:pos2
   988 markGlobalClassIdentifierFrom:pos1 to:pos2
   690 
   989 
   691     | name env cls |
   990     | name env cls |
   707     "Modified: / 15-02-2010 / 10:53:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  1006     "Modified: / 15-02-2010 / 10:53:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   708     "Modified: / 18-11-2011 / 14:54:53 / cg"
  1007     "Modified: / 18-11-2011 / 14:54:53 / cg"
   709 !
  1008 !
   710 
  1009 
   711 markLocalIdentifierFrom:pos1 to:pos2
  1010 markLocalIdentifierFrom:pos1 to:pos2
       
  1011     | node el prevEl |
       
  1012 
   712     super markLocalIdentifierFrom:pos1 to:pos2.
  1013     super markLocalIdentifierFrom:pos1 to:pos2.
   713     self rememberVariableElementFor:tokenName type:#MethodVariable from:pos1 to:pos2 assigned:false
  1014     node := VariableNode methodLocalNamed:(sourceText string copyFrom: pos1 to: pos2).
       
  1015     node startPosition: pos1 endPosition: pos2.
       
  1016     el := elements newElementFor: node.
       
  1017     prevEl := lastVariableElements at:node name ifAbsent:[nil].
       
  1018     prevEl notNil ifTrue:[prevEl next:el].
       
  1019     lastVariableElements at:node name put:el.
       
  1020     elements add: el.
       
  1021 
       
  1022     "Modified: / 21-08-2011 / 09:27:26 / cg"
       
  1023     "Created: / 16-02-2012 / 22:36:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   714 !
  1024 !
   715 
  1025 
   716 markMethodArgumentIdentifierFrom:pos1 to:pos2
  1026 markMethodArgumentIdentifierFrom:pos1 to:pos2
   717     super markMethodArgumentIdentifierFrom:pos1 to:pos2.
  1027     super markMethodArgumentIdentifierFrom:pos1 to:pos2.
   718     self rememberVariableElementFor:tokenName type:#MethodArg from:pos1 to:pos2 assigned:false
  1028     self rememberVariableElementFor:tokenName type:#MethodArg from:pos1 to:pos2 assigned:false
   723 
  1033 
   724 markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNode
  1034 markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNode
   725 
  1035 
   726     | element selectorSymbol |
  1036     | element selectorSymbol |
   727 
  1037 
   728     super markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNode.
  1038     "Special hack for Java class references - I would like to have them
       
  1039      marked specially (and not as an error when the class is not yet loaded -
       
  1040      the code is correct as JavaClassAccessor loads it lazily"
       
  1041     (aReceiverNode isJavaPackageReference) ifTrue:[
       
  1042 	self
       
  1043 	    markFrom:pos1 to:pos2
       
  1044 	    withEmphasis:preferences globalClassIdentifierEmphasis
       
  1045 	    color: preferences globalClassIdentifierColor
       
  1046     ] ifFalse:[
       
  1047 	super markSelector:selectorString from:pos1 to:pos2 receiverNode:aReceiverNode.
       
  1048     ].
       
  1049 
   729     "don't create symbols for partial typed selectors"
  1050     "don't create symbols for partial typed selectors"
   730     selectorSymbol := selectorString asSymbolIfInterned.
  1051     selectorSymbol := selectorString asSymbolIfInterned.
   731 
  1052 
   732     element := SyntaxElement from: pos1 to: pos2 type: #selector value: (selectorSymbol ? selectorString).
  1053     element := elements newElementFor: (SelectorNode value: selectorString from: pos1 to: pos2).
   733     lastSelectorElement ifNotNil:[lastSelectorElement next: element].
  1054 
       
  1055     (lastSelectorElement notNil "and:[lastSelectorElement value = selectorString]") ifTrue:[
       
  1056 	lastSelectorElement next: element.
       
  1057     ].
   734     elements add: element.
  1058     elements add: element.
   735     lastSelectorElement := element.
  1059     lastSelectorElement := "(self isValidUnarySelector:tokenType)"false
       
  1060 				ifTrue:[nil]
       
  1061 				ifFalse:[element].
   736 
  1062 
   737     "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  1063     "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   738     "Modified: / 14-02-2010 / 19:24:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  1064     "Modified: / 14-02-2010 / 19:24:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   739     "Modified (format): / 21-08-2011 / 09:18:21 / cg"
  1065     "Modified (format): / 21-08-2011 / 09:18:21 / cg"
       
  1066     "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   740 !
  1067 !
   741 
  1068 
   742 markSelfFrom:pos1 to:pos2
  1069 markSelfFrom:pos1 to:pos2
   743     super markSelfFrom:pos1 to:pos2.
  1070     super markSelfFrom:pos1 to:pos2.
   744     self rememberVariableElementFor:'self' type:#self from:pos1 to:pos2
  1071     self rememberVariableElementFor:'self' type:#self from:pos1 to:pos2
   746     "Created: / 21-08-2011 / 09:15:45 / cg"
  1073     "Created: / 21-08-2011 / 09:15:45 / cg"
   747 !
  1074 !
   748 
  1075 
   749 markUnknownIdentifierFrom:pos1 to:pos2
  1076 markUnknownIdentifierFrom:pos1 to:pos2
   750 
  1077 
   751     classToCompileFor notNil 
  1078     ignoreBadIdentifier == true ifTrue:[ ^ self ].
   752         ifTrue:[super markUnknownIdentifierFrom:pos1 to:pos2]
  1079 
   753         ifFalse:[self markLocalIdentifierFrom: pos1 to: pos2].
  1080     super markUnknownIdentifierFrom:pos1 to:pos2
   754 
  1081 
   755     "Created: / 24-07-2010 / 09:51:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
  1082     "Created: / 31.3.1998 / 19:09:26 / cg"
   756     "Modified: / 02-08-2011 / 09:35:02 / cg"
  1083     "Modified: / 31.3.1998 / 19:10:30 / cg"
   757 !
  1084 !
   758 
  1085 
   759 markVariable:v from:pos1 to:pos2 assigned:assigned
  1086 markVariable:v from:pos1 to:pos2 assigned:assigned
   760     super markVariable:v from:pos1 to:pos2 assigned:assigned.
  1087     super markVariable:v from:pos1 to:pos2 assigned:assigned.
   761     (v type == #GlobalVariable) ifTrue:[^self].
  1088     (v type == #GlobalVariable) ifTrue:[^self].
   792 ! !
  1119 ! !
   793 
  1120 
   794 !SyntaxHighlighter2 class methodsFor:'documentation'!
  1121 !SyntaxHighlighter2 class methodsFor:'documentation'!
   795 
  1122 
   796 version
  1123 version
   797     ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.18 2013-08-10 11:10:24 stefan Exp $'
  1124     ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.19 2014-02-05 18:59:09 cg Exp $'
   798 !
  1125 !
   799 
  1126 
   800 version_CVS
  1127 version_CVS
   801     ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.18 2013-08-10 11:10:24 stefan Exp $'
  1128     ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.19 2014-02-05 18:59:09 cg Exp $'
   802 !
  1129 !
   803 
  1130 
   804 version_SVN
  1131 version_SVN
   805     ^ '$Id: SyntaxHighlighter2.st,v 1.18 2013-08-10 11:10:24 stefan Exp $'
  1132     ^ '$Id: SyntaxHighlighter2.st,v 1.19 2014-02-05 18:59:09 cg Exp $'
   806 ! !
  1133 ! !
   807 
  1134