--- /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;
+ }
+
+ }
+
+}