1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 18:26:01 +02:00

Scanner discovery fixes

This commit is contained in:
Mikhail Sennikovsky 2007-03-16 12:56:22 +00:00
parent eff63967da
commit 5e04b06ded
5 changed files with 112 additions and 59 deletions

View file

@ -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);

View file

@ -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) {

View file

@ -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(){

View file

@ -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(){

View file

@ -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;
}