tools/java/src/stx/libjava/tools/text/Highlighter.java
branchdevelopment
changeset 2728 658220e93dc9
parent 2727 0d4d725cc712
child 2733 3d97124aebf5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/java/src/stx/libjava/tools/text/Highlighter.java	Thu Sep 12 00:24:05 2013 +0100
@@ -0,0 +1,254 @@
+package stx.libjava.tools.text;
+
+import org.eclipse.jdt.core.compiler.InvalidInputException;
+import org.eclipse.jdt.internal.compiler.ASTVisitor;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.MessageSend;
+import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
+import org.eclipse.jdt.internal.compiler.lookup.ClassScope;
+import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+
+import stx.libjava.tools.parser.Parser;
+
+public class Highlighter extends Parser {
+    
+    protected Marker marker;
+    protected Indexer indexer;
+    
+    public Highlighter() {
+        this(new Marker() {            
+            @Override
+            public void mark(int kind, int from, int to) {
+                // TODO Auto-generated method stub
+                
+            }
+        });
+    }
+    
+    public Highlighter(Marker marker) {
+        this(
+                new ProblemReporter(
+                        DefaultErrorHandlingPolicies.proceedWithAllProblems(), 
+                        new CompilerOptions(), 
+                        new DefaultProblemFactory()),
+                true, 
+                marker);
+    }
+
+    public Highlighter(ProblemReporter problemReporter,
+            boolean optimizeStringLiterals, Marker marker) {
+        super(problemReporter, optimizeStringLiterals);
+        setMarker(marker);
+    }
+    
+    public Marker getMarker() {
+        return marker;
+    }
+    
+    public void setMarker(Marker marker) {
+        this.marker = marker;        
+        ((Scanner)this.scanner).marker = marker;
+    }
+
+    public Indexer getIndexer() {
+        return indexer;
+    }
+
+    public void setIndexer(Indexer indexer) {
+        this.indexer = indexer;
+    }
+
+
+    public void initializeScanner(){
+        this.scanner = new Highlighter.Scanner(
+            false /*comment*/,
+            false /*whitespace*/,
+            false, /* will be set in initialize(boolean) */
+            this.options.sourceLevel /*sourceLevel*/,
+            this.options.complianceLevel /*complianceLevel*/,
+            this.options.taskTags/*taskTags*/,
+            this.options.taskPriorities/*taskPriorities*/,
+            this.options.isTaskCaseSensitive/*taskCaseSensitive*/);
+    }
+    
+    
+    public ASTNode[] parseClassBodyDeclarations(char[] source, int offset, int length, CompilationUnitDeclaration unit) {
+        ASTNode[] nodes = super.parseClassBodyDeclarations(source, offset, length, unit);
+        Visitor v = new Visitor();
+        v.setMarker(marker);
+        v.setIndexer(indexer);
+        for (int i = 0; i < nodes.length; i++) {
+            ASTNode n = nodes[i];
+            if (n instanceof MethodDeclaration) {
+                ((MethodDeclaration)n).traverse(v, (ClassScope)null);
+            } else {
+                nodes[i].traverse(v, null);
+            }
+        }
+        return nodes;
+    }
+
+    
+    public static class Visitor extends ASTVisitor {
+        protected Marker marker;        
+        protected Indexer indexer;
+
+        public Marker getMarker() {
+            return marker;
+        }
+
+        public void setMarker(Marker marker) {
+            this.marker = marker;
+        }
+
+        public Indexer getIndexer() {
+            return indexer;
+        }
+
+        public void setIndexer(Indexer indexer) {
+            this.indexer = indexer;
+        }
+        
+        public boolean visit(MessageSend messageSend, BlockScope scope) {
+            int start = (int)(messageSend.nameSourcePosition >>> 32);
+            int stop  = (int)(messageSend.nameSourcePosition & 0x0000FFFF);
+            marker.mark(Marker.MARK_SELECTOR, start, stop);                                                            
+            return true; // continue visiting
+        }
+        
+        public boolean visit(MethodDeclaration methodDeclaration, ClassScope scope) {
+            int start = methodDeclaration.sourceStart;
+            int stop  = start + methodDeclaration.selector.length - 1;
+            marker.mark(Marker.MARK_SELECTOR, start, stop);
+            return true; // do nothing by default, keep traversing
+        }
+        
+        public boolean visit(
+                ConstructorDeclaration constructorDeclaration,
+                ClassScope scope) {
+            int start = constructorDeclaration.sourceStart;
+            int stop  = start + constructorDeclaration.selector.length - 1;
+            marker.mark(Marker.MARK_SELECTOR, start, stop);
+
+            return true; // do nothing by default, keep traversing
+        }
+
+        
+    }
+        
+    public static class Scanner extends org.eclipse.jdt.internal.compiler.parser.Scanner {
+        
+        public Marker marker;
+        protected int lastCommentPtr = -1;
+
+        public Scanner(boolean b, boolean c, boolean d, long sourceLevel,
+                long complianceLevel, char[][] taskTags,
+                char[][] taskPriorities, boolean isTaskCaseSensitive) {
+            super(b,c,d,sourceLevel, complianceLevel, taskTags, taskPriorities, isTaskCaseSensitive);
+        }
+        
+        public void recordComment(int token) {            
+            // compute position
+            int start = this.startPosition;
+            int stop = this.currentPosition;
+            super.recordComment(token);
+            
+            switch (token) {
+            case TokenNameCOMMENT_LINE:
+            case TokenNameCOMMENT_BLOCK:
+                marker.mark(Marker.MARK_COMMENT, start, stop);
+                break;                 
+            case TokenNameCOMMENT_JAVADOC:
+                marker.mark(Marker.MARK_JAVADOC, start, stop);
+                break;             
+            }
+            
+        }
+        
+        
+        public int getNextToken() throws InvalidInputException {
+            int t = super.getNextToken();
+                               
+            switch (t) {
+            
+            case TokenNamebreak:
+            case TokenNamecatch:
+            case TokenNameelse:    
+            case TokenNamefinally:
+            case TokenNamecontinue:
+            case TokenNamedefault:
+            case TokenNamedo:
+            case TokenNamefor:
+            case TokenNameif:
+            case TokenNamecase:
+            case TokenNamereturn:
+                marker.mark(Marker.MARK_KEYWORD_FLOW, getCurrentTokenStartPosition(), getCurrentTokenEndPosition());
+                break;                                            
+            case TokenNameassert:
+            case TokenNameboolean:            
+            case TokenNamebyte:            
+            case TokenNamechar:
+            case TokenNameclass:
+            case TokenNamedouble:            
+            case TokenNameextends:
+            case TokenNamefalse:
+            case TokenNamefinal:
+            case TokenNamethrow:
+            case TokenNametry:
+            case TokenNamewhile:
+            case TokenNameswitch:
+            case TokenNamefloat:
+            case TokenNameimplements:
+            case TokenNameimport:
+            case TokenNameinstanceof:
+            case TokenNameinterface:
+            case TokenNamelong:
+            case TokenNameint:
+            case TokenNamenative:
+            case TokenNamenew:
+            case TokenNamenull:
+            case TokenNamepackage:
+            case TokenNameprivate:
+            case TokenNameprotected:
+            case TokenNamepublic:            
+            case TokenNameshort:
+            case TokenNamestatic:
+            case TokenNamestrictfp:
+            case TokenNamesuper:            
+            case TokenNamesynchronized:
+            case TokenNamethis:            
+            case TokenNamethrows:
+            case TokenNametransient:
+            case TokenNametrue:            
+            case TokenNamevoid:
+            case TokenNamevolatile:            
+                marker.mark(Marker.MARK_KEYWORD, getCurrentTokenStartPosition(), getCurrentTokenEndPosition());
+                break;
+            case TokenNameIntegerLiteral:
+            case TokenNameLongLiteral:
+            case TokenNameFloatingPointLiteral:
+            case TokenNameDoubleLiteral:
+                marker.mark(Marker.MARK_NUMBER, getCurrentTokenStartPosition(), getCurrentTokenEndPosition());
+                break;
+            case TokenNameStringLiteral:
+                marker.mark(Marker.MARK_STRING, getCurrentTokenStartPosition(), getCurrentTokenEndPosition());
+                break;
+            case TokenNameCharacterLiteral:                
+                marker.mark(Marker.MARK_CHARACTER, getCurrentTokenStartPosition(), getCurrentTokenEndPosition());
+                break; 
+            }
+            
+            return t;
+        }
+        
+    }
+    
+}