diff options
author | Chris Recoskie | 2010-05-20 17:21:14 +0000 |
---|---|---|
committer | Chris Recoskie | 2010-05-20 17:21:14 +0000 |
commit | 41cd409a389e730be16e973535847ef8643974ca (patch) | |
tree | 80399a2273f4fed8fa1fe7f21ac8731fcd299281 /xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt | |
parent | ba8fbc6c870fc69e45bf487a09f45227d5b4c766 (diff) | |
download | org.eclipse.cdt-41cd409a389e730be16e973535847ef8643974ca.tar.gz org.eclipse.cdt-41cd409a389e730be16e973535847ef8643974ca.tar.xz org.eclipse.cdt-41cd409a389e730be16e973535847ef8643974ca.zip |
fix for 313531 (xlc scanner discovery per file build output parser doesn't recognize automake format)
Diffstat (limited to 'xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt')
2 files changed, 87 insertions, 12 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 69f62b6409f..1d5f6599824 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 @@ -1373,8 +1373,11 @@ public class PerFileXLCScannerInfoCollector implements IScannerInfoCollector3, I List<String> projectSymbols = (List<String>) projectScannerInfo .get(ScannerInfoTypes.SYMBOL_DEFINITIONS); - for (String symbol : projectSymbols) { - symbols.put(symbol, "1"); //$NON-NLS-1$ + if (projectSymbols != null) { + + for (String symbol : projectSymbols) { + 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/XLCPerFileBuildOutputParser.java b/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XLCPerFileBuildOutputParser.java index 32fced2edc7..823ec64c861 100644 --- a/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XLCPerFileBuildOutputParser.java +++ b/xlc/org.eclipse.cdt.make.xlc.core/src/org/eclipse/cdt/make/xlc/core/scannerconfig/XLCPerFileBuildOutputParser.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.make.xlc.core.scannerconfig; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -47,19 +48,39 @@ public class XLCPerFileBuildOutputParser extends AbstractXLCBuildOutputParser { int extensionsIndex = -1; boolean found = false; String filePath = null; - for (int i = compilerInvocationIndex + 1; i < tokens.length; i++) { - String token = tokens[i]; - int k = token.lastIndexOf('.'); - if (k != -1 && (token.length() - k < 5)) { - String fileExtension = token.substring(k); + + // check for automake format first + // e.g. line will start with + // source='/some/path/source.cpp' + int automakeSrcIndex = findAutoMakeSourceIndex(tokens); + if(automakeSrcIndex != -1) { + filePath = getAutoMakeSourcePath(tokens[automakeSrcIndex]); + int k = filePath.lastIndexOf('.'); + if (k != -1 && (filePath.length() - k < 5)) { + String fileExtension = filePath.substring(k); extensionsIndex = getFileExtensionsList().indexOf(fileExtension); if (extensionsIndex != -1) { - filePath = token; found = true; - break; } } } + + if (!found) { + for (int i = compilerInvocationIndex + 1; i < tokens.length; i++) { + String token = tokens[i]; + int k = token.lastIndexOf('.'); + if (k != -1 && (token.length() - k < 5)) { + String fileExtension = token.substring(k); + extensionsIndex = getFileExtensionsList().indexOf(fileExtension); + if (extensionsIndex != -1) { + filePath = token; + found = true; + break; + } + } + } + } + if (!found) { TraceUtil.outputTrace("Error identifying file name :1", tokens, TraceUtil.EOL); //$NON-NLS-1$ return false; @@ -105,7 +126,7 @@ public class XLCPerFileBuildOutputParser extends AbstractXLCBuildOutputParser { } else { file = getUtility().findFileInWorkspace(pFilePath); } - if (file != null) { + if (true /*file != null*/) { CCommandDSC cmd = getUtility().getNewCCommandDSC(tokens, compilerInvocationIndex, extensionsIndex > 0); List<CCommandDSC> cmdList = new ArrayList<CCommandDSC>(); cmdList.add(cmd); @@ -121,8 +142,34 @@ public class XLCPerFileBuildOutputParser extends AbstractXLCBuildOutputParser { Activator.log(e); } } - } else - TraceUtil.outputError("Build command for file outside project: " + pFilePath.toString(), tokens); //$NON-NLS-1$ + } else { + /* + //TraceUtil.outputError("Build command for file outside project: " + pFilePath.toString(), tokens); //$NON-NLS-1$ + // put the info on the project + //CCommandDSC cmd = getUtility().getNewCCommandDSC(tokens, compilerInvocationIndex, extensionsIndex > 0); + //List<CCommandDSC> cmdList = new ArrayList<CCommandDSC>(); +// cmdList.add(cmd); + Map<ScannerInfoTypes, List<?>> sc = new HashMap<ScannerInfoTypes, List<?>>(); +// sc.put(ScannerInfoTypes.COMPILER_COMMAND, cmdList); + + + // put in empty info for the other types + sc.put(ScannerInfoTypes.INCLUDE_PATHS, new LinkedList<String>()); + sc.put(ScannerInfoTypes.SYMBOL_DEFINITIONS, new LinkedList<String>()); + + getCollector().contributeToScannerConfig(getProject(), sc); + if (fCollector != null && fCollector instanceof IScannerInfoCollector2) { + IScannerInfoCollector2 collector = (IScannerInfoCollector2) fCollector; + try { + collector.updateScannerConfiguration(null); + } catch (CoreException e) { + // TODO Auto-generated catch block + Activator.log(e); + } + } + + */ + } } return true; @@ -133,4 +180,29 @@ public class XLCPerFileBuildOutputParser extends AbstractXLCBuildOutputParser { } } + private String getAutoMakeSourcePath(String string) { + // path may be enclosed in single quotes + int firstQuoteIndex = string.indexOf('\''); + int lastQuoteIndex = string.lastIndexOf('\''); + if(firstQuoteIndex != -1 && lastQuoteIndex != -1) + return string.substring(firstQuoteIndex, lastQuoteIndex); + else { + // just take everything after the equals sign + int equalsIndex = string.indexOf('='); + if(equalsIndex != -1 && equalsIndex < string.length()) + return string.substring(equalsIndex+1); + + } + return null; + } + + private int findAutoMakeSourceIndex(String[] tokens) { + for (int i = 0; i < tokens.length; i++) { + final String token = tokens[i].toLowerCase(); + if(token.indexOf("source=") != -1) //$NON-NLS-1$ + return i; + } + return -1; + } + } |