summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Salinas2012-05-14 17:58:47 (EDT)
committerChris Recoskie2012-05-14 17:58:47 (EDT)
commit091df21721303c8763ef7c44c08023afeec31577 (patch)
treeb70caac6bf2d14b43991c461c95bcf8e24a6b02e
parentebb769c74ce027a4dd2fbc3301f99c8c4beeba02 (diff)
downloadorg.eclipse.cdt-091df21721303c8763ef7c44c08023afeec31577.zip
org.eclipse.cdt-091df21721303c8763ef7c44c08023afeec31577.tar.gz
org.eclipse.cdt-091df21721303c8763ef7c44c08023afeec31577.tar.bz2
Bug 379474 - remote C/C++ project with XL toolchain generates a
parse error in stdio.h, preventing proper AST gen and Indexing.
-rw-r--r--xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/PerFileXLCScannerInfoCollector.java7
-rw-r--r--xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XlCSpecsConsoleParser.java46
2 files changed, 49 insertions, 4 deletions
diff --git a/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/PerFileXLCScannerInfoCollector.java b/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/PerFileXLCScannerInfoCollector.java
index fcd524e..97a52ad 100644
--- a/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/PerFileXLCScannerInfoCollector.java
+++ b/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/PerFileXLCScannerInfoCollector.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2010 IBM Corporation and others.
+ * Copyright (c) 2007, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -1376,7 +1376,10 @@ public class PerFileXLCScannerInfoCollector implements IScannerInfoCollector3, I
if (projectSymbols != null) {
for (String symbol : projectSymbols) {
- symbols.put(symbol, "1"); //$NON-NLS-1$
+ if (symbol.matches("_Builtin")) //$NON-NLS-1$
+ symbols.put(symbol,""); //$NON-NLS-1$
+ else
+ symbols.put(symbol, "1"); //$NON-NLS-1$
}
}
}
diff --git a/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XlCSpecsConsoleParser.java b/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XlCSpecsConsoleParser.java
index d4fbeb0..3f467bd 100644
--- a/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XlCSpecsConsoleParser.java
+++ b/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XlCSpecsConsoleParser.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2011 IBM Corporation and others.
+ * Copyright (c) 2006, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -23,9 +23,12 @@ import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.TraceUtil;
import org.eclipse.cdt.make.xlc.core.activator.Activator;
+import org.eclipse.cdt.managedbuilder.scannerconfig.IManagedScannerInfoCollector;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.cdt.core.CCProjectNature;
+import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.IMarkerGenerator;
/**
@@ -47,8 +50,12 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
final Pattern includePattern = Pattern
.compile("-(?:qgcc_c_stdinc|qc_stdinc|qgcc_cpp_stdinc|qcpp_stdinc)=(.*)"); //$NON-NLS-1$
+ final Pattern C_includePattern = Pattern.compile("-(?:qgcc_c_stdinc|qc_stdinc)=(.*)"); //$NON-NLS-1$
+ final Pattern CXX_includePattern = Pattern.compile("-(?:qgcc_cpp_stdinc|qcpp_stdinc)=(.*)"); //$NON-NLS-1$
+
// xlC compiler constants
protected final static String [] compilerConstants = {
+ "_Builtin", //$NON-NLS-1$
"__IBMCPP__", //$NON-NLS-1$
"__xlC__", //$NON-NLS-1$
"__IBMC__", //$NON-NLS-1$
@@ -62,6 +69,22 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
protected List<String> symbols = new ArrayList<String>();
protected List<String> includes = new ArrayList<String>();
+
+ protected List<String> c_includes = new ArrayList<String>();
+ protected List<String> cpp_includes = new ArrayList<String>();
+
+ boolean c_lang; // if language is C only search for the C include paths from the XL Compiler, otherwise get the C++ ones.
+ public boolean isC_lang() {
+ return c_lang;
+ }
+
+ public void setC_lang(boolean c_lang) {
+ this.c_lang = c_lang;
+ }
+
+// protected List<String> c_includes = new ArrayList<String>();
+// protected List<String> cxx_includes = new ArrayList<String>();
+//
/*
* (non-Javadoc)
@@ -76,6 +99,23 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
IScannerInfoCollector collector, IMarkerGenerator markerGenerator) {
this.fProject = project;
this.fCollector = collector;
+
+ try {
+ if (project.hasNature(CCProjectNature.CC_NATURE_ID)) {
+ // use C++ pattern
+ c_lang = false;
+ }
+ else {
+ // use C pattern
+ c_lang = true;
+ }
+
+
+
+ } catch (CoreException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
}
/*
@@ -112,7 +152,9 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
} else {
// if it is not a symbol, check to see if it is an
// include
- Matcher includeMatcher = includePattern.matcher(args[i]);
+
+ // ok parse the C include paths ... and then the cpp include paths.
+ Matcher includeMatcher = c_lang ? C_includePattern.matcher(args[i]) : CXX_includePattern.matcher(args[i]);
if (includeMatcher.matches()) {
// if it is a set of include paths, split it
String[] includePaths = includeMatcher.group(1).split(