### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui Index: ui/org/eclipse/jdt/internal/ui/compare/JavaTokenComparator.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/compare/JavaTokenComparator.java,v retrieving revision 1.17 diff -u -r1.17 JavaTokenComparator.java --- ui/org/eclipse/jdt/internal/ui/compare/JavaTokenComparator.java 31 Aug 2006 09:59:17 -0000 1.17 +++ ui/org/eclipse/jdt/internal/ui/compare/JavaTokenComparator.java 19 Apr 2007 13:43:47 -0000 @@ -24,6 +24,7 @@ */ public class JavaTokenComparator implements ITokenComparator { + private static final boolean DEBUG = false; private String fText; private boolean fShouldEscape= true; private int fCount; @@ -47,26 +48,56 @@ IScanner scanner= ToolFactory.createScanner(true, true, false, false); // returns comments & whitespace scanner.setSource(fText.toCharArray()); + int endPos= 0; try { - int endPos= 0; - while (scanner.getNextToken() != ITerminalSymbols.TokenNameEOF) { + int tokenType; + while ((tokenType = scanner.getNextToken()) != ITerminalSymbols.TokenNameEOF) { int start= scanner.getCurrentTokenStartPosition(); int end= scanner.getCurrentTokenEndPosition()+1; - fStarts[fCount]= start; - fLengths[fCount]= end - start; + // Comments are treated as a single token (see bug 78063) + if (tokenType == ITerminalSymbols.TokenNameCOMMENT_JAVADOC + || tokenType == ITerminalSymbols.TokenNameCOMMENT_BLOCK + || tokenType == ITerminalSymbols.TokenNameCOMMENT_LINE) { + int dl = getCommentDelimeterLength(tokenType); + recordToken(start, dl); + parseComment(start + dl, text.substring(start+dl, end), shouldEscape); + } else { + recordToken(start, end - start); + } endPos= end; - fCount++; - } - // workaround for #13907 - if (endPos < length) { - fStarts[fCount]= endPos; - fLengths[fCount]= length-endPos; - fCount++; } } catch (InvalidInputException ex) { - // NeedWork + // We couldn't parse part of the input. Fall through and make the rest a single token + } + // workaround for #13907 + if (endPos < length) { + recordToken(endPos, length-endPos); + } + } + + private void recordToken(int start, int length) { + fStarts[fCount]= start; + fLengths[fCount]= length; + fCount++; + if (DEBUG) + System.out.println(fText.substring(start, start + length)); + } + + private void parseComment(int start, String commentText, boolean shouldEscape) { + JavaTokenComparator subTokenizer = new JavaTokenComparator(commentText, shouldEscape); + int count = subTokenizer.getRangeCount(); + for (int i = 0; i < count; i++) { + int subStart = subTokenizer.getTokenStart(i); + int subLength = subTokenizer.getTokenLength(i); + recordToken(start + subStart, subLength); } - } + } + + private int getCommentDelimeterLength(int tokenType) { + if (tokenType == ITerminalSymbols.TokenNameCOMMENT_JAVADOC) + return 3; + return 2; + } /** * Returns the number of token in the string.