SyntaxHighlighter2.st
branchjv
changeset 12401 4714b9640528
parent 12308 5d9291c0fc27
parent 11859 16062221ec57
child 12406 1fbd331e4489
equal deleted inserted replaced
12330:235b77901045 12401:4714b9640528
    60 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    60 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
    61 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    61 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
    62 OTHER DEALINGS IN THE SOFTWARE.
    62 OTHER DEALINGS IN THE SOFTWARE.
    63 "
    63 "
    64 ! !
    64 ! !
       
    65 
    65 
    66 
    66 !SyntaxHighlighter2 class methodsFor:'highlighting'!
    67 !SyntaxHighlighter2 class methodsFor:'highlighting'!
    67 
    68 
    68 formatClassDefinition:aString in:aClass elementsInto: elements
    69 formatClassDefinition:aString in:aClass elementsInto: elements
    69     "format (recolor) a class definition expression in a given class.
    70     "format (recolor) a class definition expression in a given class.
   209 
   210 
   210     "Modified: / 22-08-2006 / 13:32:04 / cg"
   211     "Modified: / 22-08-2006 / 13:32:04 / cg"
   211     "Created: / 05-07-2011 / 10:39:21 / cg"
   212     "Created: / 05-07-2011 / 10:39:21 / cg"
   212 ! !
   213 ! !
   213 
   214 
       
   215 
   214 !SyntaxHighlighter2 methodsFor:'accessing'!
   216 !SyntaxHighlighter2 methodsFor:'accessing'!
   215 
   217 
   216 elements
   218 elements
   217     ^ elements
   219     ^ elements
   218 !
   220 !
   229     super tree: aParseNode.
   231     super tree: aParseNode.
   230     elements tree: aParseNode
   232     elements tree: aParseNode
   231 
   233 
   232     "Created: / 16-02-2012 / 09:56:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   234     "Created: / 16-02-2012 / 09:56:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   233 ! !
   235 ! !
       
   236 
   234 
   237 
   235 !SyntaxHighlighter2 methodsFor:'initialization'!
   238 !SyntaxHighlighter2 methodsFor:'initialization'!
   236 
   239 
   237 initialize
   240 initialize
   238 
   241 
   242 
   245 
   243     "Created: / 14-02-2010 / 13:08:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   246     "Created: / 14-02-2010 / 13:08:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   244     "Modified: / 21-08-2011 / 09:37:35 / cg"
   247     "Modified: / 21-08-2011 / 09:37:35 / cg"
   245     "Modified: / 16-02-2012 / 09:59:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   248     "Modified: / 16-02-2012 / 09:59:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   246 ! !
   249 ! !
       
   250 
   247 
   251 
   248 !SyntaxHighlighter2 methodsFor:'parsing-expressions'!
   252 !SyntaxHighlighter2 methodsFor:'parsing-expressions'!
   249 
   253 
   250 _binaryExpressionFor:receiverArg
   254 _binaryExpressionFor:receiverArg
   251     "parse a binary-expression; return a node-tree, nil or #Error"
   255     "parse a binary-expression; return a node-tree, nil or #Error"
   540 
   544 
   541     "Modified: / 19-01-2000 / 16:22:16 / cg"
   545     "Modified: / 19-01-2000 / 16:22:16 / cg"
   542     "Created: / 16-02-2012 / 21:56:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   546     "Created: / 16-02-2012 / 21:56:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   543 !
   547 !
   544 
   548 
       
   549 binaryExpressionFor:receiverArg
       
   550     "parse a binary-expression; return a node-tree, nil or #Error"
       
   551 
       
   552     |receiver expr arg sel pos1 pos2 lno|
       
   553 
       
   554     receiver := receiverArg.
       
   555     (receiver == #Error) ifTrue:[^ #Error].
       
   556 
       
   557     "special kludge: since Scanner cannot know if -digit is a binary
       
   558      expression or a negative constant, handle cases here"
       
   559 
       
   560     [(tokenType == #BinaryOperator) 
       
   561      or:[(tokenType == $|)
       
   562      or:[(tokenType == $^ and:[parserFlags allowCaretAsBinop])
       
   563          or:[((tokenType == #Integer) or:[tokenType == #Float])
       
   564              and:[tokenValue < 0]]]]
       
   565     ] whileTrue:[
       
   566         "/ kludge alarm: in a function-call argList, #, is not a binarySelector
       
   567         inFunctionCallArgument == true ifTrue:[
       
   568             ((tokenType == #BinaryOperator) and:[tokenName = ',']) ifTrue:[
       
   569                 ^ receiver
       
   570             ].
       
   571         ].
       
   572 
       
   573         pos1 := tokenPosition.
       
   574         lno := tokenLineNr.
       
   575 
       
   576         "/ kludge alarm: bar, caret and minus are not scanned as binop
       
   577         (tokenType == $|) ifTrue:[
       
   578             sel := '|'.
       
   579             sel := self selectorCheck:sel for:receiver position:tokenPosition to:tokenPosition.
       
   580             self nextToken.
       
   581         ] ifFalse:[
       
   582             (tokenType == $^) ifTrue:[
       
   583                 sel := '^'.
       
   584                 sel := self selectorCheck:sel for:receiver position:tokenPosition to:tokenPosition.
       
   585                 self nextToken.
       
   586             ] ifFalse:[
       
   587                 (tokenType == #BinaryOperator) ifTrue:[
       
   588                     sel := tokenName.
       
   589                     sel := self selectorCheck:sel for:receiver position:tokenPosition to:(tokenPosition + tokenName size - 1).
       
   590                     self nextToken
       
   591                 ] ifFalse:[
       
   592                     sel := '-'.
       
   593                     token := tokenValue := tokenValue negated.
       
   594                     tokenPosition := tokenPosition + 1. "/ to skip the sign
       
   595                 ]
       
   596             ].
       
   597         ].
       
   598 
       
   599         pos2 := pos1 + sel size - 1.
       
   600         self markSelector:sel from:pos1 to:pos2 receiverNode:receiver.
       
   601         lastSelectorElement := nil.
       
   602 
       
   603         arg := self unaryExpression.
       
   604         (arg == #Error) ifTrue:[^ #Error].
       
   605 
       
   606         expr := BinaryNode receiver:receiver selector:sel arg:arg fold:foldConstants.
       
   607         expr isErrorNode ifTrue:[
       
   608             self parseError:(expr errorString) position:pos1 to:tokenPosition.
       
   609             errorFlag := false. "ok, user wants it - so he'll get it"
       
   610             expr := BinaryNode receiver:receiver selector:sel arg:arg fold:nil.
       
   611         ].
       
   612         expr lineNumber:lno.
       
   613         expr selectorPosition:pos1.
       
   614 
       
   615         self checkPlausibilityOf:expr from:pos1 to:pos2.
       
   616         receiver := expr.   "/ for next message
       
   617     ].
       
   618     ^ receiver
       
   619 
       
   620     "Modified: / 09-01-1998 / 19:05:18 / stefan"
       
   621     "Modified: / 14-02-2010 / 17:54:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   622     "Modified: / 19-01-2012 / 10:46:49 / cg"
       
   623 !
       
   624 
   545 expression
   625 expression
   546     | node savedLastSelectorElement |
   626     | node savedLastSelectorElement |
   547 
   627 
   548     savedLastSelectorElement := lastSelectorElement.
   628     savedLastSelectorElement := lastSelectorElement.
   549     lastSelectorElement := nil.
   629     lastSelectorElement := nil.
   558     ^node
   638     ^node
   559 
   639 
   560     "Modified: / 19-01-2000 / 16:22:16 / cg"
   640     "Modified: / 19-01-2000 / 16:22:16 / cg"
   561     "Modified: / 16-02-2012 / 23:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   641     "Modified: / 16-02-2012 / 23:39:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   562 !
   642 !
       
   643 
       
   644 
   563 
   645 
   564 unaryExpressionFor:receiverArg
   646 unaryExpressionFor:receiverArg
   565     "parse a unary-expression; return a node-tree, nil or #Error"
   647     "parse a unary-expression; return a node-tree, nil or #Error"
   566 
   648 
   567     |receiver expr sel pos pos2 lNr arguments savedLastSelectorElement|
   649     |receiver expr sel pos pos2 lNr arguments savedLastSelectorElement|
   597                     expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
   679                     expr := MessageNode receiver:receiver selector:sel args:arguments fold:nil.
   598                 ].
   680                 ].
   599                 lastSelectorElement node parent: expr.
   681                 lastSelectorElement node parent: expr.
   600                 expr lineNumber:lNr.
   682                 expr lineNumber:lNr.
   601                 self checkPlausibilityOf:expr from:pos to:pos2.
   683                 self checkPlausibilityOf:expr from:pos to:pos2.
   602                 parseForCode ifFalse:[
       
   603                     self rememberSelectorUsed:sel receiver:receiver
       
   604                 ].
       
   605                 ^ expr.
   684                 ^ expr.
   606             ].
   685             ].
   607         ].
   686         ].
   608 
   687 
   609         sel := self selectorCheck:sel for:receiver position:pos to:pos2.
   688         sel := self selectorCheck:sel for:receiver position:pos to:pos2.
   615         ].
   694         ].
   616         expr lineNumber:lNr.
   695         expr lineNumber:lNr.
   617         lastSelectorElement node parent: expr.
   696         lastSelectorElement node parent: expr.
   618 
   697 
   619         self checkPlausibilityOf:expr from:pos to:pos2.
   698         self checkPlausibilityOf:expr from:pos to:pos2.
   620         parseForCode ifFalse:[
       
   621             self rememberSelectorUsed:sel receiver:receiver
       
   622         ].
       
   623 
   699 
   624         receiver := expr.   "/ for next message
   700         receiver := expr.   "/ for next message
   625     ].
   701     ].
   626     lastSelectorElement := savedLastSelectorElement.
   702     lastSelectorElement := savedLastSelectorElement.
   627     ^ receiver
   703     ^ receiver
   648     ^node
   724     ^node
   649 
   725 
   650     "Modified: / 19-01-2000 / 16:22:16 / cg"
   726     "Modified: / 19-01-2000 / 16:22:16 / cg"
   651     "Created: / 16-02-2012 / 22:21:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   727     "Created: / 16-02-2012 / 22:21:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   652 ! !
   728 ! !
       
   729 
   653 
   730 
   654 !SyntaxHighlighter2 methodsFor:'syntax detection'!
   731 !SyntaxHighlighter2 methodsFor:'syntax detection'!
   655 
   732 
   656 markArgumentIdentifierFrom:pos1 to:pos2
   733 markArgumentIdentifierFrom:pos1 to:pos2
   657     | node el prevEl |
   734     | node el prevEl |
   674 
   751 
   675     super markBadIdentifierFrom:pos1 to:pos2
   752     super markBadIdentifierFrom:pos1 to:pos2
   676 
   753 
   677     "Created: / 17-03-2012 / 19:02:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   754     "Created: / 17-03-2012 / 19:02:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   678 !
   755 !
       
   756 
       
   757 
   679 
   758 
   680 markLocalIdentifierFrom:pos1 to:pos2
   759 markLocalIdentifierFrom:pos1 to:pos2
   681     | node el prevEl |
   760     | node el prevEl |
   682 
   761 
   683     super markLocalIdentifierFrom:pos1 to:pos2.
   762     super markLocalIdentifierFrom:pos1 to:pos2.
   722     "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   801     "Created: / 14-02-2010 / 17:40:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   723     "Modified (format): / 21-08-2011 / 09:18:21 / cg"
   802     "Modified (format): / 21-08-2011 / 09:18:21 / cg"
   724     "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   803     "Modified: / 19-04-2012 / 09:53:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
   725 !
   804 !
   726 
   805 
       
   806 
       
   807 
   727 markUnknownIdentifierFrom:pos1 to:pos2
   808 markUnknownIdentifierFrom:pos1 to:pos2
   728 
   809 
   729     ignoreBadIdentifier == true ifTrue:[ ^ self ].
   810     ignoreBadIdentifier == true ifTrue:[ ^ self ].
   730 
   811 
   731     super markUnknownIdentifierFrom:pos1 to:pos2
   812     super markUnknownIdentifierFrom:pos1 to:pos2
   732 
   813 
   733     "Created: / 31.3.1998 / 19:09:26 / cg"
   814     "Created: / 31.3.1998 / 19:09:26 / cg"
   734     "Modified: / 31.3.1998 / 19:10:30 / cg"
   815     "Modified: / 31.3.1998 / 19:10:30 / cg"
   735 !
   816 !
   736 
   817 
       
   818 
       
   819 
   737 rememberVariableElementFor:name type:typeSymbol from:pos1 to:pos2
   820 rememberVariableElementFor:name type:typeSymbol from:pos1 to:pos2
   738     |element prev|
   821     |element prev|
   739 
   822 
   740     prev := lastVariableElements at:name ifAbsent:[nil].
   823     prev := lastVariableElements at:name ifAbsent:[nil].
   741     (prev notNil and:[prev start == pos1]) ifTrue:[^ self].
   824     (prev notNil and:[prev start == pos1]) ifTrue:[^ self].
   748     elements add: element.
   831     elements add: element.
   749 
   832 
   750     "Created: / 21-08-2011 / 09:26:24 / cg"
   833     "Created: / 21-08-2011 / 09:26:24 / cg"
   751 ! !
   834 ! !
   752 
   835 
       
   836 
   753 !SyntaxHighlighter2 class methodsFor:'documentation'!
   837 !SyntaxHighlighter2 class methodsFor:'documentation'!
   754 
   838 
   755 version_CVS
   839 version_CVS
   756     ^ 'Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.10 2012/10/19 14:59:02 cg Exp '
   840     ^ '$Header: /cvs/stx/stx/libtool/SyntaxHighlighter2.st,v 1.10 2012-10-19 14:59:02 cg Exp $'
   757 !
   841 !
   758 
   842 
   759 version_SVN
   843 version_SVN
   760     ^ '$Id: SyntaxHighlighter2.st 8074 2012-11-30 17:23:39Z vranyj1 $'
   844     ^ '§Id: SyntaxHighlighter2.st 7715 2011-04-10 16:32:58Z vranyj1 §'
   761 ! !
   845 ! !
       
   846