From fda3d9751217fe8a564ba01fc0266996d35afaf1 Mon Sep 17 00:00:00 2001 From: Mikhail Sennikovsky Date: Thu, 22 Mar 2007 14:29:44 +0000 Subject: [PATCH] 1. Additional fixes for [Bug 174936] [Scanner Discovery] Per file scanner discovery is broken with the New Project Model functionality 2. Bug-fixes --- .../PerFileSettingsCalculator.java | 41 ++--- .../CfgScannerConfigInfoFactory2.java | 12 +- .../internal/core/Configuration.java | 4 + .../internal/core/FolderInfo.java | 5 +- .../internal/core/HoldsOptions.java | 16 ++ .../internal/core/InputType.java | 4 + .../managedbuilder/internal/core/Option.java | 10 ++ .../internal/core/OutputType.java | 5 +- .../internal/core/ResourceConfiguration.java | 14 ++ .../internal/core/ResourceInfo.java | 1 + .../managedbuilder/internal/core/Tool.java | 91 +++++++++- .../internal/core/ToolChain.java | 20 +++ .../dataprovider/BuildConfigurationData.java | 24 ++- .../internal/dataprovider/BuildFileData.java | 15 +- .../dataprovider/BuildFolderData.java | 16 +- .../dataprovider/BuildLanguageData.java | 4 + .../BuildVariablesContributor.java | 18 +- .../ConfigurationDataProvider.java | 8 + .../extension/CConfigurationDataProvider.java | 11 ++ .../model/extension/CResourceData.java | 2 + .../impl/CDefaultConfigurationData.java | 6 +- .../extension/impl/CDefaultFileData.java | 4 + .../extension/impl/CDefaultFolderData.java | 4 +- .../core/settings/model/util/CDataUtil.java | 20 ++- .../model/util/PathEntryTranslator.java | 75 ++++----- .../internal/core/model/CContainerInfo.java | 2 +- .../cdt/internal/core/model/CProjectInfo.java | 2 +- .../model/CConfigurationDescription.java | 5 +- .../model/CConfigurationDescriptionCache.java | 9 + .../settings/model/CFileDescriptionCache.java | 4 + .../model/CFolderDescriptionCache.java | 6 + .../model/CProjectDescriptionManager.java | 155 +++++++++++++++++- .../model/ConfigBasedPathEntryStore.java | 57 +++++-- 33 files changed, 557 insertions(+), 113 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/PerFileSettingsCalculator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/PerFileSettingsCalculator.java index ec4a5ccf345..dbaf5d4a636 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/PerFileSettingsCalculator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/PerFileSettingsCalculator.java @@ -654,29 +654,31 @@ public class PerFileSettingsCalculator { } } - private IRcSettingInfo[] mapFileDiscoveredInfo(IProject project, CConfigurationData data, RcSetSettings rcSet, Map map){ - IResource rc; + private IRcSettingInfo[] mapFileDiscoveredInfo(IProject project, CConfigurationData data, RcSetSettings rcSet, PathFilePathInfo[] pfpis){ +// IResource rc; PathInfo pInfo; - Map.Entry entry; IPath projRelPath; CResourceData rcData; // RcSetSettings dataSetting; - List list = new ArrayList(map.size()); + List list = new ArrayList(pfpis.length); RcSettingInfo rcInfo; LangSettingInfo lInfo; CLanguageData lData; ArrayList tmpList; + PathFilePathInfo pfpi; - for(Iterator iter = map.entrySet().iterator(); iter.hasNext();){ - entry = (Map.Entry)iter.next(); - rc = (IResource)entry.getKey(); - pInfo = (PathInfo)entry.getValue(); + for(int i = 0; i < pfpis.length; i++){ + pfpi = pfpis[i]; + projRelPath = pfpi.fPath; + pInfo = pfpi.fInfo; if(pInfo.isEmpty()) continue; - switch(rc.getType()){ - case IResource.FILE: - projRelPath = rc.getProjectRelativePath(); + if(projRelPath.segmentCount() == 0) + continue; +// switch(rc.getType()){ +// case IResource.FILE: +// projRelPath = rc.getProjectRelativePath(); // dataSetting = rcSet.getChild(projRelPath, false); // rcData = dataSetting.fRcData; rcData = rcSet.getChild(projRelPath, false).fRcData; @@ -723,8 +725,8 @@ public class PerFileSettingsCalculator { } - break; - } +// break; +// } } return (RcSettingInfo[])list.toArray(new RcSettingInfo[list.size()]); } @@ -732,7 +734,8 @@ public class PerFileSettingsCalculator { public IRcSettingInfo[] getSettingInfos(IProject project, CConfigurationData data, IDiscoveredPathManager.IPerFileDiscoveredPathInfo2 discoveredInfo, boolean fileDataMode){ if(fileDataMode){ RcSetSettings rcSettings = createRcSetInfo(data); - return mapFileDiscoveredInfo(project, data, rcSettings, discoveredInfo.getPathInfoMap()); + PathFilePathInfo pInfos[] = createOrderedInfo(discoveredInfo.getPathInfoMap()); + return mapFileDiscoveredInfo(project, data, rcSettings, pInfos); } RcSetSettings settings = createRcSetSettings(data, discoveredInfo); return createInfos(data, settings); @@ -981,13 +984,13 @@ public class PerFileSettingsCalculator { for(Iterator iter = map.entrySet().iterator(); iter.hasNext();){ entry = (Map.Entry)iter.next(); rc = (IResource)entry.getKey(); - path = rc.getFullPath(); + path = rc.getProjectRelativePath(); int segCount = path.segmentCount(); - if(segCount < 1) - continue; +// if(segCount < 1) +// continue; - path = path.removeFirstSegments(1); - segCount--; +// path = path.removeFirstSegments(1); +// segCount--; info = (PathInfo)entry.getValue(); storedInfo = (PathInfo)infoMap.get(info); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig2/CfgScannerConfigInfoFactory2.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig2/CfgScannerConfigInfoFactory2.java index c7963726722..fcb0ed530b8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig2/CfgScannerConfigInfoFactory2.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig2/CfgScannerConfigInfoFactory2.java @@ -48,13 +48,17 @@ public class CfgScannerConfigInfoFactory2 { private static final QualifiedName CONTAINER_INFO_PROPERTY = new QualifiedName(ManagedBuilderCorePlugin.getUniqueIdentifier(), "ScannerConfigBuilderInfo2Container"); //$NON-NLS-1$ private static class ContainerInfo{ - ICProjectDescription fDes; + int fCode; IScannerConfigBuilderInfo2Set fContainer; ContainerInfo(ICProjectDescription des, IScannerConfigBuilderInfo2Set container){ - this.fDes = des; + this.fCode = des.hashCode(); this.fContainer = container; } + + public boolean matches(ICProjectDescription des){ + return des.hashCode() == fCode; + } } private static class CfgInfo implements ICfgScannerConfigBuilderInfo2Set { private Configuration cfg; @@ -101,7 +105,7 @@ public class CfgScannerConfigInfoFactory2 { ICProjectDescription projDes = cfgDes.getProjectDescription(); if(projDes != null){ ContainerInfo cInfo = (ContainerInfo)projDes.getSessionProperty(CONTAINER_INFO_PROPERTY); - if(cInfo != null && cInfo.fDes == projDes){ + if(cInfo != null && cInfo.matches(projDes)){ fContainer = cInfo.fContainer; } else { fContainer = ScannerConfigProfileManager.createScannerConfigBuildInfo2Set(cfg.getOwner().getProject()); @@ -295,7 +299,7 @@ public class CfgScannerConfigInfoFactory2 { public static void save(BuildConfigurationData data, ICProjectDescription des, ICProjectDescription baseDescription, boolean force) throws CoreException{ ContainerInfo info = (ContainerInfo)des.getSessionProperty(CONTAINER_INFO_PROPERTY); if(info != null){ - if(info.fDes == baseDescription){ + if(info.matches(baseDescription)){ IScannerConfigBuilderInfo2Set baseContainer = info.fContainer; baseContainer.save(); } 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 bccce0e57e5..aa93c393030 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 @@ -2789,6 +2789,10 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild cfgScannerInfo = info; } + public void clearCachedData(){ + cfgScannerInfo = null; + } + public boolean isPreference(){ return isPreferenceConfig; } 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 9d5134de5ea..a3b60be6775 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 @@ -1231,6 +1231,7 @@ public class FolderInfo extends ResourceInfo implements IFolderInfo { // rebuildNeeded = true; } - - + public boolean hasCustomSettings(){ + return toolChain.hasCustomSettings(); + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java index 15a6d937a17..c5d70db0ab2 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HoldsOptions.java @@ -743,4 +743,20 @@ public abstract class HoldsOptions extends BuildObject implements IHoldsOptions, } return requires; } + + boolean hasCustomSettings(){ + if(superClass == null) + return true; + + if(optionList != null && optionList.size() != 0){ + Option option; + for(Iterator iter = optionList.iterator(); iter.hasNext();){ + option = (Option)iter.next(); + if(option.hasCustomSettings()) + return true; + } + } + + return false; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java index c0c3bf120d8..c7244d81f39 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java @@ -1852,4 +1852,8 @@ public class InputType extends BuildObject implements IInputType { return false; } + public boolean hasCustomSettings(){ + //TODO: + return false; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java index b00f3d56827..2cf4f355669 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Option.java @@ -2054,4 +2054,14 @@ public class Option extends BuildObject implements IOption, IBuildPropertiesRest } } + public boolean hasCustomSettings(){ + if(superClass == null) + return true; + + if(value != null && !value.equals(superClass.getValue())){ + return true; + } + + return false; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java index d2291a8b125..581d6791911 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java @@ -919,5 +919,8 @@ public class OutputType extends BuildObject implements IOutputType { return calc.isOutputTypeEnabled(tool, this); } - + public boolean hasCustomSettings(){ + //TODO: + return false; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java index 224e2c71bed..b057fafadc2 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceConfiguration.java @@ -971,4 +971,18 @@ public class ResourceConfiguration extends ResourceInfo implements IFileInfo { tool.resolveProjectReferences(onLoad); } } + + public boolean hasCustomSettings() { + if(toolList != null && toolList.size() != 0){ + Tool tool; + for(Iterator iter = toolList.iterator(); iter.hasNext();){ + tool = (Tool)iter.next(); + if(tool.hasCustomSettings()) + return true; + } + } + return false; + } + + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceInfo.java index 71a24435014..23b08ad619a 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ResourceInfo.java @@ -462,4 +462,5 @@ public abstract class ResourceInfo extends BuildObject implements IResourceInfo abstract void resolveProjectReferences(boolean onLoad); + abstract public boolean hasCustomSettings(); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java index a327bb6c66a..6f9763f5103 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java @@ -150,10 +150,10 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch private boolean rebuildState; private BooleanExpressionApplicabilityCalculator booleanExpressionCalculator; - private HashMap typeToDataMap = new HashMap(); + private HashMap typeToDataMap = new HashMap(2); private boolean fDataMapInited; private List identicalList; - private HashMap discoveredInfoMap = new HashMap(); + private HashMap discoveredInfoMap = new HashMap(2); private String scannerConfigDiscoveryProfileId; /* @@ -443,9 +443,11 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch super.copyChildren(tool); // Clone the children if (tool.inputTypeList != null) { + discoveredInfoMap = (HashMap)tool.discoveredInfoMap.clone(); Iterator iter = tool.getInputTypeList().listIterator(); while (iter.hasNext()) { InputType inputType = (InputType) iter.next(); + PathInfoCache cache = (PathInfoCache)discoveredInfoMap.remove(getTypeKey(inputType)); int nnn = ManagedBuildManager.getRandomNumber(); String subId; String subName; @@ -458,6 +460,9 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch } InputType newInputType = new InputType(this, subId, subName, inputType); addInputType(newInputType); + if(cache != null){ + discoveredInfoMap.put(getTypeKey(newInputType), cache); + } } } if (tool.outputTypeList != null) { @@ -3937,4 +3942,86 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch } return id; } + + public boolean hasCustomSettings(){ + if(superClass == null) + return true; + + if(super.hasCustomSettings()) + return true; + + if(inputTypeList != null && inputTypeList.size() != 0){ + InputType inType; + for(Iterator iter = inputTypeList.iterator(); iter.hasNext();){ + inType = (InputType)iter.next(); + if(inType.hasCustomSettings()) + return true; + } + } + + if(outputTypeList != null && outputTypeList.size() != 0){ + OutputType outType; + for(Iterator iter = outputTypeList.iterator(); iter.hasNext();){ + outType = (OutputType)iter.next(); + if(outType.hasCustomSettings()) + return true; + } + } + //envVarBuildPathList; + // Managed Build model attributes +// unusedChildren; +// isAbstract; + Tool superTool = (Tool)superClass; + + if(command != null && !command.equals(superTool.getToolCommand())) + return true; + + //inputExtensions; + //interfaceExtensions; //(header extensions) + //natureFilter; + //outputExtensions; + //outputFlag; + //outputPrefix; + if(errorParserIds != null && !errorParserIds.equals(superTool.getErrorParserIds())) + return true; + + + if(commandLinePattern != null && !commandLinePattern.equals(superTool.getCommandLinePattern())) + return true; + + //versionsSupported; + //convertToId; + //advancedInputCategory; + if(customBuildStep != null && customBuildStep.booleanValue() != superTool.getCustomBuildStep()) + return true; + + if(announcement != null && !announcement.equals(superTool.getAnnouncement())) + return true; + //commandLineGeneratorElement + //commandLineGenerator + //dependencyGeneratorElement + //dependencyGenerator + //iconPathURL; + //pathconverterElement + //optionPathConverter + //supportedProperties + //supportsManagedBuild + //isTest; + // Miscellaneous + //isExtensionTool + //isDirty + //resolved + //previousMbsVersionConversionElement + //currentMbsVersionConversionElement + //rebuildState + //booleanExpressionCalculator + + //typeToDataMap + //fDataMapInited; + //identicalList; + if(discoveredInfoMap != null && discoveredInfoMap.size() != 0) + return true; + //scannerConfigDiscoveryProfileId + return false; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java index ca490d36af6..4c475ec09c9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java @@ -357,6 +357,8 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert nonInternalBuilderId = toolChain.nonInternalBuilderId; + discoveredInfo = toolChain.discoveredInfo; + // Clone the children in superclass boolean copyIds = toolChain.getId().equals(id); super.copyChildren(toolChain); @@ -2621,4 +2623,22 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert IToolChain tch = ManagedBuildManager.getRealToolChain(this); return tch != null && tch.getId().equals(ConfigurationDataProvider.PREF_TC_ID); } + + public boolean hasCustomSettings(){ + if(superClass == null) + return true; + + if(super.hasCustomSettings()) + return true; + + if(toolList != null && toolList.size() != 0){ + Tool tool; + for(Iterator iter = toolList.iterator(); iter.hasNext();){ + tool = (Tool)iter.next(); + if(tool.hasCustomSettings()) + return true; + } + } + return false; + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildConfigurationData.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildConfigurationData.java index 714c411074c..6618cdccd56 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildConfigurationData.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildConfigurationData.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.managedbuilder.internal.dataprovider; import org.eclipse.cdt.core.cdtvariables.ICdtVariablesContributor; +import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.core.settings.model.extension.CBuildData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CFileData; @@ -24,14 +25,15 @@ import org.eclipse.cdt.managedbuilder.core.IFolderInfo; import org.eclipse.cdt.managedbuilder.core.IResourceInfo; import org.eclipse.cdt.managedbuilder.core.ITool; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.internal.core.Configuration; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; public class BuildConfigurationData extends CConfigurationData { - private IConfiguration fCfg; + private Configuration fCfg; private BuildVariablesContributor fCdtVars; public BuildConfigurationData(IConfiguration cfg){ - fCfg = cfg; + fCfg = (Configuration)cfg; } public IConfiguration getConfiguration(){ @@ -129,4 +131,22 @@ public class BuildConfigurationData extends CConfigurationData { fCdtVars = new BuildVariablesContributor(this); return fCdtVars; } + + void clearCachedData(){ + fCfg.clearCachedData(); + CResourceData[] datas = getResourceDatas(); + CResourceData data; + BuildLanguageData lData; + BuildLanguageData[] lDatas; + + + for(int i = 0; i < datas.length; i++){ + data = datas[i]; + if(data.getType() == ICSettingBase.SETTING_FOLDER){ + ((BuildFolderData)data).clearCachedData(); + } else { + ((BuildFileData)data).clearCachedData(); + } + } + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFileData.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFileData.java index 7154b514248..9856bf88591 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFileData.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFileData.java @@ -13,12 +13,13 @@ package org.eclipse.cdt.managedbuilder.internal.dataprovider; import org.eclipse.cdt.core.settings.model.extension.CFileData; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; import org.eclipse.cdt.managedbuilder.core.IFileInfo; +import org.eclipse.cdt.managedbuilder.internal.core.ResourceConfiguration; import org.eclipse.core.runtime.IPath; public class BuildFileData extends CFileData { - private IFileInfo fFileInfo; + private ResourceConfiguration fFileInfo; public BuildFileData(IFileInfo fileInfo){ - fFileInfo = fileInfo; + fFileInfo = (ResourceConfiguration)fileInfo; } public IFileInfo getFileInfo(){ @@ -64,4 +65,14 @@ public class BuildFileData extends CFileData { return null; } + public boolean hasCustomSettings() { + return fFileInfo.hasCustomSettings(); + } + + void clearCachedData(){ + BuildLanguageData lData = (BuildLanguageData)getLanguageData(); + if(lData != null) + lData.clearCachedData(); + } + } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFolderData.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFolderData.java index f545947cd8d..200e176a787 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFolderData.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildFolderData.java @@ -13,12 +13,13 @@ package org.eclipse.cdt.managedbuilder.internal.dataprovider; import org.eclipse.cdt.core.settings.model.extension.CFolderData; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; import org.eclipse.cdt.managedbuilder.core.IFolderInfo; +import org.eclipse.cdt.managedbuilder.internal.core.FolderInfo; import org.eclipse.core.runtime.IPath; public class BuildFolderData extends CFolderData { - private IFolderInfo fFolderInfo; + private FolderInfo fFolderInfo; public BuildFolderData(IFolderInfo folderInfo){ - fFolderInfo = folderInfo; + fFolderInfo = (FolderInfo)folderInfo; } public IFolderInfo getFolderInfo(){ @@ -72,4 +73,15 @@ public class BuildFolderData extends CFolderData { // TODO Auto-generated method stub return null; } + + public boolean hasCustomSettings() { + return fFolderInfo.hasCustomSettings(); + } + + void clearCachedData(){ + CLanguageData[] lDatas = getLanguageDatas(); + for(int i = 0; i < lDatas.length; i++){ + ((BuildLanguageData)lDatas[i]).clearCachedData(); + } + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildLanguageData.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildLanguageData.java index 660fbf990ed..2fc89115dc4 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildLanguageData.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildLanguageData.java @@ -472,4 +472,8 @@ public class BuildLanguageData extends CLanguageData { // TODO Auto-generated method stub } + + void clearCachedData(){ + fKindToEntryStore.clear(); + } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildVariablesContributor.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildVariablesContributor.java index cfc562c3ee8..169b5931216 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildVariablesContributor.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/BuildVariablesContributor.java @@ -20,6 +20,7 @@ import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.managedbuilder.core.IBuilder; import org.eclipse.cdt.managedbuilder.core.IConfiguration; import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.internal.core.Configuration; import org.eclipse.cdt.managedbuilder.internal.macros.BuildMacroProvider; import org.eclipse.cdt.managedbuilder.internal.macros.DefaultMacroContextInfo; @@ -129,19 +130,16 @@ public class BuildVariablesContributor implements ICdtVariablesContributor { IConfiguration cfg = fCfgData.getConfiguration(); if(((Configuration)cfg).isPreference()) return null; - IProject project = cfg.getOwner().getProject(); - ICProjectDescription des = CoreModel.getDefault().getProjectDescription(project); - if(des != null){ - ICConfigurationDescription cfgDes = des.getConfigurationById(cfg.getId()); - if(cfgDes != null){ - return new ContributorMacroContextInfo(mngr, - cfgDes, - BuildMacroProvider.CONTEXT_CONFIGURATION, - cfg); - } + ICConfigurationDescription cfgDes = ManagedBuildManager.getDescriptionForConfiguration(cfg); + if(cfgDes != null){ + return new ContributorMacroContextInfo(mngr, + cfgDes, + BuildMacroProvider.CONTEXT_CONFIGURATION, + cfg); } return null; } + public ICdtVariable[] getVariables(ICdtVariableManager provider) { ContributorMacroContextInfo info = createContextInfo(provider); if(info != null) 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 10629a60b73..0870cb4dfcf 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 @@ -438,4 +438,12 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem mProj.removeConfiguration(cfg.getId()); } + public void dataCached(ICConfigurationDescription cfgDes, + CConfigurationData data, + IProgressMonitor monitor) { + BuildConfigurationData cfgData = (BuildConfigurationData)data; + ((Configuration)cfgData.getConfiguration()).setConfigurationDescription(null); + cfgData.clearCachedData(); + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CConfigurationDataProvider.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CConfigurationDataProvider.java index 019f0064487..278af6889cc 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CConfigurationDataProvider.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CConfigurationDataProvider.java @@ -68,4 +68,15 @@ public abstract class CConfigurationDataProvider { ICConfigurationDescription baseDescription, CConfigurationData baseData, IProgressMonitor monitor) throws CoreException; + + /** + * called to notify that the configuration data was cached + * implementors can do any necessary cleaning, etc. + * Default implementation is empty + * + * @param cfgDes + * @param data + */ + public void dataCached(ICConfigurationDescription cfgDes, CConfigurationData data, IProgressMonitor monitor){ + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CResourceData.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CResourceData.java index cf65ec148dc..0343161637a 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CResourceData.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/CResourceData.java @@ -24,4 +24,6 @@ public abstract class CResourceData extends CDataObject { public abstract void setPath(IPath path) ; public abstract void setExcluded(boolean excluded); + + public abstract boolean hasCustomSettings(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultConfigurationData.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultConfigurationData.java index a6bce0b3444..3d26bc2bd28 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultConfigurationData.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultConfigurationData.java @@ -106,7 +106,7 @@ public class CDefaultConfigurationData extends CConfigurationData { fRootFolderData = copyFolderData(baseRootFolderData.getPath(), baseRootFolderData, clone); addRcData(fRootFolderData); - CResourceData[] rcDatas = base.getResourceDatas(); + CResourceData[] rcDatas = filterRcDatasToCopy(base); for(int i = 0; i < rcDatas.length; i++){ CResourceData rcData = rcDatas[i]; @@ -119,6 +119,10 @@ public class CDefaultConfigurationData extends CConfigurationData { addRcData(copyFileData(rcData.getPath(), (CFileData)rcData, clone)); } } + + protected CResourceData[] filterRcDatasToCopy(CConfigurationData base){ + return base.getResourceDatas(); + } protected CFolderData copyFolderData(IPath path, CFolderData base, boolean clone){ return fFactory.createFolderData(this, base, clone, path); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFileData.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFileData.java index 60151869ece..12f775dd077 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFileData.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFileData.java @@ -123,4 +123,8 @@ public class CDefaultFileData extends CFileData { fFactory.setModified(fLanguageData, false); } + public boolean hasCustomSettings() { + return false; + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFolderData.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFolderData.java index e534cb54e45..fb4413fa6dc 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFolderData.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultFolderData.java @@ -159,5 +159,7 @@ public class CDefaultFolderData extends CFolderData { } - + public boolean hasCustomSettings() { + return false; + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CDataUtil.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CDataUtil.java index a9262f57e25..6224a568d4b 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CDataUtil.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CDataUtil.java @@ -30,8 +30,11 @@ import org.eclipse.cdt.core.settings.model.CSourceEntry; 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.settings.model.extension.CConfigurationData; +import org.eclipse.cdt.core.settings.model.extension.CFileData; import org.eclipse.cdt.core.settings.model.extension.CFolderData; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; +import org.eclipse.cdt.core.settings.model.extension.CResourceData; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultLanguageData; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; @@ -319,6 +322,19 @@ public class CDataUtil { } return null; } - - + + public static PathSettingsContainer createRcDataHolder(CConfigurationData data){ + PathSettingsContainer h = PathSettingsContainer.createRootContainer(); + + h.setValue(data.getRootFolderData()); + CResourceData[] rcDatas = data.getResourceDatas(); + CResourceData rcData; + PathSettingsContainer child; + for(int i = 0; i < rcDatas.length; i++){ + rcData = rcDatas[i]; + child = h.getChildContainer(rcData.getPath(), true, true); + child.setValue(rcData); + } + return h; + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/PathEntryTranslator.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/PathEntryTranslator.java index 4367718168d..410a2d159f8 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/PathEntryTranslator.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/PathEntryTranslator.java @@ -749,16 +749,16 @@ public class PathEntryTranslator { private Set fFiltersSet; private boolean fIsExported; private IProject fProject; - private ICConfigurationDescription fCfg; +// private ICConfigurationDescription fCfg; - PathEntryComposer(String projName, IProject project, ICConfigurationDescription cfg){ - this(new Path(projName).makeAbsolute(), project, cfg); + PathEntryComposer(String projName, IProject project/*, ICConfigurationDescription cfg*/){ + this(new Path(projName).makeAbsolute(), project/*, cfg*/); } - PathEntryComposer(IPath path, IProject project, ICConfigurationDescription cfg){ + PathEntryComposer(IPath path, IProject project/*, ICConfigurationDescription cfg*/){ fPath = toProjectPath(path); fProject = project; - fCfg = cfg; +// fCfg = cfg; } private static IPath toProjectPath(IPath path){ @@ -768,11 +768,11 @@ public class PathEntryTranslator { return path.makeAbsolute(); } - PathEntryComposer(ICExclusionPatternPathEntry entry, IProject project, ICConfigurationDescription cfg){ + PathEntryComposer(ICExclusionPatternPathEntry entry, IProject project/*, ICConfigurationDescription cfg*/){ fPath = new Path(entry.getValue()); fLangEntry = entry; fProject = project; - fCfg = cfg; +// fCfg = cfg; IPath[] exclusions = entry.getExclusionPatterns(); if(exclusions.length != 0){ fFiltersSet = new HashSet(exclusions.length); @@ -780,12 +780,12 @@ public class PathEntryTranslator { } } - PathEntryComposer(IPath path, ICLanguageSettingEntry entry, boolean exported, IProject project, ICConfigurationDescription cfg){ + PathEntryComposer(IPath path, ICLanguageSettingEntry entry, boolean exported, IProject project/*, ICConfigurationDescription cfg*/){ fPath = path; fLangEntry = entry; fIsExported = exported; fProject = project; - fCfg = cfg; +// fCfg = cfg; } public void addFilter(IPath path){ @@ -856,28 +856,28 @@ public class PathEntryTranslator { return result; } - public IPathEntry toPathEntry(){ + public IPathEntry toPathEntry(ICConfigurationDescription cfg){ if(fLangEntry != null){ switch(fLangEntry.getKind()){ case ICLanguageSettingEntry.INCLUDE_FILE:{ - IPath paths[] = getEntryPath(fLangEntry, fCfg); + IPath paths[] = getEntryPath(fLangEntry, cfg); return CoreModel.newIncludeFileEntry(fPath, null, paths[0], paths[1], getExclusionPatterns(), fIsExported); } case ICLanguageSettingEntry.INCLUDE_PATH:{ - IPath paths[] = getEntryPath(fLangEntry, fCfg); + IPath paths[] = getEntryPath(fLangEntry, cfg); ICIncludePathEntry ipe = (ICIncludePathEntry)fLangEntry; return CoreModel.newIncludeEntry(fPath, paths[0], paths[1], !ipe.isLocal(), getExclusionPatterns(), fIsExported); } case ICLanguageSettingEntry.MACRO: return CoreModel.newMacroEntry(fPath, fLangEntry.getName(), fLangEntry.getValue(), getExclusionPatterns(), fIsExported); case ICLanguageSettingEntry.MACRO_FILE:{ - IPath paths[] = getEntryPath(fLangEntry, fCfg); + IPath paths[] = getEntryPath(fLangEntry, cfg); return CoreModel.newMacroFileEntry(fPath, paths[0], null, paths[1], getExclusionPatterns(), fIsExported); } case ICLanguageSettingEntry.LIBRARY_PATH: return null; case ICLanguageSettingEntry.LIBRARY_FILE:{ - IPath paths[] = getEntryPath(fLangEntry, fCfg); + IPath paths[] = getEntryPath(fLangEntry, cfg); return CoreModel.newLibraryEntry(fPath, paths[0], paths[1], null, null, null, fIsExported); } case ICLanguageSettingEntry.OUTPUT_PATH: @@ -919,27 +919,27 @@ public class PathEntryTranslator { private KindBasedStore fStore; private LinkedHashMap fRefProjMap; private IProject fProject; - private ICConfigurationDescription fCfg; +// private ICConfigurationDescription fCfg; - private PathEntryCollector(IProject project, ICConfigurationDescription cfg){ + private PathEntryCollector(IProject project/*, ICConfigurationDescription cfg*/){ fStorage = PathSettingsContainer.createRootContainer(); fStorage.setValue(this); fStore = new KindBasedStore(false); - fCfg = cfg; +// fCfg = cfg; fProject = project; } - private PathEntryCollector(PathSettingsContainer container, KindBasedStore store, IProject project, ICConfigurationDescription cfg){ + private PathEntryCollector(PathSettingsContainer container, KindBasedStore store, IProject project/*, ICConfigurationDescription cfg*/){ fStorage = container; fStore = store; - fCfg = cfg; +// fCfg = cfg; fProject = project; } public void setSourceOutputEntries(int kind, ICExclusionPatternPathEntry entries[]){ Map map = getEntriesMap(kind, true); for(int i = 0; i < entries.length; i++){ - map.put(entries[i], new PathEntryComposer(entries[i], fProject, fCfg)); + map.put(entries[i], new PathEntryComposer(entries[i], fProject/*, fCfg*/)); } } @@ -949,7 +949,7 @@ public class PathEntryTranslator { else { fRefProjMap = new LinkedHashMap(); for(int i = 0; i < paths.length; i++){ - PathEntryComposer cs = new PathEntryComposer(paths[i], fProject, fCfg); + PathEntryComposer cs = new PathEntryComposer(paths[i], fProject/*, fCfg*/); IPath path = cs.getPath(); fRefProjMap.put(path, cs); } @@ -976,7 +976,7 @@ public class PathEntryTranslator { info[i].setInfo((LinkedHashMap)map.clone()); } } - PathEntryCollector newCr = new PathEntryCollector(newContainer, cloneStore, fProject, fCfg); + PathEntryCollector newCr = new PathEntryCollector(newContainer, cloneStore, fProject/*, fCfg*/); newContainer.setValue(newCr); return newCr; } @@ -1014,7 +1014,7 @@ public class PathEntryTranslator { continue; ICLanguageSettingEntry entry = entries[i]; - map.put(entry, new PathEntryComposer(fullPath, entry, exportedEntries.contains(entry), fProject, fCfg)); + map.put(entry, new PathEntryComposer(fullPath, entry, exportedEntries.contains(entry), fProject/*, fCfg*/)); } } } @@ -1084,7 +1084,7 @@ public class PathEntryTranslator { } } - public List getEntries(int peKind, List list, int flags){ + public List getEntries(int peKind, List list, int flags, ICConfigurationDescription cfg){ if(list == null){ list = new ArrayList(); } @@ -1103,7 +1103,7 @@ public class PathEntryTranslator { PathEntryComposer cs = (PathEntryComposer)iter.next(); ICSettingEntry entry = cs.getSettingEntry(); if(checkFilter(cs, entry, flags)){ - IPathEntry pe = cs.toPathEntry(); + IPathEntry pe = cs.toPathEntry(cfg); if(pe != null) list.add(pe); } @@ -1127,19 +1127,19 @@ public class PathEntryTranslator { } - public List getEntries(List list, int flags){ + public List getEntries(List list, int flags, ICConfigurationDescription cfg){ if(list == null) list = new ArrayList(); int peKinds[] = PathEntryKyndStore.getSupportedKinds(); for(int i = 0; i < peKinds.length; i++){ - getEntries(peKinds[i], list, flags); + getEntries(peKinds[i], list, flags, cfg); } return list; } - public IPathEntry[] getEntries(int flags){ - List list = getEntries(null, flags); + public IPathEntry[] getEntries(int flags, ICConfigurationDescription cfg){ + List list = getEntries(null, flags,cfg); IPathEntry[] entries = (IPathEntry[])list.toArray(new IPathEntry[list.size()]); return entries; } @@ -1217,18 +1217,7 @@ public class PathEntryTranslator { } private static PathSettingsContainer createRcDataHolder(CConfigurationData data){ - PathSettingsContainer h = PathSettingsContainer.createRootContainer(); - - h.setValue(data.getRootFolderData()); - CResourceData[] rcDatas = data.getResourceDatas(); - CResourceData rcData; - PathSettingsContainer child; - for(int i = 0; i < rcDatas.length; i++){ - rcData = rcDatas[i]; - child = h.getChildContainer(rcData.getPath(), true, true); - child.setValue(rcData); - } - return h; + return CDataUtil.createRcDataHolder(data); } public ReferenceSettingsInfo applyPathEntries(PathEntryResolveInfo info, int op){ @@ -2237,7 +2226,7 @@ public class PathEntryTranslator { // } // // public static PathEntryCollector collectEntries(IProject project, CConfigurationData data, ReferenceSettingsInfo refInfo){ - final PathEntryCollector cr = new PathEntryCollector(project, des); + final PathEntryCollector cr = new PathEntryCollector(project/*, des*/); PathSettingsContainer rcDatas = createRcDataHolder(data); IPath srcPaths[] = data.getSourcePaths(); ICSourceEntry sEntries[] = calculateSourceEntriesFromPaths(project, rcDatas, srcPaths); @@ -2327,7 +2316,7 @@ public class PathEntryTranslator { // public static IPathEntry[] getPathEntries(IProject project, CConfigurationData data, ReferenceSettingsInfo refInfo, int flags){ public static IPathEntry[] getPathEntries(IProject project, ICConfigurationDescription cfg, int flags){ PathEntryCollector cr = collectEntries(project, cfg); - return cr.getEntries(flags); + return cr.getEntries(flags, cfg); } // // private diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java index c674f1f1999..e569cdffe76 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CContainerInfo.java @@ -70,7 +70,7 @@ public class CContainerInfo extends OpenableInfo { // IPathEntry[] entries = cproject.getResolvedPathEntries(); ICSourceEntry[] entries = null; - CProjectDescription des = (CProjectDescription)CProjectDescriptionManager.getInstance().getProjectDescription(cproject.getProject()); + CProjectDescription des = (CProjectDescription)CProjectDescriptionManager.getInstance().getProjectDescription(cproject.getProject(), false); if(des != null){ ICConfigurationDescription cfg = des.getIndexConfiguration(); if(cfg != null){ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java index 15a5e268997..7f93d27b772 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CProjectInfo.java @@ -88,7 +88,7 @@ class CProjectInfo extends OpenableInfo { char[][] exclusionPatterns = null; // try { // entries = cproject.getResolvedPathEntries(); - CProjectDescription des = (CProjectDescription)CProjectDescriptionManager.getInstance().getProjectDescription(project); + CProjectDescription des = (CProjectDescription)CProjectDescriptionManager.getInstance().getProjectDescription(project, false); if(des != null){ ICConfigurationDescription cfg = des.getIndexConfiguration(); if(cfg != null){ 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 e2d20e3c99b..a72107d0678 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 @@ -338,8 +338,10 @@ public class CConfigurationDescription extends CDataProxyContainer implements IC if(fCfgCache != null){ if(fCfgCache.isInitializing()) fCfgSpecSettings = fCfgCache.getSpecSettings(); - else + else { fCfgSpecSettings = new CConfigurationSpecSettings(this, fCfgCache.getSpecSettings()); + fCfgCache = null; + } } else { fCfgSpecSettings = new CConfigurationSpecSettings(this, (ICStorageElement)null); } @@ -348,6 +350,7 @@ public class CConfigurationDescription extends CDataProxyContainer implements IC } else if( fCfgSpecSettings.getConfigurarion() != this){ if(!fCfgCache.isInitializing()){ fCfgSpecSettings = new CConfigurationSpecSettings(this, fCfgCache.getSpecSettings()); + fCfgCache = null; } } return fCfgSpecSettings; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java index 176788e5842..854d775749f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java @@ -47,6 +47,7 @@ import org.eclipse.cdt.internal.core.cdtvariables.CdtVariableManager; import org.eclipse.cdt.internal.core.cdtvariables.StorableCdtVariables; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.QualifiedName; public class CConfigurationDescriptionCache extends CDefaultConfigurationData @@ -437,10 +438,18 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData } void doneInitialization(){ + CProjectDescriptionManager.getInstance().notifyCached(this, fData, null); fInitializing = false; } public ICLanguageSetting getLanguageSettingForFile(IPath path) { return CProjectDescriptionManager.getLanguageSettingForFile(this, path); } + + protected CResourceData[] filterRcDatasToCopy(CConfigurationData base) { + if(!isPreferenceConfiguration()) + CProjectDescriptionManager.removeNonCustomSettings(getProjectDescription().getProject(), base); + return super.filterRcDatasToCopy(base); + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFileDescriptionCache.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFileDescriptionCache.java index 1c0c77eb967..e5121430a2d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFileDescriptionCache.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFileDescriptionCache.java @@ -86,4 +86,8 @@ public class CFileDescriptionCache extends CDefaultFileData implements public IPath getPath() { return ResourceDescriptionHolder.normalizePath(super.getPath()); } + + public boolean hasCustomSettings() { + return true; + } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFolderDescriptionCache.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFolderDescriptionCache.java index 05a4ef81df3..9465b5a7e52 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFolderDescriptionCache.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CFolderDescriptionCache.java @@ -134,4 +134,10 @@ public class CFolderDescriptionCache extends CDefaultFolderData implements public IPath getPath() { return ResourceDescriptionHolder.normalizePath(super.getPath()); } + + public boolean hasCustomSettings() { + return true; + } + + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java index af098e4ba36..5294af21256 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java @@ -62,6 +62,7 @@ import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider; +import org.eclipse.cdt.core.settings.model.extension.CFileData; import org.eclipse.cdt.core.settings.model.extension.CFolderData; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; import org.eclipse.cdt.core.settings.model.extension.CResourceData; @@ -70,8 +71,11 @@ import org.eclipse.cdt.core.settings.model.extension.impl.CDataFacroty; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultConfigurationData; import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory; +import org.eclipse.cdt.core.settings.model.util.IPathSettingsContainerVisitor; import org.eclipse.cdt.core.settings.model.util.KindBasedStore; import org.eclipse.cdt.core.settings.model.util.ListComparator; +import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer; +import org.eclipse.cdt.core.settings.model.util.PatternNameMap; import org.eclipse.cdt.internal.core.CConfigBasedDescriptorManager; import org.eclipse.cdt.internal.core.envvar.ContributedEnvironment; import org.eclipse.cdt.internal.core.model.CElementDelta; @@ -1488,7 +1492,19 @@ public class CProjectDescriptionManager { CConfigurationDataProvider provider = getProvider(des); return provider.applyConfiguration(des, baseDescription, base, monitor); } - + + void notifyCached(ICConfigurationDescription des, CConfigurationData data, IProgressMonitor monitor) { + if(monitor == null) + monitor = new NullProgressMonitor(); + + try { + CConfigurationDataProvider provider = getProvider(des); + provider.dataCached(des, data, monitor); + } catch (CoreException e){ + CCorePlugin.log(e); + } + } + void removeData(ICConfigurationDescription des, CConfigurationData data, IProgressMonitor monitor) throws CoreException{ if(monitor == null) monitor = new NullProgressMonitor(); @@ -3134,4 +3150,141 @@ public class CProjectDescriptionManager { } return ((ICFileDescription)rcDes).getLanguageSetting(); } + + static private HashMap createExtSetToLDataMap(IProject project, CLanguageData[] lDatas){ + HashMap map = new HashMap(); + + for(int i = 0; i < lDatas.length; i++){ + CLanguageData lData = lDatas[i]; + String[] exts = CDataUtil.getSourceExtensions(project, lData); + HashSet set = new HashSet(Arrays.asList(exts)); + map.put(set, lData); + } + + return map; + } + + static boolean removeNonCustomSettings(IProject project, CConfigurationData data){ + if(true) + return false; + PathSettingsContainer cr = CDataUtil.createRcDataHolder(data); + PathSettingsContainer[] crs = cr.getChildren(false); + PathSettingsContainer child, parent; + CResourceData childRcData; + boolean modified = false; + for(int i = 0; i < crs.length; i++){ + child = crs[i]; + childRcData = (CResourceData)child.getValue(); + if(childRcData.getType() == ICSettingBase.SETTING_FOLDER){ + CResourceData parentRcData = null; + for(parent = child.getParentContainer(); + (parentRcData = (CResourceData)parent.getValue()).getType() != ICSettingBase.SETTING_FOLDER; + parent = parent.getParentContainer()); + if(!settingsCustomized(project, (CFolderData)parentRcData, (CFolderData)childRcData)){ + try { + data.removeResourceData(childRcData); + modified = true; + } catch (CoreException e) { + CCorePlugin.log(e); + } + } + } else { + parent = child.getParentContainer(); + if(!settingsCustomized(project, (CResourceData)parent.getValue(), (CFileData)childRcData)){ + try { + data.removeResourceData(childRcData); + modified = true; + } catch (CoreException e) { + CCorePlugin.log(e); + } + } + } + + } + return modified; + } + + static boolean settingsCustomized(IProject project, CFolderData parent, CFolderData child){ + if(baseSettingsCustomized(parent, child)) + return true; + + CLanguageData[] childLDatas = child.getLanguageDatas(); + CLanguageData[] parentLDatas = parent.getLanguageDatas(); + + if(childLDatas.length != parentLDatas.length) + return true; + + if(childLDatas.length != 0){ + HashMap parentMap = createExtSetToLDataMap(project, parentLDatas); + HashMap childMap = createExtSetToLDataMap(project, childLDatas); + CLanguageData parentLData, childLData; + for(Iterator iter = parentMap.entrySet().iterator(); iter.hasNext();){ + Map.Entry entry = (Map.Entry)iter.next(); + childLData = (CLanguageData)childMap.get(entry.getKey()); + if(childLData == null) + return true; + + parentLData = (CLanguageData)entry.getValue(); + if(!langDatasEqual(parentLData, childLData)) + return true; + } + } + + return false; + } + + static boolean settingsCustomized(IProject project, CResourceData parent, CFileData child){ + if(baseSettingsCustomized(parent, child)) + return true; + + CLanguageData lData = child.getLanguageData(); + + if(parent.getType() == ICSettingBase.SETTING_FOLDER){ + CFolderData foParent = (CFolderData)parent; + + IPath childPath = child.getPath(); + String fileName = childPath.lastSegment(); + if(PatternNameMap.isPatternName(fileName)) + return true; + + CLanguageData parentLangData = CDataUtil.findLanguagDataForFile(fileName, project, foParent); + + return !langDatasEqual(lData, parentLangData); + } + + CFileData fiParent = (CFileData)parent; + CLanguageData parentLangData = fiParent.getLanguageData(); + return !langDatasEqual(lData, parentLangData); + } + + static boolean langDatasEqual(CLanguageData lData1, CLanguageData lData2){ + if(lData1 == null) + return lData2 == null; + + if(lData2 == null) + return false; + + int kinds[] = KindBasedStore.getLanguageEntryKinds(); + int kind; + for(int i = 0; i < kinds.length; i++){ + kind = kinds[i]; + ICLanguageSettingEntry entries1[] = lData1.getEntries(kind); + ICLanguageSettingEntry entries2[] = lData2.getEntries(kind); + if(!Arrays.equals(entries1, entries2)) + return false; + } + + return true; + } + + private static boolean baseSettingsCustomized(CResourceData parent, CResourceData child){ + if(parent.isExcluded() != child.isExcluded()) + return true; + + if(child.hasCustomSettings()) + return true; + + return false; + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ConfigBasedPathEntryStore.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ConfigBasedPathEntryStore.java index d8f4b4888af..446709e4260 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ConfigBasedPathEntryStore.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/ConfigBasedPathEntryStore.java @@ -99,9 +99,10 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc } public IPathEntry[] getRawPathEntries() throws CoreException { - PathEntryCollector cr = getCollector(fProject); + ICConfigurationDescription cfg = getIndexCfg(fProject); + PathEntryCollector cr = getCollector(fProject, cfg); if(cr != null){ - List list = cr.getEntries(null, PathEntryTranslator.INCLUDE_USER); + List list = cr.getEntries(null, PathEntryTranslator.INCLUDE_USER, cfg); list.add(CoreModel.newContainerEntry(ConfigBasedPathEntryContainer.CONTAINER_PATH)); return (IPathEntry[])list.toArray(new IPathEntry[list.size()]); } @@ -109,9 +110,10 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc } public void setRawPathEntries(IPathEntry[] entries) throws CoreException { - PathEntryCollector cr = getCollector(fProject); + ICConfigurationDescription cfg = getIndexCfg(fProject); + PathEntryCollector cr = getCollector(fProject, cfg); if(cr != null){ - List sysList = cr.getEntries(null, PathEntryTranslator.INCLUDE_BUILT_INS); + List sysList = cr.getEntries(null, PathEntryTranslator.INCLUDE_BUILT_INS, cfg); List usrList = new ArrayList(entries.length); for(int i = 0; i < entries.length; i++){ if(entries[i].getEntryKind() != IPathEntry.CDT_CONTAINER) @@ -155,7 +157,7 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc ICConfigurationDescription oldIndexCfg = oldDes.getIndexConfiguration(); PathEntryCollector oldCr = getCachedCollector(oldIndexCfg); if(oldCr != null) - oldCrEntries = oldCr.getEntries(PathEntryTranslator.INCLUDE_BUILT_INS); + oldCrEntries = oldCr.getEntries(PathEntryTranslator.INCLUDE_BUILT_INS, oldIndexCfg); } if(des != null){ //TODO: smart delta handling @@ -165,8 +167,9 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc } if(oldCrEntries != null){ - PathEntryCollector newCr = getCollector(des); - IPathEntry[] newCrEntries = newCr.getEntries(PathEntryTranslator.INCLUDE_BUILT_INS); + ICConfigurationDescription newIndexCfg = des.getIndexConfiguration(); + PathEntryCollector newCr = getCollector(fProject, newIndexCfg); + IPathEntry[] newCrEntries = newCr.getEntries(PathEntryTranslator.INCLUDE_BUILT_INS, newIndexCfg); if(!Arrays.equals(oldCrEntries, newCrEntries)){ CModelManager manager = CModelManager.getDefault(); ICProject cproject = manager.create(project); @@ -187,19 +190,31 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc } } - private static PathEntryCollector getCollector(ICProjectDescription des){ - ICConfigurationDescription cfgDes = ((CProjectDescription)des).getIndexConfiguration(); +// private static PathEntryCollector getCollector(ICProjectDescription des){ +// ICConfigurationDescription cfgDes = ((CProjectDescription)des).getIndexConfiguration(); +// if(cfgDes != null){ +// PathEntryCollector cr = getCachedCollector(cfgDes); +// if(cr == null){ +// cr = PathEntryTranslator.collectEntries(des.getProject(), cfgDes); +// setCachedCollector(cfgDes, cr); +// } +// return cr; +// } +// return null; +// } + + private static PathEntryCollector getCollector(IProject project, ICConfigurationDescription cfgDes){ if(cfgDes != null){ PathEntryCollector cr = getCachedCollector(cfgDes); if(cr == null){ - cr = PathEntryTranslator.collectEntries(des.getProject(), cfgDes); + cr = PathEntryTranslator.collectEntries(project, cfgDes); setCachedCollector(cfgDes, cr); } return cr; } return null; } - + private static PathEntryCollector getCachedCollector(ICConfigurationDescription cfgDes){ return (PathEntryCollector)cfgDes.getSessionProperty(PATH_ENTRY_COLLECTOR_PROPERTY_NAME); } @@ -208,11 +223,16 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc cfgDes.setSessionProperty(PATH_ENTRY_COLLECTOR_PROPERTY_NAME, cr); } - public static PathEntryCollector getCollector(IProject project){ - ICProjectDescription des = CCorePlugin.getDefault().getProjectDescription(project, false); - if(des != null) - return getCollector(des); - return null; +// public static PathEntryCollector getCollector(IProject project){ +// ICProjectDescription des = CCorePlugin.getDefault().getProjectDescription(project, false); +// if(des != null) +// return getCollector(des); +// return null; +// } + + private static ICConfigurationDescription getIndexCfg(IProject project){ + CProjectDescription des = (CProjectDescription)CCorePlugin.getDefault().getProjectDescription(project, false); + return des.getIndexConfiguration(); } public static IPathEntry[] getContainerEntries(IProject project){ @@ -223,9 +243,10 @@ public class ConfigBasedPathEntryStore implements IPathEntryStore, ICProjectDesc } public static IPathEntry[] getContainerEntries(ICProjectDescription des){ - PathEntryCollector cr = getCollector(des); + ICConfigurationDescription cfg = ((CProjectDescription)des).getIndexConfiguration(); + PathEntryCollector cr = getCollector(des.getProject(), cfg); if(cr != null) - return cr.getEntries(PathEntryTranslator.INCLUDE_BUILT_INS); + return cr.getEntries(PathEntryTranslator.INCLUDE_BUILT_INS, cfg); return new IPathEntry[0]; }