From d6eb399569f457881b2893fbd210a3fceefbd270 Mon Sep 17 00:00:00 2001 From: David Inglis Date: Mon, 28 Oct 2002 14:05:29 +0000 Subject: [PATCH] builder fixes --- core/org.eclipse.cdt.core/ChangeLog | 7 ++++ .../eclipse/cdt/core/resources/ACBuilder.java | 42 ++++++++++++------- .../eclipse/cdt/internal/core/CBuilder.java | 16 ++++++- 3 files changed, 50 insertions(+), 15 deletions(-) diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index 6daf62afc63..43c8a98805d 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,10 @@ +2002-10-28 David Inglis + + * src/.../core/resources/ACBuilder.java + Added check for duplicate markers. + * src/.../internal/core/CBuilder.java + Added check for canceled build and throws OperationCanceledException exception + 2002-10-25 Alain Magloire The debugger needs to know the endian of a binary. For example 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 3f4a0370696..9a05e4dfe9c 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 @@ -5,7 +5,6 @@ package org.eclipse.cdt.core.resources; * All Rights Reserved. */ - import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.IMarkerGenerator; import org.eclipse.cdt.core.model.ICModelMarker; @@ -23,42 +22,57 @@ public abstract class ACBuilder extends IncrementalProjectBuilder implements IMa public ACBuilder() { super(); } - + /* * callback from Output Parser */ //public void addMarker(IFile file, int lineNumber, String errorDesc, int severity) { public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) { + try { - IMarker marker= file.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER); + IMarker[] cur = file.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ONE); + /* + * Try to find matching markers and don't put in duplicates + */ + if ((cur != null) && (cur.length > 0)) { + for (int i = 0; i < cur.length; i++) { + if ((((Integer) cur[i].getAttribute(IMarker.LOCATION)).intValue() == lineNumber) + && (((Integer) cur[i].getAttribute(IMarker.SEVERITY)).intValue() == severity) + && (((String) cur[i].getAttribute(IMarker.MESSAGE)).equals(errorDesc))) { + 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); marker.setAttribute(IMarker.CHAR_START, -1); marker.setAttribute(IMarker.CHAR_END, -1); - if(errorVar != null) { + if (errorVar != null) { marker.setAttribute(ICModelMarker.C_MODEL_MARKER_VARIABLE, errorVar); } - } catch (CoreException e) { + } + catch (CoreException e) { CCorePlugin.log(e.getStatus()); } - + } - - int mapMarkerSeverity (int severity) { + + int mapMarkerSeverity(int severity) { switch (severity) { - case SEVERITY_ERROR_BUILD: - case SEVERITY_ERROR_RESOURCE: + case SEVERITY_ERROR_BUILD : + case SEVERITY_ERROR_RESOURCE : return IMarker.SEVERITY_ERROR; - case SEVERITY_INFO: + case SEVERITY_INFO : return IMarker.SEVERITY_INFO; - case SEVERITY_WARNING: + case SEVERITY_WARNING : return IMarker.SEVERITY_WARNING; } return IMarker.SEVERITY_ERROR; } - public abstract IPath getWorkingDirectory(); + public abstract IPath getWorkingDirectory(); } - diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java index 98e85be64bd..98ab7fb6ade 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java @@ -29,6 +29,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.SubProgressMonitor; @@ -57,6 +58,7 @@ public class CBuilder extends ACBuilder { if ( isClean ) { forgetLastBuiltState(); } + checkCancel(monitor); return getProject().getReferencedProjects(); } @@ -64,6 +66,7 @@ public class CBuilder extends ACBuilder { private boolean invokeMake(boolean fullBuild, IProgressMonitor monitor) { boolean isClean = false; boolean fatalBuild = false; + boolean isCanceled = false; IProject currProject= getProject(); SubProgressMonitor subMonitor = null; @@ -117,6 +120,8 @@ public class CBuilder extends ACBuilder { launcher.execute(makepath, userArgs, env, workingDirectory); if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), subMonitor) != CommandLauncher.OK) errMsg = launcher.getErrorMessage(); + + isCanceled = monitor.isCanceled(); monitor.setCanceled(false); subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN); subMonitor.subTask("Refresh From Local"); @@ -141,6 +146,7 @@ public class CBuilder extends ACBuilder { fatalBuild = epm.reportProblems(); } subMonitor.done(); + monitor.setCanceled(isCanceled); } } catch (Exception e) { CCorePlugin.log(e); @@ -148,7 +154,15 @@ public class CBuilder extends ACBuilder { monitor.done(); return (isClean || fatalBuild); } - + + /** + * Check whether the build has been canceled. + */ + public void checkCancel(IProgressMonitor monitor) { + if (monitor != null && monitor.isCanceled()) + throw new OperationCanceledException(); + } + private String[] parseArguments(boolean fullBuild, String override_args) { ArrayList list= new ArrayList(); IProject currProject = getProject();