diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java index 5d6192b7b10..1af324882b7 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java @@ -3556,7 +3556,7 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI return null; } */ - private static final boolean TEST_CONSISTANCE = false; + private static final boolean TEST_CONSISTANCE = true; public static IConfiguration getConfigurationForDescription(ICConfigurationDescription cfgDes){ return getConfigurationForDescription(cfgDes, TEST_CONSISTANCE); @@ -3660,8 +3660,8 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI private static ICConfigurationDescription getDescriptionForConfiguration(IConfiguration cfg, boolean checkConsistance){ ICConfigurationDescription des = ((Configuration)cfg).getConfigurationDescription(); if(des == null){ - if(checkConsistance) - throw new IllegalStateException(); +// if(checkConsistance) +// throw new IllegalStateException(); if(((Configuration)cfg).isPreference()){ try { des = CCorePlugin.getDefault().getPreferenceConfiguration(CFG_DATA_PROVIDER_ID); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index aa93c393030..f1a2e864d6f 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -2707,12 +2707,20 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild if(newBuilder.getParent() == tc){ newCfgBuilder = (Builder)newBuilder; } else { - IBuilder extBuilder = newBuilder; - for(;extBuilder != null && !extBuilder.isExtensionElement(); extBuilder = extBuilder.getSuperClass()); - if(extBuilder == null) - extBuilder = newBuilder; - newCfgBuilder = new Builder(tc, extBuilder, id, name, false); - newCfgBuilder.copySettings(cur, allBuildSettings); + IBuilder curReal = ManagedBuildManager.getRealBuilder(cur); + IBuilder newReal = ManagedBuildManager.getRealBuilder(newBuilder); + if(newReal != curReal){ + IBuilder extBuilder = newBuilder; + for(;extBuilder != null && !extBuilder.isExtensionElement(); extBuilder = extBuilder.getSuperClass()); + if(extBuilder == null) + extBuilder = newBuilder; + + newCfgBuilder = new Builder(tc, extBuilder, id, name, false); + newCfgBuilder.copySettings(cur, allBuildSettings); + } + } + + if(newCfgBuilder != null){ tc.setBuilder(newCfgBuilder); } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java index a3b60be6775..a18ad70c6bd 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/FolderInfo.java @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -738,18 +739,22 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { } public IToolChain changeToolChain(IToolChain newSuperClass, String Id, String name) throws BuildException{ - IConfigurationElement el = getToolChainConverterElement(newSuperClass); - ToolChain oldToolChain = toolChain; - ITool oldTools[] = oldToolChain.getTools(); + IToolChain curReal = ManagedBuildManager.getRealToolChain(toolChain); + IToolChain newReal = ManagedBuildManager.getRealToolChain(newSuperClass); - if(el != null){ - updateToolChainWithConverter(el, newSuperClass, Id, name); - } else { - updateToolChainWithProperties(newSuperClass, Id, name); + if(newReal != curReal){ + ToolChain oldToolChain = toolChain; + IConfigurationElement el = getToolChainConverterElement(newSuperClass); + ITool oldTools[] = oldToolChain.getTools(); + + if(el != null){ + updateToolChainWithConverter(el, newSuperClass, Id, name); + } else { + updateToolChainWithProperties(newSuperClass, Id, name); + } + + BuildSettingsUtil.disconnectDepentents(getParent(), oldTools); } - - BuildSettingsUtil.disconnectDepentents(getParent(), oldTools); - return toolChain; } @@ -796,7 +801,37 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { return null; } + private ITool[][] checkDups(ITool[] removed, ITool[] added){ + LinkedHashMap removedMap = createRealMap(removed); + LinkedHashMap addedMap = createRealMap(added); + LinkedHashMap rmCopy = (LinkedHashMap)removedMap.clone(); + + removedMap.keySet().removeAll(addedMap.keySet()); + addedMap.keySet().removeAll(rmCopy.keySet()); + ITool[][] result = new Tool[2][]; + result[0] = (Tool[])removedMap.values().toArray(new Tool[removedMap.size()]); + result[1] = (Tool[])addedMap.values().toArray(new Tool[addedMap.size()]); + return result; + } + + private LinkedHashMap createRealMap(ITool[] tools){ + LinkedHashMap map = new LinkedHashMap(); + for(int i = 0; i < tools.length; i++){ + Tool realTool = (Tool)ManagedBuildManager.getRealTool(tools[i]); + Object key = realTool.getMatchKey(); + map.put(key, tools[i]); + } + + return map; + } + public void modifyToolChain(ITool[] removed, ITool[] added){ + ITool[][] checked = checkDups(removed, added); + removed = checked[0]; + added = checked[1]; + if(added.length == 0 && removed.length == 0) + return; + List remainingRemoved = new ArrayList(); List remainingAdded = new ArrayList(); Map converterMap = calculateConverterTools(removed, added, remainingRemoved, remainingAdded); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java index f63d8c45631..d22e7b7f5a3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java @@ -449,7 +449,7 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem CConfigurationData data, IProgressMonitor monitor) { BuildConfigurationData cfgData = (BuildConfigurationData)data; - ((Configuration)cfgData.getConfiguration()).setConfigurationDescription(null); + ((Configuration)cfgData.getConfiguration()).setConfigurationDescription(cfgDes); cfgData.clearCachedData(); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java index 9da8f30a07f..01617800e5c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java @@ -37,13 +37,13 @@ import org.eclipse.cdt.managedbuilder.internal.dataprovider.SettingsSet.SettingL public class EntryStorage { private int fKind; - private SettingsSet fSettings; +// private SettingsSet fSettings; // private EntryListMap fDiscoveredEntries = new EntryListMap(); // private EntryListMap fUserEntries = new EntryListMap(); // private ICLanguageSettingEntry fEntries[]; private BuildLanguageData fLangData; - private boolean fCacheInited; - private boolean fUserValuesInited; +// private boolean fCacheInited; +// private boolean fUserValuesInited; private static final String EMPTY_STRING = new String(); @@ -57,15 +57,15 @@ public class EntryStorage { } void optionsChanged(){ - fUserValuesInited = false; +// fUserValuesInited = false; } public List getEntries(List list){ - initCache(); + SettingsSet settings = initCache(); if(list == null) list = new ArrayList(); - ICLanguageSettingEntry entries[] = fSettings.getEntries(); + ICLanguageSettingEntry entries[] = settings.getEntries(); list.addAll(Arrays.asList(entries)); // for(Iterator iter = fUserEntries.getIterator(); iter.hasNext();){ // EntryInfo info = (EntryInfo)iter.next(); @@ -102,7 +102,7 @@ public class EntryStorage { } private void resetCache(){ - fCacheInited = false; +// fCacheInited = false; } public void setEntries(ICLanguageSettingEntry entries[]){ @@ -110,9 +110,9 @@ public class EntryStorage { resetDefaults(); return; } - initCache(); + SettingsSet settings = initCache(); - fSettings.applyEntries(entries); + settings.applyEntries(entries); // ArrayList userList = new ArrayList(); // Map discoveredMap = fDiscoveredEntries.getEntryInfoMap(); // boolean discoveredReadOnly = isDiscoveredEntriesReadOnly(); @@ -134,7 +134,7 @@ public class EntryStorage { // info.makeOverridden(false); // } - SettingLevel level = fSettings.getLevels()[0]; + SettingLevel level = settings.getLevels()[0]; IOption options[] = fLangData.getOptionsForKind(fKind); if(options.length != 0){ ICLanguageSettingEntry usrEntries[] = level.getEntries(); @@ -174,7 +174,7 @@ public class EntryStorage { } } - private void initCache(){ + private SettingsSet initCache(){ // if(fCacheInited){ // if(!fUserValuesInited){ // for(Iterator iter = fDiscoveredEntries.getIterator(); iter.hasNext();){ @@ -186,9 +186,9 @@ public class EntryStorage { // } // // } else { - fSettings = createEmptySettings(); - SettingLevel levels[] = fSettings.getLevels(); - fCacheInited = true; + SettingsSet settings = createEmptySettings(); + SettingLevel levels[] = settings.getLevels(); +// fCacheInited = true; DiscoveredEntry[] dEntries = fLangData.getDiscoveredEntryValues(fKind); addEntries(levels[2], dEntries); @@ -199,7 +199,9 @@ public class EntryStorage { addEntries(levels[0], dEntries); levels[0].fOverrideSet = getUserUndefinedStringSet(); - fSettings.adjustOverrideState(); + settings.adjustOverrideState(); + + return settings; //// fDiscoveredEntries.clear(); // boolean readOnly = isDiscoveredEntriesReadOnly(); // if(dEntries.length != 0){ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CDataProxyContainer.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CDataProxyContainer.java index 17e6b11a379..5f7e40d2e69 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CDataProxyContainer.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CDataProxyContainer.java @@ -94,10 +94,13 @@ public abstract class CDataProxyContainer extends CDataProxy implements ICDataPr if(provider == null) throw new IllegalStateException(); + provider.invalidateCache(); + CDataProxy proxies[] = provider.getCachedProxies(); for(int i = 0; i < proxies.length; i++){ proxies[i].setRescan(true); } + } public ICSettingObject getChildSettingById(String id) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java index fb32c968774..65937f04c19 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java @@ -15,8 +15,12 @@ import java.util.Iterator; import java.util.Map; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.settings.model.ICBuildSetting; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICFolderDescription; +import org.eclipse.cdt.core.settings.model.ICLanguageSetting; import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICResourceDescription; import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.core.settings.model.ICSettingContainer; import org.eclipse.cdt.core.settings.model.ICSettingObject; @@ -27,6 +31,7 @@ import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.QualifiedName; public class CProjectDescription implements ICProjectDescription, ICDataProxyContainer { @@ -435,4 +440,22 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon public void removeStorage(String id) throws CoreException { getStorageBase().removeStorage(id); } + + void switchToCachedAppliedData(CProjectDescription appliedCache){ + if(fIsReadOnly) + return; + + ICConfigurationDescription[] cfgs = appliedCache.getConfigurations(); + for(int i = 0; i < cfgs.length; i++){ + CConfigurationDescriptionCache cfgCache = (CConfigurationDescriptionCache)cfgs[i]; + CConfigurationDescription des = (CConfigurationDescription)getChildSettingById(cfgCache.getId()); + if(des != null){ + des.setData(cfgCache); +// ICResourceDescription rcDes = des.getResourceDescription(new Path("dd"), false); +// rcDes = des.getResourceDescription(new Path("dd"), false); +// ICBuildSetting bs = des.getBuildSetting(); +// ICLanguageSetting lss[] = ((ICFolderDescription)rcDes).getLanguageSettings(); + } + } + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/IProxyProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/IProxyProvider.java index 0679f9c43b8..1728a40ec68 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/IProxyProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/IProxyProvider.java @@ -29,6 +29,8 @@ public interface IProxyProvider { CDataProxy[] getCachedProxies(); void cacheValues(); + + void invalidateCache(); /* CDataProxy[] getProxies(Class arrayElClass); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ProxyProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ProxyProvider.java index 15ec1cd4c5c..fcae5086369 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ProxyProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ProxyProvider.java @@ -125,4 +125,10 @@ public class ProxyProvider implements IProxyProvider { fProxiesCached = true; } } + + public void invalidateCache() { + fProxiesCached = false; + } + + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java index 0e642b6ea62..34b619cd20b 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java @@ -53,9 +53,12 @@ public class SetCProjectDescriptionOperation extends CModelOperation { } CProjectDescription fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el); - mngr.setDescriptionApplying(project, fNewDescriptionCache); - fNewDescriptionCache.applyDatas(); - mngr.clearDescriptionApplying(project); + try { + mngr.setDescriptionApplying(project, fNewDescriptionCache); + fNewDescriptionCache.applyDatas(); + } finally { + mngr.clearDescriptionApplying(project); + } ICDescriptionDelta delta = mngr.createDelta(fNewDescriptionCache, fOldDescriptionCache); @@ -71,6 +74,9 @@ public class SetCProjectDescriptionOperation extends CModelOperation { } mngr.setLoaddedDescription(project, fNewDescriptionCache, true); + + fSetDescription.switchToCachedAppliedData(fNewDescriptionCache); + CompositeWorkspaceRunnable runnable = new CompositeWorkspaceRunnable(SettingsModelMessages.getString("SetCProjectDescriptionOperation.0")); //$NON-NLS-1$ try {