Bug 568224 - Support output parsing for /clang:-isystem when substituting cl for clang-cl

Add /clang:-isystem. It's handled similarly to /imsvc but interestingly it
doesn't support having spaces between the option name and it's value.

Change-Id: Ic5d61df1c7adebbf707d93a60858e942354c9ed9
Signed-off-by: Marc-Andre Laperle <malaperle@gmail.com>
diff --git a/windows/org.eclipse.cdt.msw.build.tests/src/org/eclipse/cdt/internal/msw/build/tests/MSVCBuildCommandParserTests.java b/windows/org.eclipse.cdt.msw.build.tests/src/org/eclipse/cdt/internal/msw/build/tests/MSVCBuildCommandParserTests.java
index b0fd474..87e86fe 100644
--- a/windows/org.eclipse.cdt.msw.build.tests/src/org/eclipse/cdt/internal/msw/build/tests/MSVCBuildCommandParserTests.java
+++ b/windows/org.eclipse.cdt.msw.build.tests/src/org/eclipse/cdt/internal/msw/build/tests/MSVCBuildCommandParserTests.java
@@ -231,7 +231,7 @@
 	}
 
 	/**
-	 * Parse /imsvc (clang-cl)
+	 * Parse /imsvc, /clang:isystem (clang-cl)
 	 */
 	@Test
 	public void testCIncludePathEntry_ClangCLSystemIncludePaths() throws Exception {
@@ -252,7 +252,8 @@
 		parser.startup(cfgDescription, null);
 		parser.processLine("cl" + " /imsvcC:\\path0 " + " /imsvc C:\\path1 " + " /imsvc\"C:\\path with spaces\""
 				+ " /imsvc\"C:\\backslash at end\\\\\"" + " /imsvc\"..\\..\\relative\""
-				+ " /imsvc\"..\\..\\relative with spaces\"" + " file.cpp");
+				+ " /imsvc\"..\\..\\relative with spaces\"" + " /clang:-isystemC:\\path2 "
+				+ " /clang:-isystem\"C:\\path with spaces2\"" + " file.cpp");
 		parser.shutdown();
 
 		// check populated entries
@@ -273,6 +274,8 @@
 		assertEquals(
 				new CIncludePathEntry(project.getLocation().removeLastSegments(2).append("relative with spaces"), 0),
 				entries.get(5));
+		assertEquals(new CIncludePathEntry("C:/path2", 0), entries.get(6));
+		assertEquals(new CIncludePathEntry("C:/path with spaces2", 0), entries.get(7));
 	}
 
 	/**
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 d45314e..6b63ed8 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
@@ -81,19 +81,6 @@
 		}
 	}
 
-	// TODO: Should these be considered "built-in" entries (ICSettingEntry.BUILTIN)?
-	private static class ClangCLMSVCSystemPathOptionParser extends IncludePathOptionParser {
-
-		public ClangCLMSVCSystemPathOptionParser(String pattern, String nameExpression) {
-			super(pattern, nameExpression);
-		}
-
-		@Override
-		public ICLanguageSettingEntry createEntry(String name, String value, int flag) {
-			return super.createEntry(name, unescapeString(value), flag);
-		}
-	}
-
 	@SuppressWarnings("nls")
 	static final AbstractOptionParser[] includeOptionParsers = {
 			new MSVCIncludePathOptionParser("(-|/)I\\s*\"(.*)\"", "$2"),
@@ -106,8 +93,13 @@
 
 	@SuppressWarnings("nls")
 	static final AbstractOptionParser[] msvcIncludeOptionParsers = {
-			new ClangCLMSVCSystemPathOptionParser("(-|/)imsvc\\s*\"(.*)\"", "$2"),
-			new ClangCLMSVCSystemPathOptionParser("(-|/)imsvc\\s*([^\\s\"]*)", "$2"), };
+			new MSVCIncludePathOptionParser("(-|/)imsvc\\s*\"(.*)\"", "$2"),
+			new MSVCIncludePathOptionParser("(-|/)imsvc\\s*([^\\s\"]*)", "$2"), };
+
+	@SuppressWarnings("nls")
+	static final AbstractOptionParser[] clangISystemIncludeOptionParsers = {
+			new MSVCIncludePathOptionParser("(-|/)clang:-isystem\"(.*)\"", "$2"),
+			new MSVCIncludePathOptionParser("(-|/)clang:-isystem([^\\s\"]*)", "$2"), };
 
 	@SuppressWarnings("nls")
 	static final AbstractOptionParser[] defineOptionParsers = {
@@ -136,6 +128,7 @@
 		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);
 
@@ -197,6 +190,10 @@
 			return msvcIncludeOptionParsers;
 		}
 
+		if (optionName.startsWith("clang")) {
+			return clangISystemIncludeOptionParsers;
+		}
+
 		if (optionName.startsWith("FI")) {
 			return forceIncludeOptionParsers;
 		}