diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/ErrorParserFileMatchingTest.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/ErrorParserFileMatchingTest.java index 124e49667cc..5d7f1e6cb42 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/ErrorParserFileMatchingTest.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/ErrorParserFileMatchingTest.java @@ -28,6 +28,7 @@ import org.eclipse.cdt.core.errorparsers.ErrorPattern; import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.core.internal.registry.ExtensionRegistry; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; @@ -1121,4 +1122,119 @@ public class ErrorParserFileMatchingTest extends TestCase { assertEquals("error",problemMarkerInfo.description); } + /** + * Checks if a file from error output can be found. + * + * @throws Exception... + */ + public void testPushDirectory() throws Exception { + String fileName = "testPushDirectory.c"; + ResourceHelper.createFolder(fProject, "Folder"); + ResourceHelper.createFile(fProject, fileName); + ResourceHelper.createFile(fProject, "Folder/"+fileName); + + String lines = "make[0]: Entering directory `Folder'\n" + + fileName+":1:error\n"; + + String[] errorParsers = {MAKE_ERRORPARSER_ID, mockErrorParserId }; + parseOutput(fProject, fProject.getLocation(), errorParsers, lines); + assertEquals(1, errorList.size()); + + ProblemMarkerInfo problemMarkerInfo = errorList.get(0); + assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString()); + assertEquals(1,problemMarkerInfo.lineNumber); + assertEquals("error",problemMarkerInfo.description); + } + + /** + * Checks if a file from error output can be found. + * + * @throws Exception... + */ + public void testPushAbsoluteDirectory() throws Exception { + String fileName = "testPushAbsoluteDirectory.c"; + IFolder folder = ResourceHelper.createFolder(fProject, "Folder"); + ResourceHelper.createFile(fProject, fileName); + ResourceHelper.createFile(fProject, "Folder/"+fileName); + + IPath absoluteDir = folder.getLocation(); + Assert.assertTrue(absoluteDir.isAbsolute()); + + String lines = "make[0]: Entering directory `" + absoluteDir + "'\n" + + fileName+":1:error\n"; + + String[] errorParsers = {MAKE_ERRORPARSER_ID, mockErrorParserId }; + parseOutput(fProject, fProject.getLocation(), errorParsers, lines); + assertEquals(1, errorList.size()); + + ProblemMarkerInfo problemMarkerInfo = errorList.get(0); + assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString()); + assertEquals(1,problemMarkerInfo.lineNumber); + assertEquals("error",problemMarkerInfo.description); + } + + /** + * Checks if a file from error output can be found. + * + * @throws Exception... + */ + public void testPopDirectory() throws Exception { + String fileName = "testPopDirectory.c"; + + ResourceHelper.createFolder(fProject, "Folder"); + ResourceHelper.createFolder(fProject, "Folder/SubFolder"); + + ResourceHelper.createFile(fProject, fileName); + ResourceHelper.createFile(fProject, "Folder/"+fileName); + ResourceHelper.createFile(fProject, "Folder/SubFolder/"+fileName); + + String lines = "make[1]: Entering directory `Folder'\n" + + "make[2]: Entering directory `SubFolder'\n" + + "make[2]: Leaving directory `SubFolder'\n" + + fileName+":1:error\n"; + + String[] errorParsers = {MAKE_ERRORPARSER_ID, mockErrorParserId }; + parseOutput(fProject, fProject.getLocation(), errorParsers, lines); + assertEquals(1, errorList.size()); + + ProblemMarkerInfo problemMarkerInfo = errorList.get(0); + assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString()); + assertEquals(1,problemMarkerInfo.lineNumber); + assertEquals("error",problemMarkerInfo.description); + } + + /** + * Checks if a file from error output can be found. + * + * @throws Exception... + */ + public void testPushDirectoryAndCache() throws Exception { + String fileName = "testPushDirectoryCacheProblem.c"; + ResourceHelper.createFolder(fProject, "Folder"); + ResourceHelper.createFile(fProject, fileName); + ResourceHelper.createFile(fProject, "Folder/"+fileName); + + String lines = fileName+":1:error\n" + + "make[0]: Entering directory `Folder'\n" + + fileName+":1:error\n"; + + String[] errorParsers = {MAKE_ERRORPARSER_ID, mockErrorParserId }; + parseOutput(fProject, fProject.getLocation(), errorParsers, lines); + assertEquals(2, errorList.size()); + + { + ProblemMarkerInfo problemMarkerInfo = errorList.get(0); + assertEquals("L/FindMatchingFilesTest/"+fileName,problemMarkerInfo.file.toString()); + assertEquals(1,problemMarkerInfo.lineNumber); + assertEquals("error",problemMarkerInfo.description); + } + + { + ProblemMarkerInfo problemMarkerInfo = errorList.get(1); + assertEquals("L/FindMatchingFilesTest/Folder/"+fileName,problemMarkerInfo.file.toString()); + assertEquals(1,problemMarkerInfo.lineNumber); + assertEquals("error",problemMarkerInfo.description); + } + } + } 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 22593c1b8b3..3da93073867 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 @@ -54,7 +54,7 @@ public class ErrorParserManager extends OutputStream { private ArrayList fErrors; private Vector fDirectoryStack; - private IPath fBaseDirectory; + private final IPath fBaseDirectory; private String previousLine; private OutputStream outputStream; @@ -65,6 +65,7 @@ public class ErrorParserManager extends OutputStream { private boolean hasErrors = false; private String cachedFileName = null; + private IPath cachedWorkingDirectory = null; private IFile cachedFile = null; private static boolean isCygwin = true; @@ -155,14 +156,10 @@ public class ErrorParserManager extends OutputStream { */ public void pushDirectory(IPath dir) { if (dir != null) { - IPath pwd = null; - if (fBaseDirectory.isPrefixOf(dir)) { - int segments = fBaseDirectory.matchingFirstSegments(dir); - pwd = dir.removeFirstSegments(segments); - } else { - pwd = dir; - } - fDirectoryStack.addElement(pwd); + if (dir.isAbsolute()) + fDirectoryStack.addElement(dir); + else + fDirectoryStack.addElement(getWorkingDirectory().append(dir)); } } @@ -266,7 +263,7 @@ public class ErrorParserManager extends OutputStream { * @return - file in the workspace or {@code null}. */ public IFile findFileName(String fileName) { - if (fileName.equals(cachedFileName)) + if (fileName.equals(cachedFileName) && getWorkingDirectory().equals(cachedWorkingDirectory)) return cachedFile; IPath path = new Path(fileName); @@ -290,6 +287,7 @@ public class ErrorParserManager extends OutputStream { } cachedFileName = fileName; + cachedWorkingDirectory = getWorkingDirectory(); cachedFile = file; return file; } @@ -430,7 +428,6 @@ public class ErrorParserManager extends OutputStream { if (nOpens > 0 && --nOpens == 0) { checkLine(true); fDirectoryStack.removeAllElements(); - fBaseDirectory = null; if (outputStream != null) outputStream.close(); }