summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java')
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java245
1 files changed, 105 insertions, 140 deletions
diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
index 56916b8..6685b98 100644
--- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
+++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009 Alena Laskavaia
+ * Copyright (c) 2009, 2010 Alena Laskavaia
* All rights reserved. This program 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
@@ -10,91 +10,74 @@
*******************************************************************************/
package org.eclipse.cdt.codan.internal.core;
-import java.io.File;
-import java.net.URI;
-import java.util.Collection;
-import java.util.Iterator;
import java.util.Map;
import org.eclipse.cdt.codan.core.CodanCorePlugin;
import org.eclipse.cdt.codan.core.CodanRuntime;
-import org.eclipse.cdt.codan.core.model.ICAstChecker;
+import org.eclipse.cdt.codan.core.Messages;
import org.eclipse.cdt.codan.core.model.IChecker;
-import org.eclipse.cdt.codan.core.model.ICodanAstReconciler;
import org.eclipse.cdt.codan.core.model.ICodanBuilder;
-import org.eclipse.cdt.codan.core.model.IProblem;
-import org.eclipse.cdt.codan.core.model.IProblemProfile;
import org.eclipse.cdt.codan.core.model.IProblemReporter;
-import org.eclipse.cdt.codan.internal.core.model.CodanMarkerProblemReporter;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.core.resources.IFile;
+import org.eclipse.cdt.codan.core.model.IProblemReporterPersistent;
+import org.eclipse.cdt.codan.core.model.IRunnableInEditorChecker;
+import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+/**
+ * Implementation of {@link ICodanBuilder}
+ */
public class CodanBuilder extends IncrementalProjectBuilder implements
- ICodanBuilder, ICodanAstReconciler {
- public static final String BUILDER_ID = "org.eclipse.cdt.codan.core.codanBuilder";
+ ICodanBuilder {
+ /**
+ * codan builder id
+ */
+ public static final String BUILDER_ID = "org.eclipse.cdt.codan.core.codanBuilder"; //$NON-NLS-1$
- public class CodanDeltaVisitor implements IResourceDeltaVisitor {
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse
- * .core.resources.IResourceDelta)
- */
- /*
- * (non-Javadoc)
- *
- * @see
- * org.eclipse.cdt.codan.internal.core.ICodanBuilder#visit(org.eclipse
- * .core.resources.IResourceDelta)
+ private class CodanDeltaVisitor implements IResourceDeltaVisitor {
+ private IProgressMonitor monitor;
+
+ /**
+ * @param monitor
*/
+ public CodanDeltaVisitor(IProgressMonitor monitor) {
+ this.monitor = monitor;
+ }
+
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
switch (delta.getKind()) {
- case IResourceDelta.ADDED:
- // handle added resource
- processResource(resource, new NullProgressMonitor());
- break;
- case IResourceDelta.REMOVED:
- // handle removed resource
- break;
- case IResourceDelta.CHANGED:
- // handle changed resource
- processResource(resource, new NullProgressMonitor());
- break;
+ case IResourceDelta.ADDED:
+ // handle added resource
+ processResource(resource, monitor);
+ break;
+ case IResourceDelta.REMOVED:
+ // handle removed resource
+ break;
+ case IResourceDelta.CHANGED:
+ // handle changed resource
+ processResource(resource, monitor);
+ break;
}
// return true to continue visiting children.
return true;
}
}
- public class CodanResourceVisitor implements IResourceVisitor {
- public boolean visit(IResource resource) {
- if (!(resource instanceof IProject))
- processResource(resource, new NullProgressMonitor());
- // return true to continue visiting children.
- return true;
- }
- }
-
/*
* (non-Javadoc)
*
* @see org.eclipse.core.internal.events.InternalBuilder#build(int,
* java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
*/
+ @SuppressWarnings("rawtypes")
+ @Override
protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
throws CoreException {
if (kind == FULL_BUILD) {
@@ -111,119 +94,101 @@ public class CodanBuilder extends IncrementalProjectBuilder implements
}
public void processResource(IResource resource, IProgressMonitor monitor) {
- // String string = Platform.getPreferencesService().getString(
- // CodanCorePlugin.PLUGIN_ID, "problems", "", null);
- // System.err.println("set = " + string);
- // delete general markers
- IProblemReporter problemReporter = CodanRuntime.getInstance()
- .getProblemReporter();
- if (problemReporter instanceof CodanMarkerProblemReporter) {
- ((CodanMarkerProblemReporter) problemReporter)
- .deleteMarkers(resource);
- }
- for (IChecker checker : CheckersRegisry.getInstance()) {
- try {
- boolean run = false;
- if (checker.enabledInContext(resource))
- run = true;
- if (areProblemsForCheckerEnabled(checker, resource))
- run = true;
- if (run)
- checker.processResource(resource);
- } catch (Throwable e) {
- CodanCorePlugin.log(e);
- }
- }
- if (resource instanceof IProject) {
+ processResource(resource, monitor, null, false);
+ }
+
+ protected void processResource(IResource resource,
+ IProgressMonitor monitor, Object model, boolean inEditor) {
+ CheckersRegistry chegistry = CheckersRegistry.getInstance();
+ int checkers = chegistry.getCheckersSize();
+ int memsize = 0;
+ if (resource instanceof IContainer) {
try {
- resource.accept(getResourceVisitor());
+ IResource[] members = ((IContainer) resource).members();
+ memsize = members.length;
} catch (CoreException e) {
CodanCorePlugin.log(e);
}
}
- }
-
- public void reconcileAst(IASTTranslationUnit ast, IProgressMonitor monitor) {
- if (ast == null)
- return;
- String filePath = ast.getFilePath();
- IWorkspace workspace = ResourcesPlugin.getWorkspace();
- IWorkspaceRoot root = workspace.getRoot();
- IFile[] resources;
- URI uri = new File(filePath).toURI();
- resources = root.findFilesForLocationURI(uri);
- if (resources != null && resources.length > 0) {
- IFile resource = resources[0];
+ int tick = 1000;
+ // System.err.println("processing " + resource);
+ monitor.beginTask(Messages.CodanBuilder_Code_Analysis_On + resource,
+ checkers + memsize * tick);
+ try {
IProblemReporter problemReporter = CodanRuntime.getInstance()
.getProblemReporter();
- // TODO: this is wrong - should not delete all markers -
- // only those that contributed by the checker that we run now
- if (problemReporter instanceof CodanMarkerProblemReporter) {
- ((CodanMarkerProblemReporter) problemReporter)
- .deleteMarkers(resource);
- }
- for (IChecker checker : CheckersRegisry.getInstance()) {
+ for (IChecker checker : chegistry) {
try {
- boolean run = false;
- if (checker.enabledInContext(resource))
- run = true;
- if (areProblemsForCheckerEnabled(checker, resource)) {
- run = true;
+ if (monitor.isCanceled())
+ return;
+ if (checker.enabledInContext(resource)) {
+ // delete markers if checker can possibly run on this
+ // resource
+ // this way if checker is not enabled markers would be
+ // deleted too
+ if (problemReporter instanceof IProblemReporterPersistent) {
+ // delete general markers
+ ((IProblemReporterPersistent) problemReporter)
+ .deleteProblems(resource, checker);
+ }
+ if (chegistry.isCheckerEnabled(checker, resource)) {
+ if (inEditor) {
+ if (checker.runInEditor()
+ && checker instanceof IRunnableInEditorChecker) {
+ ((IRunnableInEditorChecker) checker)
+ .processModel(model);
+ }
+ } else {
+ checker.processResource(resource);
+ }
+ }
}
- if (run && checker instanceof ICAstChecker
- && checker.runInEditor())
- ((ICAstChecker) checker).processAst(ast);
+ monitor.worked(1);
} catch (Throwable e) {
CodanCorePlugin.log(e);
}
}
+ if (resource instanceof IContainer) {
+ try {
+ IResource[] members = ((IContainer) resource).members();
+ for (int i = 0; i < members.length; i++) {
+ if (monitor.isCanceled())
+ return;
+ IResource member = members[i];
+ processResource(member, new SubProgressMonitor(monitor,
+ tick));
+ }
+ } catch (CoreException e) {
+ CodanCorePlugin.log(e);
+ }
+ }
+ } finally {
+ monitor.done();
}
}
- /**
- * @param checker
- * @param resource
- * @return
- */
- private boolean areProblemsForCheckerEnabled(IChecker checker,
- IResource resource) {
- IProblemProfile resourceProfile = CheckersRegisry.getInstance()
- .getResourceProfile(resource);
- Collection<IProblem> refProblems = CheckersRegisry.getInstance()
- .getRefProblems(checker);
- for (Iterator iterator = refProblems.iterator(); iterator.hasNext();) {
- IProblem p = (IProblem) iterator.next();
- // we need to check problem enablement in particular profile
- IProblem problem = resourceProfile.findProblem(p.getId());
- if (problem == null)
- throw new IllegalArgumentException("Id is not registered");
- if (problem.isEnabled())
- return true;
- }
- // no problem is enabled for this checker, skip the checker
- return false;
- }
-
protected void fullBuild(final IProgressMonitor monitor)
throws CoreException {
- try {
- getProject().accept(new CodanResourceVisitor());
- } catch (CoreException e) {
- }
+ processResource(getProject(), monitor);
}
protected void incrementalBuild(IResourceDelta delta,
IProgressMonitor monitor) throws CoreException {
// the visitor does the work.
- delta.accept(new CodanDeltaVisitor());
+ delta.accept(new CodanDeltaVisitor(monitor));
}
- /*
- * (non-Javadoc)
+ /**
+ * Run all checkers that support "check as you type" mode
*
- * @see org.eclipse.cdt.codan.core.model.ICodanBuilder#getResourceVisitor()
+ * @param model - model of given resource such as ast
+ * @param resource - resource to process
+ * @param monitor - progress monitor
*/
- public CodanResourceVisitor getResourceVisitor() {
- return new CodanResourceVisitor();
+ public void runInEditor(Object model, IResource resource,
+ IProgressMonitor monitor) {
+ if (model == null)
+ return;
+ processResource(resource, monitor, model, true);
}
}