View | Details | Raw Unified | Return to bug 256799
Collapse All | Expand All

(-)formatter/org/eclipse/jdt/internal/formatter/Scribe.java (+31 lines)
Lines 21-26 Link Here
21
import org.eclipse.jdt.internal.compiler.ASTVisitor;
21
import org.eclipse.jdt.internal.compiler.ASTVisitor;
22
import org.eclipse.jdt.internal.compiler.ast.Annotation;
22
import org.eclipse.jdt.internal.compiler.ast.Annotation;
23
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
23
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
24
import org.eclipse.jdt.internal.compiler.parser.Parser;
24
import org.eclipse.jdt.internal.compiler.parser.Scanner;
25
import org.eclipse.jdt.internal.compiler.parser.Scanner;
25
import org.eclipse.jdt.internal.compiler.parser.ScannerHelper;
26
import org.eclipse.jdt.internal.compiler.parser.ScannerHelper;
26
import org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
27
import org.eclipse.jdt.internal.compiler.parser.TerminalTokens;
Lines 2145-2150 Link Here
2145
					continue;
2146
					continue;
2146
				case TerminalTokens.TokenNameEOF:
2147
				case TerminalTokens.TokenNameEOF:
2147
					continue;
2148
					continue;
2149
				case TerminalTokens.TokenNameIdentifier:
2150
					if (previousToken == -1 || previousToken == SKIP_FIRST_WHITESPACE_TOKEN) {
2151
						char[] identifier = this.scanner.getCurrentTokenSource();
2152
						int startPosition = this.scanner.getCurrentTokenStartPosition();
2153
						int restartPosition = this.scanner.currentPosition;
2154
						if (CharOperation.equals(identifier, Parser.FALL_THROUGH_TAG, 0, 5/*length of string "$FALL"*/) && this.scanner.currentCharacter == '-') {
2155
							try {
2156
								this.scanner.getNextToken(); //  consume the '-'
2157
								token = this.scanner.getNextToken(); // consume the "THROUGH"
2158
								if (token == TerminalTokens.TokenNameIdentifier) {
2159
									identifier = this.scanner.getCurrentTokenSource();
2160
									if (CharOperation.endsWith(Parser.FALL_THROUGH_TAG, identifier)) {
2161
										// the comment starts with a fall through
2162
										if (previousToken == SKIP_FIRST_WHITESPACE_TOKEN) {
2163
											addReplaceEdit(spaceStartPosition, startPosition-1, " "); //$NON-NLS-1$
2164
										}
2165
										this.scanner.startPosition = startPosition;
2166
										previousToken = token;
2167
										break;
2168
									}
2169
								}
2170
							} catch (InvalidInputException iie) {
2171
								// skip
2172
							}
2173
						}
2174
						// this was not a valid fall-through tag, hence continue to process the comment normally
2175
						this.scanner.startPosition = startPosition;
2176
			    		this.scanner.currentPosition = restartPosition;
2177
					}
2178
					break;
2148
			}
2179
			}
2149
			int tokenStart = this.scanner.getCurrentTokenStartPosition();
2180
			int tokenStart = this.scanner.getCurrentTokenStartPosition();
2150
    		int tokenLength = (this.scanner.atEnd() ? this.scanner.eofPosition : this.scanner.currentPosition) - tokenStart;
2181
    		int tokenLength = (this.scanner.atEnd() ? this.scanner.eofPosition : this.scanner.currentPosition) - tokenStart;
(-)compiler/org/eclipse/jdt/internal/compiler/parser/Parser.java (-1 / +1 lines)
Lines 48-54 Link Here
48
	
48
	
49
	protected static final int THIS_CALL = ExplicitConstructorCall.This;
49
	protected static final int THIS_CALL = ExplicitConstructorCall.This;
50
	protected static final int SUPER_CALL = ExplicitConstructorCall.Super;
50
	protected static final int SUPER_CALL = ExplicitConstructorCall.Super;
51
	protected static final char[] FALL_THROUGH_TAG = "$FALL-THROUGH$".toCharArray(); //$NON-NLS-1$
51
	public static final char[] FALL_THROUGH_TAG = "$FALL-THROUGH$".toCharArray(); //$NON-NLS-1$
52
	
52
	
53
	public static char asb[] = null;
53
	public static char asb[] = null;
54
	public static char asr[] = null;
54
	public static char asr[] = null;
(-)src/org/eclipse/jdt/core/tests/formatter/FormatterCommentsBugsTest.java (+258 lines)
Lines 2535-2538 Link Here
2535
		"}\n"
2535
		"}\n"
2536
	);
2536
	);
2537
}
2537
}
2538
2539
/**
2540
 * @bug 256799: [formatter] Formatter wrongly adds space to //$FALL-THROUGH$
2541
 * @test Ensure that the comment formatter preserve $FALL-THROUGH$ tag leading spaces
2542
 * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=256799"
2543
 */
2544
public void testBug256799_Line01() throws JavaModelException {
2545
	String source = 
2546
		"public class X01 {\n" + 
2547
		"	int foo(int value) {\n" + 
2548
		"		int test = 0;\n" + 
2549
		"		switch (value) {\n" + 
2550
		"		case 1:\n" + 
2551
		"			test = value;\n" + 
2552
		"			//$FALL-THROUGH$\n" + 
2553
		"		case 2:\n" + 
2554
		"			test = value;\n" + 
2555
		"			// $FALL-THROUGH$\n" + 
2556
		"		case 3:\n" + 
2557
		"			test = value;\n" + 
2558
		"			//    	   $FALL-THROUGH$\n" + 
2559
		"		case 4:\n" + 
2560
		"			test = value;\n" + 
2561
		"			//		$FALL-THROUGH$                  \n" + 
2562
		"		default:\n" + 
2563
		"			test = -1;\n" + 
2564
		"			break;\n" + 
2565
		"		}\n" + 
2566
		"		return test;\n" + 
2567
		"	}\n" + 
2568
		"}\n";
2569
	formatSource(source,
2570
		"public class X01 {\n" + 
2571
		"	int foo(int value) {\n" + 
2572
		"		int test = 0;\n" + 
2573
		"		switch (value) {\n" + 
2574
		"		case 1:\n" + 
2575
		"			test = value;\n" + 
2576
		"			//$FALL-THROUGH$\n" + 
2577
		"		case 2:\n" + 
2578
		"			test = value;\n" + 
2579
		"			// $FALL-THROUGH$\n" + 
2580
		"		case 3:\n" + 
2581
		"			test = value;\n" + 
2582
		"			// $FALL-THROUGH$\n" + 
2583
		"		case 4:\n" + 
2584
		"			test = value;\n" + 
2585
		"			// $FALL-THROUGH$\n" + 
2586
		"		default:\n" + 
2587
		"			test = -1;\n" + 
2588
		"			break;\n" + 
2589
		"		}\n" + 
2590
		"		return test;\n" + 
2591
		"	}\n" + 
2592
		"}\n"
2593
	);
2594
}
2595
public void testBug256799_Line02() throws JavaModelException {
2596
	String source = 
2597
		"public class X01 {\n" + 
2598
		"	int foo(int value) {\n" + 
2599
		"		int test = 0;\n" + 
2600
		"		switch (value) {\n" + 
2601
		"		case 1:\n" + 
2602
		"			test = value;\n" + 
2603
		"			//$FALL-THROUGH$     with	text   	   after        \n" + 
2604
		"		case 2:\n" + 
2605
		"			test = value;\n" + 
2606
		"			// $FALL-THROUGH$		with	text   	   after        		\n" + 
2607
		"		case 3:\n" + 
2608
		"			test = value;\n" + 
2609
		"			//    	   $FALL-THROUGH$  		   with	text   	   after	        \n" + 
2610
		"		case 4:\n" + 
2611
		"			test = value;\n" + 
2612
		"			//		$FALL-THROUGH$		             		with	text   	   after			\n" + 
2613
		"		default:\n" + 
2614
		"			test = -1;\n" + 
2615
		"			break;\n" + 
2616
		"		}\n" + 
2617
		"		return test;\n" + 
2618
		"	}\n" + 
2619
		"}\n";
2620
	formatSource(source,
2621
		"public class X01 {\n" + 
2622
		"	int foo(int value) {\n" + 
2623
		"		int test = 0;\n" + 
2624
		"		switch (value) {\n" + 
2625
		"		case 1:\n" + 
2626
		"			test = value;\n" + 
2627
		"			//$FALL-THROUGH$ with text after\n" + 
2628
		"		case 2:\n" + 
2629
		"			test = value;\n" + 
2630
		"			// $FALL-THROUGH$ with text after\n" + 
2631
		"		case 3:\n" + 
2632
		"			test = value;\n" + 
2633
		"			// $FALL-THROUGH$ with text after\n" + 
2634
		"		case 4:\n" + 
2635
		"			test = value;\n" + 
2636
		"			// $FALL-THROUGH$ with text after\n" + 
2637
		"		default:\n" + 
2638
		"			test = -1;\n" + 
2639
		"			break;\n" + 
2640
		"		}\n" + 
2641
		"		return test;\n" + 
2642
		"	}\n" + 
2643
		"}\n"
2644
	);
2645
}
2646
public void testBug256799_Block01() throws JavaModelException {
2647
	String source = 
2648
		"public class X01 {\n" + 
2649
		"	int foo(int value) {\n" + 
2650
		"		int test = 0;\n" + 
2651
		"		switch (value) {\n" + 
2652
		"		case 1:\n" + 
2653
		"			test = value;\n" + 
2654
		"			/*$FALL-THROUGH$*/\n" + 
2655
		"		case 2:\n" + 
2656
		"			test = value;\n" + 
2657
		"			/* $FALL-THROUGH$*/\n" + 
2658
		"		case 3:\n" + 
2659
		"			test = value;\n" + 
2660
		"			/*$FALL-THROUGH$ */\n" + 
2661
		"		case 4:\n" + 
2662
		"			test = value;\n" + 
2663
		"			/* $FALL-THROUGH$ */\n" + 
2664
		"		case 5:\n" + 
2665
		"			test = value;\n" + 
2666
		"			/*    	   $FALL-THROUGH$*/\n" + 
2667
		"		case 6:\n" + 
2668
		"			test = value;\n" + 
2669
		"			/*		$FALL-THROUGH$                  */\n" + 
2670
		"		case 7:\n" + 
2671
		"			test = value;\n" + 
2672
		"			/*$FALL-THROUGH$			*/\n" + 
2673
		"		case 8:\n" + 
2674
		"			test = value;\n" + 
2675
		"			/*		     		     $FALL-THROUGH$	    	    	*/\n" + 
2676
		"		default:\n" + 
2677
		"			test = -1;\n" + 
2678
		"			break;\n" + 
2679
		"		}\n" + 
2680
		"		return test;\n" + 
2681
		"	}\n" + 
2682
		"}\n";
2683
	formatSource(source,
2684
		"public class X01 {\n" + 
2685
		"	int foo(int value) {\n" + 
2686
		"		int test = 0;\n" + 
2687
		"		switch (value) {\n" + 
2688
		"		case 1:\n" + 
2689
		"			test = value;\n" + 
2690
		"			/* $FALL-THROUGH$ */\n" + 
2691
		"		case 2:\n" + 
2692
		"			test = value;\n" + 
2693
		"			/* $FALL-THROUGH$ */\n" + 
2694
		"		case 3:\n" + 
2695
		"			test = value;\n" + 
2696
		"			/* $FALL-THROUGH$ */\n" + 
2697
		"		case 4:\n" + 
2698
		"			test = value;\n" + 
2699
		"			/* $FALL-THROUGH$ */\n" + 
2700
		"		case 5:\n" + 
2701
		"			test = value;\n" + 
2702
		"			/* $FALL-THROUGH$ */\n" + 
2703
		"		case 6:\n" + 
2704
		"			test = value;\n" + 
2705
		"			/* $FALL-THROUGH$ */\n" + 
2706
		"		case 7:\n" + 
2707
		"			test = value;\n" + 
2708
		"			/* $FALL-THROUGH$ */\n" + 
2709
		"		case 8:\n" + 
2710
		"			test = value;\n" + 
2711
		"			/* $FALL-THROUGH$ */\n" + 
2712
		"		default:\n" + 
2713
		"			test = -1;\n" + 
2714
		"			break;\n" + 
2715
		"		}\n" + 
2716
		"		return test;\n" + 
2717
		"	}\n" + 
2718
		"}\n"
2719
	);
2720
}
2721
public void testBug256799_Block02() throws JavaModelException {
2722
	String source = 
2723
		"public class X01 {\n" + 
2724
		"	int foo(int value) {\n" + 
2725
		"		int test = 0;\n" + 
2726
		"		switch (value) {\n" + 
2727
		"		case 1:\n" + 
2728
		"			test = value;\n" + 
2729
		"			/*$FALL-THROUGH$with    text    after*/\n" + 
2730
		"		case 2:\n" + 
2731
		"			test = value;\n" + 
2732
		"			/* $FALL-THROUGH$with  		  text	after*/\n" + 
2733
		"		case 3:\n" + 
2734
		"			test = value;\n" + 
2735
		"			/*$FALL-THROUGH$    with	   	text   	after	    */\n" + 
2736
		"		case 4:\n" + 
2737
		"			test = value;\n" + 
2738
		"			/* $FALL-THROUGH$     with	   	text   	after	    */\n" + 
2739
		"		case 5:\n" + 
2740
		"			test = value;\n" + 
2741
		"			/*    	   $FALL-THROUGH$	with  		  text	after*/\n" + 
2742
		"		case 6:\n" + 
2743
		"			test = value;\n" + 
2744
		"			/*		$FALL-THROUGH$         	with  		  text	after        */\n" + 
2745
		"		case 7:\n" + 
2746
		"			test = value;\n" + 
2747
		"			/*$FALL-THROUGH$			with  		  text	after	*/\n" + 
2748
		"		case 8:\n" + 
2749
		"			test = value;\n" + 
2750
		"			/*		     		     $FALL-THROUGH$	    		with  		  text	after    	*/\n" + 
2751
		"		default:\n" + 
2752
		"			test = -1;\n" + 
2753
		"			break;\n" + 
2754
		"		}\n" + 
2755
		"		return test;\n" + 
2756
		"	}\n" + 
2757
		"}\n";
2758
	formatSource(source,
2759
		"public class X01 {\n" + 
2760
		"	int foo(int value) {\n" + 
2761
		"		int test = 0;\n" + 
2762
		"		switch (value) {\n" + 
2763
		"		case 1:\n" + 
2764
		"			test = value;\n" + 
2765
		"			/* $FALL-THROUGH$with text after */\n" + 
2766
		"		case 2:\n" + 
2767
		"			test = value;\n" + 
2768
		"			/* $FALL-THROUGH$with text after */\n" + 
2769
		"		case 3:\n" + 
2770
		"			test = value;\n" + 
2771
		"			/* $FALL-THROUGH$ with text after */\n" + 
2772
		"		case 4:\n" + 
2773
		"			test = value;\n" + 
2774
		"			/* $FALL-THROUGH$ with text after */\n" + 
2775
		"		case 5:\n" + 
2776
		"			test = value;\n" + 
2777
		"			/* $FALL-THROUGH$ with text after */\n" + 
2778
		"		case 6:\n" + 
2779
		"			test = value;\n" + 
2780
		"			/* $FALL-THROUGH$ with text after */\n" + 
2781
		"		case 7:\n" + 
2782
		"			test = value;\n" + 
2783
		"			/* $FALL-THROUGH$ with text after */\n" + 
2784
		"		case 8:\n" + 
2785
		"			test = value;\n" + 
2786
		"			/* $FALL-THROUGH$ with text after */\n" + 
2787
		"		default:\n" + 
2788
		"			test = -1;\n" + 
2789
		"			break;\n" + 
2790
		"		}\n" + 
2791
		"		return test;\n" + 
2792
		"	}\n" + 
2793
		"}\n"
2794
	);
2795
}
2538
}
2796
}

Return to bug 256799