diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml b/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml index fb1fef30d4f..00647923140 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml @@ -6541,6 +6541,117 @@ + + + + + + + + + + + + + + + + + + + + + 0){ List entryList = new ArrayList(); for(int i = 0; i < options.length; i++){ - IOption option = options[i]; - List list = (List)option.getValue(); + Option option = (Option)options[i]; + List list = (List)option.getExactValue(); int size = list.size(); if(size > 0){ for(int j = 0; j < size; j++){ - String value = (String)list.get(j); - if(value.indexOf('"') == 0 && value.lastIndexOf('"') == value.length() - 1 && value.length() != 1){ - value = value.substring(1, value.length() - 1); - } - ICLanguageSettingEntry entry = createUserEntry(option, value, flags); - entryList.add(new UserEntryInfo(entry, value)); + OptionStringValue ve = (OptionStringValue)list.get(j); +// if(value.indexOf('"') == 0 && value.lastIndexOf('"') == value.length() - 1 && value.length() != 1){ +// value = value.substring(1, value.length() - 1); +// } + ICLanguageSettingEntry entry = createUserEntry(option, ve, flags); + entryList.add(new UserEntryInfo(entry, ve)); } } } @@ -165,6 +169,14 @@ public class BuildEntryStorage extends AbstractEntryStorage { return new UserEntryInfo[0]; } + private static String stripQuotes(String value){ + if(value.indexOf('"') == 0 && value.lastIndexOf('"') == value.length() - 1 && value.length() != 1){ + value = value.substring(1, value.length() - 1); + } + return value; + } + + private HashSet getUserUndefinedStringSet(){ HashSet set = null; IOption options[] = fLangData.getUndefOptionsForKind(getKind()); @@ -209,14 +221,18 @@ public class BuildEntryStorage extends AbstractEntryStorage { return new ICLanguageSettingEntry[0]; } - private ICLanguageSettingEntry createUserEntry(IOption option, String optionValue, int flags){ + private ICLanguageSettingEntry createUserEntry(Option option, OptionStringValue optionValue, int flags){ +// private ICLanguageSettingEntry createUserEntry(Option option, String optionValue, int flags){ int kind = getKind(); ICLanguageSettingEntry entry = null; + IPath srcPath = null, srcRootPath = null, srcPrefixMapping = null; + switch (kind){ case ICLanguageSettingEntry.MACRO: - String nv[] = macroNameValueFromValue(optionValue); + String nv[] = macroNameValueFromValue(optionValue.getValue()); +// String nv[] = macroNameValueFromValue(optionValue); entry = new CMacroEntry(nv[0], nv[1], flags); break; @@ -225,9 +241,21 @@ public class BuildEntryStorage extends AbstractEntryStorage { // case ICLanguageSettingEntry.MACRO_FILE: // case ICLanguageSettingEntry.LIBRARY_PATH: // case ICLanguageSettingEntry.LIBRARY_FILE: + case ICLanguageSettingEntry.LIBRARY_FILE: + String tmp = optionValue.getSourceAttachmentPath(); + if(tmp != null) + srcPath = new Path(tmp); + tmp = optionValue.getSourceAttachmentRootPath(); + if(tmp != null) + srcRootPath = new Path(tmp); + tmp = optionValue.getSourceAttachmentPrefixMapping(); + if(tmp != null) + srcPrefixMapping = new Path(tmp); + //do not break default: IOptionPathConverter optionPathConverter = fLangData.getTool().getOptionPathConverter(); - Object[] v = optionPathValueToEntry(optionValue); + Object[] v = optionPathValueToEntry(stripQuotes(optionValue.getValue())); +// Object[] v = optionPathValueToEntry(optionValue); String name = (String)v[0]; if(((Boolean)v[1]).booleanValue()){ flags |= ICLanguageSettingEntry.VALUE_WORKSPACE_PATH; @@ -236,21 +264,38 @@ public class BuildEntryStorage extends AbstractEntryStorage { if(path != null) name = path.toString(); } - entry = (ICLanguageSettingEntry)CDataUtil.createEntry(kind, name, null, null, flags); + entry = (ICLanguageSettingEntry)CDataUtil.createEntry(kind, name, null, null, flags, srcPath, srcRootPath, srcPrefixMapping); break; } return entry; } - private String createOptionValue(IOption option, UserEntryInfo info){ + private OptionStringValue createOptionValue(IOption option, UserEntryInfo info){ if(info.fOptionValue != null) return info.fOptionValue; return entryValueToOption(option, info.fEntry); } + + private OptionStringValue entryValueToOption(IOption option, ICLanguageSettingEntry entry){ + String optionValue = entryValueToOptionStringValue(option, entry); + if(entry.getKind() == ICSettingEntry.LIBRARY_FILE){ + ICLibraryFileEntry libFile = (ICLibraryFileEntry)entry; + return new OptionStringValue(optionValue, + false, + pathToString(libFile.getSourceAttachmentPath()), + pathToString(libFile.getSourceAttachmentRootPath()), + pathToString(libFile.getSourceAttachmentPrefixMapping())); + } + return new OptionStringValue(optionValue); + } - private String entryValueToOption(IOption option, ICLanguageSettingEntry entry){ + private static String pathToString(IPath path){ + return path != null ? path.toString() : null; + } + + private String entryValueToOptionStringValue(IOption option, ICLanguageSettingEntry entry){ if(entry.getKind() == ICLanguageSettingEntry.MACRO && entry.getValue().length() > 0){ return new StringBuffer(entry.getName()).append('=').append(entry.getValue()).toString(); } else if(entry instanceof ICLanguageSettingPathEntry){ @@ -292,7 +337,7 @@ public class BuildEntryStorage extends AbstractEntryStorage { IOption options[] = fLangData.getOptionsForKind(kind); if(options.length != 0){ IOption option = options[0]; - String optValue[] = new String[entries.length]; + OptionStringValue optValue[] = new OptionStringValue[entries.length]; if(entries.length != 0){ for(int i = 0; i < entries.length; i++){ optValue[i] = createOptionValue(option, entries[i]); diff --git a/build/org.eclipse.cdt.managedbuilder.ui.tests/src/org/eclipse/cdt/managedbuilder/ui/tests/util/TestFolderInfo.java b/build/org.eclipse.cdt.managedbuilder.ui.tests/src/org/eclipse/cdt/managedbuilder/ui/tests/util/TestFolderInfo.java index ea1f4e8bc3a..073a9f67b47 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui.tests/src/org/eclipse/cdt/managedbuilder/ui/tests/util/TestFolderInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.ui.tests/src/org/eclipse/cdt/managedbuilder/ui/tests/util/TestFolderInfo.java @@ -11,6 +11,7 @@ import org.eclipse.cdt.managedbuilder.core.IModificationStatus; import org.eclipse.cdt.managedbuilder.core.IOption; import org.eclipse.cdt.managedbuilder.core.ITool; import org.eclipse.cdt.managedbuilder.core.IToolChain; +import org.eclipse.cdt.managedbuilder.core.OptionStringValue; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.PluginVersionIdentifier; @@ -226,4 +227,10 @@ public class TestFolderInfo implements IFolderInfo { return false; } + public IOption setOption(IHoldsOptions parent, IOption option, + OptionStringValue[] value) throws BuildException { + // TODO Auto-generated method stub + return null; + } + } 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 536e06089b4..d5631d80258 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 @@ -188,6 +188,7 @@ public class CDataUtil { String value = null; IPath[] exclusionFilters = null; + IPath srcPath = null, srcRootPath = null, srcPrefixMapping = null; switch (entry.getKind()) { case ICSettingEntry.MACRO: @@ -198,6 +199,18 @@ public class CDataUtil { CCorePlugin.log(e); } 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(); @@ -215,7 +228,23 @@ public class CDataUtil { // throw new IllegalArgumentException(); } - return createEntry(entry.getKind(), name, value, exclusionFilters, entry.getFlags() | ICSettingEntry.RESOLVED); + return createEntry(entry.getKind(), name, value, exclusionFilters, entry.getFlags() | ICSettingEntry.RESOLVED, srcPath, srcRootPath, srcPrefixMapping); + } + + private static IPath resolvePath(ICdtVariableManager mngr, ICConfigurationDescription cfg, IPath path){ + if(path == null) + return null; + + try { + String unresolved = path.toString(); + String resolved = mngr.resolveValue(unresolved, "", " ", cfg); //$NON-NLS-1$ //$NON-NLS-2$ + if(resolved != null && !resolved.equals(unresolved)) + path = new Path(resolved); + } catch (CdtVariableException e) { + CCorePlugin.log(e); + } + + return path; } public static ICLanguageSettingEntry createEntry(ICLanguageSettingEntry entry, int flagsToAdd, int flafsToClear){ @@ -253,6 +282,11 @@ public class CDataUtil { } public static ICSettingEntry createEntry(int kind, String name, String value, IPath[] exclusionPatterns, int flags){ + return createEntry(kind, name, value, exclusionPatterns, flags, null, null, null); + } + + + public static ICSettingEntry createEntry(int kind, String name, String value, IPath[] exclusionPatterns, int flags, IPath srcPath, IPath srcRootPath, IPath srcPrefixMapping){ switch (kind){ case ICLanguageSettingEntry.INCLUDE_PATH: return new CIncludePathEntry(name, flags); @@ -265,7 +299,7 @@ public class CDataUtil { case ICLanguageSettingEntry.LIBRARY_PATH: return new CLibraryPathEntry(name, flags); case ICLanguageSettingEntry.LIBRARY_FILE: - return new CLibraryFileEntry(name, flags); + return new CLibraryFileEntry(name, flags, srcPath, srcRootPath, srcPrefixMapping); case ICLanguageSettingEntry.OUTPUT_PATH: return new COutputEntry(name, exclusionPatterns, flags); case ICLanguageSettingEntry.SOURCE_PATH: