From 00a6c5069f44dc2ee4181430d3f9d109ae3ac5bf Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sat, 28 Apr 2012 20:20:47 -0700 Subject: [PATCH] Streamlined check enablement logic. --- .../cdt/codan/core/model/AbstractChecker.java | 28 +++++----- .../cdt/codan/core/model/IChecker.java | 31 +++++------ .../codan/internal/core/CheckersRegistry.java | 46 +++++------------ .../cdt/codan/internal/core/CodanBuilder.java | 51 ++++++------------- 4 files changed, 55 insertions(+), 101 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java index 374355aedaa..dc47c2d82de 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2010 Alena Laskavaia + * Copyright (c) 2009, 2012 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 @@ -39,8 +39,8 @@ public abstract class AbstractChecker implements IChecker { @Deprecated @Override - public boolean enabledInContext(IResource res) { - return res.getType() == IResource.FILE; + public boolean enabledInContext(IResource resource) { + return false; } /** @@ -204,17 +204,15 @@ public abstract class AbstractChecker implements IChecker { */ @Override public void before(IResource resource) { - IProblemReporter problemReporter = CodanRuntime.getInstance().getProblemReporter(); - this.problemReporter = problemReporter; - if (problemReporter instanceof IProblemReporterSessionPersistent) { - // create session problem reporter - this.problemReporter = ((IProblemReporterSessionPersistent) problemReporter).createReporter(resource, this); - ((IProblemReporterSessionPersistent) this.problemReporter).start(); - } else if (problemReporter instanceof IProblemReporterPersistent) { - // delete markers if checker can possibly run on this - // resource this way if checker is not enabled markers would be - // deleted too - ((IProblemReporterPersistent) problemReporter).deleteProblems(resource, this); + IProblemReporter reporter = CodanRuntime.getInstance().getProblemReporter(); + problemReporter = reporter; + if (reporter instanceof IProblemReporterSessionPersistent) { + // Create session problem reporter + problemReporter = ((IProblemReporterSessionPersistent) reporter).createReporter(resource, this); + ((IProblemReporterSessionPersistent) problemReporter).start(); + } else if (reporter instanceof IProblemReporterPersistent) { + // Delete markers. + ((IProblemReporterPersistent) reporter).deleteProblems(resource, this); } } @@ -224,7 +222,7 @@ public abstract class AbstractChecker implements IChecker { @Override public void after(IResource resource) { if (problemReporter instanceof IProblemReporterSessionPersistent) { - // Delete general markers + // Delete general markers. ((IProblemReporterSessionPersistent) problemReporter).done(); } problemReporter = null; diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java index 3f1e0b66fb6..be0d3d736df 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2010 Alena Laskavaia + * Copyright (c) 2009, 2012 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 @@ -29,6 +29,14 @@ import org.eclipse.core.runtime.OperationCanceledException; * Extend {@link AbstractChecker} class instead. */ public interface IChecker { + /** + * Called before processing a resource. + * + * @param resource the resource that is about to be processed. + * @since 2.0 + */ + void before(IResource resource); + /** * Main method that checker should implement that actually detects errors * @@ -44,15 +52,7 @@ public interface IChecker { throws OperationCanceledException; /** - * Called before processing a resource. - * - * @param resource the resource that is about to be processed. - * @since 2.0 - */ - void before(IResource resource); - - /** - * Called before processing a resource. + * Called after processing a resource. * * @param resource the resource that has been processed. * @since 2.0 @@ -66,14 +66,10 @@ public interface IChecker { IProblemReporter getProblemReporter(); /** - * Implement this method to trim down type of resource you are interested - * in, usually it will be c/c++ files only. This method should be - * independent from current user preferences. - * * @param resource the resource to run on. * @return true if checker should be run on this resource. - * @deprecated Replaced by {@code CheckersRegistry.isCheckerEnabled((IChecker IResource, CheckerLaunchMode)} - * and {@code ICheckerEnablementVerifier.isCheckerEnabled(IChecker IResource, CheckerLaunchMode)}. + * @deprecated Ignored since 2.0. Replaced by + * {@code CheckersRegistry.isCheckerEnabled((IChecker, IResource, CheckerLaunchMode)} */ @Deprecated boolean enabledInContext(IResource resource); @@ -86,8 +82,7 @@ public interface IChecker { * Checker should return false if check is non-trivial and takes a long * time. * - * @return true if need to be run in editor as user types, and false - * otherwise + * @return true if need to be run in editor as user types, and false otherwise */ boolean runInEditor(); } diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegistry.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegistry.java index ebd6a506424..59dd096ae04 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegistry.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegistry.java @@ -22,6 +22,7 @@ import org.eclipse.cdt.codan.core.CodanCorePlugin; import org.eclipse.cdt.codan.core.PreferenceConstants; import org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences; import org.eclipse.cdt.codan.core.model.CheckerLaunchMode; +import org.eclipse.cdt.codan.core.model.Checkers; import org.eclipse.cdt.codan.core.model.CodanSeverity; import org.eclipse.cdt.codan.core.model.IChecker; import org.eclipse.cdt.codan.core.model.ICheckerWithPreferences; @@ -446,31 +447,6 @@ public class CheckersRegistry implements Iterable, ICheckersRegistry { return prof; } - /** - * Tests if a checker is enabled (needs to be run) or not. Checker is - * enabled - * if at least one problem it reports is enabled. - * - * @param checker - * @param resource - * @return true if the checker is enabled - */ - public boolean isCheckerEnabled(IChecker checker, IResource resource) { - IProblemProfile resourceProfile = getResourceProfile(resource); - Collection refProblems = getRefProblems(checker); - for (Iterator iterator = refProblems.iterator(); iterator.hasNext();) { - IProblem p = 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"); //$NON-NLS-1$ - if (problem.isEnabled()) - return true; - } - // no problem is enabled for this checker, skip the checker - return false; - } - /** * Tests if a checker needs to run in a specific launch mode. * @@ -483,29 +459,35 @@ public class CheckersRegistry implements Iterable, ICheckersRegistry { if (resource.getType() != IResource.FILE) { return false; } + + if (mode == CheckerLaunchMode.RUN_AS_YOU_TYPE && !Checkers.canCheckerRunAsYouType(checker)) { + return false; + } for (ICheckerEnablementVerifier verifier : checkerEnablementVerifiers) { if (!verifier.isCheckerEnabled(checker, resource, mode)) { return false; } } + IProblemProfile resourceProfile = getResourceProfile(resource); Collection refProblems = getRefProblems(checker); - boolean enabled = false; for (Iterator iterator = refProblems.iterator(); iterator.hasNext();) { IProblem p = iterator.next(); - // we need to check problem enablement in particular profile + // We need to check problem enablement in a particular profile. IProblem problem = resourceProfile.findProblem(p.getId()); if (problem == null) - throw new IllegalArgumentException("Id is not registered"); //$NON-NLS-1$ + throw new IllegalArgumentException(p.getId() + "is not registered"); //$NON-NLS-1$ + if (!problem.isEnabled()) + return false; if (checker instanceof AbstractCheckerWithProblemPreferences) { - LaunchModeProblemPreference pref = ((AbstractCheckerWithProblemPreferences) checker).getLaunchModePreference(problem); + LaunchModeProblemPreference pref = + ((AbstractCheckerWithProblemPreferences) checker).getLaunchModePreference(problem); if (pref.isRunningInMode(mode)) { - enabled = true; - break; + return true; } } } - return enabled; + return false; } /** diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java index 999d80790a8..0d88a03d63c 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanBuilder.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2011 Alena Laskavaia + * Copyright (c) 2009, 2012 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 @@ -16,7 +16,6 @@ import java.util.Map; import org.eclipse.cdt.codan.core.CodanCorePlugin; import org.eclipse.cdt.codan.core.Messages; import org.eclipse.cdt.codan.core.model.CheckerLaunchMode; -import org.eclipse.cdt.codan.core.model.Checkers; import org.eclipse.cdt.codan.core.model.IChecker; import org.eclipse.cdt.codan.core.model.ICheckerInvocationContext; import org.eclipse.cdt.codan.core.model.ICodanBuilder; @@ -44,9 +43,6 @@ public class CodanBuilder extends IncrementalProjectBuilder implements ICodanBui private class CodanDeltaVisitor implements IResourceDeltaVisitor { private IProgressMonitor monitor; - /** - * @param monitor - */ public CodanDeltaVisitor(IProgressMonitor monitor) { this.monitor = monitor; } @@ -56,28 +52,22 @@ public class CodanBuilder extends IncrementalProjectBuilder implements ICodanBui IResource resource = delta.getResource(); switch (delta.getKind()) { case IResourceDelta.ADDED: - // handle added resource + // Handle added resource processResourceDelta(resource, monitor); break; case IResourceDelta.REMOVED: - // handle removed resource + // Handle removed resource break; case IResourceDelta.CHANGED: - // handle changed resource + // Handle changed resource processResourceDelta(resource, monitor); break; } - // return true to continue visiting children. + // 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 { @@ -116,7 +106,8 @@ public class CodanBuilder extends IncrementalProjectBuilder implements ICodanBui processResource(resource, monitor, CheckerLaunchMode.RUN_ON_INC_BUILD); } - protected void processResource(IResource resource, IProgressMonitor monitor, Object model, CheckerLaunchMode checkerLaunchMode) { + protected void processResource(IResource resource, IProgressMonitor monitor, Object model, + CheckerLaunchMode checkerLaunchMode) { CheckersRegistry chegistry = CheckersRegistry.getInstance(); int checkers = chegistry.getCheckersSize(); int memsize = 0; @@ -139,24 +130,18 @@ public class CodanBuilder extends IncrementalProjectBuilder implements ICodanBui try { if (monitor.isCanceled()) return; - if (doesCheckerSupportLaunchMode(checker, checkerLaunchMode) - && chegistry.isCheckerEnabled(checker, resource, checkerLaunchMode)) { + if (chegistry.isCheckerEnabled(checker, resource, checkerLaunchMode)) { synchronized (checker) { try { checker.before(resource); - if (chegistry.isCheckerEnabled(checker, resource)) { - try { - CheckersTimeStats.getInstance().checkerStart(checker.getClass().getName()); - if (checkerLaunchMode == CheckerLaunchMode.RUN_AS_YOU_TYPE) { - ((IRunnableInEditorChecker) checker).processModel(model, context); - } else { - checker.processResource(resource, context); - } - } finally { - CheckersTimeStats.getInstance().checkerStop(checker.getClass().getName()); - } + CheckersTimeStats.getInstance().checkerStart(checker.getClass().getName()); + if (checkerLaunchMode == CheckerLaunchMode.RUN_AS_YOU_TYPE) { + ((IRunnableInEditorChecker) checker).processModel(model, context); + } else { + checker.processResource(resource, context); } } finally { + CheckersTimeStats.getInstance().checkerStop(checker.getClass().getName()); checker.after(resource); } } @@ -192,18 +177,12 @@ public class CodanBuilder extends IncrementalProjectBuilder implements ICodanBui } } - private boolean doesCheckerSupportLaunchMode(IChecker checker, CheckerLaunchMode mode) { - if (mode == CheckerLaunchMode.RUN_AS_YOU_TYPE) - return Checkers.canCheckerRunAsYouType(checker); - return true; - } - protected void fullBuild(final IProgressMonitor monitor) throws CoreException { processResource(getProject(), monitor); } protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException { - // the visitor does the work. + // The visitor does the work. delta.accept(new CodanDeltaVisitor(monitor)); }