### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.core Index: formatter/org/eclipse/jdt/internal/formatter/Scribe.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/Scribe.java,v retrieving revision 1.153 diff -u -r1.153 Scribe.java --- formatter/org/eclipse/jdt/internal/formatter/Scribe.java 9 Sep 2008 15:39:07 -0000 1.153 +++ formatter/org/eclipse/jdt/internal/formatter/Scribe.java 3 Dec 2008 20:42:49 -0000 @@ -21,6 +21,7 @@ import org.eclipse.jdt.internal.compiler.ASTVisitor; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.lookup.BlockScope; +import org.eclipse.jdt.internal.compiler.parser.Parser; import org.eclipse.jdt.internal.compiler.parser.Scanner; import org.eclipse.jdt.internal.compiler.parser.ScannerHelper; import org.eclipse.jdt.internal.compiler.parser.TerminalTokens; @@ -2145,6 +2146,36 @@ continue; case TerminalTokens.TokenNameEOF: continue; + case TerminalTokens.TokenNameIdentifier: + if (previousToken == -1 || previousToken == SKIP_FIRST_WHITESPACE_TOKEN) { + char[] identifier = this.scanner.getCurrentTokenSource(); + int startPosition = this.scanner.getCurrentTokenStartPosition(); + int restartPosition = this.scanner.currentPosition; + if (CharOperation.equals(identifier, Parser.FALL_THROUGH_TAG, 0, 5/*length of string "$FALL"*/) && this.scanner.currentCharacter == '-') { + try { + this.scanner.getNextToken(); // consume the '-' + token = this.scanner.getNextToken(); // consume the "THROUGH" + if (token == TerminalTokens.TokenNameIdentifier) { + identifier = this.scanner.getCurrentTokenSource(); + if (CharOperation.endsWith(Parser.FALL_THROUGH_TAG, identifier)) { + // the comment starts with a fall through + if (previousToken == SKIP_FIRST_WHITESPACE_TOKEN) { + addReplaceEdit(spaceStartPosition, startPosition-1, " "); //$NON-NLS-1$ + } + this.scanner.startPosition = startPosition; + previousToken = token; + break; + } + } + } catch (InvalidInputException iie) { + // skip + } + } + // this was not a valid fall-through tag, hence continue to process the comment normally + this.scanner.startPosition = startPosition; + this.scanner.currentPosition = restartPosition; + } + break; } int tokenStart = this.scanner.getCurrentTokenStartPosition(); int tokenLength = (this.scanner.atEnd() ? this.scanner.eofPosition : this.scanner.currentPosition) - tokenStart; Index: compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java,v retrieving revision 1.395 diff -u -r1.395 Parser.java --- compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java 1 Dec 2008 14:02:34 -0000 1.395 +++ compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java 3 Dec 2008 20:42:46 -0000 @@ -48,7 +48,7 @@ protected static final int THIS_CALL = ExplicitConstructorCall.This; protected static final int SUPER_CALL = ExplicitConstructorCall.Super; - protected static final char[] FALL_THROUGH_TAG = "$FALL-THROUGH$".toCharArray(); //$NON-NLS-1$ + public static final char[] FALL_THROUGH_TAG = "$FALL-THROUGH$".toCharArray(); //$NON-NLS-1$ public static char asb[] = null; public static char asr[] = null; #P org.eclipse.jdt.core.tests.model Index: src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java,v retrieving revision 1.29 diff -u -r1.29 FormatterCommentsBugsTest.java --- src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java 25 Sep 2008 11:23:14 -0000 1.29 +++ src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java 3 Dec 2008 20:43:01 -0000 @@ -2535,4 +2535,262 @@ "}\n" ); } + +/** + * @bug 256799: [formatter] Formatter wrongly adds space to //$FALL-THROUGH$ + * @test Ensure that the comment formatter preserve $FALL-THROUGH$ tag leading spaces + * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=256799" + */ +public void testBug256799_Line01() throws JavaModelException { + String source = + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " //$FALL-THROUGH$\n" + + " case 2:\n" + + " test = value;\n" + + " // $FALL-THROUGH$\n" + + " case 3:\n" + + " test = value;\n" + + " // $FALL-THROUGH$\n" + + " case 4:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ \n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n"; + formatSource(source, + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " //$FALL-THROUGH$\n" + + " case 2:\n" + + " test = value;\n" + + " // $FALL-THROUGH$\n" + + " case 3:\n" + + " test = value;\n" + + " // $FALL-THROUGH$\n" + + " case 4:\n" + + " test = value;\n" + + " // $FALL-THROUGH$\n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n" + ); +} +public void testBug256799_Line02() throws JavaModelException { + String source = + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " //$FALL-THROUGH$ with text after \n" + + " case 2:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ with text after \n" + + " case 3:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ with text after \n" + + " case 4:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ with text after \n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n"; + formatSource(source, + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " //$FALL-THROUGH$ with text after\n" + + " case 2:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ with text after\n" + + " case 3:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ with text after\n" + + " case 4:\n" + + " test = value;\n" + + " // $FALL-THROUGH$ with text after\n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n" + ); +} +public void testBug256799_Block01() throws JavaModelException { + String source = + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " /*$FALL-THROUGH$*/\n" + + " case 2:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$*/\n" + + " case 3:\n" + + " test = value;\n" + + " /*$FALL-THROUGH$ */\n" + + " case 4:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 5:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$*/\n" + + " case 6:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 7:\n" + + " test = value;\n" + + " /*$FALL-THROUGH$ */\n" + + " case 8:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n"; + formatSource(source, + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 2:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 3:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 4:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 5:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 6:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 7:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " case 8:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ */\n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n" + ); +} +public void testBug256799_Block02() throws JavaModelException { + String source = + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " /*$FALL-THROUGH$with text after*/\n" + + " case 2:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$with text after*/\n" + + " case 3:\n" + + " test = value;\n" + + " /*$FALL-THROUGH$ with text after */\n" + + " case 4:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 5:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after*/\n" + + " case 6:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 7:\n" + + " test = value;\n" + + " /*$FALL-THROUGH$ with text after */\n" + + " case 8:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n"; + formatSource(source, + "public class X01 {\n" + + " int foo(int value) {\n" + + " int test = 0;\n" + + " switch (value) {\n" + + " case 1:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$with text after */\n" + + " case 2:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$with text after */\n" + + " case 3:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 4:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 5:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 6:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 7:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " case 8:\n" + + " test = value;\n" + + " /* $FALL-THROUGH$ with text after */\n" + + " default:\n" + + " test = -1;\n" + + " break;\n" + + " }\n" + + " return test;\n" + + " }\n" + + "}\n" + ); +} }