From e69f72a48835e2ed7ab93b89d610c26612a90d3e Mon Sep 17 00:00:00 2001 From: Hansruedi Patzen Date: Tue, 14 Aug 2018 17:44:30 +0200 Subject: [PATCH] Bug 537942: Inactive include statements have wrong offsets Fixed the bug and added a test for confirmation. Change-Id: I5d3c5f797d84b10b961dcfc178a5bbcc3becbd04 Signed-off-by: Hansruedi Patzen --- .../tests/scanner/InactiveCodeTests.java | 14 +++++++++++-- .../tests/scanner/PreprocessorTestsBase.java | 21 ++++++++++++++++++- .../core/parser/scanner/CPreprocessor.java | 2 +- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/InactiveCodeTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/InactiveCodeTests.java index 0c258e69d89..4bd718c2e26 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/InactiveCodeTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/InactiveCodeTests.java @@ -10,9 +10,10 @@ *******************************************************************************/ package org.eclipse.cdt.core.parser.tests.scanner; -import junit.framework.TestSuite; - import org.eclipse.cdt.core.parser.IToken; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; + +import junit.framework.TestSuite; /** @@ -275,4 +276,13 @@ public class InactiveCodeTests extends PreprocessorTestsBase { validateProblemCount(0); } + // #undef __INCLUDE_C_STD_LIB + // #ifdef __INCLUDE_C_STD_LIB + // #include + // #endif + public void testInactiveInclude_537942() throws Exception { + super.initializeScanner(); + ASTNode include = (ASTNode) parse().getAllPreprocessorStatements()[2]; + assertEquals(fCode.indexOf("#include "), include.getOffset()); + } } diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorTestsBase.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorTestsBase.java index ad652ae6fbb..659b62d787d 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorTestsBase.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/scanner/PreprocessorTestsBase.java @@ -13,9 +13,12 @@ package org.eclipse.cdt.core.parser.tests.scanner; import java.io.IOException; import org.eclipse.cdt.core.dom.ast.IASTProblem; +import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IMacroBinding; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; +import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.GCCScannerExtensionConfiguration; +import org.eclipse.cdt.core.dom.parser.cpp.GPPParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.cpp.GPPScannerExtensionConfiguration; import org.eclipse.cdt.core.parser.EndOfFileException; import org.eclipse.cdt.core.parser.FileContent; @@ -31,6 +34,8 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; +import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser; +import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser; import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; import org.eclipse.cdt.internal.core.parser.scanner.ILocationResolver; @@ -40,6 +45,7 @@ public abstract class PreprocessorTestsBase extends BaseTestCase { private static final IParserLogService NULL_LOG = new NullLogService(); protected CPreprocessor fScanner; protected ILocationResolver fLocationResolver; + protected String fCode; public PreprocessorTestsBase(String name) { super(name); @@ -66,6 +72,7 @@ public abstract class PreprocessorTestsBase extends BaseTestCase { } private FileContent getContent(String input) { + fCode = input; return FileContent.create("", input.toCharArray()); } @@ -93,6 +100,18 @@ public abstract class PreprocessorTestsBase extends BaseTestCase { initializeScanner(getAboveComment()); } + protected IASTTranslationUnit parse() { + return parse(ParserLanguage.CPP); + } + + protected IASTTranslationUnit parse(ParserLanguage lang) { + assertNotNull("The scanner needs to be initialized before parsing the code.", fScanner); + if (lang == ParserLanguage.C) { + return new GNUCSourceParser(fScanner, ParserMode.COMPLETE_PARSE, NULL_LOG, GCCParserExtensionConfiguration.getInstance()).parse(); + } + return new GNUCPPSourceParser(fScanner, ParserMode.COMPLETE_PARSE, NULL_LOG, GPPParserExtensionConfiguration.getInstance()).parse(); + } + protected StringBuilder[] getTestContent(int sections) throws IOException { return TestSourceReader.getContentsForTest( CTestPlugin.getDefault().getBundle(), "parser", getClass(), getName(), sections); @@ -198,7 +217,7 @@ public abstract class PreprocessorTestsBase extends BaseTestCase { } protected void validateAsUndefined(String name) { - assertNull(fScanner.getMacroDefinitions().get(name.toCharArray())); + assertNull(fScanner.getMacroDefinitions().get(name)); } protected void validateProblemCount(int count) throws Exception { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java index ab99ea55161..7322a44e54c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/CPreprocessor.java @@ -1998,7 +1998,7 @@ public class CPreprocessor implements ILexerLog, IScanner, IAdaptable { case IPreprocessorDirective.ppImport: case IPreprocessorDirective.ppInclude: case IPreprocessorDirective.ppInclude_next: - executeInclude(lexer, ident.getOffset(), type, false, withinExpansion); + executeInclude(lexer, pound.getOffset(), type, false, withinExpansion); break; case IPreprocessorDirective.ppIfdef: return executeIfdef(lexer, pound.getOffset(), false, withinExpansion);