From c37cfaa6b4d54aee31214686fcc2df75c14461c2 Mon Sep 17 00:00:00 2001 From: Andrew Gvozdev Date: Mon, 5 Dec 2011 18:04:21 -0500 Subject: [PATCH] Move properties to LanguageSettingsBaseProvider, keep "parameter" attribute in properties --- .../BuiltinSpecsDetectorTest.java | 184 ++++++++++-------- .../GCCBuildCommandParserTest.java | 183 ++++++++++------- .../AbstractBuildCommandParser.java | 35 +++- .../AbstractBuiltinSpecsDetector.java | 27 ++- ...AbstractLanguageSettingsOutputScanner.java | 108 +++++----- .../GCCBuildCommandParserOptionPage.java | 8 +- .../BuiltinSpecsDetectorOptionPage.java | 8 +- .../tests/GCCBuiltinSpecsDetectorTest.java | 4 +- .../LanguageSettingsExtensionsTests.java | 5 +- ...nguageSettingsPersistenceProjectTests.java | 9 +- .../LanguageSettingsSerializableTests.java | 68 ++++--- .../MockLanguageSettingsBaseProvider.java | 16 +- .../LanguageSettingsBaseProvider.java | 46 +++-- .../LanguageSettingsSerializableProvider.java | 47 ++--- .../LanguageSettingsExtensionManager.java | 11 +- 15 files changed, 433 insertions(+), 326 deletions(-) diff --git a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/BuiltinSpecsDetectorTest.java b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/BuiltinSpecsDetectorTest.java index b51a80e0042..10db27a4541 100644 --- a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/BuiltinSpecsDetectorTest.java +++ b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/BuiltinSpecsDetectorTest.java @@ -13,7 +13,9 @@ import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.model.CoreModel; @@ -47,9 +49,11 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { private static final String PROVIDER_NAME = "provider name"; private static final String LANGUAGE_ID = "language.test.id"; private static final String CUSTOM_PARAMETER = "customParameter"; + private static final String CUSTOM_PARAMETER_2 = "customParameter2"; private static final String ELEM_TEST = "test"; // those attributes must match that in AbstractBuiltinSpecsDetector + private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ private static final String ATTR_CONSOLE = "console"; //$NON-NLS-1$ private class MockBuiltinSpecsDetector extends AbstractBuiltinSpecsDetector { @@ -143,36 +147,46 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { public void testAbstractBuiltinSpecsDetector_GettersSetters() throws Exception { { // provider configured with null parameters - MockBuiltinSpecsDetectorExecutedFlag detector = new MockBuiltinSpecsDetectorExecutedFlag(); - detector.configureProvider(PROVIDER_ID, PROVIDER_NAME, null, null, null); + MockBuiltinSpecsDetectorExecutedFlag provider = new MockBuiltinSpecsDetectorExecutedFlag(); + provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, null, null, null); - assertEquals(PROVIDER_ID, detector.getId()); - assertEquals(PROVIDER_NAME, detector.getName()); - assertEquals(null, detector.getLanguageScope()); - assertEquals(null, detector.getSettingEntries(null, null, null)); - assertEquals(null, detector.getCustomParameter()); - assertEquals(false, detector.isExecuted()); + assertEquals(PROVIDER_ID, provider.getId()); + assertEquals(PROVIDER_NAME, provider.getName()); + assertEquals(null, provider.getLanguageScope()); + assertEquals(null, provider.getSettingEntries(null, null, null)); + assertEquals(null, provider.getCommand()); + assertEquals(false, provider.isExecuted()); + assertEquals(false, provider.isConsoleEnabled()); } { // provider configured with non-null parameters - MockBuiltinSpecsDetectorExecutedFlag detector = new MockBuiltinSpecsDetectorExecutedFlag(); + MockBuiltinSpecsDetectorExecutedFlag provider = new MockBuiltinSpecsDetectorExecutedFlag(); List languages = new ArrayList(); languages.add(LANGUAGE_ID); + Map properties = new HashMap(); + properties.put(ATTR_PARAMETER, CUSTOM_PARAMETER); List entries = new ArrayList(); ICLanguageSettingEntry entry = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); entries.add(entry); - detector.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, CUSTOM_PARAMETER); - assertEquals(PROVIDER_ID, detector.getId()); - assertEquals(PROVIDER_NAME, detector.getName()); - assertEquals(languages, detector.getLanguageScope()); - assertEquals(entries, detector.getSettingEntries(null, null, null)); - assertEquals(CUSTOM_PARAMETER, detector.getCustomParameter()); - assertEquals(false, detector.isExecuted()); + provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, properties); + assertEquals(PROVIDER_ID, provider.getId()); + assertEquals(PROVIDER_NAME, provider.getName()); + assertEquals(languages, provider.getLanguageScope()); + assertEquals(entries, provider.getSettingEntries(null, null, null)); + assertEquals(CUSTOM_PARAMETER, provider.getCommand()); + assertEquals(false, provider.isConsoleEnabled()); + assertEquals(false, provider.isExecuted()); - detector.execute(); - assertEquals(true, detector.isExecuted()); + // setters + provider.setCommand(CUSTOM_PARAMETER_2); + assertEquals(CUSTOM_PARAMETER_2, provider.getCommand()); + provider.setConsoleEnabled(true); + assertEquals(true, provider.isConsoleEnabled()); + + provider.execute(); + assertEquals(true, provider.isExecuted()); } } @@ -190,7 +204,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { } // create instance to compare to - MockDetectorCloneable detector = new MockDetectorCloneable(); + MockDetectorCloneable provider = new MockDetectorCloneable(); List languages = new ArrayList(); languages.add(LANGUAGE_ID); @@ -199,73 +213,75 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { entries.add(entry); // check clone after initialization - MockDetectorCloneable clone0 = detector.clone(); - assertTrue(detector.equals(clone0)); + MockDetectorCloneable clone0 = provider.clone(); + assertTrue(provider.equals(clone0)); // configure provider - detector.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, CUSTOM_PARAMETER); - assertEquals(false, detector.isConsoleEnabled()); - detector.setConsoleEnabled(true); - detector.execute(); - assertEquals(true, detector.isExecuted()); - assertFalse(detector.equals(clone0)); + Map properties = new HashMap(); + properties.put(ATTR_PARAMETER, CUSTOM_PARAMETER); + provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, properties); + assertEquals(false, provider.isConsoleEnabled()); + provider.setConsoleEnabled(true); + provider.execute(); + assertEquals(true, provider.isExecuted()); + assertFalse(provider.equals(clone0)); // check another clone after configuring { - MockDetectorCloneable clone = detector.clone(); - assertTrue(detector.equals(clone)); + MockDetectorCloneable clone = provider.clone(); + assertTrue(provider.equals(clone)); } // check custom parameter { - MockDetectorCloneable clone = detector.clone(); - clone.setCustomParameter("changed"); - assertFalse(detector.equals(clone)); + MockDetectorCloneable clone = provider.clone(); + clone.setCommand("changed"); + assertFalse(provider.equals(clone)); } // check language scope { - MockDetectorCloneable clone = detector.clone(); + MockDetectorCloneable clone = provider.clone(); clone.setLanguageScope(null); - assertFalse(detector.equals(clone)); + assertFalse(provider.equals(clone)); } // check console flag { - MockDetectorCloneable clone = detector.clone(); + MockDetectorCloneable clone = provider.clone(); boolean isConsoleEnabled = clone.isConsoleEnabled(); clone.setConsoleEnabled( ! isConsoleEnabled ); - assertFalse(detector.equals(clone)); + assertFalse(provider.equals(clone)); } // check isExecuted flag { - MockDetectorCloneable clone = detector.clone(); + MockDetectorCloneable clone = provider.clone(); assertEquals(true, clone.isExecuted()); clone.clear(); assertEquals(false, clone.isExecuted()); - assertFalse(detector.equals(clone)); + assertFalse(provider.equals(clone)); } // check entries { - MockDetectorCloneable clone = detector.clone(); + MockDetectorCloneable clone = provider.clone(); clone.setSettingEntries(null, null, null, null); - assertFalse(detector.equals(clone)); + assertFalse(provider.equals(clone)); } // check cloneShallow() { - MockDetectorCloneable detector2 = detector.clone(); - MockDetectorCloneable clone = detector2.cloneShallow(); + MockDetectorCloneable provider2 = provider.clone(); + MockDetectorCloneable clone = provider2.cloneShallow(); assertEquals(false, clone.isExecuted()); - assertFalse(detector2.equals(clone)); + assertFalse(provider2.equals(clone)); - detector2.setSettingEntries(null, null, null, null); - assertFalse(detector2.equals(clone)); + provider2.setSettingEntries(null, null, null, null); + assertFalse(provider2.equals(clone)); clone.execute(); - assertTrue(detector2.equals(clone)); + assertTrue(provider2.equals(clone)); } } @@ -278,54 +294,54 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); // load it to new provider - MockBuiltinSpecsDetectorExecutedFlag detector = new MockBuiltinSpecsDetectorExecutedFlag(); - detector.load(rootElement); - assertEquals(false, detector.isConsoleEnabled()); + MockBuiltinSpecsDetectorExecutedFlag provider = new MockBuiltinSpecsDetectorExecutedFlag(); + provider.load(rootElement); + assertEquals(false, provider.isConsoleEnabled()); } Element elementProvider; { // define mock detector - MockBuiltinSpecsDetectorExecutedFlag detector = new MockBuiltinSpecsDetectorExecutedFlag(); - assertEquals(false, detector.isConsoleEnabled()); + MockBuiltinSpecsDetectorExecutedFlag provider = new MockBuiltinSpecsDetectorExecutedFlag(); + assertEquals(false, provider.isConsoleEnabled()); // redefine the settings - detector.setConsoleEnabled(true); - assertEquals(true, detector.isConsoleEnabled()); + provider.setConsoleEnabled(true); + assertEquals(true, provider.isConsoleEnabled()); // serialize in XML Document doc = XmlUtil.newDocument(); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); - elementProvider = detector.serialize(rootElement); + elementProvider = provider.serialize(rootElement); String xmlString = XmlUtil.toString(doc); assertTrue(xmlString.contains(ATTR_CONSOLE)); } { // create another instance of the provider - MockBuiltinSpecsDetectorExecutedFlag detector = new MockBuiltinSpecsDetectorExecutedFlag(); - assertEquals(false, detector.isConsoleEnabled()); + MockBuiltinSpecsDetectorExecutedFlag provider = new MockBuiltinSpecsDetectorExecutedFlag(); + assertEquals(false, provider.isConsoleEnabled()); // load element - detector.load(elementProvider); - assertEquals(true, detector.isConsoleEnabled()); + provider.load(elementProvider); + assertEquals(true, provider.isConsoleEnabled()); } } public void testAbstractBuiltinSpecsDetector_Nulls() throws Exception { { // test AbstractBuiltinSpecsDetector.processLine(...) flow - MockBuiltinSpecsDetector detector = new MockBuiltinSpecsDetector(); - detector.startup(null); - detector.startupForLanguage(null); - detector.processLine(null, null); - detector.shutdownForLanguage(); - detector.shutdown(); + MockBuiltinSpecsDetector provider = new MockBuiltinSpecsDetector(); + provider.startup(null); + provider.startupForLanguage(null); + provider.processLine(null, null); + provider.shutdownForLanguage(); + provider.shutdown(); } { // test AbstractBuiltinSpecsDetector.processLine(...) flow - MockConsoleBuiltinSpecsDetector detector = new MockConsoleBuiltinSpecsDetector(); - detector.runForEachLanguage(null, null, null, null); + MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector(); + provider.runForEachLanguage(null, null, null, null); } } @@ -336,28 +352,28 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - MockConsoleBuiltinSpecsDetector detector = new MockConsoleBuiltinSpecsDetector(); - detector.setLanguageScope(new ArrayList() {{add(LANGUAGE_ID);}}); + MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector(); + provider.setLanguageScope(new ArrayList() {{add(LANGUAGE_ID);}}); - detector.runForEachLanguage(cfgDescription, null, null, null); - assertFalse(detector.isEmpty()); + provider.runForEachLanguage(cfgDescription, null, null, null); + assertFalse(provider.isEmpty()); - List noentries = detector.getSettingEntries(null, null, null); + List noentries = provider.getSettingEntries(null, null, null); assertNull(noentries); - List entries = detector.getSettingEntries(cfgDescription, null, LANGUAGE_ID); + List entries = provider.getSettingEntries(cfgDescription, null, LANGUAGE_ID); ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); assertEquals(expected, entries.get(0)); } public void testAbstractBuiltinSpecsDetector_RunGlobal() throws Exception { - MockConsoleBuiltinSpecsDetector detector = new MockConsoleBuiltinSpecsDetector(); - detector.setLanguageScope(new ArrayList() {{add(LANGUAGE_ID);}}); + MockConsoleBuiltinSpecsDetector provider = new MockConsoleBuiltinSpecsDetector(); + provider.setLanguageScope(new ArrayList() {{add(LANGUAGE_ID);}}); - detector.runForEachLanguage(null, null, null, null); - assertFalse(detector.isEmpty()); + provider.runForEachLanguage(null, null, null, null); + assertFalse(provider.isEmpty()); - List entries = detector.getSettingEntries(null, null, LANGUAGE_ID); + List entries = provider.getSettingEntries(null, null, LANGUAGE_ID); ICLanguageSettingEntry expected = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); assertEquals(expected, entries.get(0)); } @@ -378,7 +394,7 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { final CLibraryFileEntry libraryFile_2 = new CLibraryFileEntry("lib_2.a", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); // Define mock detector adding unorganized entries - MockBuiltinSpecsDetector detector = new MockBuiltinSpecsDetector() { + MockBuiltinSpecsDetector provider = new MockBuiltinSpecsDetector() { @Override public boolean processLine(String line, ErrorParserManager epm) { detectedSettingEntries.add(libraryFile_1); @@ -399,14 +415,14 @@ public class BuiltinSpecsDetectorTest extends BaseTestCase { }; // run specs detector - detector.startup(null); - detector.startupForLanguage(null); - detector.processLine("", null); - detector.shutdownForLanguage(); - detector.shutdown(); + provider.startup(null); + provider.startupForLanguage(null); + provider.processLine("", null); + provider.shutdownForLanguage(); + provider.shutdown(); // compare benchmarks, expected well-sorted - List entries = detector.getSettingEntries(null, null, null); + List entries = provider.getSettingEntries(null, null, null); int i=0; assertEquals(includePath_1, entries.get(i++)); diff --git a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/GCCBuildCommandParserTest.java b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/GCCBuildCommandParserTest.java index e6f11f55714..08ef8035eb1 100644 --- a/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/GCCBuildCommandParserTest.java +++ b/build/org.eclipse.cdt.make.core.tests/src/org/eclipse/cdt/make/scannerdiscovery/GCCBuildCommandParserTest.java @@ -57,11 +57,17 @@ import org.w3c.dom.Element; public class GCCBuildCommandParserTest extends BaseTestCase { // ID of the parser taken from the extension point private static final String GCC_BUILD_COMMAND_PARSER_EXT = "org.eclipse.cdt.make.core.build.command.parser.gcc"; //$NON-NLS-1$ - + + private static final String PROVIDER_ID = "provider.id"; + private static final String PROVIDER_NAME = "provider name"; + private static final String LANGUAGE_ID = "language.test.id"; + private static final String CUSTOM_PARAMETER = "customParameter"; + private static final String CUSTOM_PARAMETER_2 = "customParameter2"; private static final String ELEM_TEST = "test"; private static final String LANG_CPP = GPPLanguage.ID; - // those attributes must match that in AbstractBuiltinSpecsDetector + // those attributes must match that in AbstractBuildCommandParser + private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ private static final String ATTR_EXPAND_RELATIVE_PATHS = "expand-relative-paths"; //$NON-NLS-1$ private class MockBuildCommandParser extends AbstractBuildCommandParser implements Cloneable { @@ -140,12 +146,12 @@ public class GCCBuildCommandParserTest extends BaseTestCase { // configuration description ICConfigurationDescription[] cfgDescriptions = projectDescription.getConfigurations(); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + final ICConfigurationDescription cfgDescriptionReferenced = getConfigurationDescriptions(projectReferenced)[0]; cfgDescription.setReferenceInfo(new HashMap() {{ put(projectReferenced.getName(), cfgDescriptionReferenced.getId()); }}); coreModel.setProjectDescription(project, projectDescription); } - + { // doublecheck that it's set as expected ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); @@ -157,7 +163,44 @@ public class GCCBuildCommandParserTest extends BaseTestCase { } } - + + + public void testAbstractBuildCommandParser_GettersSetters() throws Exception { + { + // provider configured with null parameters + MockBuildCommandParser provider = new MockBuildCommandParser(); + provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, null, null, null); + + assertEquals(PROVIDER_ID, provider.getId()); + assertEquals(PROVIDER_NAME, provider.getName()); + assertEquals(null, provider.getLanguageScope()); + assertEquals(null, provider.getSettingEntries(null, null, null)); + assertEquals(null, provider.getCompilerPattern()); + } + + { + // provider configured with non-null parameters + MockBuildCommandParser provider = new MockBuildCommandParser(); + List languages = new ArrayList(); + languages.add(LANGUAGE_ID); + Map properties = new HashMap(); + properties.put(ATTR_PARAMETER, CUSTOM_PARAMETER); + List entries = new ArrayList(); + ICLanguageSettingEntry entry = new CMacroEntry("MACRO", "VALUE", ICSettingEntry.BUILTIN | ICSettingEntry.READONLY); + entries.add(entry); + + provider.configureProvider(PROVIDER_ID, PROVIDER_NAME, languages, entries, properties); + assertEquals(PROVIDER_ID, provider.getId()); + assertEquals(PROVIDER_NAME, provider.getName()); + assertEquals(languages, provider.getLanguageScope()); + assertEquals(entries, provider.getSettingEntries(null, null, null)); + assertEquals(CUSTOM_PARAMETER, provider.getCompilerPattern()); + + // setters + provider.setCompilerPattern(CUSTOM_PARAMETER_2); + assertEquals(CUSTOM_PARAMETER_2, provider.getCompilerPattern()); + } + } public void testAbstractBuildCommandParser_CloneAndEquals() throws Exception { // create instance to compare to @@ -824,7 +867,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { parser.startup(cfgDescription); parser.processLine("gcc -I/path0 missing.cpp"); parser.shutdown(); - + // check entries assertTrue(parser.isEmpty()); } @@ -838,13 +881,13 @@ public class GCCBuildCommandParserTest extends BaseTestCase { 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); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -852,7 +895,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + "-I. " + file.getLocation().toOSString()); parser.shutdown(); - + // check entries IPath path0 = new Path("/path0").setDevice(project.getLocation().getDevice()); { @@ -861,7 +904,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CIncludePathEntry(project.getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(1)); } } - + /** */ public void testFileAbsolutePath_NoProject() throws Exception { @@ -871,13 +914,13 @@ public class GCCBuildCommandParserTest extends BaseTestCase { 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); - + // parse line parser.startup(null); parser.processLine("gcc " @@ -885,7 +928,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + "-I. " + file.getLocation().toOSString()); parser.shutdown(); - + // check entries IPath path0 = new Path("/path0").setDevice(project.getLocation().getDevice()); { @@ -894,7 +937,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CIncludePathEntry(file.getParent().getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(1)); } } - + /** */ public void testFileWithSpaces() throws Exception { @@ -960,17 +1003,17 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IFile file=ResourceHelper.createFile(project, "Folder1/Folder2/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); ErrorParserManager epm = new ErrorParserManager(project, null); // Shift build directory, that could happen if Make Target from folder1 was run IFolder buildDir = folder1; epm.pushDirectoryURI(buildDir.getLocationURI()); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -979,7 +1022,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + "Folder1/Folder2/file.cpp", epm); parser.shutdown(); - + // check entries IPath path0 = new Path("/path0").setDevice(project.getLocation().getDevice()); { @@ -989,7 +1032,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CIncludePathEntry(project.getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(1)); } } - + /** */ public void testEndOfLine() throws Exception { @@ -998,23 +1041,23 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + IFile file0=ResourceHelper.createFile(project, "file0.cpp"); IFile file1=ResourceHelper.createFile(project, "file1.cpp"); IFile file2=ResourceHelper.createFile(project, "file2.cpp"); ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file0.getProjectRelativePath(), true); String languageId = ls.getLanguageId(); - + // create GCCBuildCommandParser GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc -I/path0 file0.cpp"); parser.processLine("gcc -I/path0 file1.cpp\n"); parser.processLine("gcc -I/path0 file2.cpp\r\n"); parser.shutdown(); - + // check populated entries IPath path0 = new Path("/path0").setDevice(project.getLocation().getDevice()); { @@ -1043,33 +1086,33 @@ public class GCCBuildCommandParserTest extends BaseTestCase { // do not test on non-windows systems where drive letters are not supported if (! Platform.getOS().equals(Platform.OS_WIN32)) return; - + // 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 GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); parser.setResolvingPaths(true); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " + " -IX:\\path" + " file.cpp"); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); assertEquals(new CIncludePathEntry(new Path("X:\\path"), 0), entries.get(0)); } - + /** */ public void testPathEntry_ExpandRelativePath() throws Exception { @@ -1189,7 +1232,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + IFolder buildDir=ResourceHelper.createFolder(project, "BuildDir"); IFolder folder=ResourceHelper.createFolder(project, "BuildDir/Folder"); IFile file=ResourceHelper.createFile(project, "BuildDir/file.cpp"); @@ -1197,12 +1240,12 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IFile fakeFile=ResourceHelper.createFile(project, "file.cpp"); ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), true); String languageId = ls.getLanguageId(); - + // create GCCBuildCommandParser GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); ErrorParserManager epm = new ErrorParserManager(project, null); epm.pushDirectoryURI(buildDir.getLocationURI()); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -1214,7 +1257,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " file.cpp", epm); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); { @@ -1225,7 +1268,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CIncludePathEntry(buildDir.getFullPath().append("MissingFolder"), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(4)); } } - + /** */ public void testPathEntry_GuessCWD() throws Exception { @@ -1382,7 +1425,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CIncludePathEntry(buildDir.getFullPath().append("MissingFolder2"), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(4)); } } - + /** */ public void testPathEntry_MappedFolderInProject() throws Exception { @@ -1391,7 +1434,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + IFile file=ResourceHelper.createFile(project, "BuildDir/file.cpp"); IFolder mappedFolder=ResourceHelper.createFolder(project, "Mapped/Folder"); IFolder folder=ResourceHelper.createFolder(project, "Mapped/Folder/Subfolder"); @@ -1399,14 +1442,14 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IFolder ambiguousFolder1=ResourceHelper.createFolder(project, "One/Ambiguous/Folder"); @SuppressWarnings("unused") IFolder ambiguousFolder2=ResourceHelper.createFolder(project, "Another/Ambiguous/Folder"); - + ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), true); String languageId = ls.getLanguageId(); - + // create GCCBuildCommandParser GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); ErrorParserManager epm = new ErrorParserManager(project, null); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -1417,7 +1460,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " file.cpp", epm); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); { @@ -1442,7 +1485,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + // create files and folders IFile file=ResourceHelper.createFile(project, "file.cpp"); // another project @@ -1453,14 +1496,14 @@ public class GCCBuildCommandParserTest extends BaseTestCase { @SuppressWarnings("unused") IFolder ambiguousFolder2=ResourceHelper.createFolder(anotherProject, "Another/Ambiguous/Folder"); - + ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), true); String languageId = ls.getLanguageId(); // create GCCBuildCommandParser GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); ErrorParserManager epm = new ErrorParserManager(project, null); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -1470,7 +1513,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " file.cpp", epm); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); { @@ -1485,22 +1528,22 @@ public class GCCBuildCommandParserTest extends BaseTestCase { assertEquals(new CIncludePathEntry(path, 0), entries.get(2)); } } - + /** */ public void testPathEntry_MappedFolderInReferencedProject() throws Exception { // Create model project and accompanied descriptions String projectName = getName(); - + // create main project IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); IFile file=ResourceHelper.createFile(project, "file.cpp"); - + // create another project (non-referenced) IProject anotherProject = ResourceHelper.createCDTProjectWithConfig(projectName+"-another"); @SuppressWarnings("unused") IFolder folderInAnotherProject=ResourceHelper.createFolder(anotherProject, "Mapped/Folder/Subfolder"); - + // create referenced project IProject referencedProject = ResourceHelper.createCDTProjectWithConfig(projectName+"-referenced"); IFolder folderInReferencedProject=ResourceHelper.createFolder(referencedProject, "Mapped/Folder/Subfolder"); @@ -1508,7 +1551,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IFolder ambiguousFolder1=ResourceHelper.createFolder(referencedProject, "One/Ambiguous/Folder"); @SuppressWarnings("unused") IFolder ambiguousFolder2=ResourceHelper.createFolder(referencedProject, "Another/Ambiguous/Folder"); - + setReference(project, referencedProject); // get cfgDescription and language to work with @@ -1516,11 +1559,11 @@ public class GCCBuildCommandParserTest extends BaseTestCase { 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); ErrorParserManager epm = new ErrorParserManager(project, null); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -1529,7 +1572,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " file.cpp", epm); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); { @@ -1680,16 +1723,16 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IFolder includeDir=ResourceHelper.createFolder(project, "BuildDir/include"); // Change build dir setBuilderCWD(project, buildDir.getLocation()); - + 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); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -1698,16 +1741,16 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " " + file.getLocation().toOSString() ); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); { assertEquals(new CIncludePathEntry(buildDir.getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(0)); assertEquals(new CIncludePathEntry(includeDir.getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(1)); } - + } - + public void testContentType_None() throws Exception { MockBuildCommandParser parser = new MockBuildCommandParser() { @Override @@ -1718,11 +1761,11 @@ public class GCCBuildCommandParserTest extends BaseTestCase { parser.startup(null); parser.processLine("gcc file.wrong-content-type"); parser.shutdown(); - + List entries = parser.getSettingEntries(null, null, null); assertNull(entries); } - + /** */ public void testContentType_Mismatch() throws Exception { @@ -1732,7 +1775,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; ResourceHelper.createFile(project, "file.c"); - + // create GCCBuildCommandParser GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); // restrict the parser's language scope to C++ only @@ -1742,7 +1785,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { parser.startup(cfgDescription); parser.processLine("gcc -I/path0 file.c"); parser.shutdown(); - + assertTrue(parser.isEmpty()); } @@ -1863,7 +1906,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + // create folder structure @SuppressWarnings("unused") IFolder buildDir=ResourceHelper.createEfsFolder(project, "BuildDir", new URI("mem:/EfsProject/BuildDir")); @@ -1902,7 +1945,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IProject project = ResourceHelper.createCDTProjectWithConfig(projectName); ICConfigurationDescription[] cfgDescriptions = getConfigurationDescriptions(project); ICConfigurationDescription cfgDescription = cfgDescriptions[0]; - + // create folder structure @SuppressWarnings("unused") IFolder buildDir=ResourceHelper.createEfsFolder(project, "BuildDir", new URI("mem:/MappedEfsProject/BuildDir")); @@ -1911,11 +1954,11 @@ public class GCCBuildCommandParserTest extends BaseTestCase { IFile file=ResourceHelper.createEfsFile(project, "BuildDir/file.cpp", new URI("mem:/MappedEfsProject/BuildDir/file.cpp")); ICLanguageSetting ls = cfgDescription.getLanguageSettingForFile(file.getProjectRelativePath(), true); String languageId = ls.getLanguageId(); - + // create GCCBuildCommandParser GCCBuildCommandParser parser = (GCCBuildCommandParser) LanguageSettingsManager.getExtensionProviderCopy(GCC_BUILD_COMMAND_PARSER_EXT); ErrorParserManager epm = new ErrorParserManager(project, null); - + // parse line parser.startup(cfgDescription); parser.processLine("gcc " @@ -1923,7 +1966,7 @@ public class GCCBuildCommandParserTest extends BaseTestCase { + " file.cpp", epm); parser.shutdown(); - + // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); { diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuildCommandParser.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuildCommandParser.java index e3159346705..59e256ed08e 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuildCommandParser.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuildCommandParser.java @@ -45,8 +45,8 @@ import org.eclipse.core.runtime.jobs.Job; */ public abstract class AbstractBuildCommandParser extends AbstractLanguageSettingsOutputScanner implements ICConsoleParser, IErrorParser { - public static final Object JOB_FAMILY_BUILD_COMMAND_PARSER = "org.eclipse.cdt.make.core.scannerconfig.AbstractBuildCommandParser"; + private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ private static final String LEADING_PATH_PATTERN = "\\S+[/\\\\]"; //$NON-NLS-1$ private static final Pattern OPTIONS_PATTERN = Pattern.compile("-[^\\s\"']*(\\s*((\".*?\")|('.*?')|([^-\\s][^\\s]+)))?"); //$NON-NLS-1$ @@ -63,22 +63,43 @@ public abstract class AbstractBuildCommandParser extends AbstractLanguageSetting private static final int FILE_GROUP = 2; + /** + * The compiler command pattern without specifying compiler options. + * The options are intended to be handled with option parsers, + * see {@link #getOptionParsers()}. + * This is regular expression pattern. + * + * @return the compiler command pattern. + */ + public String getCompilerPattern() { + return getProperty(ATTR_PARAMETER); + } + + /** + * Set compiler command pattern for the provider. See {@link #getCompilerPattern()}. + * @param commandPattern - value of the command pattern to set. + * This is regular expression pattern. + */ + public void setCompilerPattern(String commandPattern) { + setProperty(ATTR_PARAMETER, commandPattern); + } + @SuppressWarnings("nls") - private String getCompilerCommandPattern() { - String parameter = getCustomParameter(); - return "\\s*\"?("+LEADING_PATH_PATTERN+")?(" + parameter + ")\"?"; + private String getCompilerPatternExtended() { + String compilerPattern = getCompilerPattern(); + return "\\s*\"?("+LEADING_PATH_PATTERN+")?(" + compilerPattern + ")\"?"; } private int adjustFileGroup() { - return countGroups(getCompilerCommandPattern()) + FILE_GROUP; + return countGroups(getCompilerPatternExtended()) + FILE_GROUP; } private String makePattern(String template) { @SuppressWarnings("nls") String pattern = template - .replace("${COMPILER_PATTERN}", getCompilerCommandPattern()) + .replace("${COMPILER_PATTERN}", getCompilerPatternExtended()) .replace("${EXTENSIONS_PATTERN}", getPatternFileExtensions()) - .replace("${COMPILER_GROUPS+1}", new Integer(countGroups(getCompilerCommandPattern()) + 1).toString()); + .replace("${COMPILER_GROUPS+1}", new Integer(countGroups(getCompilerPatternExtended()) + 1).toString()); return pattern; } diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuiltinSpecsDetector.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuiltinSpecsDetector.java index 2264e3f1af5..0022c02bf8e 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractBuiltinSpecsDetector.java @@ -80,6 +80,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti private static final String PLUGIN_CDT_MAKE_UI_ID = "org.eclipse.cdt.make.ui"; //$NON-NLS-1$ private static final String GMAKE_ERROR_PARSER_ID = "org.eclipse.cdt.core.GmakeErrorParser"; //$NON-NLS-1$ private static final String PATH_ENV = "PATH"; //$NON-NLS-1$ + private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ private static final String ATTR_CONSOLE = "console"; //$NON-NLS-1$ protected static final String COMPILER_MACRO = "${COMMAND}"; //$NON-NLS-1$ @@ -182,6 +183,30 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti } } + /** + * The command to run. Some macros could be specified in there: + *
    + * ${COMMAND} - compiler command taken from the toolchain.
    + * ${INPUTS} - path to spec file which will be placed in workspace area.
    + * ${EXT} - file extension calculated from language ID. + *
+ * The parameter could be taken from the extension + * in {@code plugin.xml} or from property file. + * + * @return the command to run. + */ + public String getCommand() { + return getProperty(ATTR_PARAMETER); + } + + /** + * Set custom command for the provider. See {@link #getCommand()}. + * @param command - value of custom command to set. + */ + public void setCommand(String command) { + setProperty(ATTR_PARAMETER, command); + } + public void setConsoleEnabled(boolean enable) { isConsoleEnabled = enable; } @@ -191,7 +216,7 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti } protected String resolveCommand(String languageId) throws CoreException { - String cmd = getCustomParameter(); + String cmd = getCommand(); if (cmd!=null && (cmd.contains(COMPILER_MACRO) || cmd.contains(SPEC_FILE_MACRO) || cmd.contains(SPEC_EXT_MACRO))) { if (cmd.contains(COMPILER_MACRO)) { String compiler = getCompilerCommand(languageId); diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractLanguageSettingsOutputScanner.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractLanguageSettingsOutputScanner.java index 652dcfc63da..0c373948d47 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractLanguageSettingsOutputScanner.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/AbstractLanguageSettingsOutputScanner.java @@ -184,7 +184,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett /** * Parse the line returning the resource name as appears in the output. * This is the resource where {@link ICLanguageSettingEntry} list is being added. - * + * * @param line - one input line from the output stripped from end of line characters. * @return the resource name as appears in the output or {@code null}. * Note that {@code null} can have different semantics and can mean "no resource found" @@ -198,7 +198,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett * the option parsers. It is assumed that each substring presents one * {@link ICLanguageSettingEntry} (for example compiler options {@code -I/path} or * {@code -DMACRO=1}. - * + * * @param line - one input line from the output stripped from end of line characters. * @return list of substrings representing language settings entries. */ @@ -240,7 +240,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett errorParserManager = epm; parsedResourceName = parseForResourceName(line); currentResource = findResource(parsedResourceName); - + currentLanguageId = determineLanguage(); if (!isLanguageInScope(currentLanguageId)) return false; @@ -251,7 +251,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett * it can be different filesystem (and different URI schema). */ URI buildDirURI = null; - + /** * Where source tree starts if mapped. This kind of mapping is useful for example in cases when * the absolute path to the source file on the remote system is simulated inside a project in the @@ -260,14 +260,14 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett * (or even URI schema) does not have to match that of buildDirURI. */ URI mappedRootURI = null; - + if (isResolvingPaths) { mappedRootURI = getMappedRootURI(currentResource, parsedResourceName); buildDirURI = getBuildDirURI(mappedRootURI); } List entries = new ArrayList(); - + List options = parseForOptions(line); if (options!=null) { for (String option : options) { @@ -283,7 +283,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett } else { entry = optionParser.createEntry(optionParser.parsedName, optionParser.parsedValue, 0); } - + if (entry != null && !entries.contains(entry)) { entries.add(entry); break; @@ -319,7 +319,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett protected void setSettingEntries(List entries) { setSettingEntries(currentCfgDescription, currentResource, currentLanguageId, entries); - + LanguageSettingsLogger.logInfo(getPrefixForLog() + getClass().getSimpleName() + " collected " + (entries!=null ? ("" + entries.size()) : "null") + " entries for " + currentResource); } @@ -331,10 +331,10 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett // use handle; resource does not need to exist rc = currentProject.getFile("__" + fileName); } - + if (rc == null) return null; - + List languageIds = LanguageSettingsManager.getLanguages(rc, currentCfgDescription); if (languageIds.isEmpty()) return null; @@ -349,26 +349,26 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett protected String getPatternFileExtensions() { IContentTypeManager manager = Platform.getContentTypeManager(); - + Set fileExts = new HashSet(); - + IContentType contentTypeCpp = manager.getContentType("org.eclipse.cdt.core.cxxSource"); //$NON-NLS-1$ fileExts.addAll(Arrays.asList(contentTypeCpp.getFileSpecs(IContentType.FILE_EXTENSION_SPEC))); - + IContentType contentTypeC = manager.getContentType("org.eclipse.cdt.core.cSource"); //$NON-NLS-1$ fileExts.addAll(Arrays.asList(contentTypeC.getFileSpecs(IContentType.FILE_EXTENSION_SPEC))); - + String pattern = expressionLogicalOr(fileExts); - + return pattern; } private ICLanguageSettingEntry createResolvedPathEntry(AbstractOptionParser optionParser, String parsedPath, int flag, URI baseURI) { - + ICLanguageSettingEntry entry; String resolvedPath = null; - + URI uri = determineMappedURI(parsedPath, baseURI); IResource rc = null; if (uri != null && uri.isAbsolute()) { @@ -400,7 +400,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett resolvedPath = path.toString(); } } - + if (resolvedPath==null) { resolvedPath = parsedPath; } @@ -412,9 +412,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett private IResource findResource(String parsedResourceName) { if (parsedResourceName==null) return null; - + IResource sourceFile = null; - + // try ErrorParserManager if (errorParserManager != null) { sourceFile = errorParserManager.findFileName(parsedResourceName); @@ -442,7 +442,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett protected URI getBuildDirURI(URI mappedRootURI) { URI buildDirURI = null; - + URI cwdURI = null; if (currentResource!=null && parsedResourceName!=null && !new Path(parsedResourceName).isAbsolute()) { cwdURI = findBaseLocationURI(currentResource.getLocationURI(), parsedResourceName); @@ -450,14 +450,14 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett if (cwdURI == null && errorParserManager != null) { cwdURI = errorParserManager.getWorkingDirectoryURI(); } - + String cwdPath = cwdURI != null ? EFSExtensionManager.getDefault().getPathFromURI(cwdURI) : null; if (cwdPath != null && mappedRootURI != null) { buildDirURI = EFSExtensionManager.getDefault().append(mappedRootURI, cwdPath); } else { buildDirURI = cwdURI; } - + if (buildDirURI == null && currentCfgDescription != null) { IPath pathBuilderCWD = currentCfgDescription.getBuildSetting().getBuilderCWD(); if (pathBuilderCWD != null) { @@ -472,11 +472,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett buildDirURI = org.eclipse.core.filesystem.URIUtil.toURI(builderCWD); } } - + if (buildDirURI == null && currentProject != null) { buildDirURI = currentProject.getLocationURI(); } - + if (buildDirURI == null && currentResource != null) { IContainer container; if (currentResource instanceof IContainer) { @@ -491,14 +491,14 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett /** * Determine URI on the local filesystem considering possible mapping. - * + * * @param pathStr - path to the resource, can be absolute or relative * @param baseURI - base {@link URI} where path to the resource is rooted * @return {@link URI} of the resource */ private static URI determineMappedURI(String pathStr, URI baseURI) { URI uri = null; - + if (baseURI==null) { if (new Path(pathStr).isAbsolute()) { uri = resolvePathFromBaseLocation(pathStr, Path.ROOT); @@ -519,7 +519,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett } } } - + if (uri == null) { // if everything fails just wrap string to URI uri = org.eclipse.core.filesystem.URIUtil.toURI(pathStr); @@ -532,7 +532,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett if (path.equals(new Path(".")) || path.equals(new Path(".."))) { //$NON-NLS-1$ //$NON-NLS-2$ return null; } - + // prefer current project if (preferredProject!=null) { List result = findPathInFolder(path, preferredProject); @@ -543,9 +543,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett return null; } } - + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - + // then prefer referenced projects if (referencedProjectsNames.size() > 0) { IResource rc = null; @@ -567,7 +567,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett return rc; } } - + // then check all other projects in workspace IProject[] projects = root.getProjects(); if (projects.length > 0) { @@ -589,7 +589,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett return rc; } } - + // not found or ambiguous return null; } @@ -600,7 +600,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett if (resource != null) { paths.add(resource); } - + try { for (IResource res : folder.members()) { if (res instanceof IContainer) { @@ -610,7 +610,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett } catch (CoreException e) { // ignore } - + return paths; } @@ -637,9 +637,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett private static URI findBaseLocationURI(URI fileURI, String relativeFileName) { URI cwdURI = null; String path = fileURI.getPath(); - + String[] segments = relativeFileName.split("[/\\\\]"); //$NON-NLS-1$ - + // start removing segments from the end of the path for (int i = segments.length - 1; i >= 0; i--) { String lastSegment = segments[i]; @@ -659,7 +659,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett } } } - + try { cwdURI = new URI(fileURI.getScheme(), fileURI.getUserInfo(), fileURI.getHost(), fileURI.getPort(), path + '/', fileURI.getQuery(), fileURI.getFragment()); @@ -667,7 +667,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett // It should be valid URI here or something is wrong MakeCorePlugin.log(e); } - + return cwdURI; } @@ -676,7 +676,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett * this function will try to figure mapping and return "mapped root", * i.e URI where the root path would be mapped. The mapped root will be * used to prepend to other "absolute" paths where appropriate. - * + * * @param sourceFile - a resource referred by parsed path * @param parsedResourceName - path as appears in the output * @return mapped path as URI @@ -685,10 +685,10 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett if (currentResource==null) { return null; } - + URI fileURI = sourceFile.getLocationURI(); String mappedRoot = "/"; //$NON-NLS-1$ - + if (parsedResourceName!=null) { IPath parsedSrcPath = new Path(parsedResourceName); if (parsedSrcPath.isAbsolute()) { @@ -723,7 +723,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett if (device != null && device.length() > 0) { pathName = pathName.substring(device.length()); } - + baseLocation = baseLocation.addTrailingSeparator(); if (pathName.startsWith("/")) { //$NON-NLS-1$ pathName = pathName.substring(1); @@ -731,7 +731,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett pathName = baseLocation.toString() + pathName; } } - + try { File file = new File(pathName); file = file.getCanonicalFile(); @@ -739,7 +739,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett } catch (IOException e) { // if error just leave it as is } - + URI uri = org.eclipse.core.filesystem.URIUtil.toURI(pathName); return uri; } @@ -747,9 +747,9 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett private static IResource findResourceForLocationURI(URI uri, int kind, IProject preferredProject) { if (uri==null) return null; - + IResource resource = null; - + switch (kind) { case ICSettingEntry.INCLUDE_PATH: case ICSettingEntry.LIBRARY_PATH: @@ -760,7 +760,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett resource = findFileForLocationURI(uri, preferredProject); break; } - + return resource; } @@ -788,11 +788,11 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett private static IPath getFilesystemLocation(URI uri) { if (uri==null) return null; - + // EFSExtensionManager mapping String pathStr = EFSExtensionManager.getDefault().getMappedPath(uri); uri = org.eclipse.core.filesystem.URIUtil.toURI(pathStr); - + try { File file = new java.io.File(uri); String canonicalPathStr = file.getCanonicalPath(); @@ -818,7 +818,7 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett pattern += ")"; return pattern; } - + protected static int countGroups(String str) { @SuppressWarnings("nls") int count = str.replaceAll("[^\\(]", "").length(); @@ -831,16 +831,16 @@ public abstract class AbstractLanguageSettingsOutputScanner extends LanguageSett elementProvider.setAttribute(ATTR_EXPAND_RELATIVE_PATHS, Boolean.toString(isResolvingPaths)); return elementProvider; } - + @Override public void loadAttributes(Element providerNode) { super.loadAttributes(providerNode); - + String expandRelativePathsValue = XmlUtil.determineAttributeValue(providerNode, ATTR_EXPAND_RELATIVE_PATHS); if (expandRelativePathsValue!=null) isResolvingPaths = Boolean.parseBoolean(expandRelativePathsValue); } - + @Override public int hashCode() { final int prime = 31; diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/preferences/GCCBuildCommandParserOptionPage.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/preferences/GCCBuildCommandParserOptionPage.java index 982e2a023e6..b0739693219 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/preferences/GCCBuildCommandParserOptionPage.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/preferences/GCCBuildCommandParserOptionPage.java @@ -88,8 +88,8 @@ public final class GCCBuildCommandParserOptionPage extends AbstractLanguageSetti { inputCommand = ControlFactory.createTextField(composite, SWT.SINGLE | SWT.BORDER); - String customParameter = provider.getCustomParameter(); - inputCommand.setText(customParameter!=null ? customParameter : ""); + String compilerPattern = provider.getCompilerPattern(); + inputCommand.setText(compilerPattern!=null ? compilerPattern : ""); GridData gd = new GridData(); gd.horizontalSpan = 1; @@ -103,9 +103,9 @@ public final class GCCBuildCommandParserOptionPage extends AbstractLanguageSetti public void modifyText(ModifyEvent e) { String text = inputCommand.getText(); AbstractBuildCommandParser provider = getRawProvider(); - if (!text.equals(provider.getCustomParameter())) { + if (!text.equals(provider.getCompilerPattern())) { AbstractBuildCommandParser selectedProvider = getWorkingCopy(providerId); - selectedProvider.setCustomParameter(text); + selectedProvider.setCompilerPattern(text); providerTab.refreshItem(selectedProvider); } } diff --git a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/BuiltinSpecsDetectorOptionPage.java b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/BuiltinSpecsDetectorOptionPage.java index 581c9b8a5d3..12035759118 100644 --- a/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/BuiltinSpecsDetectorOptionPage.java +++ b/build/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/scannerconfig/BuiltinSpecsDetectorOptionPage.java @@ -84,17 +84,17 @@ public final class BuiltinSpecsDetectorOptionPage extends AbstractLanguageSettin { inputCommand = ControlFactory.createTextField(composite, SWT.SINGLE | SWT.BORDER); - String customParameter = provider.getCustomParameter(); - inputCommand.setText(customParameter!=null ? customParameter : ""); + String command = provider.getCommand(); + inputCommand.setText(command!=null ? command : ""); inputCommand.setEnabled(fEditable); inputCommand.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String text = inputCommand.getText(); AbstractBuiltinSpecsDetector provider = getRawProvider(); - if (!text.equals(provider.getCustomParameter())) { + if (!text.equals(provider.getCommand())) { AbstractBuiltinSpecsDetector selectedProvider = getWorkingCopy(providerId); - selectedProvider.setCustomParameter(text); + selectedProvider.setCommand(text); providerTab.refreshItem(selectedProvider); } } diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/build/core/scannerconfig/tests/GCCBuiltinSpecsDetectorTest.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/build/core/scannerconfig/tests/GCCBuiltinSpecsDetectorTest.java index da2257694e4..6a24a79e6aa 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/build/core/scannerconfig/tests/GCCBuiltinSpecsDetectorTest.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/build/core/scannerconfig/tests/GCCBuiltinSpecsDetectorTest.java @@ -88,7 +88,7 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase { { MockGCCBuiltinSpecsDetectorLocal detector = new MockGCCBuiltinSpecsDetectorLocal(); detector.setLanguageScope(new ArrayList() {{add(LANGUAGE_ID_C);}}); - detector.setCustomParameter("${COMMAND} -E -P -v -dD ${INPUTS}"); + detector.setCommand("${COMMAND} -E -P -v -dD ${INPUTS}"); String resolvedCommand = detector.resolveCommand(LANGUAGE_ID_C); assertTrue(resolvedCommand.startsWith("gcc -E -P -v -dD ")); @@ -97,7 +97,7 @@ public class GCCBuiltinSpecsDetectorTest extends BaseTestCase { { MockGCCBuiltinSpecsDetectorLocal detector = new MockGCCBuiltinSpecsDetectorLocal(); detector.setLanguageScope(new ArrayList() {{add(LANGUAGE_ID_C);}}); - detector.setCustomParameter("${COMMAND} -E -P -v -dD file.${EXT}"); + detector.setCommand("${COMMAND} -E -P -v -dD file.${EXT}"); String resolvedCommand = detector.resolveCommand(LANGUAGE_ID_C); assertTrue(resolvedCommand.startsWith("gcc -E -P -v -dD ")); diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java index d2f792f2a29..40dc2fc9439 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsExtensionsTests.java @@ -39,6 +39,7 @@ public class LanguageSettingsExtensionsTests extends BaseTestCase { /*package*/ static final String EXTENSION_BASE_PROVIDER_NAME = "Test Plugin Mock Language Settings Base Provider"; /*package*/ static final String EXTENSION_BASE_PROVIDER_LANG_ID = "org.eclipse.cdt.core.tests.language.id"; /*package*/ static final String EXTENSION_BASE_PROVIDER_PARAMETER = "custom parameter"; + /*package*/ static final String EXTENSION_BASE_PROVIDER_ATTR_PARAMETER = "parameter"; /*package*/ static final String EXTENSION_CUSTOM_PROVIDER_ID = "org.eclipse.cdt.core.tests.custom.language.settings.provider"; /*package*/ static final String EXTENSION_CUSTOM_PROVIDER_NAME = "Test Plugin Mock Language Settings Provider"; /*package*/ static final String EXTENSION_BASE_SUBCLASS_PROVIDER_ID = "org.eclipse.cdt.core.tests.language.settings.base.provider.subclass"; @@ -122,7 +123,7 @@ public class LanguageSettingsExtensionsTests extends BaseTestCase { LanguageSettingsBaseProvider provider = (LanguageSettingsBaseProvider)rawProvider; assertEquals(EXTENSION_BASE_PROVIDER_ID, provider.getId()); assertEquals(EXTENSION_BASE_PROVIDER_NAME, provider.getName()); - assertEquals(EXTENSION_BASE_PROVIDER_PARAMETER, provider.getCustomParameter()); + assertEquals(EXTENSION_BASE_PROVIDER_PARAMETER, provider.getProperty(EXTENSION_BASE_PROVIDER_ATTR_PARAMETER)); // attempt to get entries for wrong language assertNull(provider.getSettingEntries(null, FILE_0, LANG_ID)); @@ -263,7 +264,7 @@ public class LanguageSettingsExtensionsTests extends BaseTestCase { LanguageSettingsSerializableProvider provider = (LanguageSettingsSerializableProvider) rawProvider; assertEquals(null, provider.getLanguageScope()); - assertEquals("", provider.getCustomParameter()); + assertEquals("", provider.getProperty(EXTENSION_BASE_PROVIDER_ATTR_PARAMETER)); List expected = new ArrayList(); expected.add(new CMacroEntry("MACRO", "value", 0)); diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java index 6b994c49e4c..d0c7a4c43a6 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsPersistenceProjectTests.java @@ -54,8 +54,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { private static final String PROVIDER_2 = "test.provider.2.id"; private static final String PROVIDER_NAME_0 = "test.provider.0.name"; private static final String PROVIDER_NAME_2 = "test.provider.2.name"; - private static final String PROVIDER_ID_WSP = "test.provider.workspace.id"; - private static final String PROVIDER_NAME_WSP = "test.provider.workspace.name"; + private static final String ATTR_PARAMETER = "parameter"; private static final String CUSTOM_PARAMETER = "custom parameter"; private static final String ELEM_TEST = "test"; @@ -349,8 +348,8 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { assertEquals(EXTENSION_SERIALIZABLE_PROVIDER_ID, rawProvider.getId()); // customize provider - rawProvider.setCustomParameter(CUSTOM_PARAMETER); - assertEquals(CUSTOM_PARAMETER, rawProvider.getCustomParameter()); + rawProvider.setProperty(ATTR_PARAMETER, CUSTOM_PARAMETER); + assertEquals(CUSTOM_PARAMETER, rawProvider.getProperty(ATTR_PARAMETER)); } { // save workspace provider (as opposed to raw provider) @@ -363,7 +362,7 @@ public class LanguageSettingsPersistenceProjectTests extends BaseTestCase { // check that it has not cleared ILanguageSettingsProvider provider = LanguageSettingsManager.getWorkspaceProvider(EXTENSION_SERIALIZABLE_PROVIDER_ID); LanguageSettingsSerializableProvider rawProvider = (LanguageSettingsSerializableProvider) LanguageSettingsManager.getRawProvider(provider); - assertEquals(CUSTOM_PARAMETER, rawProvider.getCustomParameter()); + assertEquals(CUSTOM_PARAMETER, rawProvider.getProperty(ATTR_PARAMETER)); } } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java index 7b85ac4668d..1e26760efd7 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableTests.java @@ -54,7 +54,8 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { private static final String PROVIDER_NAME_NULL = "test.provider.null.name"; private static final String PROVIDER_NAME_1 = "test.provider.1.name"; private static final String PROVIDER_NAME_2 = "test.provider.2.name"; - private static final String CUSTOM_PARAMETER = "custom.parameter"; + private static final String ATTR_PARAMETER = "parameter"; + private static final String VALUE_PARAMETER = "custom.parameter"; private static final String ATTR_STORE_ENTRIES = "store-entries"; private static final String VALUE_PROJECT = "project"; private static final String ELEM_TEST = "test"; @@ -113,14 +114,8 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertEquals(PROVIDER_2, mockProvider.getId()); mockProvider.setName(PROVIDER_NAME_2); assertEquals(PROVIDER_NAME_2, mockProvider.getName()); - mockProvider.setCustomParameter(CUSTOM_PARAMETER); - assertEquals(CUSTOM_PARAMETER, mockProvider.getCustomParameter()); - - assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(mockProvider)); - LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, true); - assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(mockProvider)); - LanguageSettingsManager.setStoringEntriesInProjectArea(mockProvider, false); - assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(mockProvider)); + mockProvider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); + assertEquals(VALUE_PARAMETER, mockProvider.getProperty(ATTR_PARAMETER)); mockProvider.setLanguageScope(languages); assertEquals(languages, mockProvider.getLanguageScope()); @@ -138,6 +133,19 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertTrue(mockProvider.isEmpty()); } + /** + */ + public void testProvider_SetStoringEntriesInProjectArea() throws Exception { + // create a provider + LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); + + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); + assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); + LanguageSettingsManager.setStoringEntriesInProjectArea(provider, false); + assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); + } + /** */ public void testProvider_RegularDOM() throws Exception { @@ -146,7 +154,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // create customized provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); - provider.setCustomParameter(CUSTOM_PARAMETER); + provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); List languageScope = new ArrayList(); languageScope.add(LANG_ID); @@ -164,7 +172,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { String xmlString = XmlUtil.toString(doc); assertTrue(xmlString.contains(PROVIDER_1)); assertTrue(xmlString.contains(PROVIDER_NAME_1)); - assertTrue(xmlString.contains(CUSTOM_PARAMETER)); + assertTrue(xmlString.contains(VALUE_PARAMETER)); assertTrue(xmlString.contains(LANG_ID)); assertTrue(xmlString.contains("path0")); } @@ -173,7 +181,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); assertEquals(PROVIDER_1, provider.getId()); assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); - assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter()); + assertEquals(VALUE_PARAMETER, provider.getProperty(ATTR_PARAMETER)); assertNotNull(provider.getLanguageScope()); assertTrue(provider.getLanguageScope().size()>0); assertEquals(LANG_ID, provider.getLanguageScope().get(0)); @@ -193,7 +201,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // create customized provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); - provider.setCustomParameter(CUSTOM_PARAMETER); + provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); List languageScope = new ArrayList(); languageScope.add(LANG_ID); @@ -211,7 +219,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { String xmlString = XmlUtil.toString(doc); assertTrue(xmlString.contains(PROVIDER_1)); assertTrue(xmlString.contains(PROVIDER_NAME_1)); - assertTrue(xmlString.contains(CUSTOM_PARAMETER)); + assertTrue(xmlString.contains(VALUE_PARAMETER)); assertTrue(xmlString.contains(LANG_ID)); // no entries assertFalse(xmlString.contains("path0")); @@ -222,7 +230,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { provider.loadAttributes(elementProvider); assertEquals(PROVIDER_1, provider.getId()); assertEquals(true, LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); - assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter()); + assertEquals(VALUE_PARAMETER, provider.getProperty(ATTR_PARAMETER)); assertNotNull(provider.getLanguageScope()); assertTrue(provider.getLanguageScope().size()>0); assertEquals(LANG_ID, provider.getLanguageScope().get(0)); @@ -240,7 +248,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // create customized provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); LanguageSettingsManager.setStoringEntriesInProjectArea(provider, true); - provider.setCustomParameter(CUSTOM_PARAMETER); + provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); List languageScope = new ArrayList(); languageScope.add(LANG_ID); @@ -259,7 +267,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // no attributes assertFalse(xmlString.contains(PROVIDER_1)); assertFalse(xmlString.contains(PROVIDER_NAME_1)); - assertFalse(xmlString.contains(CUSTOM_PARAMETER)); + assertFalse(xmlString.contains(VALUE_PARAMETER)); assertFalse(xmlString.contains(LANG_ID)); // entries should be present assertTrue(xmlString.contains("path0")); @@ -274,7 +282,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertFalse(PROVIDER_1.equals(provider.getId())); assertFalse(PROVIDER_NAME_1.equals(provider.getName())); assertFalse(true==LanguageSettingsManager.isStoringEntriesInProjectArea(provider)); - assertFalse(CUSTOM_PARAMETER.equals(provider.getCustomParameter())); + assertFalse(VALUE_PARAMETER.equals(provider.getProperty(ATTR_PARAMETER))); assertNull(provider.getLanguageScope()); // entries should be loaded List entries = provider.getSettingEntries(null, null, null); @@ -318,19 +326,19 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { { // create provider with custom parameter LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); - provider.setCustomParameter(CUSTOM_PARAMETER); - assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter()); + provider.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); + assertEquals(VALUE_PARAMETER, provider.getProperty(ATTR_PARAMETER)); Document doc = XmlUtil.newDocument(); Element rootElement = XmlUtil.appendElement(doc, ELEM_TEST); elementProvider = provider.serialize(rootElement); String xmlString = XmlUtil.toString(doc); - assertTrue(xmlString.contains(CUSTOM_PARAMETER)); + assertTrue(xmlString.contains(VALUE_PARAMETER)); } { // re-load and check custom parameter of the newly loaded provider LanguageSettingsSerializableProvider provider = new LanguageSettingsSerializableProvider(elementProvider); - assertEquals(CUSTOM_PARAMETER, provider.getCustomParameter()); + assertEquals(VALUE_PARAMETER, provider.getProperty(ATTR_PARAMETER)); } } @@ -1175,7 +1183,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { // create a model provider LanguageSettingsSerializableProvider provider1 = new LanguageSettingsSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); - provider1.setCustomParameter(CUSTOM_PARAMETER); + provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); @@ -1199,7 +1207,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertFalse(provider1.equals(provider2)); assertFalse(provider1.hashCode()==provider2.hashCode()); - provider2.setCustomParameter(CUSTOM_PARAMETER); + provider2.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); assertFalse(provider1.equals(provider2)); assertFalse(provider1.hashCode()==provider2.hashCode()); @@ -1252,7 +1260,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { } MockSerializableProvider provider1 = new MockSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); - provider1.setCustomParameter(CUSTOM_PARAMETER); + provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); provider1.setSettingEntries(MOCK_CFG, MOCK_RC, LANG_ID, sampleEntries_1); @@ -1264,10 +1272,10 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertTrue(provider1.equals(providerClone)); assertTrue(provider1.getClass()==providerClone.getClass()); - assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); + assertEquals(provider1.getProperty(ATTR_PARAMETER), providerClone.getProperty(ATTR_PARAMETER)); // ensure we did not clone reference - provider1.setCustomParameter(""); - assertFalse(provider1.getCustomParameter().equals(providerClone.getCustomParameter())); + provider1.setProperty(ATTR_PARAMETER, ""); + assertFalse(provider1.getProperty(ATTR_PARAMETER).equals(providerClone.getProperty(ATTR_PARAMETER))); assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1), LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); // ensure we did not clone reference @@ -1309,7 +1317,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { } MockSerializableProvider provider1 = new MockSerializableProvider(PROVIDER_1, PROVIDER_NAME_1); provider1.setLanguageScope(sampleLanguages); - provider1.setCustomParameter(CUSTOM_PARAMETER); + provider1.setProperty(ATTR_PARAMETER, VALUE_PARAMETER); assertEquals(false, LanguageSettingsManager.isStoringEntriesInProjectArea(provider1)); LanguageSettingsManager.setStoringEntriesInProjectArea(provider1, true); @@ -1322,7 +1330,7 @@ public class LanguageSettingsSerializableTests extends BaseTestCase { assertNotSame(provider1, providerClone); assertFalse(provider1.equals(providerClone)); assertTrue(provider1.getClass()==providerClone.getClass()); - assertEquals(provider1.getCustomParameter(), providerClone.getCustomParameter()); + assertEquals(provider1.getProperty(ATTR_PARAMETER), providerClone.getProperty(ATTR_PARAMETER)); assertEquals(LanguageSettingsManager.isStoringEntriesInProjectArea(provider1), LanguageSettingsManager.isStoringEntriesInProjectArea(providerClone)); assertEquals(provider1.getLanguageScope().get(0), providerClone.getLanguageScope().get(0)); diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/MockLanguageSettingsBaseProvider.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/MockLanguageSettingsBaseProvider.java index afae2a4cb50..ce5a88584d6 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/MockLanguageSettingsBaseProvider.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/language/settings/providers/MockLanguageSettingsBaseProvider.java @@ -1,19 +1,23 @@ /******************************************************************************* - * Copyright (c) 2009, 2009 Andrew Gvozdev (Quoin Inc.) and others. + * Copyright (c) 2009, 2011 Andrew Gvozdev and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Andrew Gvozdev (Quoin Inc.) - initial API and implementation + * Andrew Gvozdev - initial API and implementation *******************************************************************************/ - package org.eclipse.cdt.core.language.settings.providers; -import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsBaseProvider; - - public class MockLanguageSettingsBaseProvider extends LanguageSettingsBaseProvider { + private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ + + /** + * @return the custom parameter defined in the extension in {@code plugin.xml}. + */ + public String getCustomParameter() { + return getProperty(ATTR_PARAMETER); + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsBaseProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsBaseProvider.java index dad259c2584..21e2879b096 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsBaseProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsBaseProvider.java @@ -13,7 +13,9 @@ package org.eclipse.cdt.core.language.settings.providers; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.eclipse.cdt.core.AbstractExecutableExtensionBase; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; @@ -27,15 +29,13 @@ import org.eclipse.core.resources.IResource; * * This implementation supports "static" list of entries for languages specified in * the extension point. - * - * @since 6.0 */ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBase implements ILanguageSettingsProvider { /** Language scope, i.e. list of languages the entries will be provided for. */ protected List languageScope = null; - /** Custom parameter. Intended for providers extending this class. */ - protected String customParameter = null; + /** Provider-specific properties */ + protected Map properties = new HashMap(); /** List of entries defined by this provider. */ private List entries = null; @@ -85,15 +85,15 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas * are provided for any language. * @param entries - the list of language settings entries this provider provides. * If {@code null} is passed, the provider creates an empty list. - * @param customParameter - a custom parameter as the means to customize - * providers extending this class. + * @param properties - custom properties as the means to customize providers. */ public LanguageSettingsBaseProvider(String id, String name, List languages, - List entries, String customParameter) { + List entries, Map properties) { super(id, name); this.languageScope = languages!=null ? new ArrayList(languages) : null; this.entries = getPooledList(entries); - this.customParameter = customParameter; + if (properties != null) + this.properties = new HashMap(properties); } /** @@ -111,21 +111,34 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas * are provided for any language. * @param entries - the list of language settings entries this provider provides. * If {@code null} is passed, the provider creates an empty list. - * @param customParameter - a custom parameter as the means to customize - * providers extending this class from extension definition in {@code plugin.xml}. + * @param properties - custom properties as the means to customize providers. * * @throws UnsupportedOperationException if an attempt to reconfigure provider is made. */ public void configureProvider(String id, String name, List languages, - List entries, String customParameter) { - if (this.entries!=null) + List entries, Map properties) { + if (this.entries!=null || !this.properties.isEmpty()) throw new UnsupportedOperationException(SettingsModelMessages.getString("LanguageSettingsBaseProvider.CanBeConfiguredOnlyOnce")); //$NON-NLS-1$ setId(id); setName(name); this.languageScope = languages!=null ? new ArrayList(languages) : null; this.entries = getPooledList(entries); - this.customParameter = customParameter; + if (properties != null) + this.properties = new HashMap(properties); + } + + /** + * {@code LanguageSettingsBaseProvider} keeps the list of key-value pairs + * so extenders of this class can customize the provider. The properties + * of {@code LanguageSettingsBaseProvider} come from the extension in plugin.xml + * although the extenders can provide their own method. + * + * @param key - property to check the value. + * @return value of the property. + */ + public String getProperty(String key) { + return properties.get(key); } private List getPooledList(List entries) { @@ -168,11 +181,4 @@ public class LanguageSettingsBaseProvider extends AbstractExecutableExtensionBas return null; return Collections.unmodifiableList(languageScope); } - - /** - * @return the custom parameter defined in the extension in {@code plugin.xml}. - */ - public String getCustomParameter() { - return customParameter; - } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java index b5f0f63d29a..69698156d79 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializableProvider.java @@ -44,9 +44,7 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr private static final String ELEM_LANGUAGE_SCOPE = "language-scope"; //$NON-NLS-1$ private static final String ATTR_NAME = "name"; //$NON-NLS-1$ private static final String ATTR_CLASS = "class"; //$NON-NLS-1$ - private static final String ATTR_PARAMETER = "parameter"; //$NON-NLS-1$ - private Map properties = new HashMap(); private LanguageSettingsSerializableStorage fStorage = new LanguageSettingsSerializableStorage(); /** @@ -78,9 +76,9 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr } @Override - public void configureProvider(String id, String name, List languages, List entries, String customParameter) { + public void configureProvider(String id, String name, List languages, List entries, Map properties) { // do not pass entries to super, keep them in local storage - super.configureProvider(id, name, languages, null, customParameter); + super.configureProvider(id, name, languages, null, properties); fStorage.clear(); @@ -113,16 +111,6 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr this.languageScope = new ArrayList(languages); } - /** - * Set custom parameter for the provider. - * Subclasses are free to define how their behavior depends on custom parameter. - * - * @param customParameter - */ - public void setCustomParameter(String customParameter) { - this.customParameter = customParameter; - } - /** * Clear all the entries for all configurations, all resources and all languages. */ @@ -218,8 +206,6 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr attributes.add(getName()); attributes.add(ATTR_CLASS); attributes.add(getClass().getCanonicalName()); - attributes.add(ATTR_PARAMETER); - attributes.add(getCustomParameter()); for (Entry entry : properties.entrySet()) { attributes.add(entry.getKey()); attributes.add(entry.getValue()); @@ -281,7 +267,6 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr public void loadAttributes(Element providerNode) { String providerId = XmlUtil.determineAttributeValue(providerNode, ATTR_ID); String providerName = XmlUtil.determineAttributeValue(providerNode, ATTR_NAME); - String providerParameter = XmlUtil.determineAttributeValue(providerNode, ATTR_PARAMETER); properties.clear(); NamedNodeMap attrs = providerNode.getAttributes(); @@ -298,7 +283,6 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr this.setId(providerId); this.setName(providerName); - this.setCustomParameter(providerParameter); NodeList nodes = providerNode.getChildNodes(); for (int i=0;i ceAttributes = new HashMap(); List languages = null; List entries = null; + for (String attr : ce.getAttributeNames()) { + ceAttributes.put(attr, determineAttributeValue(ce, attr)); + } + for (IConfigurationElement ceLang : ce.getChildren(ELEM_LANGUAGE_SCOPE)) { String langId = determineAttributeValue(ceLang, ATTR_ID); if (langId.length() > 0) { @@ -203,7 +208,7 @@ public class LanguageSettingsExtensionManager { } if (provider instanceof LanguageSettingsBaseProvider) { - ((LanguageSettingsBaseProvider) provider).configureProvider(ceId, ceName, languages, entries, ceParameter); + ((LanguageSettingsBaseProvider) provider).configureProvider(ceId, ceName, languages, entries, ceAttributes); } else if (provider instanceof AbstractExecutableExtensionBase) { ((AbstractExecutableExtensionBase) provider).setId(ceId); ((AbstractExecutableExtensionBase) provider).setName(ceName);