Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java105
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();

Back to the top