diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 4e88eda1c50..484ffe708aa 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,13 @@ +2004-11-14 Alain Magloire + Fix for PR 77546. + Make the error parser manager faster by + using IResourceProxyVisitor to get the files. + Use eoParser.findFileName() faster. + * src/org/eclipse/cdt/core/ErrorParserManager.java + * src/org/eclipse/cdt/core/internal/errorparsers/GASErrorParser.java + * src/org/eclipse/cdt/core/internal/errorparsers/GCCErrorParser.java + * src/org/eclipse/cdt/core/internal/errorparsers/GLDErrorarser.java + 2004-11-11 Alain Magloire PR 78573, patch from Brad Jarvinen * src/org/eclipse/cdt/internal/errorparser/VCErroParser.java 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 2efd2456915..06830d5c919 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 @@ -17,10 +17,11 @@ import java.util.Map; import java.util.Vector; import org.eclipse.cdt.core.resources.ACBuilder; -import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceProxy; +import org.eclipse.core.resources.IResourceProxyVisitor; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; @@ -83,19 +84,15 @@ public class ErrorParserManager extends OutputStream { fDirectoryStack = new Vector(); fErrors = new ArrayList(); - // prepare file lists - fFilesInProject.clear(); - fNameConflicts.clear(); - List collectedFiles = new ArrayList(); fBaseDirectory = (workingDirectory == null || workingDirectory.isEmpty()) ? fProject.getLocation() : workingDirectory; collectFiles(fProject, collectedFiles); for (int i = 0; i < collectedFiles.size(); i++) { - IFile curr = (IFile) collectedFiles.get(i); - Object existing = fFilesInProject.put(curr.getName(), curr); + IFile file = (IFile) collectedFiles.get(i); + Object existing = fFilesInProject.put(file.getName(), file); if (existing != null) { - fNameConflicts.add(curr.getName()); + fNameConflicts.add(file.getName()); } } } @@ -156,17 +153,17 @@ public class ErrorParserManager extends OutputStream { } } - protected void collectFiles(IContainer parent, List result) { + protected void collectFiles(IProject parent, final List result) { try { - IResource[] resources = parent.members(); - for (int i = 0; i < resources.length; i++) { - IResource resource = resources[i]; - if (resource instanceof IFile) { - result.add(resource); - } else if (resource instanceof IContainer) { - collectFiles((IContainer) resource, result); + parent.accept(new IResourceProxyVisitor() { + public boolean visit(IResourceProxy proxy) throws CoreException { + if (proxy.getType() == IResource.FILE) { + result.add(proxy.requestResource()); + return false; + } + return true; } - } + }, IResource.NONE); } catch (CoreException e) { CCorePlugin.log(e.getStatus()); } 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 bda398f0985..383090ec592 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 @@ -41,11 +41,18 @@ public class GASErrorParser implements IErrorParser { desc = line.substring(secondColon + 2); } } - file = eoParser.findFilePath(fileName); + file = eoParser.findFileName(fileName); } } + boolean isConflicting = false; + if (file != null) { + isConflicting = eoParser.isConflictingName(fileName); + file = null; + } else { + file = eoParser.findFileName(fileName); + } if (file == null) { - desc = fileName + " " + desc; //$NON-NLS-1$ + desc = fileName + ":" + desc; //$NON-NLS-1$ } eoParser.generateMarker(file, num, desc, severity, null); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GCCErrorParser.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GCCErrorParser.java index 0a507250ee6..51b24a94afc 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GCCErrorParser.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GCCErrorParser.java @@ -9,6 +9,8 @@ import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.IErrorParser; import org.eclipse.cdt.core.IMarkerGenerator; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; public class GCCErrorParser implements IErrorParser { @@ -211,16 +213,39 @@ public class GCCErrorParser implements IErrorParser { } } - IFile file = eoParser.findFilePath(fileName); - - if (file == null) { - // Parse the entire project. - file = eoParser.findFileName(fileName); - if (file != null) { - // If there is a conflict set the error on the project. - if (eoParser.isConflictingName(fileName)) { - desc = "*" + desc; //$NON-NLS-1$ - file = null; + // The pattern is to generall we have to guard: + // Before making this pattern a marker we do one more check + // The fileName that we extract __must__ look like a valid file name. + // We been having to much bad hits with patterns like + // /bin/sh ../libtool --mode=link gcc -version-info 0:1:0 foo.lo var.lo + // Things like libtool that will fool the parser because of "0:1:0" + if (!Path.EMPTY.isValidPath(fileName)) { + return false; + } + IFile file = eoParser.findFileName(fileName); + if (file != null) { + if (eoParser.isConflictingName(fileName)) { + desc = "[Conflicting names: " + fileName + " ] " + desc; //$NON-NLS-1$ //$NON-NLS-2$ + file = null; + } + } else { + file = eoParser.findFilePath(fileName); + if (file == null) { + // one last try before bailing out we may be in a wrong + // directory. This will happen, for example in the Makefile: + // all: foo.c + // cd src3; gcc -c bar/foo.c + // the user do a cd(1). + IPath path = new Path(fileName); + if (path.segmentCount() > 1) { + String name = path.lastSegment(); + file = eoParser.findFileName(fileName); + if (file != null) { + if (eoParser.isConflictingName(fileName)) { + desc = "[Conflicting names: " + name + " ] " + desc; //$NON-NLS-1$ //$NON-NLS-2$ + file = null; + } + } } } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GLDErrorParser.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GLDErrorParser.java index 8f0d29dd880..4b72ed1baa8 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GLDErrorParser.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/errorparsers/GLDErrorParser.java @@ -9,6 +9,7 @@ import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.IErrorParser; import org.eclipse.cdt.core.IMarkerGenerator; import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.Path; public class GLDErrorParser implements IErrorParser { @@ -37,15 +38,29 @@ public class GLDErrorParser implements IErrorParser { if (colon != -1) { previous = previous.substring(colon + 1); } - + + // The pattern is to generall we have to guard: + // Before making this pattern a marker we do one more check + // The fileName that we extract __must__ look like a valid file name. + // We been having to much bad hits with patterns like + // /bin/sh ../libtool --mode=link gcc -version-info 0:1:0 foo.lo var.lo + // Things like libtool that will fool the parser because of "0:1:0" + if (!Path.EMPTY.isValidPath(fileName)) { + return false; + } + desc = "*" + previous + " " + desc; //$NON-NLS-1$ //$NON-NLS-2$ - // Since we do not have any way to know the name of the C file - // where the undefined reference is refering we set the error - // on the project. - IFile file = eoParser.findFilePath(fileName); + IFile file = eoParser.findFileName(fileName); + if (file != null) { + if (eoParser.isConflictingName(fileName)) { + file = null; + } + } else { + file = eoParser.findFilePath(fileName); + } if (file == null) { desc = fileName + " " + desc; //$NON-NLS-1$ - } + } eoParser.generateMarker(file, 0, desc, IMarkerGenerator.SEVERITY_ERROR_RESOURCE, null); } else if (buf.endsWith("ld")){ //$NON-NLS-1$ // By default treat the condition as fatal/error, unless marked as a warning @@ -56,7 +71,14 @@ public class GLDErrorParser implements IErrorParser { } String fileName = line.substring(0, firstColon); - IFile file = eoParser.findFilePath(fileName); + IFile file = eoParser.findFileName(fileName); + if (file != null) { + if (eoParser.isConflictingName(fileName)) { + file = null; + } + } else { + file = eoParser.findFilePath(fileName); + } if (file == null) { desc = fileName + " " + desc; //$NON-NLS-1$ }