diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java
index 7a4a324107c..a89fa570c09 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ErrorParserManager.java
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.core;
@@ -14,6 +15,7 @@ import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@@ -42,8 +44,8 @@ public class ErrorParserManager extends OutputStream {
private IProject fProject;
private IMarkerGenerator fMarkerGenerator;
- private Map fFilesInProject;
- private List fNameConflicts;
+ // Maps a file name without directory to a IFile object or a list of a IFile objects.
+ private Map fFilesInProject; // Files or lists of files keyed by the file name
private Map fErrorParsers;
private ArrayList fErrors;
@@ -88,7 +90,6 @@ public class ErrorParserManager extends OutputStream {
private void initErrorParserManager(IPath workingDirectory) {
fFilesInProject = new HashMap();
- fNameConflicts = new ArrayList();
fDirectoryStack = new Vector();
fErrors = new ArrayList();
@@ -98,9 +99,18 @@ public class ErrorParserManager extends OutputStream {
for (int i = 0; i < collectedFiles.size(); i++) {
IFile file = (IFile) collectedFiles.get(i);
- Object existing = fFilesInProject.put(file.getName(), file);
+ String filename = file.getName();
+ Object existing = fFilesInProject.put(filename, file);
if (existing != null) {
- fNameConflicts.add(file.getName());
+ Collection files;
+ if (existing instanceof IFile) {
+ files = new ArrayList();
+ files.add(existing);
+ } else {
+ files = (Collection) existing;
+ }
+ files.add(file);
+ fFilesInProject.put(filename, files);
}
}
}
@@ -113,7 +123,7 @@ public class ErrorParserManager extends OutputStream {
if (fDirectoryStack.size() != 0) {
return (IPath) fDirectoryStack.lastElement();
}
- // Fallback to the Project Location
+ // Fall back to the Project Location
return fBaseDirectory;
}
@@ -168,7 +178,7 @@ public class ErrorParserManager extends OutputStream {
protected void collectFiles(IProject parent, final List result) {
try {
parent.accept(new IResourceProxyVisitor() {
- public boolean visit(IResourceProxy proxy) throws CoreException {
+ public boolean visit(IResourceProxy proxy) {
if (proxy.getType() == IResource.FILE) {
result.add(proxy.requestResource());
return false;
@@ -233,11 +243,35 @@ public class ErrorParserManager extends OutputStream {
}
/**
- * Called by the error parsers.
+ * Returns the project file with the given name if that file can be uniquely identified.
+ * Otherwise returns null
.
*/
public IFile findFileName(String fileName) {
IPath path = new Path(fileName);
- return (IFile) fFilesInProject.get(path.lastSegment());
+ Object obj = fFilesInProject.get(path.lastSegment());
+ if (obj == null || obj instanceof IFile) {
+ return (IFile) obj;
+ }
+ Collection files = (Collection) obj;
+ IFile matchingFile = null;
+ for (Iterator it = files.iterator(); it.hasNext();) {
+ IFile file = (IFile) it.next();
+ IPath location = file.getLocation();
+ boolean match = false;
+ if (path.isAbsolute()) {
+ match = path.equals(location);
+ } else {
+ int prefixLen = location.segmentCount() - path.segmentCount();
+ match = prefixLen >= 0 && location.removeFirstSegments(prefixLen).equals(path);
+ }
+ if (match) {
+ if (matchingFile != null) {
+ return null; // Ambiguous match
+ }
+ matchingFile = file;
+ }
+ }
+ return matchingFile;
}
protected IFile findFileInWorkspace(IPath path) {
@@ -263,11 +297,12 @@ public class ErrorParserManager extends OutputStream {
}
/**
- * Called by the error parsers.
+ * Returns true
if the project contains more than one file with the given name.
*/
public boolean isConflictingName(String fileName) {
IPath path = new Path(fileName);
- return fNameConflicts.contains(path.lastSegment());
+ Object obj = fFilesInProject.get(path.lastSegment());
+ return obj != null && !(obj instanceof IFile);
}
/**
@@ -347,7 +382,6 @@ public class ErrorParserManager extends OutputStream {
hasErrors = true;
}
-
/**
* Called by the error parsers. Return the previous line, save in the working buffer.
*/
@@ -357,7 +391,7 @@ public class ErrorParserManager extends OutputStream {
/**
* Method setOutputStream.
- * @param cos
+ * @param os
*/
public void setOutputStream(OutputStream os) {
outputStream = os;
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/ErrorPattern.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/ErrorPattern.java
index 5608bc5ae8b..59f6c7f298b 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/ErrorPattern.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/ErrorPattern.java
@@ -131,7 +131,7 @@ public class ErrorPattern {
IResource file = null;
if (fileName != null) {
file = eoParser.findFileName(fileName);
- if (file == null || eoParser.isConflictingName(fileName)) {
+ if (file == null) {
file = eoParser.findFilePath(fileName);
}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GASErrorParser.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GASErrorParser.java
index c2ac13d5939..f93d8d4bb48 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GASErrorParser.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GASErrorParser.java
@@ -50,11 +50,7 @@ public class GASErrorParser implements IErrorParser {
file = eoParser.findFileName(fileName);
}
}
- boolean isConflicting = false;
- if (file != null) {
- isConflicting = eoParser.isConflictingName(fileName);
- file = null;
- } else {
+ if (file == null) {
file = eoParser.findFileName(fileName);
}
if (file == null) {