From af92b8417ae76946c7d10772d8848abbe1126209 Mon Sep 17 00:00:00 2001 From: Elliott Baron Date: Wed, 16 Dec 2009 16:51:53 -0500 Subject: Update codan plugins to HEAD. * org.eclipse.cdt.codan.checkers.ui: Updated. * org.eclipse.cdt.codan.checkers: Updated. * org.eclipse.cdt.codan.core: Updated. * org.eclipse.cdt.codan.ui: Updated. --- .../org/eclipse/cdt/codan/internal/CVS/Template | 0 .../eclipse/cdt/codan/internal/core/CVS/Entries | 5 +- .../eclipse/cdt/codan/internal/core/CVS/Template | 0 .../cdt/codan/internal/core/CheckersRegisry.java | 88 +++++++++++---- .../cdt/codan/internal/core/CodanBuilder.java | 33 ++++++ .../internal/core/CodanPreferencesLoader.java | 119 +++++++++++++++++++++ .../cdt/codan/internal/core/model/CVS/Entries | 5 +- .../cdt/codan/internal/core/model/CVS/Template | 0 .../core/model/CodanMarkerProblemReporter.java | 2 +- .../internal/core/model/CodanProblemCategory.java | 4 +- .../codan/internal/core/model/ProblemProfile.java | 105 ++++++++++++++++++ 11 files changed, 334 insertions(+), 27 deletions(-) create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java (limited to 'org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal') diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/CVS/Template new file mode 100644 index 0000000..e69de29 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries index 74cd7a6..49bf43c 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Entries @@ -1,4 +1,5 @@ -/CheckersRegisry.java/1.1/Sat Aug 22 21:16:49 2009// -/CodanBuilder.java/1.2/Sat Aug 22 21:31:29 2009// +/CheckersRegisry.java/1.3/Wed Dec 16 21:48:48 2009// +/CodanBuilder.java/1.3/Wed Dec 16 21:48:48 2009// +/CodanPreferencesLoader.java/1.1/Wed Sep 23 23:29:36 2009// /CodeAnlysisNature.java/1.1/Sat Aug 22 21:16:49 2009// D/model//// diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CVS/Template new file mode 100644 index 0000000..e69de29 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java index 82ace80..5661622 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CheckersRegisry.java @@ -16,16 +16,15 @@ import java.util.HashMap; import java.util.Iterator; import org.eclipse.cdt.codan.core.CodanCorePlugin; -import org.eclipse.cdt.codan.core.CodanPreferencesLoader; import org.eclipse.cdt.codan.core.PreferenceConstants; import org.eclipse.cdt.codan.core.model.IChecker; import org.eclipse.cdt.codan.core.model.ICheckersRegistry; import org.eclipse.cdt.codan.core.model.IProblem; import org.eclipse.cdt.codan.core.model.IProblemCategory; import org.eclipse.cdt.codan.core.model.IProblemProfile; -import org.eclipse.cdt.codan.core.model.ProblemProfile; import org.eclipse.cdt.codan.internal.core.model.CodanProblem; import org.eclipse.cdt.codan.internal.core.model.CodanProblemCategory; +import org.eclipse.cdt.codan.internal.core.model.ProblemProfile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ProjectScope; @@ -45,6 +44,7 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { private Collection checkers = new ArrayList(); private static CheckersRegisry instance; private HashMap profiles = new HashMap(); + private HashMap> problemList = new HashMap>(); private CheckersRegisry() { instance = this; @@ -136,7 +136,9 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { } } if (!hasRef) { - addProblem(new CodanProblem(id, name), null); + CodanProblem p = new CodanProblem(id, name); + addProblem(p, null); + addRefProblem(checkerObj, p); } } } catch (Exception e) { @@ -184,7 +186,9 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { return elementValue; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#iterator() */ public Iterator iterator() { @@ -197,15 +201,23 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { return instance; } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addChecker(org.eclipse.cdt.codan.core.model.IChecker) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addChecker(org.eclipse + * .cdt.codan.core.model.IChecker) */ public void addChecker(IChecker checker) { checkers.add(checker); } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addProblem(org.eclipse.cdt.codan.core.model.IProblem, java.lang.String) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addProblem(org.eclipse + * .cdt.codan.core.model.IProblem, java.lang.String) */ public void addProblem(IProblem p, String category) { IProblemCategory cat = getDefaultProfile().findCategory(category); @@ -214,8 +226,12 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { ((ProblemProfile) getDefaultProfile()).addProblem(p, cat); } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addCategory(org.eclipse.cdt.codan.core.model.IProblemCategory, java.lang.String) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addCategory(org.eclipse + * .cdt.codan.core.model.IProblemCategory, java.lang.String) */ public void addCategory(IProblemCategory p, String category) { IProblemCategory cat = getDefaultProfile().findCategory(category); @@ -224,21 +240,46 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { ((ProblemProfile) getDefaultProfile()).addCategory(p, cat); } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#addRefProblem(org.eclipse.cdt.codan.core.model.IChecker, org.eclipse.cdt.codan.core.model.IProblem) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#addRefProblem(org. + * eclipse.cdt.codan.core.model.IChecker, + * org.eclipse.cdt.codan.core.model.IProblem) */ public void addRefProblem(IChecker c, IProblem p) { + Collection plist = problemList.get(c); + if (plist == null) { + plist = new ArrayList(); + problemList.put(c, plist); + } + plist.add(p); + } + + /** + * Returns list of problems registered for given checker + * @return collection of problems or null + */ + public Collection getRefProblems(IChecker checker) { + return problemList.get(checker); } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getDefaultProfile() + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#getDefaultProfile() */ public IProblemProfile getDefaultProfile() { return profiles.get(DEFAULT); } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getWorkspaceProfile() + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#getWorkspaceProfile() */ public IProblemProfile getWorkspaceProfile() { IProblemProfile wp = profiles.get(ResourcesPlugin.getWorkspace()); @@ -262,8 +303,12 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { profiles.put(element, profile); } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfile(org.eclipse.core.resources.IResource) + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfile + * (org.eclipse.core.resources.IResource) */ public IProblemProfile getResourceProfile(IResource element) { IProblemProfile prof = profiles.get(element); @@ -296,8 +341,11 @@ public class CheckersRegisry implements Iterable, ICheckersRegistry { return prof; } - /* (non-Javadoc) - * @see org.eclipse.cdt.codan.core.model.ICheckersRegistry#getResourceProfileWorkingCopy(org.eclipse.core.resources.IResource) + /* + * (non-Javadoc) + * + * @seeorg.eclipse.cdt.codan.core.model.ICheckersRegistry# + * getResourceProfileWorkingCopy(org.eclipse.core.resources.IResource) */ public IProblemProfile getResourceProfileWorkingCopy(IResource element) { if (element instanceof IProject) { 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 7d58351..56916b8 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 @@ -12,6 +12,8 @@ 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; @@ -20,6 +22,8 @@ import org.eclipse.cdt.codan.core.model.ICAstChecker; 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; @@ -122,6 +126,8 @@ public class CodanBuilder extends IncrementalProjectBuilder implements boolean run = false; if (checker.enabledInContext(resource)) run = true; + if (areProblemsForCheckerEnabled(checker, resource)) + run = true; if (run) checker.processResource(resource); } catch (Throwable e) { @@ -161,6 +167,9 @@ public class CodanBuilder extends IncrementalProjectBuilder implements boolean run = false; if (checker.enabledInContext(resource)) run = true; + if (areProblemsForCheckerEnabled(checker, resource)) { + run = true; + } if (run && checker instanceof ICAstChecker && checker.runInEditor()) ((ICAstChecker) checker).processAst(ast); @@ -171,6 +180,30 @@ public class CodanBuilder extends IncrementalProjectBuilder implements } } + /** + * @param checker + * @param resource + * @return + */ + private boolean areProblemsForCheckerEnabled(IChecker checker, + IResource resource) { + IProblemProfile resourceProfile = CheckersRegisry.getInstance() + .getResourceProfile(resource); + Collection 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 { diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java new file mode 100644 index 0000000..bafff9a --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanPreferencesLoader.java @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright (c) 2009 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.internal.core; + +import org.eclipse.cdt.codan.core.model.CodanSeverity; +import org.eclipse.cdt.codan.core.model.IProblem; +import org.eclipse.cdt.codan.core.model.IProblemProfile; +import org.eclipse.cdt.codan.internal.core.model.CodanProblem; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; + +/** + * @author Alena + * + */ +public class CodanPreferencesLoader { + private IProblemProfile baseModel; + + /** + * @param workspaceProfile + */ + public CodanPreferencesLoader(IProblemProfile profile) { + setInput(profile); + } + + /** + * + */ + public CodanPreferencesLoader() { + } + + public void setInput(Object model) { + baseModel = (IProblemProfile) model; + } + + /** + * @return + */ + public IProblem[] getProblems() { + IProblem[] problems = baseModel.getProblems(); + return problems; + } + + /** + * @param id + * @param s + */ + public void setProperty(String id, String s) { + IProblem prob = baseModel.findProblem(id); + if (!(prob instanceof CodanProblem)) + return; + String sevs = s; + boolean enabled = true; + if (sevs.startsWith("-")) { + sevs = sevs.substring(1); + enabled = false; + } + ((CodanProblem) prob).setEnabled(enabled); + CodanSeverity sev; + try { + sev = CodanSeverity.valueOf(sevs); + } catch (RuntimeException e) { + sev = CodanSeverity.Warning; + } + ((CodanProblem) prob).setSeverity(sev); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return getInput().toString(); + } + + /** + * @return + */ + public IProblemProfile getInput() { + return baseModel; + } + + /** + * @param id + * @return + */ + public String getProperty(String id) { + IProblem prob = baseModel.findProblem(id); + if (!(prob instanceof CodanProblem)) + return null; + String enabled = prob.isEnabled() ? "" : "-"; + String severity = prob.getSeverity().toString(); + String res = enabled + severity; + return res; + } + + /** + * @param storePreferences + */ + public void load(IEclipsePreferences storePreferences) { + IProblem[] probs = getProblems(); + for (int i = 0; i < probs.length; i++) { + String id = probs[i].getId(); + String s = storePreferences.get(id, null); + if (s != null) { + setProperty(id, s); + } + } + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries index cf1f6cc..5f7a029 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Entries @@ -1,4 +1,5 @@ -/CodanMarkerProblemReporter.java/1.1/Sat Aug 22 21:16:48 2009// +/CodanMarkerProblemReporter.java/1.2/Wed Dec 16 21:48:48 2009// /CodanProblem.java/1.1/Sat Aug 22 21:16:48 2009// -/CodanProblemCategory.java/1.1/Sat Aug 22 21:16:48 2009// +/CodanProblemCategory.java/1.2/Wed Dec 16 21:48:48 2009// +/ProblemProfile.java/1.1/Wed Sep 23 23:29:36 2009// D diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CVS/Template new file mode 100644 index 0000000..e69de29 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java index ebf00c9..a4599c5 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanMarkerProblemReporter.java @@ -23,7 +23,7 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; public class CodanMarkerProblemReporter implements IProblemReporter { - public static final String GENERIC_CODE_ANALYSIS_MARKER_TYPE = "org.eclipse.cdt.codan.core.codanProblem"; + /* * (non-Javadoc) diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java index 289e0fd..fc63480 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblemCategory.java @@ -40,8 +40,8 @@ public class CodanProblemCategory implements IProblemCategory, Cloneable { return name; } - public Object[] getChildren() { - return list.toArray(); + public IProblemElement[] getChildren() { + return (IProblemElement[]) list.toArray(new IProblemElement[list.size()]); } public void addChild(IProblemElement p) { diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java new file mode 100644 index 0000000..d2330f1 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/ProblemProfile.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2009 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.internal.core.model; + +import java.util.ArrayList; +import java.util.Collection; + +import org.eclipse.cdt.codan.core.model.IProblem; +import org.eclipse.cdt.codan.core.model.IProblemCategory; +import org.eclipse.cdt.codan.core.model.IProblemProfile; + +/** + * @author Alena + * + */ +public class ProblemProfile implements IProblemProfile, Cloneable { + private IProblemCategory rootCategory = new CodanProblemCategory("root", + "root"); + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.model.IProblemProfile#getProblem(java.lang + * .String) + */ + public IProblem findProblem(String id) { + return getRoot().findProblem(id); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.codan.core.model.IProblemProfile#getProblems() + */ + public IProblem[] getProblems() { + Collection problems = new ArrayList(); + collectProblems(getRoot(), problems); + return problems.toArray(new IProblem[problems.size()]); + } + + /** + * @param root + * @param problems + */ + protected void collectProblems(IProblemCategory parent, + Collection problems) { + Object[] children = parent.getChildren(); + for (Object object : children) { + if (object instanceof IProblemCategory) { + IProblemCategory cat = (IProblemCategory) object; + collectProblems(cat, problems); + } else if (object instanceof IProblem) { + problems.add((IProblem) object); + } + } + } + + public IProblemCategory getRoot() { + return rootCategory; + } + + public void addProblem(IProblem p, IProblemCategory cat) { + if (cat == null) + cat = getRoot(); + ((CodanProblemCategory) cat).addChild(p); + } + + public IProblemCategory findCategory(String id) { + return getRoot().findCategory(id); + } + + /* + * (non-Javadoc) + * + * @see java.lang.Object#clone() + */ + @Override + public Object clone() { + try { + ProblemProfile clone = (ProblemProfile) super.clone(); + clone.rootCategory = (IProblemCategory) ((CodanProblemCategory) this.rootCategory) + .clone(); + return clone; + } catch (CloneNotSupportedException e) { + return this; + } + } + + /** + * @param p + * @param cat + */ + public void addCategory(IProblemCategory category, IProblemCategory parent) { + ((CodanProblemCategory) parent).addChild(category); + } +} -- cgit