diff options
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.java | 245 |
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); } } |