1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

1. Additional Fix for [Bug 174936] [Scanner Discovery] Per file scanner discovery is broken with the New Project Model functionality

2. Bug-fixes
This commit is contained in:
Mikhail Sennikovsky 2007-03-21 15:49:35 +00:00
parent 1ae4154fb6
commit f0cccf7f71
21 changed files with 598 additions and 142 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<specs.length; j++) {
projSpecs[i] = specs[j];
i++;
}
for (int j=0; j<globalSpecs.length; j++) {
projSpecs[i] = globalSpecs[j];
i++;
}
return projSpecs;
}
}
}
return globalSpecs;
}
public static CLanguageData findLanguagDataForFile(String fileName, IProject project, CFolderData fData){
return findLanguagDataForFile(fileName, project, fData.getLanguageDatas());
}
public static 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 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;
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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<specs.length; j++) {
projSpecs[i] = specs[j];
i++;
}
for (int j=0; j<globalSpecs.length; j++) {
projSpecs[i] = globalSpecs[j];
i++;
}
return projSpecs;
}
}
}
return globalSpecs;
}
public 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 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<specs.length; j++) {
// projSpecs[i] = specs[j];
// i++;
// }
// for (int j=0; j<globalSpecs.length; j++) {
// projSpecs[i] = globalSpecs[j];
// i++;
// }
// return projSpecs;
// }
// }
// }
// return globalSpecs;
// }
// public String[] getExtensionsFromContentTypes(IProject project, String[] typeIds){
// return CDataUtil.getExtensionsFromContentTypes(project, typeIds);
// }
ICProjectDescription getDescriptionApplying(IProject project){
Map map = getDescriptionApplyingMap(false);
@ -3186,4 +3122,16 @@ public class CProjectDescriptionManager {
if(map != null)
map.remove(project);
}
static ICLanguageSetting getLanguageSettingForFile(ICConfigurationDescription cfgDes, IPath path){
int segCount = path.segmentCount();
if(segCount == 0)
return null;
ICResourceDescription rcDes = cfgDes.getResourceDescription(path, false);
if(rcDes.getType() == ICSettingBase.SETTING_FOLDER){
return ((ICFolderDescription)rcDes).getLanguageSettingForFile(path.lastSegment());
}
return ((ICFileDescription)rcDes).getLanguageSetting();
}
}

View file

@ -14,8 +14,6 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.naming.OperationNotSupportedException;
import org.eclipse.cdt.core.settings.model.ICSettingsStorage;
import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.core.runtime.CoreException;