diff options
Diffstat (limited to 'windows/org.eclipse.cdt.msw.build/src/org/eclipse/cdt/msw/build/core/MSVCBuildCommandParser.java')
-rw-r--r-- | windows/org.eclipse.cdt.msw.build/src/org/eclipse/cdt/msw/build/core/MSVCBuildCommandParser.java | 105 |
1 files changed, 86 insertions, 19 deletions
diff --git a/windows/org.eclipse.cdt.msw.build/src/org/eclipse/cdt/msw/build/core/MSVCBuildCommandParser.java b/windows/org.eclipse.cdt.msw.build/src/org/eclipse/cdt/msw/build/core/MSVCBuildCommandParser.java index 50d2a814f33..6b63ed8b70e 100644 --- a/windows/org.eclipse.cdt.msw.build/src/org/eclipse/cdt/msw/build/core/MSVCBuildCommandParser.java +++ b/windows/org.eclipse.cdt.msw.build/src/org/eclipse/cdt/msw/build/core/MSVCBuildCommandParser.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.msw.build.core; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -26,11 +28,20 @@ import org.eclipse.cdt.managedbuilder.language.settings.providers.AbstractBuildC */ public class MSVCBuildCommandParser extends AbstractBuildCommandParser implements ILanguageSettingsEditableProvider { + private static final String DOUBLE_BACKSLASH = "\\\\"; //$NON-NLS-1$ + private static final Pattern DOUBLE_BACKSLASH_PATTERN = Pattern.compile(Pattern.quote(DOUBLE_BACKSLASH)); + private static final String BACKSLASH_REPLACEMENT_STRING = "\\\\"; //$NON-NLS-1$ + private static final String BACKSLASH_QUOTE = "\\\""; //$NON-NLS-1$ + private static final Pattern BACKSLASH_QUOTE_PATTERN = Pattern.compile(Pattern.quote(BACKSLASH_QUOTE)); + private static final String QUOTE_REPLACEMENT_STRING = "\""; //$NON-NLS-1$ + private static String unescapeString(String value) { // There are probably many other things to unescape but these are the most // common. - value = value.replaceAll("\\\\\\\\", "\\\\"); //$NON-NLS-1$//$NON-NLS-2$ - value = value.replaceAll("\\\\\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + if (value.contains(DOUBLE_BACKSLASH)) + value = DOUBLE_BACKSLASH_PATTERN.matcher(value).replaceAll(BACKSLASH_REPLACEMENT_STRING); + if (value.contains(BACKSLASH_QUOTE)) + value = BACKSLASH_QUOTE_PATTERN.matcher(value).replaceAll(QUOTE_REPLACEMENT_STRING); return value; } @@ -70,26 +81,28 @@ public class MSVCBuildCommandParser extends AbstractBuildCommandParser implement } } - // TODO: Should these be considered "built-in" entries (ICSettingEntry.BUILTIN)? - private static class ClangCLMSVCSystemPathOptionParser extends IncludePathOptionParser { + @SuppressWarnings("nls") + static final AbstractOptionParser[] includeOptionParsers = { + new MSVCIncludePathOptionParser("(-|/)I\\s*\"(.*)\"", "$2"), + new MSVCIncludePathOptionParser("(-|/)I\\s*([^\\s\"]*)", "$2"), }; - public ClangCLMSVCSystemPathOptionParser(String pattern, String nameExpression) { - super(pattern, nameExpression); - } + @SuppressWarnings("nls") + static final AbstractOptionParser[] forceIncludeOptionParsers = { + new MSVCForceIncludePathOptionParser("(-|/)FI\\s*\"(.*)\"", "$2"), + new MSVCForceIncludePathOptionParser("(-|/)FI\\s*([^\\s\"]*)", "$2"), }; - @Override - public ICLanguageSettingEntry createEntry(String name, String value, int flag) { - return super.createEntry(name, unescapeString(value), flag); - } - } + @SuppressWarnings("nls") + static final AbstractOptionParser[] msvcIncludeOptionParsers = { + new MSVCIncludePathOptionParser("(-|/)imsvc\\s*\"(.*)\"", "$2"), + new MSVCIncludePathOptionParser("(-|/)imsvc\\s*([^\\s\"]*)", "$2"), }; @SuppressWarnings("nls") - static final AbstractOptionParser[] optionParsers = { new MSVCIncludePathOptionParser("(-|/)I\\s*\"(.*)\"", "$2"), - new MSVCIncludePathOptionParser("(-|/)I\\s*([^\\s\"]*)", "$2"), - new MSVCForceIncludePathOptionParser("(-|/)FI\\s*\"(.*)\"", "$2"), - new MSVCForceIncludePathOptionParser("(-|/)FI\\s*([^\\s\"]*)", "$2"), - new ClangCLMSVCSystemPathOptionParser("(-|/)imsvc\\s*\"(.*)\"", "$2"), - new ClangCLMSVCSystemPathOptionParser("(-|/)imsvc\\s*([^\\s\"]*)", "$2"), + static final AbstractOptionParser[] clangISystemIncludeOptionParsers = { + new MSVCIncludePathOptionParser("(-|/)clang:-isystem\"(.*)\"", "$2"), + new MSVCIncludePathOptionParser("(-|/)clang:-isystem([^\\s\"]*)", "$2"), }; + + @SuppressWarnings("nls") + static final AbstractOptionParser[] defineOptionParsers = { // /D "FOO=bar" new MSVCMacroOptionParser("(-|/)D\\s*\"([^=]+)=(.*)\"", "$2", "$3"), // /D FOO="bar" @@ -99,12 +112,29 @@ public class MSVCBuildCommandParser extends AbstractBuildCommandParser implement // /D FOO new MSVCMacroOptionParser("(-|/)D\\s*([^\\s=\"]+)", "$2", "1"), // /D"FOO" - new MSVCMacroOptionParser("(-|/)D\\s*\"([^\\s=\"]+)\"", "$2", "1"), + new MSVCMacroOptionParser("(-|/)D\\s*\"([^\\s=\"]+)\"", "$2", "1"), }; + + @SuppressWarnings("nls") + static final AbstractOptionParser[] undefineOptionParsers = { // /U FOO new MacroOptionParser("(-|/)U\\s*([^\\s=\"]+)", "$2", ICSettingEntry.UNDEFINED), // /U "FOO" new MacroOptionParser("(-|/)U\\s*\"(.*?)\"", "$2", ICSettingEntry.UNDEFINED) }; + static final AbstractOptionParser[] emptyParsers = new AbstractOptionParser[0]; + + static final AbstractOptionParser[] optionParsers; + static { + List<AbstractOptionParser> parsers = new ArrayList<>(Arrays.asList(includeOptionParsers)); + Collections.addAll(parsers, defineOptionParsers); + Collections.addAll(parsers, msvcIncludeOptionParsers); + Collections.addAll(parsers, clangISystemIncludeOptionParsers); + Collections.addAll(parsers, forceIncludeOptionParsers); + Collections.addAll(parsers, undefineOptionParsers); + + optionParsers = parsers.toArray(new AbstractOptionParser[0]); + } + /** * "foo" or "C:\foo\\" * @@ -138,6 +168,43 @@ public class MSVCBuildCommandParser extends AbstractBuildCommandParser implement return optionParsers; } + @SuppressWarnings("nls") + @Override + protected AbstractOptionParser[] getOptionParsers(String optionToParse) { + if (optionToParse.length() <= 1) { + return emptyParsers; + } + + // Skip - or /, we know it's there with the OPTIONS_PATTERN + String optionName = optionToParse.substring(1); + + if (optionName.startsWith("I")) { + return includeOptionParsers; + } + + if (optionName.startsWith("D")) { + return defineOptionParsers; + } + + if (optionName.startsWith("imsvc")) { + return msvcIncludeOptionParsers; + } + + if (optionName.startsWith("clang")) { + return clangISystemIncludeOptionParsers; + } + + if (optionName.startsWith("FI")) { + return forceIncludeOptionParsers; + } + + if (optionName.startsWith("U")) { + return undefineOptionParsers; + } + + return emptyParsers; + } + @Override public MSVCBuildCommandParser cloneShallow() throws CloneNotSupportedException { return (MSVCBuildCommandParser) super.cloneShallow(); |