diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java index 891725391e3..9125bb7bedf 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java @@ -1680,4 +1680,40 @@ public class ScannerTestCase extends BaseScannerTest validateEOF(); assertEquals( ((Scanner)scanner).getBranchTracker().getDepth(), 0 ); } + + public void test68229() throws Exception{ + Writer writer = new StringWriter(); + writer.write( "#define COUNT 0 \n" ); //$NON-NLS-1$ + writer.write( "1 \n" ); //$NON-NLS-1$ + writer.write( "#if COUNT \n" ); //$NON-NLS-1$ + writer.write( " 2 \n" ); //$NON-NLS-1$ + writer.write( "#endif \n" ); //$NON-NLS-1$ + writer.write( "3 \n" ); //$NON-NLS-1$ + + initializeScanner( writer.toString() ); + + IToken t1 = scanner.nextToken(); + IToken t3 = scanner.nextToken(); + + assertEquals( t1.getImage(), "1" ); //$NON-NLS-1$ + assertEquals( t3.getImage(), "3" ); //$NON-NLS-1$ + assertEquals( t1.getNext(), t3 ); + validateEOF(); + + writer = new StringWriter(); + writer.write( "#define FOO( x ) x \n" ); //$NON-NLS-1$ + writer.write( "1 FOO( 2 ) 3 \n" ); //$NON-NLS-1$ + + initializeScanner( writer.toString() ); + t1 = scanner.nextToken(); + IToken t2 = scanner.nextToken(); + t3 = scanner.nextToken(); + validateEOF(); + + assertEquals( t1.getImage(), "1" ); //$NON-NLS-1$ + assertEquals( t2.getImage(), "2" ); //$NON-NLS-1$ + assertEquals( t3.getImage(), "3" ); //$NON-NLS-1$ + + assertEquals( t1.getNext(), t2 ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java index c83cf788945..8f38d883ede 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/Scanner.java @@ -2554,7 +2554,7 @@ public final class Scanner implements IScanner, IScannerData { // TODO John HELP! something has changed. If I turn this to true, My tests finish early (but the JUnits pass!) IScannerContext context = new ScannerContextTopString(expression, EXPRESSION, ';', true); contextStack.cs_push(context); - + IToken previousToken = currentToken; ISourceElementRequestor savedRequestor = requestor; IParserLogService savedLog = log; log = NULL_LOG_SERVICE; @@ -2581,6 +2581,9 @@ public final class Scanner implements IScanner, IScannerData { } catch (EndOfFileException e) { return false; } finally { + currentToken = previousToken; + if( currentToken != null ) + currentToken.setNext( null ); contextStack.cs_pop(); requestor = savedRequestor; passOnToClient = savedPassOnToClient; @@ -2712,6 +2715,7 @@ public final class Scanner implements IScanner, IScannerData { throw INCLUSION_PARSE_EXCEPTION ; ISourceElementRequestor savedRequestor = requestor; + IToken previousToken = currentToken; try { IScannerContext context = new ScannerContextTopString( includeLine, "INCLUDE", true ); //$NON-NLS-1$ @@ -2785,6 +2789,9 @@ public final class Scanner implements IScanner, IScannerData { { throw INCLUSION_PARSE_EXCEPTION ; } finally { + currentToken = previousToken; + if( currentToken != null ) + currentToken.setNext( null ); contextStack.cs_pop(); requestor = savedRequestor; disableMacroExpansion = false; @@ -2886,6 +2893,7 @@ public final class Scanner implements IScanner, IScannerData { contextStack.cs_push(context); ISourceElementRequestor savedRequestor = requestor; IParserLogService savedLog = log; + IToken previousToken = currentToken; setTokenizingMacroReplacementList( true ); disableMacroExpansion = true; @@ -2959,6 +2967,9 @@ public final class Scanner implements IScanner, IScannerData { return result; } finally { + currentToken = previousToken; + if( currentToken != null ) + currentToken.setNext( null ); contextStack.cs_pop(); setTokenizingMacroReplacementList( false ); requestor = savedRequestor; @@ -3193,7 +3204,7 @@ public final class Scanner implements IScanner, IScannerData { IParserLogService savedLog = log; log = NULL_LOG_SERVICE; requestor = NULL_REQUESTOR; - + IToken previousToken = currentToken; Vector parameterValues = new Vector(); for (int i = 0; i < parameters.size(); i++) { @@ -3244,6 +3255,9 @@ public final class Scanner implements IScanner, IScannerData { parameterValues.add(strBuff2.toString()); } } + currentToken = previousToken; + if( currentToken != null ) + currentToken.setNext( null ); setThrowExceptionOnBadCharacterRead(true); requestor = savedRequestor; log = savedLog;