From 4f3ad71e873067bd62c32440cfbacfcc2b896d38 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Sun, 24 Mar 2013 08:09:28 -0400 Subject: [PATCH] bug 404125: Build output parser incorrectly handles compile lines compiling files outside of the workspace --- .../tests/GCCBuildCommandParserTest.java | 67 +++++++++++++++---- .../providers/AbstractBuildCommandParser.java | 6 +- ...AbstractLanguageSettingsOutputScanner.java | 10 ++- 3 files changed, 64 insertions(+), 19 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java index bd56882895e..3ddb9454292 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuilder/language/settings/providers/tests/GCCBuildCommandParserTest.java @@ -2043,30 +2043,73 @@ public class GCCBuildCommandParserTest extends BaseTestCase { * Test assigning entries for global provider. */ public void testEntriesProjectLevelGlobalProvider() throws Exception { - // Create model project and accompanied descriptions - String projectName = getName(); - IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); - ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); - ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - - IFile file=ResourceHelper.createFile(project, "file.cpp"); - ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), true); - String languageId = ls.getLanguageId(); - // create GCCBuildCommandParser ILanguageSettingsProvider wspProvider = LanguageSettingsManager.getWorkspaceProvider(GCC_BUILD_COMMAND_PARSER_EXT); GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getRawProvider(wspProvider); parser.setResourceScope(AbstractBuildCommandParser.ResourceScope.PROJECT); + parser.clear(); // parse line - parser.startup(cfgDescription, null); + parser.startup(null, null); parser.processLine("gcc -I/path0 file.cpp"); parser.shutdown(); // check populated entries List expected = new ArrayList(); expected.add(new CIncludePathEntry("/path0", 0)); - assertEquals(expected, parser.getSettingEntries(null, project, languageId)); + assertEquals(expected, parser.getSettingEntries(null, null, LANG_CPP)); } + /** + * Parsing of file being compiled outside of workspace saving entries at project scope. + */ + public void testFileAbsolutePath_ProjectLevel() throws Exception { + // Create model project and accompanied descriptions + String projectName = getName(); + IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); + IFile file=ResourceHelper.createFile(project, "file.cpp"); + ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); + ICConfigurationDescription cfgDescription = cfgDescriptions[0]; + + ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), true); + String languageId = ls.getLanguageId(); + + // create GCCBuildCommandParser + GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT, true); + parser.setResourceScope(AbstractBuildCommandParser.ResourceScope.PROJECT); + + // parse line + parser.startup(cfgDescription, null); + parser.processLine("gcc " + + "-I/path0 " + + "/absolute/path/file.cpp"); + parser.shutdown(); + + // check entries + List entries = parser.getSettingEntries(cfgDescription, project, languageId); + assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0)); + } + + /** + * Parsing of file being compiled outside of workspace saving entries at project scope. + */ + public void testFileAbsolutePath_ProjectLevelGlobalProvider() throws Exception { + // create GCCBuildCommandParser + ILanguageSettingsProvider wspProvider = LanguageSettingsManager.getWorkspaceProvider(GCC_BUILD_COMMAND_PARSER_EXT); + GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getRawProvider(wspProvider); + parser.setResourceScope(AbstractBuildCommandParser.ResourceScope.PROJECT); + parser.clear(); + + // parse line + parser.startup(null, null); + parser.processLine("gcc " + + "-I/path0 " + + "/absolute/path/file.cpp"); + parser.shutdown(); + + // check entries + List entries = parser.getSettingEntries(null, null, LANG_CPP); + assertEquals(new CIncludePathEntry("/path0", 0), entries.get(0)); + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java index 9ef6fa3c3f1..4eafdbffaf3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractBuildCommandParser.java @@ -164,9 +164,7 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting } break; case PROJECT: - if (currentResource != null) { - rc = currentResource.getProject(); - } + rc = currentProject; break; default: break; @@ -215,7 +213,7 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting @Override protected List parseOptions(String line) { - if (line == null || currentResource == null) { + if (line == null || (currentResource == null && resourceScope != ResourceScope.PROJECT)) { return null; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractLanguageSettingsOutputScanner.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractLanguageSettingsOutputScanner.java index f11ec08a8ea..0e718103ca1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractLanguageSettingsOutputScanner.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/language/settings/providers/AbstractLanguageSettingsOutputScanner.java @@ -460,9 +460,13 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett if (optionParser.parseOption(option)) { ICLanguageSettingEntry entry = null; if (isResolvingPaths && (optionParser.isForFile() || optionParser.isForFolder())) { - URI baseURI = mappedRootURI; - if (buildDirURI != null && !new Path(optionParser.parsedName).isAbsolute()) { - baseURI = efsProvider.append(mappedRootURI, buildDirURI.getPath()); + URI baseURI = buildDirURI; + if (mappedRootURI != null) { + if (buildDirURI != null && !new Path(optionParser.parsedName).isAbsolute()) { + baseURI = efsProvider.append(mappedRootURI, buildDirURI.getPath()); + } else { + baseURI = mappedRootURI; + } } entry = createResolvedPathEntry(optionParser, optionParser.parsedName, 0, baseURI); } else {