1
0
Fork 0
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:
Andrew Niefer 2004-06-22 20:38:34 +00:00
parent 6b68d31e47
commit d75195c520
2 changed files with 52 additions and 2 deletions

View file

@ -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 );
}
}

View file

@ -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;