1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug #129507 : Build variables of type Path List not handled by indexer if used to specify include dirs

This commit is contained in:
Oleg Krasilnikov 2007-10-30 06:37:43 +00:00
parent 1284a72c42
commit fc77ba4a0a
2 changed files with 151 additions and 108 deletions

View file

@ -69,6 +69,9 @@ import org.eclipse.core.runtime.content.IContentTypeSettings;
import org.eclipse.core.runtime.preferences.IScopeContext; import org.eclipse.core.runtime.preferences.IScopeContext;
public class CDataUtil { public class CDataUtil {
private static final String EMPTY = ""; //$NON-NLS-1$
private static final String DELIM = " "; //$NON-NLS-1$
private static Random randomNumber; private static Random randomNumber;
public static final String[] EMPTY_STRING_ARRAY = new String[0]; public static final String[] EMPTY_STRING_ARRAY = new String[0];
@ -135,15 +138,14 @@ public class CDataUtil {
if(entries.length == 0) if(entries.length == 0)
return entries; return entries;
ICSettingEntry[] resolved = new ICSettingEntry[entries.length]; ArrayList out = new ArrayList(entries.length);
ICdtVariableManager mngr = CCorePlugin.getDefault().getCdtVariableManager(); ICdtVariableManager mngr = CCorePlugin.getDefault().getCdtVariableManager();
for(int i = 0; i < entries.length; i++){ for(int i = 0; i < entries.length; i++){
ICSettingEntry entry = entries[i]; ICSettingEntry entry = entries[i];
resolved[i] = createResolvedEntry(entry, cfgDes, mngr); out.addAll(Arrays.asList(createResolvedEntry(entry, cfgDes, mngr)));
} }
return (ICSettingEntry[])out.toArray(new ICSettingEntry[out.size()]);
return resolved;
} }
public static ICLanguageSettingEntry[] resolveEntries(ICLanguageSettingEntry entries[], ICConfigurationDescription cfgDes){ public static ICLanguageSettingEntry[] resolveEntries(ICLanguageSettingEntry entries[], ICConfigurationDescription cfgDes){
@ -176,60 +178,71 @@ public class CDataUtil {
return resolvedLangEntries; return resolvedLangEntries;
} }
private static ICSettingEntry createResolvedEntry(ICSettingEntry entry, ICConfigurationDescription cfg, ICdtVariableManager mngr){ private static ICSettingEntry[] createResolvedEntry(ICSettingEntry entry, ICConfigurationDescription cfg, ICdtVariableManager mngr){
if(entry.isResolved()) if(entry.isResolved())
return entry; return new ICSettingEntry[] { entry };
String name = entry.getName(); String name = entry.getName();
String[] names = new String[] { name }; // default value
try { try {
name = mngr.resolveValue(name, "", " ", cfg); //$NON-NLS-1$ //$NON-NLS-2$ if ((entry.getKind() != ICSettingEntry.MACRO) &&
mngr.isStringListValue(name, cfg)) {
names = mngr.resolveStringListValue(name, EMPTY, DELIM, cfg);
} else {
names[0] = mngr.resolveValue(name, EMPTY, DELIM, cfg);
}
} catch (CdtVariableException e) { } catch (CdtVariableException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
} }
String value = null; ICSettingEntry[] result = new ICSettingEntry[names.length];
IPath[] exclusionFilters = null;
IPath srcPath = null, srcRootPath = null, srcPrefixMapping = null;
switch (entry.getKind()) { for (int k=0; k<names.length; k++) {
case ICSettingEntry.MACRO: String value = null;
value = entry.getValue(); IPath[] exclusionFilters = null;
try { IPath srcPath = null, srcRootPath = null, srcPrefixMapping = null;
value = mngr.resolveValue(value, "", " ", cfg); //$NON-NLS-1$ //$NON-NLS-2$
} catch (CdtVariableException e) { switch (entry.getKind()) {
CCorePlugin.log(e); case ICSettingEntry.MACRO:
} value = entry.getValue();
break;
case ICSettingEntry.LIBRARY_FILE:
ICLibraryFileEntry libFile = (ICLibraryFileEntry)entry;
srcPath = libFile.getSourceAttachmentPath();
srcRootPath = libFile.getSourceAttachmentRootPath();
srcPrefixMapping = libFile.getSourceAttachmentPrefixMapping();
if(srcPath != null)
srcPath = resolvePath(mngr, cfg, srcPath);
if(srcRootPath != null)
srcRootPath = resolvePath(mngr, cfg, srcRootPath);
if(srcPrefixMapping != null)
srcPrefixMapping = resolvePath(mngr, cfg, srcPrefixMapping);
break;
case ICSettingEntry.SOURCE_PATH:
case ICSettingEntry.OUTPUT_PATH:
exclusionFilters = ((ICExclusionPatternPathEntry)entry).getExclusionPatterns();
for(int i = 0; i < exclusionFilters.length; i++){
String exclString = exclusionFilters[i].toString();
try { try {
exclString = mngr.resolveValue(exclString, "", " ", cfg); //$NON-NLS-1$ //$NON-NLS-2$ value = mngr.resolveValue(value, EMPTY, DELIM, cfg);
} catch (CdtVariableException e) { } catch (CdtVariableException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
} }
exclusionFilters[i] = new Path(exclString); break;
case ICSettingEntry.LIBRARY_FILE:
ICLibraryFileEntry libFile = (ICLibraryFileEntry)entry;
srcPath = libFile.getSourceAttachmentPath();
srcRootPath = libFile.getSourceAttachmentRootPath();
srcPrefixMapping = libFile.getSourceAttachmentPrefixMapping();
if(srcPath != null)
srcPath = resolvePath(mngr, cfg, srcPath);
if(srcRootPath != null)
srcRootPath = resolvePath(mngr, cfg, srcRootPath);
if(srcPrefixMapping != null)
srcPrefixMapping = resolvePath(mngr, cfg, srcPrefixMapping);
break;
case ICSettingEntry.SOURCE_PATH:
case ICSettingEntry.OUTPUT_PATH:
exclusionFilters = ((ICExclusionPatternPathEntry)entry).getExclusionPatterns();
for(int i = 0; i < exclusionFilters.length; i++){
String exclString = exclusionFilters[i].toString();
try {
exclString = mngr.resolveValue(exclString, EMPTY, DELIM, cfg);
} catch (CdtVariableException e) {
CCorePlugin.log(e);
}
exclusionFilters[i] = new Path(exclString);
}
break;
default:
break;
} }
break; result[k] = createEntry(entry.getKind(), names[k], value, exclusionFilters, entry.getFlags() | ICSettingEntry.RESOLVED, srcPath, srcRootPath, srcPrefixMapping);
// default:
// throw new IllegalArgumentException();
} }
return result;
return createEntry(entry.getKind(), name, value, exclusionFilters, entry.getFlags() | ICSettingEntry.RESOLVED, srcPath, srcRootPath, srcPrefixMapping);
} }
private static IPath resolvePath(ICdtVariableManager mngr, ICConfigurationDescription cfg, IPath path){ private static IPath resolvePath(ICdtVariableManager mngr, ICConfigurationDescription cfg, IPath path){
@ -238,7 +251,7 @@ public class CDataUtil {
try { try {
String unresolved = path.toString(); String unresolved = path.toString();
String resolved = mngr.resolveValue(unresolved, "", " ", cfg); //$NON-NLS-1$ //$NON-NLS-2$ String resolved = mngr.resolveValue(unresolved, EMPTY, DELIM, cfg);
if(resolved != null && !resolved.equals(unresolved)) if(resolved != null && !resolved.equals(unresolved))
path = new Path(resolved); path = new Path(resolved);
} catch (CdtVariableException e) { } catch (CdtVariableException e) {

View file

@ -818,90 +818,113 @@ public class PathEntryTranslator {
return new IPath[0]; return new IPath[0];
} }
private IPath[] getEntryPath(ICSettingEntry entry, ICConfigurationDescription cfg){ private IPath[][] getEntryPath(ICSettingEntry entry, ICConfigurationDescription cfg){
return valueToEntryPath(entry.getName(), (entry.getFlags() & ICSettingEntry.VALUE_WORKSPACE_PATH) != 0, cfg); return valueToEntryPath(entry.getName(), (entry.getFlags() & ICSettingEntry.VALUE_WORKSPACE_PATH) != 0, cfg);
} }
private IPath[] valueToEntryPath(String value, boolean isWsp, ICConfigurationDescription cfg){ private IPath[][] valueToEntryPath(String value, boolean isWsp, ICConfigurationDescription cfg){
String pathVarValue = resolveKeepingPathEntryFars(value, cfg); String[] pathVarValues = resolveKeepingPathEntryFars(value, cfg);
String resolvedValue = resolveAll(value, cfg); IPath result[][] = new IPath[2][pathVarValues.length];
IPath resolvedPath = new Path(resolvedValue); for (int i=0; i<pathVarValues.length; i++) {
IPath pathVarPath = new Path(pathVarValue); String resolvedValue = resolveAll(value, cfg);
IPath result[] = new IPath[2]; IPath resolvedPath = new Path(resolvedValue);
if(isWsp){ IPath pathVarPath = new Path(pathVarValues[i]);
if(!resolvedPath.isAbsolute()){ if(isWsp){
result[0] = fProject.getFullPath().makeRelative(); if(!resolvedPath.isAbsolute()){
result[1] = pathVarPath; result[0][i] = fProject.getFullPath().makeRelative();
// path = fProject.getFullPath().append(path); result[1][i] = pathVarPath;
} else { // path = fProject.getFullPath().append(path);
if(resolvedPath.segmentCount() != 0){ } else {
String projName = resolvedPath.segment(0); if(resolvedPath.segmentCount() != 0){
IPath valuePath = resolvedPath.removeFirstSegments(1).makeRelative(); String projName = resolvedPath.segment(0);
if(pathVarPath.segmentCount() != 0){ IPath valuePath = resolvedPath.removeFirstSegments(1).makeRelative();
String resolvedProjName = projName; if(pathVarPath.segmentCount() != 0){
String varProjName = pathVarPath.segment(0); String resolvedProjName = projName;
IPath resolvedProjPath = CCorePlugin.getDefault().getPathEntryVariableManager().resolvePath(new Path(varProjName)); String varProjName = pathVarPath.segment(0);
if(resolvedProjPath.segmentCount() == 1 && resolvedProjName.equals(resolvedProjPath.segment(0))){ IPath resolvedProjPath = CCorePlugin.getDefault().getPathEntryVariableManager().resolvePath(new Path(varProjName));
projName = varProjName; if(resolvedProjPath.segmentCount() == 1 && resolvedProjName.equals(resolvedProjPath.segment(0))){
valuePath = pathVarPath.removeFirstSegments(1).makeRelative(); projName = varProjName;
valuePath = pathVarPath.removeFirstSegments(1).makeRelative();
}
} }
result[0][i] = new Path(projName);
result[1][i] = valuePath;
} }
result[0] = new Path(projName);
result[1] = valuePath;
} }
// path = path.makeRelative();
} else {
if(!resolvedPath.isAbsolute()){
IPath location = fProject.getLocation();
if(location != null)
pathVarPath = location.append(pathVarPath);
}
result[1][i] = pathVarPath;
} }
// path = path.makeRelative();
} else {
if(!resolvedPath.isAbsolute()){
IPath location = fProject.getLocation();
if(location != null)
pathVarPath = location.append(pathVarPath);
}
result[1] = pathVarPath;
} }
return result; return result;
} }
public IPathEntry toPathEntry(ICConfigurationDescription cfg, boolean keepPathInfo){ public IPathEntry[] toPathEntry(ICConfigurationDescription cfg, boolean keepPathInfo){
IPath path = keepPathInfo ? fPath : fProject.getFullPath(); IPath path = keepPathInfo ? fPath : fProject.getFullPath();
IPathEntry[] result = new IPathEntry[0];
if(fLangEntry != null){ if(fLangEntry != null){
switch(fLangEntry.getKind()){ switch(fLangEntry.getKind()){
case ICLanguageSettingEntry.INCLUDE_FILE:{ case ICLanguageSettingEntry.INCLUDE_FILE:{
IPath paths[] = getEntryPath(fLangEntry, cfg); IPath paths[][] = getEntryPath(fLangEntry, cfg);
return CoreModel.newIncludeFileEntry(path, null, paths[0], paths[1], getExclusionPatterns(), fIsExported); result = new IPathEntry[paths[0].length];
for (int i=0; i<result.length; i++)
result[i] = CoreModel.newIncludeFileEntry(path, null, paths[0][i], paths[1][i], getExclusionPatterns(), fIsExported);
return result;
} }
case ICLanguageSettingEntry.INCLUDE_PATH:{ case ICLanguageSettingEntry.INCLUDE_PATH:{
IPath paths[] = getEntryPath(fLangEntry, cfg); IPath paths[][] = getEntryPath(fLangEntry, cfg);
ICIncludePathEntry ipe = (ICIncludePathEntry)fLangEntry; ICIncludePathEntry ipe = (ICIncludePathEntry)fLangEntry;
return CoreModel.newIncludeEntry(path, paths[0], paths[1], !ipe.isLocal(), getExclusionPatterns(), fIsExported);
result = new IPathEntry[paths[0].length];
for (int i=0; i<result.length; i++)
result[i] = CoreModel.newIncludeEntry(path, paths[0][i], paths[1][i], !ipe.isLocal(), getExclusionPatterns(), fIsExported);
return result;
} }
case ICLanguageSettingEntry.MACRO: case ICLanguageSettingEntry.MACRO:
return CoreModel.newMacroEntry(path, fLangEntry.getName(), fLangEntry.getValue(), getExclusionPatterns(), fIsExported); result = new IPathEntry[1];
result[0] = CoreModel.newMacroEntry(path, fLangEntry.getName(), fLangEntry.getValue(), getExclusionPatterns(), fIsExported);
return result;
case ICLanguageSettingEntry.MACRO_FILE:{ case ICLanguageSettingEntry.MACRO_FILE:{
IPath paths[] = getEntryPath(fLangEntry, cfg); IPath paths[][] = getEntryPath(fLangEntry, cfg);
return CoreModel.newMacroFileEntry(path, paths[0], null, paths[1], getExclusionPatterns(), fIsExported); result = new IPathEntry[paths[0].length];
for (int i=0; i<result.length; i++)
result[i] = CoreModel.newMacroFileEntry(path, paths[0][i], null, paths[1][i], getExclusionPatterns(), fIsExported);
return result;
} }
case ICLanguageSettingEntry.LIBRARY_PATH: case ICLanguageSettingEntry.LIBRARY_PATH:
return null; return null;
case ICLanguageSettingEntry.LIBRARY_FILE:{ case ICLanguageSettingEntry.LIBRARY_FILE:{
IPath paths[] = getEntryPath(fLangEntry, cfg); IPath paths[][] = getEntryPath(fLangEntry, cfg);
return CoreModel.newLibraryEntry(path, paths[0], paths[1], null, null, null, fIsExported); result = new IPathEntry[paths[0].length];
for (int i=0; i<result.length; i++)
result[i] = CoreModel.newLibraryEntry(path, paths[0][i], paths[1][i], null, null, null, fIsExported);
return result;
} }
case ICLanguageSettingEntry.OUTPUT_PATH: case ICLanguageSettingEntry.OUTPUT_PATH:
return CoreModel.newOutputEntry(fPath, getExclusionPatterns()); result = new IPathEntry[1];
result[0] = CoreModel.newOutputEntry(fPath, getExclusionPatterns());
return result;
case ICLanguageSettingEntry.SOURCE_PATH: case ICLanguageSettingEntry.SOURCE_PATH:
return CoreModel.newSourceEntry(fPath, getExclusionPatterns()); result = new IPathEntry[1];
result[0] = CoreModel.newSourceEntry(fPath, getExclusionPatterns());;
return result;
default: default:
return null; return result; // empty
} }
} else if(fPath != null){ } else if(fPath != null){
return CoreModel.newProjectEntry(fPath, fIsExported); result = new IPathEntry[1];
result[0] = CoreModel.newProjectEntry(fPath, fIsExported);
return result;
} }
return null; return result; // empty
} }
} }
@ -914,17 +937,20 @@ public class PathEntryTranslator {
return value; return value;
} }
private static String resolveKeepingPathEntryFars(String value, ICConfigurationDescription cfg){ private static String[] resolveKeepingPathEntryFars(String value, ICConfigurationDescription cfg){
String[] result = new String[] { value }; // default value;
try { try {
VarSubstitutor substitutor = new VarSubstitutor(cfg); VarSubstitutor substitutor = new VarSubstitutor(cfg);
return CdtVariableResolver.resolveToString(value, substitutor); result = CdtVariableResolver.resolveToStringList(value, substitutor);
if (result == null || result.length == 0)
result = new String[] { CdtVariableResolver.resolveToString(value, substitutor) };
} catch (CdtVariableException e) { } catch (CdtVariableException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
} }
return value; return result;
} }
/*
private static int lsKindToPeKind(int kind){ private static int lsKindToPeKind(int kind){
switch(kind){ switch(kind){
case ICLanguageSettingEntry.INCLUDE_FILE: case ICLanguageSettingEntry.INCLUDE_FILE:
@ -947,6 +973,7 @@ public class PathEntryTranslator {
return 0; return 0;
} }
} }
*/
public static class PathEntryCollector { public static class PathEntryCollector {
private PathSettingsContainer fStorage; private PathSettingsContainer fStorage;
private KindBasedStore fStore; private KindBasedStore fStore;
@ -1172,7 +1199,7 @@ public class PathEntryTranslator {
PathEntryComposer cs = (PathEntryComposer)iter.next(); PathEntryComposer cs = (PathEntryComposer)iter.next();
ICSettingEntry entry = cs.getSettingEntry(); ICSettingEntry entry = cs.getSettingEntry();
if(checkFilter(cs, entry, flags)){ if(checkFilter(cs, entry, flags)){
IPathEntry pe = null; IPathEntry[] pe = null;
if(isBuiltIn(entry) && cs.getPath().segmentCount() > 1){ if(isBuiltIn(entry) && cs.getPath().segmentCount() > 1){
String name = entry.getName(); String name = entry.getName();
Map map = (Map)store.get(peKind); Map map = (Map)store.get(peKind);
@ -1182,15 +1209,18 @@ public class PathEntryTranslator {
} }
if(!map.containsKey(name)){ if(!map.containsKey(name)){
pe = cs.toPathEntry(cfg, false); pe = cs.toPathEntry(cfg, false);
if (pe.length > 1) {
System.out.println();
}
if(pe != null){ if(pe != null){
map.put(name, pe); map.put(name, pe[0]);
} }
} }
} else { } else {
pe = cs.toPathEntry(cfg, true); pe = cs.toPathEntry(cfg, true);
} }
if(pe != null) if(pe != null)
list.add(pe); list.addAll(Arrays.asList(pe));
} }
} }
} }
@ -1516,8 +1546,8 @@ public class PathEntryTranslator {
ICOutputEntry outEntries[] = null; ICOutputEntry outEntries[] = null;
// PathSettingsContainer child; // PathSettingsContainer child;
ResolvedEntry rEntry; ResolvedEntry rEntry;
IPath projPath; // IPath projPath;
IResource rc; // IResource rc;
ResourceInfo rcInfo; ResourceInfo rcInfo;
for(int i = 0; i < rEntries.length; i++){ for(int i = 0; i < rEntries.length; i++){
rEntry = rEntries[i]; rEntry = rEntries[i];
@ -1898,7 +1928,7 @@ public class PathEntryTranslator {
return result; return result;
} }
/*
private PathEntryKyndStore sort(ResolvedEntry[] rEntries, PathEntryKyndStore store){ private PathEntryKyndStore sort(ResolvedEntry[] rEntries, PathEntryKyndStore store){
if(store == null){ if(store == null){
store = new PathEntryKyndStore(); store = new PathEntryKyndStore();
@ -1917,7 +1947,7 @@ public class PathEntryTranslator {
return store; return store;
} }
*/
// private void listStoreToArrayStore(PathEntryKyndStore store, boolean nullAsEmptyArray){ // private void listStoreToArrayStore(PathEntryKyndStore store, boolean nullAsEmptyArray){
// int[]kinds = store.getSupportedKinds(); // int[]kinds = store.getSupportedKinds();
// int kind; // int kind;