From c64385f973d8570fa53324441111dfdf103aa9ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norbert=20Pl=F6tt?= Date: Mon, 20 Nov 2006 08:14:14 +0000 Subject: [PATCH] Fix for #151005 - Error parser - cannot generate proper marker for file outside of the workspace --- .../makefile/gnu/GNUMakefileValidator.java | 31 ++++- .../scannerconfig2/SCMarkerGenerator.java | 37 +++-- .../tests/GenericErrorParserTests.java | 21 ++- .../eclipse/cdt/core/model/ICModelMarker.java | 6 + core/org.eclipse.cdt.core/plugin.xml | 1 + .../eclipse/cdt/core/ErrorParserManager.java | 49 ++----- .../eclipse/cdt/core/IMarkerGenerator.java | 5 + .../eclipse/cdt/core/ProblemMarkerInfo.java | 46 ++++++ .../eclipse/cdt/core/resources/ACBuilder.java | 38 +++-- .../internal/errorparsers/ErrorPattern.java | 41 +++++- core/org.eclipse.cdt.ui/plugin.properties | 1 + core/org.eclipse.cdt.ui/plugin.xml | 12 ++ .../internal/ui/editor/CDocumentProvider.java | 16 ++- .../editor/ExternalSearchAnnotationModel.java | 53 ++++--- .../ExternalSearchDocumentProvider.java | 28 ++-- .../cdt/internal/ui/util/EditorUtility.java | 2 +- .../internal/ui/util/ExternalEditorInput.java | 25 +++- .../ui/util/OpenExternalProblemAction.java | 131 ++++++++++++++++++ 18 files changed, 433 insertions(+), 110 deletions(-) create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ProblemMarkerInfo.java create mode 100644 core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/util/OpenExternalProblemAction.java diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefileValidator.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefileValidator.java index 16d2e225c0a..1fca7eb5d98 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefileValidator.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/makefile/gnu/GNUMakefileValidator.java @@ -16,6 +16,7 @@ import java.io.InputStreamReader; import java.io.Reader; import org.eclipse.cdt.core.IMarkerGenerator; +import org.eclipse.cdt.core.ProblemMarkerInfo; import org.eclipse.cdt.make.core.makefile.IBadDirective; import org.eclipse.cdt.make.core.makefile.IDirective; import org.eclipse.cdt.make.core.makefile.IMakefileValidator; @@ -49,22 +50,38 @@ public class GNUMakefileValidator implements IMakefileValidator { reporter = new IMarkerGenerator() { public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { + ProblemMarkerInfo problemMarkerInfo = new ProblemMarkerInfo(file, lineNumber, errorDesc, severity, errorVar, null); + addMarker(problemMarkerInfo); + } + + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.IMarkerGenerator#addMarker(org.eclipse.cdt.core.ProblemMarkerInfo) + */ + public void addMarker(ProblemMarkerInfo problemMarkerInfo) { String name = "Makefile"; //$NON-NLS-1$ - if (file != null) { - name = file.getName(); + if (problemMarkerInfo.file != null) { + name = problemMarkerInfo.file.getName(); } StringBuffer sb = new StringBuffer(name); - sb.append(':').append(lineNumber).append(':').append(getSeverity(severity)); - if (errorDesc != null) { - sb.append(':').append(errorDesc); + sb.append(':').append(problemMarkerInfo.lineNumber).append(':').append(getSeverity(problemMarkerInfo.severity)); + if (problemMarkerInfo.description != null) { + sb.append(':').append(problemMarkerInfo.description); } - if (errorVar != null ) { - sb.append(':').append(errorVar); + if (problemMarkerInfo.variableName != null ) { + sb.append(':').append(problemMarkerInfo.variableName); + } + if (problemMarkerInfo.externalPath != null ) { + sb.append(':').append(problemMarkerInfo.externalPath); } sb.append('\n'); System.out.println(sb.toString()); + } + + public String getSeverity(int severity) { if (severity == IMarkerGenerator.SEVERITY_ERROR_BUILD) { return MakefileMessages.getString("MakefileValidator.errorBuild"); //$NON-NLS-1$ diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCMarkerGenerator.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCMarkerGenerator.java index 6ffaa37ebae..4badaee97e5 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCMarkerGenerator.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig2/SCMarkerGenerator.java @@ -15,6 +15,7 @@ import java.util.List; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IMarkerGenerator; +import org.eclipse.cdt.core.ProblemMarkerInfo; import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; @@ -39,8 +40,18 @@ public class SCMarkerGenerator implements IMarkerGenerator { * @see org.eclipse.cdt.core.IMarkerGenerator#addMarker(org.eclipse.core.resources.IResource, int, java.lang.String, int, java.lang.String) */ public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { + ProblemMarkerInfo info = new ProblemMarkerInfo(file, lineNumber, errorDesc, severity, errorVar); + addMarker(info); + } + + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.IMarkerGenerator#addMarker(org.eclipse.cdt.core.ProblemMarkerInfo) + */ + public void addMarker(ProblemMarkerInfo problemMarkerInfo) { try { - IMarker[] cur = file.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ONE); + IMarker[] cur = problemMarkerInfo.file.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ONE); /* * Try to find matching markers and don't put in duplicates */ @@ -49,29 +60,33 @@ public class SCMarkerGenerator implements IMarkerGenerator { int line = ((Integer) cur[i].getAttribute(IMarker.LOCATION)).intValue(); int sev = ((Integer) cur[i].getAttribute(IMarker.SEVERITY)).intValue(); String mesg = (String) cur[i].getAttribute(IMarker.MESSAGE); - if (line == lineNumber && sev == mapMarkerSeverity(severity) && mesg.equals(errorDesc)) { + if (line == problemMarkerInfo.lineNumber && sev == mapMarkerSeverity(problemMarkerInfo.severity) && mesg.equals(problemMarkerInfo.description)) { return; } } } - IMarker marker = file.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER); - marker.setAttribute(IMarker.LOCATION, lineNumber); - marker.setAttribute(IMarker.MESSAGE, errorDesc); - marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(severity)); - marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + IMarker marker = problemMarkerInfo.file.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER); + marker.setAttribute(IMarker.LOCATION, problemMarkerInfo.lineNumber); + marker.setAttribute(IMarker.MESSAGE, problemMarkerInfo.description); + marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(problemMarkerInfo.severity)); + marker.setAttribute(IMarker.LINE_NUMBER, problemMarkerInfo.lineNumber); marker.setAttribute(IMarker.CHAR_START, -1); marker.setAttribute(IMarker.CHAR_END, -1); - if (errorVar != null) { - marker.setAttribute(ICModelMarker.C_MODEL_MARKER_VARIABLE, errorVar); + if (problemMarkerInfo.variableName != null) { + marker.setAttribute(ICModelMarker.C_MODEL_MARKER_VARIABLE, problemMarkerInfo.variableName); + } + if (problemMarkerInfo.externalPath != null) { + marker.setAttribute(ICModelMarker.C_MODEL_MARKER_EXTERNAL_LOCATION, problemMarkerInfo.externalPath.toOSString()); } } catch (CoreException e) { CCorePlugin.log(e.getStatus()); } - } + + } - public void removeMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { + public void removeMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { IWorkspace workspace = file.getWorkspace(); // remove specific marker try { diff --git a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/GenericErrorParserTests.java b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/GenericErrorParserTests.java index a5a1ed26a93..e05ed391720 100644 --- a/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/GenericErrorParserTests.java +++ b/core/org.eclipse.cdt.core.tests/misc/org/eclipse/cdt/core/internal/errorparsers/tests/GenericErrorParserTests.java @@ -22,6 +22,7 @@ import junit.framework.TestCase; import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.IMarkerGenerator; +import org.eclipse.cdt.core.ProblemMarkerInfo; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -181,21 +182,31 @@ public class GenericErrorParserTests extends TestCase { private Comparator fFileNameComparator; public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { - int index = Collections.binarySearch(uniqFiles, file, fFileNameComparator); + ProblemMarkerInfo problemMarkerInfo = new ProblemMarkerInfo(file, lineNumber, errorDesc, severity, errorVar, null); + addMarker(problemMarkerInfo); + } + + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.IMarkerGenerator#addMarker(org.eclipse.cdt.core.ProblemMarkerInfo) + */ + public void addMarker(ProblemMarkerInfo problemMarkerInfo) { + int index = Collections.binarySearch(uniqFiles, problemMarkerInfo.file, fFileNameComparator); if (index < 0) { - uniqFiles.add(-1 * (index + 1), file); + uniqFiles.add(-1 * (index + 1), problemMarkerInfo.file); } - if (severity == SEVERITY_WARNING) { + if (problemMarkerInfo.severity == SEVERITY_WARNING) { numWarnings++; - } else if (severity == SEVERITY_ERROR_BUILD || severity == SEVERITY_ERROR_RESOURCE) { + } else if (problemMarkerInfo.severity == SEVERITY_ERROR_BUILD || problemMarkerInfo.severity == SEVERITY_ERROR_RESOURCE) { numErrors++; } - lastDescription = errorDesc; + lastDescription = problemMarkerInfo.description; numMarkers++; } + public CountingMarkerGenerator() { numErrors = 0; numWarnings = 0; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICModelMarker.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICModelMarker.java index 0e2136fd8df..9e7a72cc370 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICModelMarker.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICModelMarker.java @@ -37,6 +37,12 @@ public interface ICModelMarker { */ public static final String C_MODEL_MARKER_VARIABLE = "problem.variable"; //$NON-NLS-1$ + /** + * C model extension to the marker problem markers which may hold + * the path to the workspace external location of the file containing the problem + */ + public static final String C_MODEL_MARKER_EXTERNAL_LOCATION = "problem.externalLocation"; //$NON-NLS-1$ + /** * C model task marker type (value "org.eclipse.cdt.core.task"). * This can be used to recognize task markers in the workspace that correspond to tasks diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml index eed37a0a9b5..3af219c5684 100644 --- a/core/org.eclipse.cdt.core/plugin.xml +++ b/core/org.eclipse.cdt.core/plugin.xml @@ -192,6 +192,7 @@ + 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 85a6f235f87..e6b0e32e3cf 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 @@ -334,33 +334,24 @@ public class ErrorParserManager extends OutputStream { return (file != null && file.exists()) ? file : null; } - protected class Problem { - protected IResource file; - protected int lineNumber; - protected String description; - protected int severity; - protected String variableName; - - public Problem(IResource file, int lineNumber, String desciption, int severity, String variableName) { - this.file = file; - this.lineNumber = lineNumber; - this.description = desciption; - this.severity = severity; - this.variableName = variableName; - } - } - /** * Called by the error parsers. */ public void generateMarker(IResource file, int lineNumber, String desc, int severity, String varName) { - Problem problem = new Problem(file, lineNumber, desc, severity, varName); - fErrors.add(problem); - + generateExternalMarker(file, lineNumber, desc, severity, varName, null); + } + + /** + * Called by the error parsers for external problem markers + */ + public void generateExternalMarker(IResource file, int lineNumber, String desc, int severity, String varName, IPath externalPath) { + ProblemMarkerInfo problemMarkerInfo = new ProblemMarkerInfo(file, lineNumber, desc, severity, varName, externalPath); + fErrors.add(problemMarkerInfo); if (severity == IMarkerGenerator.SEVERITY_ERROR_RESOURCE) hasErrors = true; } + /** * Called by the error parsers. Return the previous line, save in the working buffer. */ @@ -456,25 +447,11 @@ public class ErrorParserManager extends OutputStream { if (nOpens == 0) { Iterator iter = fErrors.iterator(); while (iter.hasNext()) { - Problem problem = (Problem) iter.next(); - if (problem.severity == IMarkerGenerator.SEVERITY_ERROR_BUILD) { + ProblemMarkerInfo problemMarkerInfo = (ProblemMarkerInfo) iter.next(); + if (problemMarkerInfo.severity == IMarkerGenerator.SEVERITY_ERROR_BUILD) { reset = true; } - if (problem.file == null) { - fMarkerGenerator.addMarker( - fProject, - problem.lineNumber, - problem.description, - problem.severity, - problem.variableName); - } else { - fMarkerGenerator.addMarker( - problem.file, - problem.lineNumber, - problem.description, - problem.severity, - problem.variableName); - } + fMarkerGenerator.addMarker(problemMarkerInfo); } fErrors.clear(); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IMarkerGenerator.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IMarkerGenerator.java index 608597cdac1..aa5df64177e 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IMarkerGenerator.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/IMarkerGenerator.java @@ -21,5 +21,10 @@ public interface IMarkerGenerator { int SEVERITY_ERROR_RESOURCE = 2; int SEVERITY_ERROR_BUILD = 3; + /** + * callback from Output Parser + * @deprecated Use public void addMarker(org.eclipse.cdt.core.ProblemMarkerInfo problem) instead. + */ void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar); + void addMarker(ProblemMarkerInfo problemMarkerInfo); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ProblemMarkerInfo.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ProblemMarkerInfo.java new file mode 100644 index 00000000000..ab018846e00 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ProblemMarkerInfo.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2006 Siemens AG. + * All rights reserved. This content 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Norbert Ploett - Initial implementation + *******************************************************************************/ + +package org.eclipse.cdt.core; + +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; + +public class ProblemMarkerInfo { + + public IResource file; + public int lineNumber; + public String description; + public int severity; + public String variableName; + public IPath externalPath ; + + public ProblemMarkerInfo(IResource file, int lineNumber, String desciption, int severity, String variableName) { + this.file = file; + this.lineNumber = lineNumber; + this.description = desciption; + this.severity = severity; + this.variableName = variableName; + this.externalPath = null ; + } + + + public ProblemMarkerInfo(IResource file, int lineNumber, String description, int severity, String variableName, IPath externalPath) { + super(); + this.file = file; + this.lineNumber = lineNumber; + this.description = description; + this.severity = severity; + this.variableName = variableName; + this.externalPath = externalPath; + } + +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java index 63f0a7d4a61..8328d5fe34a 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/ACBuilder.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.resources; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IMarkerGenerator; +import org.eclipse.cdt.core.ProblemMarkerInfo; import org.eclipse.cdt.core.model.ICModelMarker; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; @@ -28,13 +29,21 @@ public abstract class ACBuilder extends IncrementalProjectBuilder implements IMa super(); } - /* - * callback from Output Parser - */ public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { + ProblemMarkerInfo problemMarkerInfo = new ProblemMarkerInfo(file, lineNumber, errorDesc, severity, errorVar, null); + addMarker(problemMarkerInfo); + } + /* + * callback from Output Parser + */ + public void addMarker(ProblemMarkerInfo problemMarkerInfo) { try { - IMarker[] cur = file.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ONE); + IResource markerResource = problemMarkerInfo.file ; + if (markerResource==null) { + markerResource = getProject(); + } + IMarker[] cur = markerResource.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_ONE); /* * Try to find matching markers and don't put in duplicates */ @@ -43,21 +52,24 @@ public abstract class ACBuilder extends IncrementalProjectBuilder implements IMa int line = ((Integer) cur[i].getAttribute(IMarker.LOCATION)).intValue(); int sev = ((Integer) cur[i].getAttribute(IMarker.SEVERITY)).intValue(); String mesg = (String) cur[i].getAttribute(IMarker.MESSAGE); - if (line == lineNumber && sev == mapMarkerSeverity(severity) && mesg.equals(errorDesc)) { + if (line == problemMarkerInfo.lineNumber && sev == mapMarkerSeverity(problemMarkerInfo.severity) && mesg.equals(problemMarkerInfo.description)) { return; } } } - - IMarker marker = file.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER); - marker.setAttribute(IMarker.LOCATION, lineNumber); - marker.setAttribute(IMarker.MESSAGE, errorDesc); - marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(severity)); - marker.setAttribute(IMarker.LINE_NUMBER, lineNumber); + + IMarker marker = markerResource.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER); + marker.setAttribute(IMarker.LOCATION, problemMarkerInfo.lineNumber); + marker.setAttribute(IMarker.MESSAGE, problemMarkerInfo.description); + marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(problemMarkerInfo.severity)); + marker.setAttribute(IMarker.LINE_NUMBER, problemMarkerInfo.lineNumber); marker.setAttribute(IMarker.CHAR_START, -1); marker.setAttribute(IMarker.CHAR_END, -1); - if (errorVar != null) { - marker.setAttribute(ICModelMarker.C_MODEL_MARKER_VARIABLE, errorVar); + if (problemMarkerInfo.variableName != null) { + marker.setAttribute(ICModelMarker.C_MODEL_MARKER_VARIABLE, problemMarkerInfo.variableName); + } + if (problemMarkerInfo.externalPath != null) { + marker.setAttribute(ICModelMarker.C_MODEL_MARKER_EXTERNAL_LOCATION, problemMarkerInfo.externalPath.toOSString()); } } catch (CoreException e) { 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 802173cd7e2..c37c8b80278 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 @@ -11,11 +11,18 @@ package org.eclipse.cdt.internal.errorparsers; +import java.io.File; +import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.cdt.core.ErrorParserManager; +import org.eclipse.cdt.utils.CygPath; +import org.eclipse.cdt.utils.DefaultCygwinToolFactory; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; /** * @author Doug Schaefer @@ -121,8 +128,9 @@ public class ErrorPattern { int lineNum = getLineNum(matcher); String desc = getDesc(matcher); String varName = getVarName(matcher); + IPath externalPath = null ; - IFile file = null; + IResource file = null; if (fileName != null) { file = eoParser.findFileName(fileName); if (file == null || eoParser.isConflictingName(fileName)) { @@ -130,11 +138,40 @@ public class ErrorPattern { } if (file == null) { + // If the file is not found in the workspace we attach the problem to the project + // and add the external path to the file. desc = fileName + " " + desc; //$NON-NLS-1$ + file = eoParser.getProject(); + externalPath = getLocation(fileName); } } - eoParser.generateMarker(file, lineNum, desc, severity, varName); + eoParser.generateExternalMarker(file, lineNum, desc, severity, varName, externalPath); return true; } + + /** + * If the file designated by filename exists, return the IPath representation of the filename + * If it does not exist, try cygpath translation + */ + protected IPath getLocation(String filename) { + IPath path = new Path(filename); + File file = path.toFile() ; + if (!file.exists()) { + CygPath cygpath = null ; + try { + cygpath = new CygPath("cygpath"); + String cygfilename = cygpath.getFileName(filename); + path = new Path(cygfilename); + } catch (IOException e) { + } + finally { + if (null!=cygpath) { + cygpath.dispose(); + } + } + } + return path ; + } + } diff --git a/core/org.eclipse.cdt.ui/plugin.properties b/core/org.eclipse.cdt.ui/plugin.properties index 66a450b146c..bf296de1a79 100644 --- a/core/org.eclipse.cdt.ui/plugin.properties +++ b/core/org.eclipse.cdt.ui/plugin.properties @@ -156,6 +156,7 @@ ShowInvisibleCharactersAction.description=Show invisible (whitespace) characters # Task Action DeleteTaskAction.label=Delete C/C++ Markers DeleteIProblemMarkerAction.label=Delete IProblem Markers +OpenExternalProblemAction.label=Open external location # Common Editor ruler actions AddTask.label=Add &Task... diff --git a/core/org.eclipse.cdt.ui/plugin.xml b/core/org.eclipse.cdt.ui/plugin.xml index 8a6d883b525..88011c52cd5 100644 --- a/core/org.eclipse.cdt.ui/plugin.xml +++ b/core/org.eclipse.cdt.ui/plugin.xml @@ -745,6 +745,18 @@ value="org.eclipse.cdt.core.indexermarker" name="type"/> + + + + diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java index f44419d3af9..8f52f0d4988 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/CDocumentProvider.java @@ -19,6 +19,7 @@ import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceRuleFactory; +import org.eclipse.core.resources.IStorage; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -31,6 +32,7 @@ import org.eclipse.jface.text.ILineTracker; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.TextUtilities; import org.eclipse.jface.text.source.Annotation; +import org.eclipse.jface.text.source.AnnotationModel; import org.eclipse.jface.text.source.AnnotationModelEvent; import org.eclipse.jface.text.source.IAnnotationAccessExtension; import org.eclipse.jface.text.source.IAnnotationModel; @@ -854,13 +856,13 @@ public class CDocumentProvider extends TextFileDocumentProvider { tuInfo.fCopy = copy; if (tuInfo.fModel == null && element instanceof IStorageEditorInput) { -// IStorage storage= ((IStorageEditorInput)element).getStorage(); -// IResource markerResource= original.getCProject().getProject(); -// tuInfo.fModel= new ExternalSearchAnnotationModel(markerResource, storage); -// IAnnotationModel fileBufferAnnotationModel= tuInfo.fTextFileBuffer.getAnnotationModel(); -// if (fileBufferAnnotationModel != null) { -// ((AnnotationModel)tuInfo.fModel).addAnnotationModel("secondaryModel", fileBufferAnnotationModel); //$NON-NLS-1$ -// } + IStorage storage= ((IStorageEditorInput)element).getStorage(); + IResource markerResource= original.getCProject().getProject(); + tuInfo.fModel= new ExternalSearchAnnotationModel(markerResource, storage); + IAnnotationModel fileBufferAnnotationModel= tuInfo.fTextFileBuffer.getAnnotationModel(); + if (fileBufferAnnotationModel != null) { + ((AnnotationModel)tuInfo.fModel).addAnnotationModel("secondaryModel", fileBufferAnnotationModel); //$NON-NLS-1$ + } } if (tuInfo.fModel instanceof TranslationUnitAnnotationModel) { TranslationUnitAnnotationModel model= (TranslationUnitAnnotationModel) tuInfo.fModel; diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchAnnotationModel.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchAnnotationModel.java index 895bf754eca..e0f7bfca2da 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchAnnotationModel.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchAnnotationModel.java @@ -15,43 +15,64 @@ import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IStorage; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.CoreException; -import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel; +import org.eclipse.cdt.core.model.ICModelMarker; public class ExternalSearchAnnotationModel extends - AbstractMarkerAnnotationModel implements IResourceChangeListener { + ResourceMarkerAnnotationModel implements IResourceChangeListener { protected IWorkspace fWorkspace; - protected IResource fMarkerResource; + protected IStorage fStorage; protected boolean fChangesApplied; - + /** * @param resource */ - public ExternalSearchAnnotationModel(IResource resource) { - this.fMarkerResource = resource; + public ExternalSearchAnnotationModel(IResource resource, IStorage storage) { + super(resource); this.fWorkspace = resource.getWorkspace(); + this.fStorage = storage; } protected IMarker[] retrieveMarkers() throws CoreException { - if (fMarkerResource != null) - return fMarkerResource.findMarkers(IMarker.MARKER, true, IResource.DEPTH_INFINITE); - return null; - } - - protected void deleteMarkers(IMarker[] markers) throws CoreException { - } - - protected void listenToMarkerChanges(boolean listen) { + IMarker[] markers = null; + if (getResource() != null) { + markers = getResource().findMarkers(IMarker.MARKER, true, + IResource.DEPTH_ZERO); + } + return markers; } protected boolean isAcceptable(IMarker marker) { - return false; + boolean acceptable = false; + String externalFileName = marker.getAttribute( + ICModelMarker.C_MODEL_MARKER_EXTERNAL_LOCATION, null); + if (externalFileName != null) { // Only accept markers with external + // paths set + IPath externalPath = new Path(externalFileName); + IPath storagePath = fStorage.getFullPath(); + acceptable = externalPath.equals(storagePath); // Only accept + // markers for this + // annotation + // model's external + // editor + } + return acceptable; } + /* + * (non-Javadoc) + * + * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) + */ public void resourceChanged(IResourceChangeEvent event) { + } } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchDocumentProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchDocumentProvider.java index 6212f1a9261..a21e5d1370c 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchDocumentProvider.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/editor/ExternalSearchDocumentProvider.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.internal.ui.util.ExternalEditorInput; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IStorage; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.IDocument; @@ -54,26 +55,31 @@ public class ExternalSearchDocumentProvider extends FileDocumentProvider { IStorage storage = externalInput.getStorage(); - IProject projectToUseForMarker = null; + IResource resourceToUseForMarker = null; IFile resourceFile = CUIPlugin.getWorkspace().getRoot().getFileForLocation(storage.getFullPath()); - + if (resourceFile == null){ - IProject[] proj = CUIPlugin.getWorkspace().getRoot().getProjects(); - for (int i=0; i