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 a1aef93e593..8d4feecca84 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 @@ -770,46 +770,21 @@ public class GCCBuildCommandParserTest extends TestCase { // check populated entries List entries = parser.getSettingEntries(cfgDescription, file, languageId); + String device = project.getLocation().getDevice(); // + " -I/path0 " - { - IPath path = new Path("/path0").setDevice(project.getLocation().getDevice()); - CIncludePathEntry expected = new CIncludePathEntry(path, 0); - assertEquals(expected, entries.get(0)); - } -// + " -DMACRO1=value" - { - CMacroEntry expected = new CMacroEntry("MACRO1", "value", 0); - assertEquals(expected, entries.get(1)); - } -// + " -ldomain" - { - CLibraryFileEntry expected = new CLibraryFileEntry("libdomain.a", 0); - assertEquals(expected, entries.get(2)); - } + assertEquals(new CIncludePathEntry(new Path("/path0").setDevice(device), 0), entries.get(0)); // + " -I /path1 " - { - IPath path = new Path("/path1").setDevice(project.getLocation().getDevice()); - CIncludePathEntry expected = new CIncludePathEntry(path, 0); - assertEquals(expected, entries.get(3)); - } -// + " -DMACRO2=\"value with spaces\"" - { - CMacroEntry expected = new CMacroEntry("MACRO2", "value with spaces", 0); - assertEquals(expected, entries.get(4)); - } + assertEquals(new CIncludePathEntry(new Path("/path1").setDevice(device), 0), entries.get(1)); // + " -I\"/path with spaces\"" - { - IPath path = new Path("/path with spaces").setDevice(project.getLocation().getDevice()); - CIncludePathEntry expected = new CIncludePathEntry(path, 0); - assertEquals(expected, entries.get(5)); - } + assertEquals(new CIncludePathEntry(new Path("/path with spaces").setDevice(device), 0), entries.get(2)); +// + " -DMACRO1=value" + assertEquals(new CMacroEntry("MACRO1", "value", 0), entries.get(3)); +// + " -DMACRO2=\"value with spaces\"" + assertEquals(new CMacroEntry("MACRO2", "value with spaces", 0), entries.get(4)); // + " -L/usr/lib" - { - IPath path = new Path("/usr/lib").setDevice(project.getLocation().getDevice()); - CLibraryPathEntry expected = new CLibraryPathEntry(path, 0); - assertEquals(expected, entries.get(6)); - } - + assertEquals(new CLibraryPathEntry(new Path("/usr/lib").setDevice(device), 0), entries.get(5)); +// + " -ldomain" + assertEquals(new CLibraryFileEntry("libdomain.a", 0), entries.get(6)); assertEquals(7, entries.size()); } @@ -1811,11 +1786,11 @@ public class GCCBuildCommandParserTest extends TestCase { // check populated entries { List entries = parser.getSettingEntries(cfgDescription, file, languageId); - assertEquals(new CMacroEntry("BOOST_ALL_NO_LIB", "1", 0), entries.get(0)); - assertEquals(new CMacroEntry("BOOST_PYTHON_SOURCE", "", 0), entries.get(1)); - assertEquals(new CMacroEntry("BOOST_PYTHON_STATIC_LIB", "", 0), entries.get(2)); - assertEquals(new CIncludePathEntry(project.getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(3)); - assertEquals(new CIncludePathEntry(new Path("/Python1025/Include").setDevice(project.getLocation().getDevice()), 0), entries.get(4)); + assertEquals(new CIncludePathEntry(project.getFullPath(), ICSettingEntry.VALUE_WORKSPACE_PATH | ICSettingEntry.RESOLVED), entries.get(0)); + assertEquals(new CIncludePathEntry(new Path("/Python1025/Include").setDevice(project.getLocation().getDevice()), 0), entries.get(1)); + assertEquals(new CMacroEntry("BOOST_ALL_NO_LIB", "1", 0), entries.get(2)); + assertEquals(new CMacroEntry("BOOST_PYTHON_SOURCE", "", 0), entries.get(3)); + assertEquals(new CMacroEntry("BOOST_PYTHON_STATIC_LIB", "", 0), entries.get(4)); assertEquals(5, entries.size()); } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/scannerconfig/AbstractBuiltinSpecsDetector.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/scannerconfig/AbstractBuiltinSpecsDetector.java index 488c155cfa7..b21b0b4f64c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/scannerconfig/AbstractBuiltinSpecsDetector.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/scannerconfig/AbstractBuiltinSpecsDetector.java @@ -196,7 +196,6 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti mappedRootURI = null; if (detectedSettingEntries!=null && detectedSettingEntries.size()>0) { - groupEntries(detectedSettingEntries); setSettingEntries(currentCfgDescription, currentResource, currentLanguageId, detectedSettingEntries); IStatus status = new Status(IStatus.INFO, MakeCorePlugin.PLUGIN_ID, getClass().getSimpleName() @@ -213,33 +212,6 @@ public abstract class AbstractBuiltinSpecsDetector extends AbstractLanguageSetti currentCommandResolved = null; } - protected void groupEntries(List inputEntries) { - Map> groupedEntries = new HashMap>(); - int kindMax = 0; - for (ICLanguageSettingEntry entry : inputEntries) { - int kind = entry.getKind(); - if (kind>kindMax) { - kindMax = kind; - } - - List entries = groupedEntries.get(kind); - if (entries==null) { - entries = new ArrayList(); - groupedEntries.put(kind, entries); - } - entries.add(entry); - } - - inputEntries.clear(); - - for (int kind=1;kind<=kindMax;kind++) { - List entries = groupedEntries.get(kind); - if (entries!=null) { - inputEntries.addAll(entries); - } - } - } - public void run(IProject project, String languageId, IPath workingDirectory, String[] env, IProgressMonitor monitor) throws CoreException, IOException { if (isRunOnce() && !isEmpty()) { 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 0cde8b59f0a..79803db2061 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 @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.settings.model.CMacroEntry; import org.eclipse.cdt.core.settings.model.CMacroFileEntry; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; +import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.testplugin.CModelMock; import org.eclipse.cdt.core.testplugin.ResourceHelper; import org.eclipse.cdt.internal.core.XmlUtil; @@ -797,9 +798,9 @@ public class LanguageSettingsSerializableTests extends TestCase { public void testMixedSettingEntries() throws Exception { Element elementProvider; List entries = new ArrayList(); - entries.add(new CMacroEntry("MACRO0", "value0",1)); entries.add(new CIncludePathEntry("path0", 1)); entries.add(new CIncludePathEntry("path1", 1)); + entries.add(new CMacroEntry("MACRO0", "value0",1)); { // create a provider and serialize its settings LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); @@ -822,6 +823,156 @@ public class LanguageSettingsSerializableTests extends TestCase { } } + /** + */ + public void testSort_Kinds() throws Exception { + // create sample entries + CIncludePathEntry includePathEntry1 = new CIncludePathEntry("path1", 0); + CIncludePathEntry includePathEntry2 = new CIncludePathEntry("path2", 0); + CMacroEntry macroEntry1 = new CMacroEntry("MACRO1", null, 0); + CMacroEntry macroEntry2 = new CMacroEntry("MACRO2", null, 0); + CIncludeFileEntry includeFileEntry1 = new CIncludeFileEntry("file1", 0); + CIncludeFileEntry includeFileEntry2 = new CIncludeFileEntry("file2", 0); + CMacroFileEntry macroFileEntry1 = new CMacroFileEntry("file1", 0); + CMacroFileEntry macroFileEntry2 = new CMacroFileEntry("file2", 0); + CLibraryPathEntry libraryPathEntry1 = new CLibraryPathEntry("lib1", 0); + CLibraryPathEntry libraryPathEntry2 = new CLibraryPathEntry("lib2", 0); + CLibraryFileEntry libraryFileEntry1 = new CLibraryFileEntry("file1", 0); + CLibraryFileEntry libraryFileEntry2 = new CLibraryFileEntry("file2", 0); + + // place entries in unsorted list + List unsortedEntries = new ArrayList(); + unsortedEntries.add(macroEntry1); + unsortedEntries.add(macroFileEntry1); + unsortedEntries.add(macroEntry2); + unsortedEntries.add(includePathEntry1); + unsortedEntries.add(includeFileEntry1); + unsortedEntries.add(macroFileEntry2); + unsortedEntries.add(libraryFileEntry1); + unsortedEntries.add(includeFileEntry2); + unsortedEntries.add(libraryFileEntry2); + unsortedEntries.add(libraryPathEntry1); + unsortedEntries.add(includePathEntry2); + unsortedEntries.add(libraryPathEntry2); + + // create a provider and set the entries + LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); + provider.setSettingEntries(null, null, null, unsortedEntries); + + // retrieve and check that language settings got sorted properly + assertEquals(PROVIDER_1, provider.getId()); + int i=0; + List actual = provider.getSettingEntries(null, null, null); + assertEquals(includePathEntry1, actual.get(i++)); + assertEquals(includePathEntry2, actual.get(i++)); + assertEquals(includeFileEntry1, actual.get(i++)); + assertEquals(includeFileEntry2, actual.get(i++)); + assertEquals(macroEntry1, actual.get(i++)); + assertEquals(macroEntry2, actual.get(i++)); + assertEquals(macroFileEntry1, actual.get(i++)); + assertEquals(macroFileEntry2, actual.get(i++)); + assertEquals(libraryPathEntry1, actual.get(i++)); + assertEquals(libraryPathEntry2, actual.get(i++)); + assertEquals(libraryFileEntry1, actual.get(i++)); + assertEquals(libraryFileEntry2, actual.get(i++)); + + assertEquals(unsortedEntries.size(), actual.size()); + } + + /** + */ + public void testSort_Entries() throws Exception { + // create sample entries + CIncludePathEntry includePathEntry1 = new CIncludePathEntry("path_B", 0); + CIncludePathEntry includePathEntry2 = new CIncludePathEntry("path_A", 0); + CMacroEntry macroEntry1 = new CMacroEntry("MACRO_A", null, 0); + CMacroEntry macroEntry2 = new CMacroEntry("MACRO_B", null, 0); + CIncludeFileEntry includeFileEntry1 = new CIncludeFileEntry("file_B", 0); + CIncludeFileEntry includeFileEntry2 = new CIncludeFileEntry("file_A", 0); + CMacroFileEntry macroFileEntry1 = new CMacroFileEntry("file_B", 0); + CMacroFileEntry macroFileEntry2 = new CMacroFileEntry("file_A", 0); + CLibraryPathEntry libraryPathEntry1 = new CLibraryPathEntry("lib_B", 0); + CLibraryPathEntry libraryPathEntry2 = new CLibraryPathEntry("lib_A", 0); + CLibraryFileEntry libraryFileEntry1 = new CLibraryFileEntry("file_B", 0); + CLibraryFileEntry libraryFileEntry2 = new CLibraryFileEntry("file_A", 0); + + // place entries in unsorted list + List unsortedEntries = new ArrayList(); + // macros will be sorted by name + unsortedEntries.add(macroEntry2); + unsortedEntries.add(macroEntry1); + // paths are not sorted only grouped by kind + unsortedEntries.add(macroFileEntry1); + unsortedEntries.add(macroFileEntry2); + unsortedEntries.add(includePathEntry1); + unsortedEntries.add(includePathEntry2); + unsortedEntries.add(includeFileEntry1); + unsortedEntries.add(includeFileEntry2); + unsortedEntries.add(libraryFileEntry1); + unsortedEntries.add(libraryFileEntry2); + unsortedEntries.add(libraryPathEntry1); + unsortedEntries.add(libraryPathEntry2); + + // create a provider and set the entries + LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); + provider.setSettingEntries(null, null, null, unsortedEntries); + + // retrieve and check that language settings got sorted properly + assertEquals(PROVIDER_1, provider.getId()); + int i=0; + List actual = provider.getSettingEntries(null, null, null); + assertEquals(includePathEntry1, actual.get(i++)); + assertEquals(includePathEntry2, actual.get(i++)); + assertEquals(includeFileEntry1, actual.get(i++)); + assertEquals(includeFileEntry2, actual.get(i++)); + assertEquals(macroEntry1, actual.get(i++)); + assertEquals(macroEntry2, actual.get(i++)); + assertEquals(macroFileEntry1, actual.get(i++)); + assertEquals(macroFileEntry2, actual.get(i++)); + assertEquals(libraryPathEntry1, actual.get(i++)); + assertEquals(libraryPathEntry2, actual.get(i++)); + assertEquals(libraryFileEntry1, actual.get(i++)); + assertEquals(libraryFileEntry2, actual.get(i++)); + + assertEquals(unsortedEntries.size(), actual.size()); + } + + /** + */ + public void testSort_Undef() throws Exception { + // create sample entries + CMacroEntry macroEntry1 = new CMacroEntry("MACRO_1", null, 0); + CMacroEntry macroEntry2A = new CMacroEntry("MACRO_2", null, ICSettingEntry.UNDEFINED); + CMacroEntry macroEntry2B = new CMacroEntry("MACRO_2", null, 0); + CMacroEntry macroEntry2C = new CMacroEntry("MACRO_2", null, ICSettingEntry.BUILTIN); + CMacroEntry macroEntry3 = new CMacroEntry("MACRO_3", null, 0); + + // place entries in unsorted list + List unsortedEntries = new ArrayList(); + // macros will be sorted by name and keep order for the same name + unsortedEntries.add(macroEntry2A); + unsortedEntries.add(macroEntry3); + unsortedEntries.add(macroEntry2B); + unsortedEntries.add(macroEntry1); + unsortedEntries.add(macroEntry2C); + + // create a provider and set the entries + LanguageSettingsSerializable provider = new LanguageSettingsSerializable(PROVIDER_1, PROVIDER_NAME_1); + provider.setSettingEntries(null, null, null, unsortedEntries); + + // retrieve and check that language settings got sorted properly + assertEquals(PROVIDER_1, provider.getId()); + int i=0; + List actual = provider.getSettingEntries(null, null, null); + assertEquals(macroEntry1, actual.get(i++)); + assertEquals(macroEntry2A, actual.get(i++)); + assertEquals(macroEntry2B, actual.get(i++)); + assertEquals(macroEntry2C, actual.get(i++)); + assertEquals(macroEntry3, actual.get(i++)); + + assertEquals(unsortedEntries.size(), actual.size()); + } + /** */ public void testLanguageAndNull() throws Exception { @@ -1056,9 +1207,9 @@ public class LanguageSettingsSerializableTests extends TestCase { public void testClone() throws Exception { // define sample data List sampleEntries_1 = new ArrayList(); - sampleEntries_1.add(new CMacroEntry("MACRO0", "value0",1)); sampleEntries_1.add(new CIncludePathEntry("path0", 1)); sampleEntries_1.add(new CIncludePathEntry("path1", 1)); + sampleEntries_1.add(new CMacroEntry("MACRO0", "value0",1)); List sampleEntries_2 = new ArrayList(); sampleEntries_2.add(new CIncludePathEntry("path0", 1)); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java index 460824da26c..da29eb269b8 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/language/settings/providers/LanguageSettingsSerializable.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.language.settings.providers; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -119,7 +120,8 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { langMap = new HashMap>(); fStorage.put(languageId, langMap); } - langMap.put(rcProjectPath, entries); + List sortedEntries = sortEntries(entries); + langMap.put(rcProjectPath, sortedEntries); } else { // do not keep nulls in the tables Map> langMap = fStorage.get(languageId); @@ -132,6 +134,25 @@ public class LanguageSettingsSerializable extends LanguageSettingsBaseProvider { } } + protected List sortEntries(List entries) { + List sortedEntries = new ArrayList(entries); + Collections.sort(sortedEntries, new Comparator(){ + /** + * This comparator sorts by kinds first and the macros are sorted additionally by name. + */ + public int compare(ICLanguageSettingEntry entry0, ICLanguageSettingEntry entry1) { + int kind0 = entry0.getKind(); + int kind1 = entry1.getKind(); + if (kind0==ICSettingEntry.MACRO && kind1==ICSettingEntry.MACRO) { + return entry0.getName().compareTo(entry1.getName()); + } + + return kind0 - kind1; + }}); + + return sortedEntries; + } + /** * Sets language settings entries for the provider. * Note that the entries are not persisted at that point. To persist use TODO