diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java index 040b0702884..9897677cabf 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2SelectionParseTest.java @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.ParserLanguage; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; /** * @author dsteffle @@ -1510,6 +1511,54 @@ public class AST2SelectionParseTest extends AST2SelectionParseBaseTest { assertTrue(name.resolveBinding() instanceof IVariable); } + public void testBug86870() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append("#if VERSION == 1\r\n"); //$NON-NLS-1$ + buffer.append("#define INCFILE \"vers1.h\"\r\n"); //$NON-NLS-1$ + buffer.append("#elif VERSION == 2\r\n"); //$NON-NLS-1$ + buffer.append("#define INCFILE \"vers2.h\" /* and so on */\r\n"); //$NON-NLS-1$ + buffer.append("#else\r\n"); //$NON-NLS-1$ + buffer.append("#define INCFILE \"versN.h\"\r\n"); //$NON-NLS-1$ + buffer.append("#endif\r\n"); //$NON-NLS-1$ + + String code = buffer.toString(); + int offset1 = code.indexOf( "#if VERSION == 1" ); //$NON-NLS-1$ + int length = "#if VERSION == 1".length(); //$NON-NLS-1$ + IASTNode node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertEquals( ((ASTNode)node).getLength(), length); + + offset1 = code.indexOf( "#elif VERSION == 2" ); //$NON-NLS-1$ + length = "#elif VERSION == 2".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertEquals( ((ASTNode)node).getLength(), length); + + offset1 = code.indexOf( "#else" ); //$NON-NLS-1$ + length = "#else".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertEquals( ((ASTNode)node).getLength(), length); + + offset1 = code.indexOf( "#define INCFILE \"versN.h\"" ); //$NON-NLS-1$ + length = "#define INCFILE \"versN.h\"".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertEquals( ((ASTNode)node).getLength(), length); + + offset1 = code.indexOf( "INCFILE \"versN.h\"" ); //$NON-NLS-1$ + length = "INCFILE".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertEquals( ((ASTNode)node).getLength(), length); + + offset1 = code.indexOf( "#endif" ); //$NON-NLS-1$ + length = "#endif".length(); //$NON-NLS-1$ + node = parse( code, ParserLanguage.C, offset1, length ); + assertNotNull(node); + assertEquals( ((ASTNode)node).getLength(), length); + } + public void testBug87179() throws Exception { StringBuffer buffer = new StringBuffer(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java index 7cc9d369308..81f83c286b6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner2/BaseScanner.java @@ -2583,6 +2583,9 @@ abstract class BaseScanner implements IScanner { handleCompletionOnExpression(CharArrayUtils.extract( buffer, start, len)); branchState(BRANCH_IF); + + processIf(pos, pos + start + len, true); // fix 86870, process IF before skipping the condition and only process it once + if (expressionEvaluator.evaluate(buffer, start, len, definitions, getLineNumber(bufferPos[bufferStackPos]), @@ -2590,9 +2593,7 @@ abstract class BaseScanner implements IScanner { skipOverConditionalCode(true); if (isLimitReached()) handleInvalidCompletion(); - processIf(pos, bufferPos[bufferStackPos], true); } - processIf(pos, bufferPos[bufferStackPos], false); return; case ppElse: case ppElif: @@ -3406,11 +3407,11 @@ abstract class BaseScanner implements IScanner { skipToNewLine(); if (checkelse && nesting == 0) { processElse(startPos, - bufferPos[bufferStackPos] + 1, true); + bufferPos[bufferStackPos], true); return; } processElse(startPos, - bufferPos[bufferStackPos] + 1, false); + bufferPos[bufferStackPos], false); } else { //problem, ignore this one. handleProblem( @@ -3435,16 +3436,16 @@ abstract class BaseScanner implements IScanner { definitions, getLineNumber(bufferPos[bufferStackPos]), getCurrentFilename()) != 0) { - // condition passed, we're good - processElsif(start, + // condition passed, we're good + processElsif(startPos, bufferPos[bufferStackPos], true); return; } - processElsif(start, + processElsif(startPos, bufferPos[bufferStackPos], false); } else { skipToNewLine(); - processElsif(start, + processElsif(startPos, bufferPos[bufferStackPos], false); } } else { @@ -3890,7 +3891,7 @@ abstract class BaseScanner implements IScanner { break; } else if (!escaped && bufferPos[bufferStackPos] < limit && buffer[bufferPos[bufferStackPos] + 1] == '\n') { - bufferPos[bufferStackPos]++; +// bufferPos[bufferStackPos]++; // Do not want to skip past the \r return; } break;