diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/ExternalSettingsProviderTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/ExternalSettingsProviderTests.java index 76a6b0195a9..aeb0616159a 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/ExternalSettingsProviderTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/ExternalSettingsProviderTests.java @@ -27,7 +27,7 @@ import org.eclipse.core.runtime.Path; public class ExternalSettingsProviderTests extends BaseTestCase{ private static final String PROJ_NAME_PREFIX = "espt_"; - ICProject p1, p2, p3; + ICProject p1, p2, p3, p4; public static TestSuite suite() { return suite(ExternalSettingsProviderTests.class, "_"); @@ -37,6 +37,7 @@ public class ExternalSettingsProviderTests extends BaseTestCase{ p1 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "a", IPDOMManager.ID_NO_INDEXER); p2 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "b", IPDOMManager.ID_NO_INDEXER); p3 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "c", IPDOMManager.ID_NO_INDEXER); + p4 = CProjectHelper.createNewStileCProject(PROJ_NAME_PREFIX + "d", IPDOMManager.ID_NO_INDEXER); } public void testRefs() throws Exception { @@ -203,6 +204,67 @@ public class ExternalSettingsProviderTests extends BaseTestCase{ assertTrue(Arrays.equals(expectedEntries2, entries)); } + public void testRestoreDefaults() throws Exception { + TestExtSettingsProvider.setVariantNum(0); + + CoreModel model = CoreModel.getDefault(); + ICProjectDescriptionManager mngr = model.getProjectDescriptionManager(); + IProject project = p4.getProject(); + + ICProjectDescription des = model.getProjectDescription(project); + ICConfigurationDescription cfgDes = des.getConfigurations()[0]; + ICLanguageSetting ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); + ICLanguageSettingEntry[] entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); + assertEquals(0, entries.length); + ICSourceEntry[] sourceEntries = cfgDes.getSourceEntries(); + ICSourceEntry[] expectedSourceEntries = new ICSourceEntry[]{ + new CSourceEntry(project.getFullPath(), null, ICSettingEntry.RESOLVED) + }; + assertEquals(1, sourceEntries.length); + assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); + String[] extPIds = new String[]{CTestPlugin.PLUGIN_ID + ".testExtSettingsProvider"}; + cfgDes.setExternalSettingsProviderIds(extPIds); + + + ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); + entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); + ICLanguageSettingEntry[] expectedEntries = new ICLanguageSettingEntry[]{ + new CIncludePathEntry("ip_a", 0), + new CIncludePathEntry("ip_b", 0), + }; + assertTrue(Arrays.equals(expectedEntries, entries)); + + model.setProjectDescription(project, des); + + des = model.getProjectDescription(project); + cfgDes = des.getConfigurations()[0]; + ls = cfgDes.getLanguageSettingForFile(new Path("a.c"), true); + entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); + assertTrue(Arrays.equals(expectedEntries, entries)); + + ls.setSettingEntries(ICSettingEntry.INCLUDE_PATH, (ICLanguageSettingEntry[])null); + entries = ls.getSettingEntries(ICSettingEntry.INCLUDE_PATH); + assertTrue(Arrays.equals(expectedEntries, entries)); + + cfgDes.setSourceEntries(null); + expectedSourceEntries = new ICSourceEntry[]{ + new CSourceEntry(project.getFullPath().append("sp_a"), null, 0), + new CSourceEntry(project.getFullPath().append("sp_b"), null, 0), + }; + sourceEntries = cfgDes.getSourceEntries(); + assertEquals(2, sourceEntries.length); + assertTrue(Arrays.equals(expectedSourceEntries, sourceEntries)); + + cfgDes.getBuildSetting().setOutputDirectories(null); + ICOutputEntry[] expectedOutputEntries = new ICOutputEntry[]{ + new COutputEntry("op_a", null, 0), + new COutputEntry("op_b", null, 0), + }; + ICOutputEntry[] outputEntries = cfgDes.getBuildSetting().getOutputDirectories(); + assertEquals(2, outputEntries.length); + assertTrue(Arrays.equals(expectedOutputEntries, outputEntries)); + } + protected void tearDown() throws Exception { try { p1.getProject().delete(true, null); @@ -216,5 +278,9 @@ public class ExternalSettingsProviderTests extends BaseTestCase{ p3.getProject().delete(true, null); } catch (CoreException e){ } + try { + p4.getProject().delete(true, null); + } catch (CoreException e){ + } } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CBuildSetting.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CBuildSetting.java index c5d0fb9b37c..a2184ca20d2 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CBuildSetting.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CBuildSetting.java @@ -56,6 +56,9 @@ public class CBuildSetting extends CDataProxy implements ICBuildSetting { public void setOutputDirectories(ICOutputEntry[] entries) { CBuildData data = getBuildData(true); data.setOutputDirectories(entries); + if(entries == null){ + CExternalSettingsManager.getInstance().restoreOutputEntryDefaults(getConfiguration()); + } } public final int getType() { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescription.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescription.java index b5cf1f854f9..e4054d1abf3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescription.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescription.java @@ -476,11 +476,17 @@ public class CConfigurationDescription extends CDataProxyContainer implements IC public void setSourceEntries(ICSourceEntry[] entries) throws CoreException { CConfigurationData data = getConfigurationData(true); IProject project = fIsPreference ? null : getProjectDescription().getProject(); - if(entries != null && entries.length == 0) + boolean restoreDefault = false; + if(entries == null) + restoreDefault = true; + else if(entries.length == 0) entries = null; entries = CDataUtil.adjustEntries(entries, false, project); data.setSourceEntries(entries); + if(restoreDefault){ + CExternalSettingsManager.getInstance().restoreSourceEntryDefaults(this); + } // ICSourceEntry entry; // IPath entryPath; // IPath paths[]; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CExternalSettingsManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CExternalSettingsManager.java index 81135cdfcd5..8e353564751 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CExternalSettingsManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CExternalSettingsManager.java @@ -795,7 +795,27 @@ public class CExternalSettingsManager implements ICExternalSettingsListener, ICP private CExternalSettinsDeltaCalculator getDeltaCalculator(){ return CExternalSettinsDeltaCalculator.getInstance(); } - + + public void restoreSourceEntryDefaults(ICConfigurationDescription cfg){ + CfgContainer cr = new CfgContainer(cfg); + CfgContainerRefInfoContainer ric = new CfgContainerRefInfoContainer(cr); + CExternalSetting[] settings = ric.getRefInfo(false).createExternalSettings(); + ExtSettingsDelta[] deltas = getDeltaCalculator().getSettingChange(settings, null); + if(deltas != null){ + CExternalSettingsDeltaProcessor.applySourceEntriesChange(cfg, deltas); + } + } + + public void restoreOutputEntryDefaults(ICConfigurationDescription cfg){ + CfgContainer cr = new CfgContainer(cfg); + CfgContainerRefInfoContainer ric = new CfgContainerRefInfoContainer(cr); + CExternalSetting[] settings = ric.getRefInfo(false).createExternalSettings(); + ExtSettingsDelta[] deltas = getDeltaCalculator().getSettingChange(settings, null); + if(deltas != null){ + CExternalSettingsDeltaProcessor.applyOutputEntriesChange(cfg, deltas); + } + } + public void restoreDefaults(ICLanguageSetting ls, int entryKinds){ ICConfigurationDescription cfg = ls.getConfiguration(); CfgContainer cr = new CfgContainer(cfg);