mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
fix for bug 68229 - problems with IToken.getNext() around places where subscanners are used
This commit is contained in:
parent
6b68d31e47
commit
d75195c520
2 changed files with 52 additions and 2 deletions
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue