Optimization on JavaSourceHighlighter. development
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 05 Sep 2013 03:29:47 +0100
branchdevelopment
changeset 2707 165badf6c997
parent 2706 d15cdc953fbe
child 2708 648286432b9a
Optimization on JavaSourceHighlighter. Highlight Java code only on lexical basis. This avoids using PetitParser based parses which was way too slow for large sources and render highliting unusuable in real applications (ie.e, JImport expecco plugin). Also, this commit introduces Marker, a helper class for eclipse-based highlighter.
tools/JavaSourceHighlighter.st
--- a/tools/JavaSourceHighlighter.st	Tue Sep 03 14:09:43 2013 +0100
+++ b/tools/JavaSourceHighlighter.st	Thu Sep 05 03:29:47 2013 +0100
@@ -23,28 +23,15 @@
 Object subclass:#JavaSourceHighlighter
 	instanceVariableNames:'preferences cachedStringEmphasis cachedStringColor sourceText
 		sourceIndex'
-	classVariableNames:'FormattedSourceCache'
+	classVariableNames:''
 	poolDictionaries:''
 	category:'Languages-Java-Tools-Source'
 !
 
-PPParser subclass:#BlockParser
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	privateIn:JavaSourceHighlighter
-!
-
-JavaParseNodeBuilder subclass:#Builder
+Object subclass:#Marker
 	instanceVariableNames:'highlighter'
-	classVariableNames:''
-	poolDictionaries:''
-	privateIn:JavaSourceHighlighter
-!
-
-JavaParser subclass:#Parser
-	instanceVariableNames:'stream'
-	classVariableNames:''
+	classVariableNames:'MARK_KEYWORD MARK_NUMBER MARK_STRING MARK_CHARACTER MARK_COMMENT
+		MARK_JAVADOC MARK_KEYWORD_FLOW'
 	poolDictionaries:''
 	privateIn:JavaSourceHighlighter
 !
@@ -202,9 +189,10 @@
     ] on: Error do:[
 
     ].
-        ^ sourceText
+    ^ sourceText
 
     "Created: / 04-08-2013 / 00:25:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 05-09-2013 / 02:54:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
 formatExpression:source in:class
@@ -294,14 +282,20 @@
         sourceText := source asText.
     ].
 
-    scanner := Scanner for: source.  
-    builder := Builder new.
-    builder highlighter: self.
-    scanner highlighter: self.
-    parser := Parser newStartingAt: kind.
-    parser builder: builder.
-    parser stream: scanner.
-    tree := parser parse: scanner.
+    scanner := Scanner for: source.
+    scanner highlighter: self.     
+    [
+        [ scanner nextToken ~~ #EOF ] whileTrue.
+    ] on: Error do:[
+    ]. 
+
+"/    builder := Builder new.
+"/    builder highlighter: self.
+"/    scanner highlighter: self.
+"/    parser := Parser newStartingAt: kind.
+"/    parser builder: builder.
+"/    parser stream: scanner.
+"/    tree := parser parse: scanner.
 
     ^ cacheIt ifTrue:[
         document sourceText: sourceText.
@@ -315,7 +309,7 @@
     ]
 
     "Created: / 17-03-2012 / 14:02:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 30-08-2013 / 01:53:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-09-2013 / 02:56:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaSourceHighlighter methodsFor:'syntax detection'!
@@ -441,6 +435,24 @@
     "Modified: / 07-08-2013 / 00:28:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+markKeywordFlowFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:preferences controlFlowSelectorEmphasis
+        color:preferences controlFlowSelectorColor
+
+    "Created: / 05-09-2013 / 03:09:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+markKeywordFrom:pos1 to:pos2
+    self 
+        markFrom:pos1 to:pos2 
+        withEmphasis:preferences jsKeywordEmphasis
+        color:preferences jsKeywordColor
+
+    "Created: / 05-09-2013 / 03:09:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
 markLocalIdentifierFrom:pos1 to:pos2
     self 
         markFrom:pos1 to:pos2 
@@ -601,189 +613,46 @@
     "Modified: / 4.3.1999 / 12:56:13 / cg"
 ! !
 
-!JavaSourceHighlighter::BlockParser methodsFor:'parsing'!
-
-parseOn: aStream
-
-    | start stop scanner stack t |
-
+!JavaSourceHighlighter::Marker class methodsFor:'initialization'!
 
-    scanner := aStream. "/give it better name so the code is readable...
-    stack := Stack new:10.
-    t := scanner nextToken.
-    t ~~ ${ ifTrue:[
-        ^ PPFailure message: ('unexpected token (got ', (scanner tokenValue ? nil) printString , ' expecting { )') at: aStream position
-    ].
-    stack push: t.
-    [ t ~~ #EOF and:[ stack notEmpty ] ] whileTrue:[
-        "/Skip all non-paren like tokens...    
-        t := scanner nextToken.
-        [ ('{}[]()' includes: t) or: [ t == #EOF ] ] whileFalse:[
-            t := scanner nextToken.    
-        ].
-        ('{[(' includes: t) ifTrue:[
-            stack push: t.
-        ] ifFalse:[
-            | opening |
-
-            opening := '{[(' at: ('}])' indexOf: t).
-            stack top == opening ifTrue:[
-                stack pop
-            ] ifFalse:[
-                ^ PPFailure message: ('mispatched (got ''', t , ''' expecting ''', ('}])' at: ('{[(' indexOf: stack top)) , ''' )') at: aStream position
-            ]
-        ]
-    ].
-
-    stop := aStream position.
-    ^JavaScanner::Token new
-        type: #__Block__;
-        value: nil;
-        startPosition: start;
-        endPosition: stop;
-        yourself.
-
-
+initialize
+    "Invoked at system start or when the class is dynamically loaded."
 
     "
-        ( JavaBlockParser new trim , ';' asParser trim) parse: '{ } ;'
-
+    !!!! IMPORTANT !!!!!!
+    When changing / adding constants, make sure they
+    are in sync with those defined in Smaltalk
+    stx.libjava.tools.source.JavaSourceMarker !!!!!!
     "
 
-    "Modified: / 04-08-2013 / 01:42:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSourceHighlighter::Builder methodsFor:'accessing'!
-
-highlighter
-    ^ highlighter
-!
-
-highlighter:something
-    highlighter := something.
-! !
-
-!JavaSourceHighlighter::Builder methodsFor:'building'!
-
-newComment: text
+    self lookupObject: JavaLookup instance.
+    
+    MARK_KEYWORD := 1.
+    MARK_NUMBER := 2.
+    MARK_STRING := 3.
+    MARK_CHARACTER := 4.
+    MARK_COMMENT := 5.
+    MARK_JAVADOC := 6.
+    MARK_KEYWORD_FLOW := 7.
 
-    highlighter markCommentFrom:start to: stop.
-    ^super newComment: text
-
-    "Created: / 09-03-2012 / 17:11:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-newJavaDoc: text
-
-    highlighter markCommentFrom:start to: stop.
-    ^super newJavaDoc: text
-
-    "Created: / 09-03-2012 / 17:11:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-newStringLiteral: text
-
-    highlighter markStringFrom:start to: stop.
-    ^super newStringLiteral: text
-
-    "Created: / 22-04-2013 / 18:22:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 05-09-2013 / 03:14:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!JavaSourceHighlighter::Parser methodsFor:'accessing'!
-
-highlighter
-
-    ^builder highlighter
-
-    "Created: / 17-03-2012 / 19:11:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-stream
-    ^ stream
-!
-
-stream:something
-    stream := something.
-! !
-
-!JavaSourceHighlighter::Parser methodsFor:'grammar-classes-method'!
-
-constructorNameIdentifier
+!JavaSourceHighlighter::Marker methodsFor:'syntax detection'!
 
-    ^super constructorNameIdentifier ==> [:token|
-        self highlighter
-            markSelector: token value 
-                    from: token startPosition to: token endPosition
-    ]
-
-    "Created: / 17-03-2012 / 19:12:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-identifier
+mark: kind from:pos1 to:pos2
 
-    ^(JavaParserI::TokenParser for: #Identifier)
-
-    "Created: / 16-12-2012 / 10:29:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 17-01-2013 / 11:10:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-methodNameIdentifier
-
-    ^super methodNameIdentifier ==> [:token|
-        self highlighter
-            markSelector: token value 
-                    from: token startPosition to: token endPosition
-    ]
+    kind == MARK_KEYWORD        ifTrue:[ ^ highlighter markKeywordFrom: pos1 to: pos2 ].
+    kind == MARK_KEYWORD_FLOW   ifTrue:[ ^ highlighter markKeywordFlowFrom: pos1 to: pos2 ].
 
-    "Created: / 17-03-2012 / 19:13:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-typeNameIdentifier
-
-    ^super typeNameIdentifier ==> [:token|
-        self highlighter
-            markSelector: token value 
-                    from: token startPosition to: token endPosition
-    ]
-
-    "Created: / 17-03-2012 / 19:44:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSourceHighlighter::Parser methodsFor:'grammar-literals-string'!
-
-stringLiteral 
-
-    ^super stringLiteral ==> [:stringToken|
-        builder 
-            start: stringToken startPosition; 
-            stop: stringToken endPosition;
-            newStringLiteral: stringToken value
-    ]
+    kind == MARK_NUMBER         ifTrue:[ ^ highlighter markConstantFrom: pos1 to: pos2 ].
+    kind == MARK_STRING         ifTrue:[ ^ highlighter markConstantFrom: pos1 to: pos2 ].
+    kind == MARK_CHARACTER      ifTrue:[ ^ highlighter markConstantFrom: pos1 to: pos2 ].
 
-    "Created: / 17-03-2012 / 17:31:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 22-04-2013 / 18:13:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaSourceHighlighter::Parser methodsFor:'utility'!
-
-tokenFor: aString
+    kind == MARK_COMMENT       ifTrue:[ ^ highlighter markCommentFrom: pos1 to: pos2 ].
+    kind == MARK_JAVADOC       ifTrue:[ ^ highlighter markCommentFrom: pos1 to: pos2 ].
 
-"/    | p |
-"/
-"/    p := keywords at: aString ifAbsent:[nil].
-"/    p notNil ifTrue:[ 
-"/        ^ (self asToken: p) ==> [:token| 
-"/            | start stop |
-"/
-"/            stop := stream position.
-"/            start := stop - keyword size.
-"/            builder highlighter markKeyword: keyword from:start to:stop
-"/        ].
-"/    ].
-
-    ^super tokenFor: aString
-
-    "Created: / 10-03-2012 / 11:52:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 05-09-2013 / 03:03:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !JavaSourceHighlighter::Scanner methodsFor:'accessing'!
@@ -913,3 +782,5 @@
     ^ 'Id'
 ! !
 
+
+JavaSourceHighlighter::Marker initialize!