From f0cccf7f71215705018a00d23426dea422e4f41b Mon Sep 17 00:00:00 2001 From: Mikhail Sennikovsky Date: Wed, 21 Mar 2007 15:49:35 +0000 Subject: [PATCH] 1. Additional Fix for [Bug 174936] [Scanner Discovery] Per file scanner discovery is broken with the New Project Model functionality 2. Bug-fixes --- .../cdt/make/core/scannerconfig/PathInfo.java | 2 + .../CfgDiscoveredPathManager.java | 12 +- .../PerFileSettingsCalculator.java | 110 +++++++++++- .../internal/dataprovider/EntryStorage.java | 4 +- .../index/tests/IndexProviderManagerTest.java | 5 + .../org/eclipse/cdt/core/model/CoreModel.java | 40 ++++- .../model/ICConfigurationDescription.java | 9 + .../impl/CDefaultConfigurationData.java | 5 +- .../extension/impl/CDefaultLanguageData.java | 9 + .../core/settings/model/util/CDataUtil.java | 157 ++++++++++++++++++ .../model/util/CSettingEntryFactory.java | 121 ++++++++++++++ .../model/util/PathEntryTranslator.java | 10 +- .../model/CConfigurationDescription.java | 5 + .../model/CConfigurationDescriptionCache.java | 23 ++- .../settings/model/CFileDescriptionCache.java | 4 +- .../model/CFolderDescriptionCache.java | 6 +- .../core/settings/model/CLanguageSetting.java | 31 ++-- .../settings/model/CLanguageSettingCache.java | 17 +- .../settings/model/CProjectDescription.java | 14 +- .../model/CProjectDescriptionManager.java | 154 ++++++----------- .../core/settings/model/CStorage.java | 2 - 21 files changed, 598 insertions(+), 142 deletions(-) create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CSettingEntryFactory.java diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/PathInfo.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/PathInfo.java index e78b2c1fbb3..229e2985d7a 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/PathInfo.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/PathInfo.java @@ -19,6 +19,8 @@ import org.eclipse.core.runtime.Path; public final class PathInfo { private static final Path[] EMPTY_PATH_ARRAY = new Path[0]; + public final static PathInfo EMPTY_INFO = new PathInfo(null, null, null, null, null); + private static int EMPTY_CODE = 53; private IPath[] fIncludePaths; 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 f12b39f82f8..89d52169080 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 @@ -23,6 +23,7 @@ import org.eclipse.cdt.build.internal.core.scannerconfig2.CfgScannerConfigProfil import org.eclipse.cdt.core.model.CoreModel; 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.CFolderData; import org.eclipse.cdt.core.settings.model.extension.CResourceData; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager; @@ -202,7 +203,7 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { return; PerFileSettingsCalculator calculator = new PerFileSettingsCalculator(); - IRcSettingInfo[] rcInfos = calculator.getSettingInfos(data, info); + IRcSettingInfo[] rcInfos = calculator.getSettingInfos(cInfo.fLoadContext.getConfiguration().getOwner().getProject(), data, info, true); CResourceData rcDatas[] = data.getResourceDatas(); Map rcDataMap = new HashMap(rcDatas.length); @@ -223,12 +224,19 @@ public class CfgDiscoveredPathManager implements IResourceChangeListener { } if(!rcDataMap.isEmpty()){ + CResourceData tmpRcData; for(Iterator iter = rcDataMap.values().iterator(); iter.hasNext();){ - clearCache((CResourceData)iter.next()); + tmpRcData = (CResourceData)iter.next(); + if(tmpRcData.getPath().segmentCount() == 0 && tmpRcData.getType() == ICSettingBase.SETTING_FOLDER){ + cache(cInfo, PerFileSettingsCalculator.createEmptyRcSettingInfo((CFolderData)tmpRcData)); + } else { + clearCache(tmpRcData); + } } } } + private void cache(ContextInfo cInfo, IRcSettingInfo rcSetting){ CResourceData rcData = rcSetting.getResourceData(); clearCache(rcData); 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 51540787c93..beb6aa22d6e 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 @@ -27,9 +27,10 @@ import org.eclipse.cdt.core.settings.model.extension.CResourceData; import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.settings.model.util.IPathSettingsContainerVisitor; import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer; -import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager; +import org.eclipse.cdt.make.core.scannerconfig.PathInfo; import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -59,7 +60,7 @@ public class PerFileSettingsCalculator { } private static class RcSettingInfo implements IRcSettingInfo{ - private List fLangInfoList; + private ArrayList fLangInfoList; private CResourceData fRcData; RcSettingInfo(CResourceData rcData){ @@ -629,7 +630,110 @@ public class PerFileSettingsCalculator { return rcSet; } - public IRcSettingInfo[] getSettingInfos(CConfigurationData data, IDiscoveredPathManager.IPerFileDiscoveredPathInfo2 discoveredInfo){ + /* + * utility method for creating empty IRcSettingInfo + */ + public static IRcSettingInfo createEmptyRcSettingInfo(CFolderData data){ + RcSettingInfo rcInfo = new RcSettingInfo(data); + CLanguageData[] lDatas = data.getLanguageDatas(); + addEmptyLanguageInfos(rcInfo, lDatas); + return rcInfo; + } + + private static void addEmptyLanguageInfos(RcSettingInfo rcInfo, CLanguageData[] lDatas){ + ArrayList list = rcInfo.fLangInfoList; + if(list == null){ + list = new ArrayList(lDatas.length); + rcInfo.fLangInfoList = list; + } else { + list.ensureCapacity(lDatas.length); + } + + for(int i = 0; i < lDatas.length; i++){ + list.add(new LangSettingInfo(lDatas[i], PathInfo.EMPTY_INFO)); + } + } + + private IRcSettingInfo[] mapFileDiscoveredInfo(IProject project, CConfigurationData data, RcSetSettings rcSet, Map map){ + IResource rc; + PathInfo pInfo; + Map.Entry entry; + IPath projRelPath; + CResourceData rcData; +// RcSetSettings dataSetting; + List list = new ArrayList(map.size()); + RcSettingInfo rcInfo; + LangSettingInfo lInfo; + CLanguageData lData; + ArrayList tmpList; + + for(Iterator iter = map.entrySet().iterator(); iter.hasNext();){ + entry = (Map.Entry)iter.next(); + rc = (IResource)entry.getKey(); + pInfo = (PathInfo)entry.getValue(); + if(pInfo.isEmpty()) + continue; + + switch(rc.getType()){ + case IResource.FILE: + projRelPath = rc.getProjectRelativePath(); +// dataSetting = rcSet.getChild(projRelPath, false); +// rcData = dataSetting.fRcData; + rcData = rcSet.getChild(projRelPath, false).fRcData; + if(!rcData.getPath().equals(projRelPath)){ + if(rcData.getType() == ICSettingBase.SETTING_FOLDER){ + CFolderData foData = (CFolderData)rcData; + lData = CDataUtil.findLanguagDataForFile(projRelPath.lastSegment(), project, (CFolderData)rcData); + try { + rcData = createFileData(data, projRelPath, foData, lData); + } catch (CoreException e) { + rcData = null; + ManagedBuilderCorePlugin.log(e); + } + } else { + try { + rcData = createFileData(data, projRelPath, (CFileData)rcData); + } catch (CoreException e) { + rcData = null; + ManagedBuilderCorePlugin.log(e); + } + } +// if(rcData != null) +// dataSetting = rcSet.createChild(projRelPath, rcData, false); +// else +// dataSetting = null; + } + + if(rcData != null){ + if(rcData.getType() == ICSettingBase.SETTING_FILE){ + lData = ((CFileData)rcData).getLanguageData(); + } else { + lData = CDataUtil.findLanguagDataForFile(projRelPath.lastSegment(), project, (CFolderData)rcData); + + } + + if(lData != null){ + rcInfo = new RcSettingInfo(rcData); + lInfo = new LangSettingInfo(lData, pInfo); + tmpList = new ArrayList(1); + tmpList.add(lInfo); + rcInfo.fLangInfoList = tmpList; + list.add(rcInfo); + } + + } + + break; + } + } + return (RcSettingInfo[])list.toArray(new RcSettingInfo[list.size()]); + } + + 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()); + } RcSetSettings settings = createRcSetSettings(data, discoveredInfo); return createInfos(data, settings); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java index c5e8320f84e..901a98f55f9 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/EntryStorage.java @@ -233,11 +233,11 @@ public class EntryStorage { levels[0].setReadOnly(false); levels[1].setFlagsToClear(ICSettingEntry.BUILTIN); - levels[1].setFlagsToSet(ICSettingEntry.READONLY); + levels[1].setFlagsToSet(ICSettingEntry.READONLY | ICSettingEntry.RESOLVED); levels[1].setReadOnly(true); levels[2].setFlagsToClear(0); - levels[2].setFlagsToSet(ICSettingEntry.READONLY | ICSettingEntry.BUILTIN); + levels[2].setFlagsToSet(ICSettingEntry.READONLY | ICSettingEntry.BUILTIN | ICSettingEntry.RESOLVED); levels[2].setReadOnly(true); return settings; diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java index e52377c322a..6af6174c4aa 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/index/tests/IndexProviderManagerTest.java @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICExternalSetting; import org.eclipse.cdt.core.settings.model.ICFileDescription; import org.eclipse.cdt.core.settings.model.ICFolderDescription; +import org.eclipse.cdt.core.settings.model.ICLanguageSetting; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICResourceDescription; @@ -444,6 +445,10 @@ class MockConfig implements ICConfigurationDescription { public void removeStorage(String id) throws CoreException { } + + public ICLanguageSetting getLanguageSettingForFile(IPath path) { + return null; + } } /* diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java index fa5e687d85d..1623dedddae 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java @@ -16,7 +16,12 @@ import org.eclipse.cdt.core.CCProjectNature; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.core.resources.IPathEntryStore; +import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; +import org.eclipse.cdt.core.settings.model.ICLanguageSetting; +import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICProjectDescription; +import org.eclipse.cdt.core.settings.model.ICResourceDescription; +import org.eclipse.cdt.core.settings.model.ICSettingEntry; import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.internal.core.model.APathEntry; import org.eclipse.cdt.internal.core.model.BatchOperation; @@ -32,6 +37,7 @@ import org.eclipse.cdt.internal.core.model.OutputEntry; import org.eclipse.cdt.internal.core.model.PathEntryManager; import org.eclipse.cdt.internal.core.model.ProjectEntry; import org.eclipse.cdt.internal.core.model.SourceEntry; +import org.eclipse.cdt.internal.core.settings.model.CProjectDescription; import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; @@ -1223,8 +1229,40 @@ public class CoreModel { * @param resource * @since 3.0 */ - public static boolean isScannerInformationEmpty(IResource resource) { + IProject project = resource.getProject(); + CProjectDescriptionManager mngr = CProjectDescriptionManager.getInstance(); + CProjectDescription des = (CProjectDescription)mngr.getProjectDescription(project, false); + if(des != null){ + ICConfigurationDescription indexCfg = des.getIndexConfiguration(); + if(indexCfg != null){ + if(!mngr.isNewStyleCfg(indexCfg)){ + return oldIsScannerInformationEmpty(resource); + } + ICLanguageSetting lSetting = indexCfg.getLanguageSettingForFile(resource.getProjectRelativePath()); + if(lSetting != null){ + ICLanguageSettingEntry[] entries = lSetting.getSettingEntries(ICLanguageSettingEntry.INCLUDE_PATH); + if(entries.length != 0) + return true; + + entries = lSetting.getSettingEntries(ICLanguageSettingEntry.MACRO); + if(entries.length != 0) + return true; + + entries = lSetting.getSettingEntries(ICLanguageSettingEntry.INCLUDE_FILE); + if(entries.length != 0) + return true; + + entries = lSetting.getSettingEntries(ICLanguageSettingEntry.MACRO_FILE); + if(entries.length != 0) + return true; + } + } + } + return false; + } + + private static boolean oldIsScannerInformationEmpty(IResource resource) { final int PATH_ENTRY_MASK = IPathEntry.CDT_INCLUDE | IPathEntry.CDT_MACRO | IPathEntry.CDT_INCLUDE_FILE | IPathEntry.CDT_MACRO_FILE; boolean rc = true; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICConfigurationDescription.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICConfigurationDescription.java index 9b6d8082d2f..ca6338e9ce1 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICConfigurationDescription.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICConfigurationDescription.java @@ -352,4 +352,13 @@ public interface ICConfigurationDescription extends ICSettingContainer, ICSettin void remove(String extensionPoint) throws CoreException; boolean isPreferenceConfiguration(); + + /** + * convenience method to return a language setting for the file + * with the specified project-relative path + * + * @param path - file project relative path + * @return ICLanguageSetting or null if not found + */ + ICLanguageSetting getLanguageSettingForFile(IPath path); } 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 fd5b4279ca2..a6bce0b3444 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 @@ -97,7 +97,6 @@ public class CDefaultConfigurationData extends CConfigurationData { if(base == null) return; fDescription = base.getDescription(); - CResourceData[] rcDatas = base.getResourceDatas(); fTargetPlatformData = copyTargetPlatformData(base.getTargetPlatformData(), clone); fSourcePaths = base.getSourcePaths(); @@ -106,7 +105,9 @@ public class CDefaultConfigurationData extends CConfigurationData { CFolderData baseRootFolderData = base.getRootFolderData(); fRootFolderData = copyFolderData(baseRootFolderData.getPath(), baseRootFolderData, clone); addRcData(fRootFolderData); - + + CResourceData[] rcDatas = base.getResourceDatas(); + for(int i = 0; i < rcDatas.length; i++){ CResourceData rcData = rcDatas[i]; if(baseRootFolderData == rcData) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultLanguageData.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultLanguageData.java index 137e4e5353d..8b10456fbca 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultLanguageData.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/extension/impl/CDefaultLanguageData.java @@ -19,6 +19,9 @@ import org.eclipse.cdt.core.settings.model.util.EntryStore; import org.eclipse.cdt.core.settings.model.util.KindBasedStore; public class CDefaultLanguageData extends CLanguageData { + protected final static int OP_COPY = 1; + protected final static int OP_SET = 2; + protected String fName; protected String fId; protected String fLanguageId; @@ -84,11 +87,16 @@ public class CDefaultLanguageData extends CLanguageData { int kinds[] = KindBasedStore.getLanguageEntryKinds(); for(int i = 0; i < kinds.length; i++){ ICLanguageSettingEntry entries[] = data.getEntries(kinds[i]); + entries = processStoredEntries(entries, OP_COPY); store.storeEntries(kinds[i], entries); } return store; } + protected ICLanguageSettingEntry[] processStoredEntries(ICLanguageSettingEntry[] entries, int op){ + return entries; + } + protected EntryStore createStore(){ return new EntryStore(true); } @@ -174,6 +182,7 @@ public class CDefaultLanguageData extends CLanguageData { } public void setEntries(int kind, ICLanguageSettingEntry entries[]) { + entries = processStoredEntries(entries, OP_SET); fStore.storeEntries(kind, entries); setModified(true); 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 841a5504f20..a9262f57e25 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 @@ -11,6 +11,7 @@ package org.eclipse.cdt.core.settings.model.util; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.StringTokenizer; @@ -24,9 +25,22 @@ import org.eclipse.cdt.core.settings.model.CLibraryFileEntry; import org.eclipse.cdt.core.settings.model.CLibraryPathEntry; import org.eclipse.cdt.core.settings.model.CMacroEntry; import org.eclipse.cdt.core.settings.model.CMacroFileEntry; +import org.eclipse.cdt.core.settings.model.COutputEntry; +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.CFolderData; +import org.eclipse.cdt.core.settings.model.extension.CLanguageData; +import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultLanguageData; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.content.IContentType; +import org.eclipse.core.runtime.content.IContentTypeManager; +import org.eclipse.core.runtime.content.IContentTypeSettings; +import org.eclipse.core.runtime.preferences.IScopeContext; public class CDataUtil { private static Random randomNumber; @@ -164,4 +178,147 @@ public class CDataUtil { } return entry; } + + public static ICSettingEntry createEntry(int kind, String name, String value, IPath[] exclusionPatterns, int flags){ + switch (kind){ + case ICLanguageSettingEntry.INCLUDE_PATH: + return new CIncludePathEntry(name, flags); + case ICLanguageSettingEntry.MACRO: + return new CMacroEntry(name, value, flags); + case ICLanguageSettingEntry.INCLUDE_FILE: + return new CIncludeFileEntry(name, flags); + case ICLanguageSettingEntry.MACRO_FILE: + return new CMacroFileEntry(name, flags); + case ICLanguageSettingEntry.LIBRARY_PATH: + return new CLibraryPathEntry(name, flags); + case ICLanguageSettingEntry.LIBRARY_FILE: + return new CLibraryFileEntry(name, flags); + case ICLanguageSettingEntry.OUTPUT_PATH: + return new COutputEntry(name, exclusionPatterns, flags); + case ICLanguageSettingEntry.SOURCE_PATH: + return new CSourceEntry(name, exclusionPatterns, flags); + } + throw new IllegalArgumentException(); + } + + public static String[] getSourceExtensions(IProject project, CLanguageData data) { + String[] exts = null; + String[] typeIds = data.getSourceContentTypeIds(); + if(typeIds != null && typeIds.length != 0){ + exts = getExtensionsFromContentTypes(project, typeIds); + } else { + exts = data.getSourceExtensions(); + if(exts != null && exts.length != 0) + exts = (String[])exts.clone(); + else + exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; + } + + if(exts == null) + exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; + return exts; + } + + public static String[] getExtensionsFromContentTypes(IProject project, String[] typeIds){ + String[] exts = null; + if(typeIds != null && typeIds.length != 0){ + IContentTypeManager manager = Platform.getContentTypeManager(); + IContentType type; + if(typeIds.length == 1){ + type = manager.getContentType(typeIds[0]); + if(type != null) + exts = getContentTypeFileSpecs(project, type); + } else { + List list = new ArrayList(); + for(int i = 0; i < typeIds.length; i++){ + type = manager.getContentType(typeIds[i]); + if(type != null) { + list.addAll(Arrays.asList(getContentTypeFileSpecs(project, type))); + } + } + exts = (String[])list.toArray(new String[list.size()]); + } + } + + if(exts == null) + exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; + return exts; + } + + public static String[] getContentTypeFileSpecs (IProject project, IContentType type) { + String[] globalSpecs = type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC); + IContentTypeSettings settings = null; + if (project != null) { + IScopeContext projectScope = new ProjectScope(project); + try { + settings = type.getSettings(projectScope); + } catch (Exception e) {} + if (settings != null) { + String[] specs = settings.getFileSpecs(IContentType.FILE_EXTENSION_SPEC); + if (specs.length > 0) { + int total = globalSpecs.length + specs.length; + String[] projSpecs = new String[total]; + int i=0; + for (int j=0; j 0){ + String ext = fileName.substring(index + 1).trim(); + if(ext.length() > 0){ + data = findLanguageDataForExtension(ext, datas); + } + } + return data; + } + + public static CLanguageData findLanguageDataForExtension(String ext, CLanguageData datas[]/*, boolean src*/){ + CLanguageData data; + for(int i = 0; i < datas.length; i++){ + data = datas[i]; + String exts[] = data.getSourceExtensions(); +/* if(src){ + if(setting.getSourceContentType() == null){ + exts = setting.getSourceExtensions(); + } + } else { + if(setting.getHeaderContentType() == null){ + exts = setting.getHeaderExtensions(); + } + } +*/ + if(exts != null && exts.length != 0){ + for(int j = 0; j < exts.length; j++){ + if(ext.equals(exts[j])) + return data; + } + } + } + return null; + } + + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CSettingEntryFactory.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CSettingEntryFactory.java new file mode 100644 index 00000000000..28fdf342d35 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/util/CSettingEntryFactory.java @@ -0,0 +1,121 @@ +/******************************************************************************* + * Copyright (c) 2007 Intel Corporation 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Intel Corporation - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.settings.model.util; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; + +import org.eclipse.cdt.core.settings.model.ICExclusionPatternPathEntry; +import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; +import org.eclipse.cdt.core.settings.model.ICSettingEntry; +import org.eclipse.core.runtime.IPath; + +public class CSettingEntryFactory { + private static final HashSet EMPTY_SET = new HashSet(0); + + private KindBasedStore fStore = new KindBasedStore(false); + + private HashMap getNameMap(int kind, boolean create){ + HashMap map = (HashMap)fStore.get(kind); + if(map == null && create){ + map = new HashMap(); + fStore.put(kind, map); + } + return map; + } + + private HashMap getValueMap(String name, boolean create){ + HashMap nameMap = getNameMap(ICSettingEntry.MACRO, create); + if(nameMap != null){ + return getMap(nameMap, name, create); + } + return null; + } + + private HashMap getFlagMap(int kind, String name, String value, IPath[] exclusionPatters, boolean create){ + switch(kind){ + case ICSettingEntry.MACRO: + HashMap valueMap = getValueMap(name, create); + if(valueMap != null){ + return getMap(valueMap, name, create); + } + return null; + case ICSettingEntry.SOURCE_PATH: + case ICSettingEntry.OUTPUT_PATH: + HashMap excPatternMap = getExclusionPatternsMap(kind, name, create); + if(excPatternMap != null){ + HashSet setKey = exclusionPatters == null || exclusionPatters.length == 0 ? EMPTY_SET : new HashSet(Arrays.asList(exclusionPatters)); + return getMap(excPatternMap, setKey, create); + } + return null; + default: + HashMap nameMap = getNameMap(kind, create); + if(nameMap != null){ + return getMap(nameMap, name, create); + } + return null; + } + } + + private HashMap getExclusionPatternsMap(int kind, String name, boolean create){ + HashMap nameMap = getNameMap(kind, create); + if(nameMap != null){ + return getMap(nameMap, name, create); + } + return null; + } + + private static HashMap getMap(HashMap container, Object key, boolean create){ + HashMap map = (HashMap)container.get(key); + if(map == null && create){ + map = new HashMap(); + container.put(key, map); + } + return map; + } + + public ICSettingEntry getEntry(ICSettingEntry entry){ + switch(entry.getKind()){ + case ICSettingEntry.OUTPUT_PATH: + case ICSettingEntry.SOURCE_PATH: + return getEntry(entry.getKind(), entry.getName(), null, ((ICExclusionPatternPathEntry)entry).getExclusionPatterns(), entry.getFlags(), entry, true); + default: + return getLanguageSettingEntry((ICLanguageSettingEntry)entry); + } + } + + public ICLanguageSettingEntry getLanguageSettingEntry(ICLanguageSettingEntry lEntry){ + return (ICLanguageSettingEntry)getEntry(lEntry.getKind(), lEntry.getName(), lEntry.getValue(), null, lEntry.getFlags(), lEntry, true); + } + + public ICSettingEntry getEntry(int kind, String name, String value, IPath[] exclusionPatterns, int flags, boolean create){ + return getEntry(kind, name, value, exclusionPatterns, flags, null, create); + } + + private ICSettingEntry getEntry(int kind, String name, String value, IPath[] exclusionPatterns, int flags, ICSettingEntry baseEntry, boolean create){ + HashMap flagMap = getFlagMap(kind, name, value, exclusionPatterns, create); + if(flagMap != null){ + Integer iFlags = new Integer(flags); + ICSettingEntry entry = (ICSettingEntry)flagMap.get(iFlags); + if(entry == null && create){ + entry = baseEntry != null ? baseEntry : CDataUtil.createEntry(kind, name, value, exclusionPatterns, flags); + flagMap.put(iFlags, entry); + } + return entry; + } + return null; + } + + public void clear(){ + fStore.clear(); + } +} 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 111f3387357..4367718168d 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 @@ -67,7 +67,6 @@ import org.eclipse.cdt.internal.core.model.CModelStatus; import org.eclipse.cdt.internal.core.model.PathEntry; import org.eclipse.cdt.internal.core.settings.model.CConfigurationDescriptionCache; import org.eclipse.cdt.internal.core.settings.model.CExternalSetting; -import org.eclipse.cdt.internal.core.settings.model.CProjectDescriptionManager; import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo; import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver; import org.eclipse.core.resources.IContainer; @@ -1103,7 +1102,7 @@ public class PathEntryTranslator { for(Iterator iter = composerList.iterator(); iter.hasNext();){ PathEntryComposer cs = (PathEntryComposer)iter.next(); ICSettingEntry entry = cs.getSettingEntry(); - if(checkFilter(entry, flags)){ + if(checkFilter(cs, entry, flags)){ IPathEntry pe = cs.toPathEntry(); if(pe != null) list.add(pe); @@ -1114,9 +1113,12 @@ public class PathEntryTranslator { return list; } - private static boolean checkFilter(ICSettingEntry entry, int flags){ + private static boolean checkFilter(PathEntryComposer cs, ICSettingEntry entry, int flags){ boolean builtIn = entry != null ? entry.isBuiltIn() || entry.isReadOnly() : false; + + if(builtIn && cs.getPath().segmentCount() > 1) + return false; if((flags & INCLUDE_BUILT_INS) != 0 && builtIn) return true; if((flags & INCLUDE_USER) != 0 && !builtIn) @@ -1596,7 +1598,7 @@ public class PathEntryTranslator { } else { CFolderData folderData = (CFolderData)base; CLanguageData lDatas[] = folderData.getLanguageDatas(); - CLanguageData baseLData = CProjectDescriptionManager.getInstance().findLanguagDataForFile(rcInfo.fRc.getFullPath().lastSegment(), fProject, lDatas); + CLanguageData baseLData = CDataUtil.findLanguagDataForFile(rcInfo.fRc.getFullPath().lastSegment(), fProject, lDatas); newRcData = fCfgData.createFileData(path, folderData, baseLData); } } else { 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 18fe677d1c0..e2d20e3c99b 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 @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICExternalSetting; import org.eclipse.cdt.core.settings.model.ICFileDescription; import org.eclipse.cdt.core.settings.model.ICFolderDescription; +import org.eclipse.cdt.core.settings.model.ICLanguageSetting; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICResourceDescription; @@ -724,4 +725,8 @@ public class CConfigurationDescription extends CDataProxyContainer implements IC CConfigurationDescriptionCache data = (CConfigurationDescriptionCache)doGetData(); return data.isInitializing(); } + + public ICLanguageSetting getLanguageSettingForFile(IPath path) { + return CProjectDescriptionManager.getLanguageSettingForFile(this, path); + } } 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 817520ee80e..176788e5842 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 @@ -22,6 +22,7 @@ import org.eclipse.cdt.core.settings.model.ICConfigurationDescription; import org.eclipse.cdt.core.settings.model.ICExternalSetting; import org.eclipse.cdt.core.settings.model.ICFileDescription; import org.eclipse.cdt.core.settings.model.ICFolderDescription; +import org.eclipse.cdt.core.settings.model.ICLanguageSetting; import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry; import org.eclipse.cdt.core.settings.model.ICProjectDescription; import org.eclipse.cdt.core.settings.model.ICResourceDescription; @@ -40,6 +41,7 @@ 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.CTargetPlatformData; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultConfigurationData; +import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory; import org.eclipse.cdt.core.settings.model.util.PathSettingsContainer; import org.eclipse.cdt.internal.core.cdtvariables.CdtVariableManager; import org.eclipse.cdt.internal.core.cdtvariables.StorableCdtVariables; @@ -60,6 +62,7 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData private boolean fDataLoadded; private boolean fInitializing; private ICConfigurationDescription fBaseDescription; + private CSettingEntryFactory fSettingsFactory; CConfigurationDescriptionCache(ICStorageElement storage, CProjectDescription parent) throws CoreException{ super(null); @@ -77,15 +80,20 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData return fInitializing; } - void loadData() throws CoreException{ + void loadData(CSettingEntryFactory factory) throws CoreException{ if(fDataLoadded) return; fDataLoadded = true; fData = CProjectDescriptionManager.getInstance().loadData(this, null); + + fSettingsFactory = factory; + copySettingsFrom(fData, true); + fSettingsFactory = null; + fSpecSettings.reconsileExtensionSettings(true); ((CBuildSettingCache)fBuildData).initEnvironmentCache(); ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this); @@ -121,7 +129,7 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData // fInitializing = false; } - void applyData() throws CoreException{ + void applyData(CSettingEntryFactory factory) throws CoreException{ if(fBaseDescription == null) return; @@ -129,9 +137,12 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData fDataLoadded = true; fName = fData.getName(); fId = fData.getId(); + fSettingsFactory = factory; copySettingsFrom(fData, true); + fSettingsFactory = null; + ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this); fMacros = new StorableCdtVariables(vars, true); // if(saving) @@ -141,6 +152,10 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData // fInitializing = false; } + CSettingEntryFactory getSettingsFactory(){ + return fSettingsFactory; + } + public StorableCdtVariables getCachedVariables(){ return fMacros; } @@ -424,4 +439,8 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData void doneInitialization(){ fInitializing = false; } + + public ICLanguageSetting getLanguageSettingForFile(IPath path) { + return CProjectDescriptionManager.getLanguageSettingForFile(this, path); + } } 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 576627db709..1c0c77eb967 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 @@ -28,9 +28,11 @@ public class CFileDescriptionCache extends CDefaultFileData implements private ResourceDescriptionHolder fRcDesHolder; public CFileDescriptionCache(CFileData base, CConfigurationDescriptionCache cfg) { - super(base.getId(), base.getPath(), base, cfg, null, true); + super(base.getId(), base.getPath(), cfg, null); fCfg = cfg; fCfg.addResourceDescription(this); + + copyDataFrom(base, true); } protected CLanguageData copyLanguageData(CLanguageData data, boolean clone) { 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 b1e090e467f..05a4ef81df3 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 @@ -18,8 +18,10 @@ import org.eclipse.cdt.core.settings.model.ICSettingBase; import org.eclipse.cdt.core.settings.model.ICSettingContainer; import org.eclipse.cdt.core.settings.model.ICSettingObject; import org.eclipse.cdt.core.settings.model.WriteAccessException; +import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; 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.impl.CDataFacroty; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultFolderData; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IPath; @@ -31,9 +33,11 @@ public class CFolderDescriptionCache extends CDefaultFolderData implements private ResourceDescriptionHolder fRcDesHolder; public CFolderDescriptionCache(CFolderData base, CConfigurationDescriptionCache cfg) { - super(base.getId(), base.getPath(), base, cfg, null, true); + super(base.getId(), base.getPath(), cfg, null); fCfg = cfg; fCfg.addResourceDescription(this); + + copyDataFrom(base, true); } public ICLanguageSetting getLanguageSettingForFile(String fileName) { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSetting.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSetting.java index 9ba4e6dbba3..0caaf7ef20e 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSetting.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSetting.java @@ -113,21 +113,22 @@ public class CLanguageSetting extends CDataProxy implements */ public String[] getSourceExtensions() { CLanguageData data = getCLanguageData(false); - String[] exts = null; - String[] typeIds = data.getSourceContentTypeIds(); - if(typeIds != null && typeIds.length != 0){ - exts = CProjectDescriptionManager.getInstance().getExtensionsFromContentTypes(getProject(), typeIds); - } else { - exts = data.getSourceExtensions(); - if(exts != null && exts.length != 0) - exts = (String[])exts.clone(); - else - exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; - } - - if(exts == null) - exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; - return exts; + return CDataUtil.getSourceExtensions(getProject(), data); +// String[] exts = null; +// String[] typeIds = data.getSourceContentTypeIds(); +// if(typeIds != null && typeIds.length != 0){ +// exts = CProjectDescriptionManager.getInstance().getExtensionsFromContentTypes(getProject(), typeIds); +// } else { +// exts = data.getSourceExtensions(); +// if(exts != null && exts.length != 0) +// exts = (String[])exts.clone(); +// else +// exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; +// } +// +// if(exts == null) +// exts = CDefaultLanguageData.EMPTY_STRING_ARRAY; +// return exts; } /* diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSettingCache.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSettingCache.java index 77e67e1c426..eb9719d3109 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSettingCache.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CLanguageSettingCache.java @@ -20,6 +20,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingContainer; import org.eclipse.cdt.core.settings.model.extension.CLanguageData; import org.eclipse.cdt.core.settings.model.extension.impl.CDefaultLanguageData; 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.EntryStore; import org.eclipse.core.resources.IProject; @@ -74,7 +75,7 @@ public class CLanguageSettingCache extends CDefaultLanguageData implements String[] typeIds = getSourceContentTypeIds(); String exts[] = null; if(typeIds != null && typeIds.length != 0){ - exts = CProjectDescriptionManager.getInstance().getExtensionsFromContentTypes(getProject(), typeIds); + exts = CDataUtil.getExtensionsFromContentTypes(getProject(), typeIds); } else { exts = super.getSourceExtensions(); if(exts != null && exts.length != 0) @@ -156,4 +157,18 @@ public class CLanguageSettingCache extends CDefaultLanguageData implements return true; } + protected ICLanguageSettingEntry[] processStoredEntries( + ICLanguageSettingEntry[] entries, int op) { + if(entries.length != 0){ + CConfigurationDescriptionCache cfgCache = (CConfigurationDescriptionCache)getConfiguration(); + CSettingEntryFactory factory = cfgCache.getSettingsFactory(); + if(factory != null){ + for(int i = 0; i < entries.length; i++){ + entries[i] = factory.getLanguageSettingEntry(entries[i]); + } + } + } + return entries; + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java index 3f7cabec8f8..fb32c968774 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingsStorage; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; +import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.QualifiedName; @@ -72,10 +73,11 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon if(!fIsReadOnly || !fIsLoadding) return; + CSettingEntryFactory factory = new CSettingEntryFactory(); for(Iterator iter = fCfgMap.values().iterator(); iter.hasNext();){ CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)iter.next(); try { - cache.loadData(); + cache.loadData(factory); } catch (CoreException e) { CCorePlugin.log(e); iter.remove(); @@ -83,6 +85,9 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon } doneInitializing(); + + factory.clear(); + fIsLoadding = false; } @@ -90,10 +95,11 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon if(!fIsReadOnly || !fIsApplying) return; + CSettingEntryFactory factory = new CSettingEntryFactory(); for(Iterator iter = fCfgMap.values().iterator(); iter.hasNext();){ CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)iter.next(); try { - cache.applyData(); + cache.applyData(factory); } catch (CoreException e) { CCorePlugin.log(e); iter.remove(); @@ -102,6 +108,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon doneInitializing(); + factory.clear(); + fIsApplying = false; } @@ -149,7 +157,7 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon configurationCreated(cfg); } } catch (CoreException e){ - //TODO: log + CCorePlugin.log(e); } } 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 5fd4ec4c1fd..2bd87097772 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 @@ -68,8 +68,8 @@ import org.eclipse.cdt.core.settings.model.extension.CResourceData; import org.eclipse.cdt.core.settings.model.extension.ICProjectConverter; 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.extension.impl.CDefaultLanguageData; 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.KindBasedStore; import org.eclipse.cdt.core.settings.model.util.ListComparator; import org.eclipse.cdt.internal.core.CConfigBasedDescriptorManager; @@ -87,7 +87,6 @@ import org.eclipse.core.resources.ISavedState; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRunnable; -import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IExtension; @@ -102,11 +101,9 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.content.IContentType; import org.eclipse.core.runtime.content.IContentTypeManager; -import org.eclipse.core.runtime.content.IContentTypeSettings; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; -import org.eclipse.core.runtime.preferences.IScopeContext; import org.osgi.framework.Version; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -1402,49 +1399,6 @@ public class CProjectDescriptionManager { return setting; } - public CLanguageData findLanguagDataForFile(String fileName, IProject project, CLanguageData datas[]){ - // if(cType != null){ - // setting = findLanguageSettingForContentTypeId(cType.getId(), settings, true); - // if(setting == null) - // setting = findLanguageSettingForContentTypeId(cType.getId(), settings, false); - // } - CLanguageData data = null; - int index = fileName.lastIndexOf('.'); - if(index > 0){ - String ext = fileName.substring(index + 1).trim(); - if(ext.length() > 0){ - data = findLanguageDataForExtension(ext, datas); - } - } - return data; - } - - public CLanguageData findLanguageDataForExtension(String ext, CLanguageData datas[]/*, boolean src*/){ - CLanguageData data; - for(int i = 0; i < datas.length; i++){ - data = datas[i]; - String exts[] = data.getSourceExtensions(); -/* if(src){ - if(setting.getSourceContentType() == null){ - exts = setting.getSourceExtensions(); - } - } else { - if(setting.getHeaderContentType() == null){ - exts = setting.getHeaderExtensions(); - } - } -*/ - if(exts != null && exts.length != 0){ - for(int j = 0; j < exts.length; j++){ - if(ext.equals(exts[j])) - return data; - } - } - } - return null; - } - - public ICLanguageSetting findLanguageSettingForContentTypeId(String id, ICLanguageSetting settings[]/*, boolean src*/){ for(int i = 0; i < settings.length; i++){ String ids[] = settings[i].getSourceContentTypeIds(); @@ -2848,9 +2802,10 @@ public class CProjectDescriptionManager { ICStorageElement baseRootEl = settings.getRootStorageElement(); rootEl = rootParent.importChild(baseRootEl); CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, cfgDes.getSpecSettings(), null, rootEl); - cache.applyData(); + CSettingEntryFactory factory = new CSettingEntryFactory(); + cache.applyData(factory); cache.doneInitialization(); - + factory.clear(); return cache; } @@ -2926,8 +2881,10 @@ public class CProjectDescriptionManager { } CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(cfgEl, null); - cache.loadData(); + CSettingEntryFactory factory = new CSettingEntryFactory(); + cache.loadData(factory); cache.doneInitialization(); + factory.clear(); return cache; } @@ -3111,59 +3068,38 @@ public class CProjectDescriptionManager { return data != null && !PathEntryConfigurationDataProvider.isPathEntryData(data); } - public String[] getContentTypeFileSpecs (IProject project, IContentType type) { - String[] globalSpecs = type.getFileSpecs(IContentType.FILE_EXTENSION_SPEC); - IContentTypeSettings settings = null; - if (project != null) { - IScopeContext projectScope = new ProjectScope(project); - try { - settings = type.getSettings(projectScope); - } catch (Exception e) {} - if (settings != null) { - String[] specs = settings.getFileSpecs(IContentType.FILE_EXTENSION_SPEC); - if (specs.length > 0) { - int total = globalSpecs.length + specs.length; - String[] projSpecs = new String[total]; - int i=0; - for (int j=0; j 0) { +// int total = globalSpecs.length + specs.length; +// String[] projSpecs = new String[total]; +// int i=0; +// for (int j=0; j