From 5e04b06ded1e36c63abe148e4884c22dacf4991f Mon Sep 17 00:00:00 2001 From: Mikhail Sennikovsky Date: Fri, 16 Mar 2007 12:56:22 +0000 Subject: [PATCH] Scanner discovery fixes --- .../scannerconfig/DiscoveredPathManager.java | 10 +- .../CfgDiscoveredPathManager.java | 123 +++++++++++++----- .../internal/core/Configuration.java | 10 +- .../managedbuilder/internal/core/Tool.java | 14 +- .../internal/core/ToolChain.java | 14 +- 5 files changed, 112 insertions(+), 59 deletions(-) diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java index 755c1c07227..ba27dcbf68a 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DiscoveredPathManager.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2006 QNX Software Systems and others. + * Copyright (c) 2004, 2007 QNX Software Systems and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -21,7 +21,6 @@ import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.PathEntryContainerChanged; -import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager; import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2; @@ -33,7 +32,6 @@ import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigScope; import org.eclipse.cdt.make.internal.core.MakeMessages; import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance; import org.eclipse.cdt.make.internal.core.scannerconfig2.ScannerConfigProfileManager; -import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; @@ -232,10 +230,12 @@ public class DiscoveredPathManager implements IDiscoveredPathManager, IResourceC * @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager#updateDiscoveredInfo(org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo, java.util.List) */ public void updateDiscoveredInfo(InfoContext context, IDiscoveredPathInfo info, boolean updateContainer, List changedResources) throws CoreException { - DiscoveredInfoHolder holder = getHolder(info.getProject(), false); - if (holder != null && holder.getInfo(context) != null) { + DiscoveredInfoHolder holder = getHolder(info.getProject(), true); + IDiscoveredPathInfo oldInfo = holder.getInfo(context); + if (oldInfo != null) { IDiscoveredScannerInfoSerializable serializable = info.getSerializable(); if (serializable != null) { + holder.setInfo(context, info); IProject project = info.getProject(); DiscoveredScannerInfoStore.getInstance().saveDiscoveredScannerInfoToState(project, context, serializable); fireUpdate(INFO_CHANGED, info); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java index aaef98d645e..f12b39f82f8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/build/internal/core/scannerconfig/CfgDiscoveredPathManager.java @@ -25,11 +25,11 @@ import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CResourceData; import org.eclipse.cdt.make.core.MakeCorePlugin; -import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager; import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2; import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector; import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2; +import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore; import org.eclipse.cdt.make.internal.core.scannerconfig2.PerFileSICollector; import org.eclipse.cdt.make.internal.core.scannerconfig2.SCProfileInstance; @@ -80,6 +80,20 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { boolean fIsFerFileCache; } + public static class PathInfoCache{ + private PathInfo fPathInfo; + private String fProfileId; + + public PathInfo getPathInfo(){ + return fPathInfo; + } + + private PathInfoCache(String profileId, PathInfo pathInfo){ + this.fProfileId = profileId; + this.fPathInfo = pathInfo; + } + } + private CfgDiscoveredPathManager() { fBaseMngr = MakeCorePlugin.getDefault().getDiscoveryManager(); } @@ -169,7 +183,7 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { private PathInfo resolveCacheBaseDiscoveredInfo(ContextInfo cInfo, IDiscoveredPathManager.IDiscoveredPathInfo baseInfo){ if(cInfo.fIsFerFileCache){ if(baseInfo instanceof IDiscoveredPathManager.IPerFileDiscoveredPathInfo2){ - resolveCachePerFileInfo(cInfo.fLoadContext.getConfiguration(), (IDiscoveredPathManager.IPerFileDiscoveredPathInfo2)baseInfo); + resolveCachePerFileInfo(cInfo, (IDiscoveredPathManager.IPerFileDiscoveredPathInfo2)baseInfo); } return getCachedPathInfo(cInfo); } @@ -178,12 +192,12 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { IPath paths[] = baseInfo.getIncludePaths(); PathInfo info = new PathInfo(paths, null, map, null, null); - setCachedPathInfo(cInfo.fCacheContext, info); + setCachedPathInfo(cInfo, info); return info; } - private void resolveCachePerFileInfo(IConfiguration cfg, IDiscoveredPathManager.IPerFileDiscoveredPathInfo2 info){ - CConfigurationData data = cfg.getConfigurationData(); + private void resolveCachePerFileInfo(ContextInfo cInfo, IDiscoveredPathManager.IPerFileDiscoveredPathInfo2 info){ + CConfigurationData data = cInfo.fLoadContext.getConfiguration().getConfigurationData(); if(data == null) return; @@ -205,7 +219,7 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { rcData = rcInfo.getResourceData(); rcDataMap.remove(rcData.getPath()); - cache(rcInfo); + cache(cInfo, rcInfo); } if(!rcDataMap.isEmpty()){ @@ -215,18 +229,18 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { } } - private void cache(IRcSettingInfo rcSetting){ + private void cache(ContextInfo cInfo, IRcSettingInfo rcSetting){ CResourceData rcData = rcSetting.getResourceData(); clearCache(rcData); ILangSettingInfo lInfos[] = rcSetting.getLangInfos(); for(int i = 0; i < lInfos.length; i++){ - cache(lInfos[i]); + cache(cInfo, lInfos[i]); } } - private void cache(ILangSettingInfo lInfo){ + private void cache(ContextInfo cInfo, ILangSettingInfo lInfo){ BuildLanguageData bld = (BuildLanguageData)lInfo.getLanguageData(); - ((Tool)bld.getTool()).setDiscoveredPathInfo(bld.getInputType(), lInfo.getFilePathInfo()); + setCachedPathInfo(cInfo, (Configuration)bld.getConfiguration(), (Tool)bld.getTool(), bld.getInputType(), lInfo.getFilePathInfo()); } private void clearCache(CResourceData rcData){ @@ -271,8 +285,7 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { private PathInfo getCachedPathInfo(ContextInfo cInfo){ // ICfgScannerConfigBuilderInfo2Set cfgInfo = cInfo.fCfgInfo; - PathInfo info = getCachedPathInfo((Configuration)cInfo.fCacheContext.getConfiguration(), - (Tool)cInfo.fCacheContext.getTool(), cInfo.fCacheContext.getInputType(), true); + PathInfo info = getCachedPathInfo(cInfo, true, true); // boolean queryCfg = !cfgInfo.isPerRcTypeDiscovery(); // if(!queryCfg){ // Tool tool = (Tool)context.getTool(); @@ -287,14 +300,30 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { // } return info; } + + private PathInfo getCachedPathInfo(ContextInfo cInfo, boolean queryParent, boolean clearIfInvalid){ + return getCachedPathInfo(cInfo, (Configuration)cInfo.fCacheContext.getConfiguration(), (Tool)cInfo.fCacheContext.getTool(), cInfo.fCacheContext.getInputType(), queryParent, clearIfInvalid); + } + + private PathInfo getCachedPathInfo(ContextInfo cInfo, Configuration cfg, Tool tool, IInputType inType, boolean queryParent, boolean clearIfInvalid){ + PathInfoCache infoCache = getPathInfoCache(cInfo, cfg, tool, inType, queryParent, clearIfInvalid); + if(infoCache != null && isCacheValid(cInfo, infoCache)) + return infoCache.fPathInfo; + return null; + } - private PathInfo getCachedPathInfo(Configuration cfg, Tool tool, IInputType inType, boolean queryParent){ - PathInfo info = null; - boolean queryCfg = false; + private PathInfoCache getPathInfoCache(ContextInfo cInfo, Configuration cfg, Tool tool, IInputType inType, boolean queryParent, boolean clearIfInvalid){ + PathInfoCache info = null; +// boolean queryCfg = false; if(tool != null){ info = tool.getDiscoveredPathInfo(inType); - if(info == null && queryParent){ - IResourceInfo rcInfo = tool.getParentResourceInfo(); + if(info != null){ + if(clearIfInvalid && !isCacheValid(cInfo, info)){ + tool.clearDiscoveredPathInfo(inType); +// fBaseMngr.removeDiscoveredInfo(cfg.getOwner().getProject(), cInfo.fLoadContext.toInfoContext()); + } + } else if(queryParent){ +// IResourceInfo rcInfo = tool.getParentResourceInfo(); ITool superTool = tool.getSuperClass(); if(!superTool.isExtensionElement()){ if(inType != null){ @@ -306,21 +335,36 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { break; } if(superInType != null){ - info = getCachedPathInfo(cfg, (Tool)superTool, superInType, true); + info = getPathInfoCache(cInfo, cfg, (Tool)superTool, superInType, true, clearIfInvalid); } } else { - info = getCachedPathInfo(cfg, (Tool)superTool, null, true); + info = getPathInfoCache(cInfo, cfg, (Tool)superTool, null, true, clearIfInvalid); } } else { - info = getCachedPathInfo(cfg, null, null, true); + info = getPathInfoCache(cInfo, cfg, null, null, true, clearIfInvalid); } } } else { info = cfg.getDiscoveredPathInfo(); + if(clearIfInvalid && !isCacheValid(cInfo, info)){ + cfg.clearDiscoveredPathInfo(); +// fBaseMngr.removeDiscoveredInfo(cfg.getOwner().getProject(), cInfo.fLoadContext.toInfoContext()); + } } return info; } + + private boolean isCacheValid(ContextInfo cInfo, PathInfoCache cache){ + if(cache == null) + return true; + + if(cInfo.fInfo != null){ + String id = cInfo.fInfo.getSelectedProfileId(); + return id.equals(cache.fProfileId); + } + return false; + } private ContextInfo getContextInfo(CfgInfoContext context){ return getContextInfo(context, null); @@ -415,25 +459,34 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { return newContext; } - private PathInfo setCachedPathInfo(CfgInfoContext context, PathInfo info){ - ICfgScannerConfigBuilderInfo2Set cfgInfo = CfgScannerConfigProfileManager.getCfgScannerConfigBuildInfo(context.getConfiguration()); - boolean cacheOnCfg = !cfgInfo.isPerRcTypeDiscovery(); - PathInfo oldInfo = null; - if(!cacheOnCfg){ - Tool tool = (Tool)context.getTool(); - if(tool != null){ - if(info != null) - oldInfo = tool.setDiscoveredPathInfo(context.getInputType(), info); - else - oldInfo = tool.clearDiscoveredPathInfo(context.getInputType()); - } + private PathInfo setCachedPathInfo(ContextInfo cInfo, PathInfo info){ + CfgInfoContext cacheContext = cInfo.fCacheContext; + return setCachedPathInfo(cInfo, (Configuration)cacheContext.getConfiguration(), (Tool)cacheContext.getTool(), cacheContext.getInputType(), info); + } + + + private PathInfo setCachedPathInfo(ContextInfo cInfo, Configuration cfg, Tool tool, IInputType inType, PathInfo info){ + PathInfoCache oldInfo; + PathInfoCache cache; + if(info != null){ + String id = cInfo.fInfo != null ? cInfo.fInfo.getSelectedProfileId() : null; + cache = new PathInfoCache(id, info); + } else { + cache = null; + } + + if(tool != null){ + if(info != null) + oldInfo = tool.setDiscoveredPathInfo(inType, cache); + else + oldInfo = tool.clearDiscoveredPathInfo(inType); } else { if(info != null) - oldInfo = ((Configuration)context.getConfiguration()).setDiscoveredPathInfo(info); + oldInfo = cfg.setDiscoveredPathInfo(cache); else - oldInfo = ((Configuration)context.getConfiguration()).clearDiscoveredPathInfo(); + oldInfo = cfg.clearDiscoveredPathInfo(); } - return oldInfo; + return oldInfo != null ? oldInfo.fPathInfo : null; } // public void removeDiscoveredInfo(IProject project, CfgInfoContext context) { 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 75bf83a7eb1..bccce0e57e5 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 @@ -21,6 +21,7 @@ import java.util.StringTokenizer; import java.util.Vector; import org.eclipse.cdt.build.core.scannerconfig.ICfgScannerConfigBuilderInfo2Set; +import org.eclipse.cdt.build.internal.core.scannerconfig.CfgDiscoveredPathManager.PathInfoCache; import org.eclipse.cdt.core.settings.model.CIncludePathEntry; import org.eclipse.cdt.core.settings.model.CLibraryPathEntry; import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; @@ -32,7 +33,6 @@ import org.eclipse.cdt.core.settings.model.ICStorageElement; 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.util.PathSettingsContainer; -import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildProperty; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyType; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; @@ -2761,12 +2761,12 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild // return tc.setScannerConfigBuilderInfo(info); // } - public PathInfo setDiscoveredPathInfo(PathInfo info){ + public PathInfoCache setDiscoveredPathInfo(PathInfoCache info){ ToolChain tc = (ToolChain)getRootFolderInfo().getToolChain(); return tc.setDiscoveredPathInfo(info); } - public PathInfo getDiscoveredPathInfo(){ + public PathInfoCache getDiscoveredPathInfo(){ ToolChain tc = (ToolChain)getRootFolderInfo().getToolChain(); return tc.getDiscoveredPathInfo(); } @@ -2776,9 +2776,9 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild return tc.getScannerConfigDiscoveryProfileId(); } - public PathInfo clearDiscoveredPathInfo(){ + public PathInfoCache clearDiscoveredPathInfo(){ ToolChain tc = (ToolChain)getRootFolderInfo().getToolChain(); - return tc.setDiscoveredPathInfo(null); + return tc.clearDiscoveredPathInfo(); } public ICfgScannerConfigBuilderInfo2Set getCfgScannerConfigInfo(){ 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 d487f83f395..a327bb6c66a 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 @@ -26,10 +26,10 @@ import java.util.SortedMap; import java.util.StringTokenizer; import java.util.Vector; +import org.eclipse.cdt.build.internal.core.scannerconfig.CfgDiscoveredPathManager.PathInfoCache; import org.eclipse.cdt.core.cdtvariables.CdtVariableException; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; -import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyType; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; import org.eclipse.cdt.managedbuilder.core.BuildException; @@ -3889,16 +3889,16 @@ public class Tool extends HoldsOptions implements ITool, IOptionCategory, IMatch return false; } - public PathInfo setDiscoveredPathInfo(IInputType type, PathInfo info){ - return (PathInfo)discoveredInfoMap.put(getTypeKey(type), info); + public PathInfoCache setDiscoveredPathInfo(IInputType type, PathInfoCache info){ + return (PathInfoCache)discoveredInfoMap.put(getTypeKey(type), info); } - public PathInfo getDiscoveredPathInfo(IInputType type){ - return (PathInfo)discoveredInfoMap.get(getTypeKey(type)); + public PathInfoCache getDiscoveredPathInfo(IInputType type){ + return (PathInfoCache)discoveredInfoMap.get(getTypeKey(type)); } - public PathInfo clearDiscoveredPathInfo(IInputType type){ - return (PathInfo)discoveredInfoMap.remove(getTypeKey(type)); + public PathInfoCache clearDiscoveredPathInfo(IInputType type){ + return (PathInfoCache)discoveredInfoMap.remove(getTypeKey(type)); } public void clearAllDiscoveredInfo(){ 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 4e9b084cc4c..ca490d36af6 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 @@ -22,9 +22,9 @@ import java.util.Set; import java.util.SortedMap; import java.util.StringTokenizer; +import org.eclipse.cdt.build.internal.core.scannerconfig.CfgDiscoveredPathManager.PathInfoCache; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.extension.CTargetPlatformData; -import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyType; import org.eclipse.cdt.managedbuilder.buildproperties.IBuildPropertyValue; import org.eclipse.cdt.managedbuilder.core.IBuildObject; @@ -116,7 +116,7 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert private IFolderInfo parentFolderInfo; - private PathInfo discoveredInfo; + private PathInfoCache discoveredInfo; private Boolean isRcTypeBasedDiscovery; @@ -2601,18 +2601,18 @@ public class ToolChain extends HoldsOptions implements IToolChain, IBuildPropert isRcTypeBasedDiscovery = Boolean.valueOf(on); } - public PathInfo setDiscoveredPathInfo(PathInfo info){ - PathInfo oldInfo = discoveredInfo; + public PathInfoCache setDiscoveredPathInfo(PathInfoCache info){ + PathInfoCache oldInfo = discoveredInfo; discoveredInfo = info; return oldInfo; } - public PathInfo getDiscoveredPathInfo(){ + public PathInfoCache getDiscoveredPathInfo(){ return discoveredInfo; } - public PathInfo clearDiscoveredPathInfo(){ - PathInfo oldInfo = discoveredInfo; + public PathInfoCache clearDiscoveredPathInfo(){ + PathInfoCache oldInfo = discoveredInfo; discoveredInfo = null; return oldInfo; }