From 4e112eca7750a4f530c986be55c178c43c16d3ea Mon Sep 17 00:00:00 2001 From: Elliott Baron Date: Sat, 26 Jun 2010 22:27:34 -0400 Subject: Update codan plugins to CDT 7.0. * 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.core.cxx: Added. * org.eclipse.cdt.codan.extension/META-INF/MANIFEST.MF: Import org.eclipse.cdt.codan.core.cxx.model. * org.eclipse.cdt.codan.extension/src/org/eclipse/cdt/codan/extension/checkers/AbstractPropSimChecker.java: Superclass moved. --- .../src/org/eclipse/cdt/codan/core/CVS/Entries | 10 +- .../src/org/eclipse/cdt/codan/core/CVS/Tag | 1 + .../eclipse/cdt/codan/core/CodanApplication.java | 94 ------ .../eclipse/cdt/codan/core/CodanCorePlugin.java | 14 +- .../org/eclipse/cdt/codan/core/CodanRuntime.java | 76 ++++- .../src/org/eclipse/cdt/codan/core/Messages.java | 36 +++ .../cdt/codan/core/PreferenceConstants.java | 14 +- .../org/eclipse/cdt/codan/core/messages.properties | 19 ++ .../cdt/codan/core/model/AbstractChecker.java | 115 +++++++- .../AbstractCheckerWithProblemPreferences.java | 223 ++++++++++++++ .../codan/core/model/AbstractIndexAstChecker.java | 103 ------- .../codan/core/model/AbstractProblemLocation.java | 104 +++++++ .../org/eclipse/cdt/codan/core/model/CVS/Entries | 35 ++- .../src/org/eclipse/cdt/codan/core/model/CVS/Tag | 1 + .../cdt/codan/core/model/CodanSeverity.java | 27 +- .../eclipse/cdt/codan/core/model/ICAstChecker.java | 21 -- .../org/eclipse/cdt/codan/core/model/IChecker.java | 37 ++- .../codan/core/model/ICheckerWithPreferences.java | 35 +++ .../cdt/codan/core/model/ICheckersRegistry.java | 114 ++++++-- .../cdt/codan/core/model/ICodanAstReconciler.java | 22 -- .../cdt/codan/core/model/ICodanBuilder.java | 15 +- .../org/eclipse/cdt/codan/core/model/IProblem.java | 64 ++-- .../cdt/codan/core/model/IProblemCategory.java | 33 +-- .../cdt/codan/core/model/IProblemElement.java | 12 +- .../cdt/codan/core/model/IProblemLocation.java | 8 +- .../codan/core/model/IProblemLocationFactory.java | 67 +++++ .../cdt/codan/core/model/IProblemProfile.java | 42 ++- .../cdt/codan/core/model/IProblemReporter.java | 34 ++- .../core/model/IProblemReporterPersistent.java | 45 +++ .../cdt/codan/core/model/IProblemWorkingCopy.java | 73 +++++ .../codan/core/model/IRunnableInEditorChecker.java | 29 ++ .../cdt/codan/core/model/ProblemLocation.java | 109 ------- .../eclipse/cdt/codan/core/model/cfg/CVS/Entries | 13 + .../cdt/codan/core/model/cfg/CVS/Repository | 1 + .../org/eclipse/cdt/codan/core/model/cfg/CVS/Root | 1 + .../org/eclipse/cdt/codan/core/model/cfg/CVS/Tag | 1 + .../cdt/codan/core/model/cfg/IBasicBlock.java | 46 +++ .../cdt/codan/core/model/cfg/IBranchNode.java | 38 +++ .../eclipse/cdt/codan/core/model/cfg/ICfgData.java | 32 ++ .../cdt/codan/core/model/cfg/IConnectorNode.java | 25 ++ .../codan/core/model/cfg/IControlFlowGraph.java | 69 +++++ .../cdt/codan/core/model/cfg/IDecisionNode.java | 29 ++ .../cdt/codan/core/model/cfg/IExitNode.java | 25 ++ .../cdt/codan/core/model/cfg/IJumpNode.java | 33 +++ .../cdt/codan/core/model/cfg/INodeFactory.java | 54 ++++ .../cdt/codan/core/model/cfg/IPlainNode.java | 22 ++ .../cdt/codan/core/model/cfg/ISingleIncoming.java | 23 ++ .../cdt/codan/core/model/cfg/ISingleOutgoing.java | 23 ++ .../cdt/codan/core/model/cfg/IStartNode.java | 22 ++ .../core/param/AbstractProblemPreference.java | 202 +++++++++++++ .../codan/core/param/BasicProblemPreference.java | 134 +++++++++ .../org/eclipse/cdt/codan/core/param/CVS/Entries | 10 + .../eclipse/cdt/codan/core/param/CVS/Repository | 1 + .../src/org/eclipse/cdt/codan/core/param/CVS/Root | 1 + .../src/org/eclipse/cdt/codan/core/param/CVS/Tag | 1 + .../core/param/FileScopeProblemPreference.java | 267 +++++++++++++++++ .../cdt/codan/core/param/IProblemPreference.java | 27 ++ .../IProblemPreferenceCompositeDescriptor.java | 51 ++++ .../param/IProblemPreferenceCompositeValue.java | 42 +++ .../core/param/IProblemPreferenceDescriptor.java | 171 +++++++++++ .../codan/core/param/IProblemPreferenceValue.java | 54 ++++ .../codan/core/param/ListProblemPreference.java | 323 +++++++++++++++++++++ .../cdt/codan/core/param/MapProblemPreference.java | 261 +++++++++++++++++ 63 files changed, 3132 insertions(+), 502 deletions(-) create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Tag delete mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanApplication.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/Messages.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/messages.properties create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractCheckerWithProblemPreferences.java delete mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractIndexAstChecker.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemLocation.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Tag delete mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICAstChecker.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckerWithPreferences.java delete mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanAstReconciler.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocationFactory.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporterPersistent.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IRunnableInEditorChecker.java delete mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ProblemLocation.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Entries create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Repository create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Root create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Tag create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBranchNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ICfgData.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IDecisionNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IExitNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/INodeFactory.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleIncoming.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleOutgoing.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IStartNode.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemPreference.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/BasicProblemPreference.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Entries create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Repository create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Root create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Tag create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/FileScopeProblemPreference.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreference.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeDescriptor.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeValue.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceDescriptor.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceValue.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListProblemPreference.java create mode 100644 org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/MapProblemPreference.java (limited to 'org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core') diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Entries index d3c5192..3e108e0 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Entries +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Entries @@ -1,6 +1,8 @@ -/CodanApplication.java/1.2/Sat Aug 22 21:16:48 2009// -/CodanCorePlugin.java/1.3/Sat Aug 22 21:16:48 2009// -/CodanRuntime.java/1.1/Sat Aug 22 21:16:48 2009// -/PreferenceConstants.java/1.2/Sat Apr 18 04:01:43 2009// +/CodanCorePlugin.java/1.5/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/CodanRuntime.java/1.6/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/Messages.java/1.3/Tue May 25 01:33:23 2010//TCDT_7_0_0 +/PreferenceConstants.java/1.6/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 D/builder//// +/messages.properties/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 D/model//// +D/param//// diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Tag b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Tag new file mode 100644 index 0000000..49a449a --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Tag @@ -0,0 +1 @@ +NCDT_7_0_0 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanApplication.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanApplication.java deleted file mode 100644 index e0287b1..0000000 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanApplication.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.eclipse.cdt.codan.core; - -import java.util.ArrayList; -import java.util.Collection; - -import org.eclipse.cdt.codan.internal.core.CodanBuilder; -import org.eclipse.cdt.codan.internal.core.model.CodanMarkerProblemReporter; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IWorkspaceRoot; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.equinox.app.IApplication; -import org.eclipse.equinox.app.IApplicationContext; - -public class CodanApplication implements IApplication { - private Collection projects = new ArrayList(); - private boolean verbose = false; - private boolean all = false; - - public Object start(IApplicationContext context) throws Exception { - String[] args = (String[]) context.getArguments().get( - "application.args"); - if (args == null || args.length == 0) { - help(); - return EXIT_OK; - } - extractArguments(args); - CodanBuilder codanBuilder = new CodanBuilder(); - CodanRuntime runtime = CodanRuntime.getInstance(); - runtime.setProblemReporter(new CodanMarkerProblemReporter() { - @Override - public void reportProblem(String id, int severity, IFile file, - int lineNumber, int startChar, int endChar, String message) { - System.out.println(file.getLocation() + ":" + lineNumber + ": " - + message); - } - }); - IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); - if (all) { - log("Launching analysis on workspace"); - root.accept(codanBuilder.new CodanResourceVisitor()); - } else { - for (String project : projects) { - log("Launching analysis on project " + project); - IProject wProject = root.getProject(project); - if (!wProject.exists()) { - System.err.println("Error: project " + project - + " does not exist"); - continue; - } - wProject.accept(codanBuilder.new CodanResourceVisitor()); - } - } - return EXIT_OK; - } - - /** - * @param string - */ - private void log(String string) { - if (verbose) - System.err.println(string); - } - - /** - * @param args - */ - private void extractArguments(String[] args) { - for (int i = 0; i < args.length; i++) { - String string = args[i]; - if (string.equals("-verbose")) { - verbose = true; - } else if (string.equals("-all")) { - all = true; - } else { - projects.add(string); - } - } - } - - /** - * - */ - private void help() { - System.out.println("Usage: [options] ..."); - System.out.println("Options:"); - System.out.println(" -all - run on all projects in workspace"); - System.out.println(" -verbose - print extra build information"); - } - - public void stop() { - // nothing - } -} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanCorePlugin.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanCorePlugin.java index d60262b..90e5d83 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanCorePlugin.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanCorePlugin.java @@ -1,3 +1,13 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 Alena Laskavaia and others. + * 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.core; import org.eclipse.cdt.codan.internal.core.CodeAnlysisNature; @@ -13,7 +23,7 @@ import org.osgi.framework.BundleContext; */ public class CodanCorePlugin extends Plugin { // The plug-in ID - public static final String PLUGIN_ID = "org.eclipse.cdt.codan.core"; + public static final String PLUGIN_ID = "org.eclipse.cdt.codan.core"; //$NON-NLS-1$ public static final String NATURE_ID = CodeAnlysisNature.NATURE_ID; // The shared instance private static CodanCorePlugin plugin; @@ -34,6 +44,7 @@ public class CodanCorePlugin extends Plugin { * @see * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) */ + @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; @@ -45,6 +56,7 @@ public class CodanCorePlugin extends Plugin { * @see * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) */ + @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanRuntime.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanRuntime.java index 16375cf..bc7b3d7 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanRuntime.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanRuntime.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 @@ -11,44 +11,102 @@ package org.eclipse.cdt.codan.core; import org.eclipse.cdt.codan.core.model.ICheckersRegistry; -import org.eclipse.cdt.codan.core.model.ICodanAstReconciler; import org.eclipse.cdt.codan.core.model.ICodanBuilder; +import org.eclipse.cdt.codan.core.model.IProblemLocationFactory; import org.eclipse.cdt.codan.core.model.IProblemReporter; -import org.eclipse.cdt.codan.internal.core.CheckersRegisry; +import org.eclipse.cdt.codan.internal.core.CheckersRegistry; import org.eclipse.cdt.codan.internal.core.CodanBuilder; import org.eclipse.cdt.codan.internal.core.model.CodanMarkerProblemReporter; +import org.eclipse.cdt.codan.internal.core.model.ProblemLocationFactory; /** * Runtime singleton class to get access to Codan framework parts * + * Clients may extend this class to override default framework parts. + * + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

*/ public class CodanRuntime { private static CodanRuntime instance = new CodanRuntime(); private IProblemReporter problemReporter = new CodanMarkerProblemReporter(); - private CodanBuilder builder = new CodanBuilder(); - private CheckersRegisry checkers = CheckersRegisry.getInstance(); + private ICodanBuilder builder = new CodanBuilder(); + private CheckersRegistry checkers = CheckersRegistry.getInstance(); + private IProblemLocationFactory locFactory = new ProblemLocationFactory(); + + /** + * CodanRuntime - only can be called by subclasses to override default + * constructor + */ + protected CodanRuntime() { + // nothing here + } + /** + * Get runtime problem reporter. Default reported generated problem markers. + * + * @return + */ public IProblemReporter getProblemReporter() { return problemReporter; } + /** + * Set different problem reporter. + * + * @param reporter + */ public void setProblemReporter(IProblemReporter reporter) { problemReporter = reporter; } + /** + * Get instance of of Codan Runtime + * + * @return + */ public static CodanRuntime getInstance() { return instance; } + /** + * Get builder. Builder can used to run code analysis on given resource + * using API. + * + * @return + */ public ICodanBuilder getBuilder() { return builder; } - public ICodanAstReconciler getAstQuickBuilder() { - return builder; - } - + /** + * Get checkers registry. + * + * @return + */ public ICheckersRegistry getChechersRegistry() { return checkers; } + + /** + * Get problem location factory. + * + * @return + */ + public IProblemLocationFactory getProblemLocationFactory() { + return locFactory; + } + + /** + * Set another problem location factory - only need if default is not + * sufficient, i.e IProblemLocation is implemented differently + * + * @param factory + */ + public void setProblemLocationFactory(IProblemLocationFactory factory) { + locFactory = factory; + } } diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/Messages.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/Messages.java new file mode 100644 index 0000000..312c5c2 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/Messages.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core; + +import org.eclipse.osgi.util.NLS; + +/** + * Core Messages + */ +public class Messages extends NLS { + private static final String BUNDLE_NAME = "org.eclipse.cdt.codan.core.messages"; //$NON-NLS-1$ + public static String CodanApplication_all_option; + public static String CodanApplication_Error_ProjectDoesNotExists; + public static String CodanApplication_LogRunProject; + public static String CodanApplication_LogRunWorkspace; + public static String CodanApplication_Options; + public static String CodanApplication_Usage; + public static String CodanApplication_verbose_option; + public static String CodanBuilder_Code_Analysis_On; + public static String FileScopeProblemPreference_Label; + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/PreferenceConstants.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/PreferenceConstants.java index a4a1374..c730e9e 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/PreferenceConstants.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/PreferenceConstants.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 @@ -12,9 +12,15 @@ package org.eclipse.cdt.codan.core; /** * Constant definitions for plug-in preferences + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

*/ public class PreferenceConstants { - public static final String P_RUN_ON_BUILD = "booleanPreference"; - public static final String P_PROBLEMS = "problems"; - public static final String P_USE_PARENT = "useParentScope"; + public static final String P_RUN_ON_BUILD = "onBuild"; //$NON-NLS-1$ + public static final String P_RUN_IN_EDITOR = "inEditor"; //$NON-NLS-1$ + public static final String P_PROBLEMS = "problems"; //$NON-NLS-1$ + public static final String P_USE_PARENT = "useParentScope"; //$NON-NLS-1$ } diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/messages.properties b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/messages.properties new file mode 100644 index 0000000..d27aa29 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/messages.properties @@ -0,0 +1,19 @@ +############################################################################### +# Copyright (c) 2010 Alena Laskavaia and others. +# 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 +############################################################################### +CodanApplication_Error_ProjectDoesNotExists=Error: project {0} does not exist +CodanApplication_LogRunProject=Running code analysis on project +CodanApplication_LogRunWorkspace=Running code analysis on workspace +CodanApplication_Usage=Usage: [options] ... +CodanApplication_Options=Options: +CodanApplication_all_option= -all - run on all projects in workspace +CodanApplication_verbose_option= -verbose - print verbose build information +CodanBuilder_Code_Analysis_On=Code analysis on +FileScopeProblemPreference_Label=Exclusion and Inclusion diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java index f1e5028..411ba67 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.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 @@ -11,12 +11,21 @@ package org.eclipse.cdt.codan.core.model; import org.eclipse.cdt.codan.core.CodanRuntime; +import org.eclipse.cdt.codan.internal.core.CheckersRegistry; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; +/** + * Convenience implementation of IChecker interface. Has a default + * implementation for common methods. + * + */ public abstract class AbstractChecker implements IChecker { protected String name; + /** + * Default constructor + */ public AbstractChecker() { } @@ -32,19 +41,38 @@ public abstract class AbstractChecker implements IChecker { * Reports a simple problem for given file and line * * @param id - * - problem id + * - problem id * @param file - * - file + * - file * @param lineNumber - * - line - * @param arg - * - problem argument, if problem does not define error message - * it will be error message (not recommended because of - * internationalization) + * - line + * @param args + * - problem arguments, if problem does not define error message + * it will be error message (not recommended because of + * internationalization) */ - public void reportProblem(String id, IFile file, int lineNumber, String arg) { + public void reportProblem(String id, IFile file, int lineNumber, + Object... args) { getProblemReporter().reportProblem(id, - new ProblemLocation(file, lineNumber), arg); + createProblemLocation(file, lineNumber), args); + } + + /** + * Finds an instance of problem by given id, in user profile registered for + * specific file + * + * @param id + * - problem id + * @param file + * - file in scope + * @return problem instance + */ + public IProblem getProblemById(String id, IResource file) { + IProblem problem = CheckersRegistry.getInstance() + .getResourceProfile(file).findProblem(id); + if (problem == null) + throw new IllegalArgumentException("Id is not registered"); //$NON-NLS-1$ + return problem; } /** @@ -52,15 +80,15 @@ public abstract class AbstractChecker implements IChecker { * from problem definition * * @param id - * - problem id + * - problem id * @param file - * - file + * - file * @param lineNumber - * - line + * - line */ public void reportProblem(String id, IFile file, int lineNumber) { getProblemReporter().reportProblem(id, - new ProblemLocation(file, lineNumber), new Object[] {}); + createProblemLocation(file, lineNumber), new Object[] {}); } /** @@ -70,7 +98,64 @@ public abstract class AbstractChecker implements IChecker { return CodanRuntime.getInstance().getProblemReporter(); } + /** + * Convenience method to return codan runtime + * + * @return + */ + protected CodanRuntime getRuntime() { + return CodanRuntime.getInstance(); + } + + /** + * Convenience method to create and return instance of IProblemLocation + * + * @param file + * - file where problem is found + * @param line + * - line number 1-relative + * @return instance of IProblemLocation + */ + protected IProblemLocation createProblemLocation(IFile file, int line) { + return getRuntime().getProblemLocationFactory().createProblemLocation( + file, line); + } + + /** + * Convenience method to create and return instance of IProblemLocation + * + * @param file + * - file where problem is found + * @param startChar + * - start char of the problem in the file, is zero-relative + * @param endChar + * - end char of the problem in the file, is zero-relative and + * exclusive. + * @return instance of IProblemLocation + */ + protected IProblemLocation createProblemLocation(IFile file, int startChar, + int endChar) { + return getRuntime().getProblemLocationFactory().createProblemLocation( + file, startChar, endChar); + } + + /** + * Defines if checker should be run as user type in C editor. Override this + * method is checker is too heavy for that (runs too long) + */ public boolean runInEditor() { - return false; + return this instanceof IRunnableInEditorChecker; + } + + /** + * report a problem + * + * @param problemId - id of a problem + * @param loc - problem location + * @param args - extra problem arguments + */ + public void reportProblem(String problemId, IProblemLocation loc, + Object... args) { + getProblemReporter().reportProblem(problemId, loc, args); } } diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractCheckerWithProblemPreferences.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractCheckerWithProblemPreferences.java new file mode 100644 index 0000000..b58156f --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractCheckerWithProblemPreferences.java @@ -0,0 +1,223 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +import java.util.Collection; +import java.util.Iterator; + +import org.eclipse.cdt.codan.core.param.AbstractProblemPreference; +import org.eclipse.cdt.codan.core.param.BasicProblemPreference; +import org.eclipse.cdt.codan.core.param.FileScopeProblemPreference; +import org.eclipse.cdt.codan.core.param.IProblemPreference; +import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType; +import org.eclipse.cdt.codan.core.param.ListProblemPreference; +import org.eclipse.cdt.codan.core.param.MapProblemPreference; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; + +/** + * AbstarctChecker that has extra methods to simplify adding problem + * preferences. + * Checker can produce several problems, but preferences are per problem. + * Sharing preferences between problems is not supported now. + */ +public abstract class AbstractCheckerWithProblemPreferences extends + AbstractChecker implements ICheckerWithPreferences { + /** + * Checker that actually has parameter must override this + */ + public void initPreferences(IProblemWorkingCopy problem) { + // by default add file scope preference + addPreference(problem, new FileScopeProblemPreference(), null); + } + + /** + * Scope preference - special preference that all file checkers should have, + * it allows user to include/exclude files for this specific problem. + * + * @param problem - problem for which scope preference is need + * @return scope problem preference, null if not defined + */ + public FileScopeProblemPreference getScopePreference(IProblem problem) { + FileScopeProblemPreference scope = (FileScopeProblemPreference) getTopLevelPreferenceMap( + problem).getChildDescriptor(FileScopeProblemPreference.KEY); + return scope; + } + + /** + * User can scope out some resources for this checker. Checker can use this + * call to test if it should run on this resource at all or not. Test should + * be done within processResource method not in enabledInContext. + * This test uses user "scope" preference for the all problems that this + * checker can produce. + * + * @param res - resource to test on + * @return true if checker should report problems, fails otherwise. + */ + public boolean shouldProduceProblems(IResource res) { + Collection refProblems = getRuntime().getChechersRegistry() + .getRefProblems(this); + for (Iterator iterator = refProblems.iterator(); iterator + .hasNext();) { + IProblem checkerProblem = iterator.next(); + if (shouldProduceProblem( + getProblemById(checkerProblem.getId(), res), + res.getLocation())) + return true; + } + return false; + } + + /** + * User can scope out some resources for this checker. Checker can use this + * call to test if it should run on this resource at all or produce a + * specific problem on this resource. Test should + * be done within processResource method not in enabledInContext, or just + * before printing of a problem. + * This test uses user "scope" preference for the given problem. If scope is + * not defined preference it returns true. + * + * @param problem - problem to test for + * @param resource - resource to test on + * + * @return true if problem should be report for given resource, fails + * otherwise. + */ + public boolean shouldProduceProblem(IProblem problem, IPath resource) { + FileScopeProblemPreference scope = getScopePreference(problem); + if (scope == null) + return true; + return scope.isInScope(resource); + } + + @Override + public void reportProblem(String problemId, IProblemLocation loc, + Object... args) { + if (shouldProduceProblem(getProblemById(problemId, loc.getFile()), loc + .getFile().getLocation())) + super.reportProblem(problemId, loc, args); + } + + /** + * Add a parameter + * + * @param problem + * - problem that has parameter + * @param key + * - parameter key + * @param label + * - parameter label - user visible + * @param defaultValue + * - parameter default value + * @return - parameter info object + */ + public IProblemPreference addPreference(IProblemWorkingCopy problem, + String key, String label, Object defaultValue) { + MapProblemPreference map = getTopLevelPreferenceMap(problem); + BasicProblemPreference info = new BasicProblemPreference(key, label, + PreferenceType.typeOf(defaultValue)); + map.addChildDescriptor(info); + setDefaultPreferenceValue(problem, key, defaultValue); + return info; + } + + /** + * Add preference of type list of strings, list is empty by + * default + * + * @param problem + * - problem + * @param key + * - preference key + * @param label + * - preference label + * @param itemLabel + * @return preference instance of of the list, can be used to add default + * values or set different element type + * + */ + public ListProblemPreference addListPreference(IProblemWorkingCopy problem, + String key, String label, String itemLabel) { + MapProblemPreference map = getTopLevelPreferenceMap(problem); + ListProblemPreference list = new ListProblemPreference(key, label); + list.setChildDescriptor(new BasicProblemPreference( + ListProblemPreference.COMMON_DESCRIPTOR_KEY, itemLabel, + PreferenceType.TYPE_STRING)); + return (ListProblemPreference) map.addChildDescriptor(list); + } + + /** + * Add preference for the given problem with default value + * + * @param problem + * @param pref - preference + * @param defaultValue - default value of the preference + * @return added preference + */ + public IProblemPreference addPreference(IProblemWorkingCopy problem, + IProblemPreference pref, Object defaultValue) { + MapProblemPreference map = getTopLevelPreferenceMap(problem); + String key = pref.getKey(); + pref = map.addChildDescriptor(pref); + setDefaultPreferenceValue(problem, key, defaultValue); + return pref; + } + + /** + * Convenience method for setting default preference value for checker that + * uses "map" as top level problem preference. + * + * @param problem - problem for which to set default value for a prefence + * @param key - preference key + * @param defaultValue - value of preference to be set + */ + protected void setDefaultPreferenceValue(IProblemWorkingCopy problem, + String key, Object defaultValue) { + MapProblemPreference map = getTopLevelPreferenceMap(problem); + if (map.getChildValue(key) == null) + map.setChildValue(key, defaultValue); + } + + /** + * Return "map" problem preference for a give problem, if problem + * has preference different than a map, it will throw ClassCastException. + * If top level preference does not exist create a map preference with name + * "params" + * and return it. + * + * @param problem + * @return top level preference if it is a map + */ + protected MapProblemPreference getTopLevelPreferenceMap(IProblem problem) { + MapProblemPreference map = (MapProblemPreference) problem + .getPreference(); + if (map == null) { + map = new MapProblemPreference(AbstractProblemPreference.PARAM, ""); //$NON-NLS-1$ + if (problem instanceof IProblemWorkingCopy) { + ((IProblemWorkingCopy) problem).setPreference(map); + } + } + return map; + } + + /** + * Returns value of the preference for the key in the top level + * preference map for the given problem + * + * @param problem - problem for which to get the preference + * @param key - preference key + * @return value of the preference + */ + public Object getPreference(IProblem problem, String key) { + return ((MapProblemPreference) problem.getPreference()) + .getChildValue(key); + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractIndexAstChecker.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractIndexAstChecker.java deleted file mode 100644 index d805f2f..0000000 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractIndexAstChecker.java +++ /dev/null @@ -1,103 +0,0 @@ -/******************************************************************************* - * 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.core.model; - -import org.eclipse.cdt.codan.core.CodanCorePlugin; -import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.dom.ast.IASTFileLocation; -import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.index.IIndex; -import org.eclipse.cdt.core.model.CoreModel; -import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ITranslationUnit; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; - -/** - * @author Alena - * - */ -public abstract class AbstractIndexAstChecker extends AbstractChecker implements - ICAstChecker { - private IFile file; - - protected IFile getFile() { - return file; - } - - void processFile(IFile file) throws CoreException, InterruptedException { - // create translation unit and access index - ICElement model = CoreModel.getDefault().create(file); - if (!(model instanceof ITranslationUnit)) - return; - ITranslationUnit tu = (ITranslationUnit) model; - if (tu == null) - return; // not a C/C++ file - IIndex index = CCorePlugin.getIndexManager().getIndex(tu.getCProject()); - // lock the index for read access - index.acquireReadLock(); - try { - // create index based ast - IASTTranslationUnit ast = tu.getAST(index, - ITranslationUnit.AST_SKIP_INDEXED_HEADERS); - // traverse the ast using the visitor pattern. - this.file = file; - processAst(ast); - } finally { - this.file = null; - index.releaseReadLock(); - } - } - - public boolean processResource(IResource resource) { - if (resource instanceof IFile) { - IFile file = (IFile) resource; - try { - processFile(file); - } catch (CoreException e) { - CodanCorePlugin.log(e); - } catch (InterruptedException e) { - // ignore - } - return false; - } - return true; - } - - public void reportProblem(String id, IASTNode astNode, String message) { - IASTFileLocation astLocation = astNode.getFileLocation(); - IPath location = new Path(astLocation.getFileName()); - IFile astFile = ResourcesPlugin.getWorkspace().getRoot() - .getFileForLocation(location); - if (astFile == null) { - astFile = file; - } - ProblemLocation loc; - if (astLocation.getStartingLineNumber() == astLocation - .getEndingLineNumber()) - loc = new ProblemLocation(astFile, astLocation.getNodeOffset(), - astLocation.getNodeOffset() + astLocation.getNodeLength()); - else - loc = new ProblemLocation(astFile, astLocation - .getStartingLineNumber()); - getProblemReporter().reportProblem(id, loc, message); - } - - @Override - public boolean runInEditor() { - return true; - } -} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemLocation.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemLocation.java new file mode 100644 index 0000000..c2bcd2a --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemLocation.java @@ -0,0 +1,104 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +import org.eclipse.core.resources.IFile; + +/** + * Abstract Implementation of IProblemLocation + * + * Clients may extend this class. + *

+ * EXPERIMENTAL. This class or interface has been added as + * part of a work in progress. There is no guarantee that this API will + * work or that it will remain the same. + *

+ */ +public abstract class AbstractProblemLocation implements IProblemLocation { + protected IFile file; + protected int line; + protected int posStart; + protected int posEnd; + protected Object extra; + + protected AbstractProblemLocation(IFile file, int line) { + this.file = file; + this.line = line; + this.posStart = -1; + this.posEnd = -1; + } + + protected AbstractProblemLocation(IFile file, int startChar, int endChar) { + this.file = file; + this.line = -1; + this.posStart = startChar; + this.posEnd = endChar; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getData() + */ + public Object getData() { + return extra; + } + + /** + * Sets extra data for the problem location + * + * @param data + */ + public void setData(Object data) { + this.extra = data; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getFile() + */ + public IFile getFile() { + return file; + } + + /** + * Problem line number referenced in problem view in location field + */ + public int getLineNumber() { + return getStartingLineNumber(); + } + + /** + * @return line number where problem starts + */ + public int getStartingLineNumber() { + return line; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getStartPos() + */ + public int getStartingChar() { + return posStart; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getEndingChar() + */ + public int getEndingChar() { + return posEnd; + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Entries index 8635b9d..4315bc4 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Entries +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Entries @@ -1,16 +1,19 @@ -/AbstractChecker.java/1.4/Sat Aug 22 21:31:29 2009// -/AbstractIndexAstChecker.java/1.6/Wed Dec 16 21:48:48 2009// -/CodanSeverity.java/1.2/Wed Apr 22 01:26:56 2009// -/ICAstChecker.java/1.1/Thu Apr 9 12:46:50 2009// -/IChecker.java/1.3/Wed Dec 16 21:48:48 2009// -/ICheckersRegistry.java/1.1/Sat Aug 22 21:16:48 2009// -/ICodanAstReconciler.java/1.1/Sat Aug 22 21:16:48 2009// -/ICodanBuilder.java/1.1/Sat Aug 22 21:16:48 2009// -/IProblem.java/1.4/Wed Dec 16 21:48:48 2009// -/IProblemCategory.java/1.3/Wed Dec 16 21:48:48 2009// -/IProblemElement.java/1.2/Wed Dec 16 21:48:48 2009// -/IProblemLocation.java/1.1/Sat Aug 22 21:16:48 2009// -/IProblemProfile.java/1.4/Wed Dec 16 21:48:48 2009// -/IProblemReporter.java/1.2/Wed Dec 16 21:48:48 2009// -/ProblemLocation.java/1.1/Sat Aug 22 21:16:48 2009// -D +/AbstractChecker.java/1.13/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/AbstractCheckerWithProblemPreferences.java/1.5/Mon May 31 02:53:25 2010//TCDT_7_0_0 +/AbstractProblemLocation.java/1.3/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/CodanSeverity.java/1.6/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IChecker.java/1.8/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/ICheckerWithPreferences.java/1.3/Thu Jun 3 17:01:52 2010//TCDT_7_0_0 +/ICheckersRegistry.java/1.6/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/ICodanBuilder.java/1.4/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblem.java/1.13/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemCategory.java/1.7/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemElement.java/1.4/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemLocation.java/1.4/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemLocationFactory.java/1.5/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemProfile.java/1.8/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemReporter.java/1.6/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemReporterPersistent.java/1.3/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IProblemWorkingCopy.java/1.9/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +/IRunnableInEditorChecker.java/1.3/Sun Jun 27 01:30:41 2010//TCDT_7_0_0 +D/cfg//// diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Tag b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Tag new file mode 100644 index 0000000..49a449a --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Tag @@ -0,0 +1 @@ +NCDT_7_0_0 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CodanSeverity.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CodanSeverity.java index acfa4d1..fb85718 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CodanSeverity.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CodanSeverity.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 @@ -12,21 +12,40 @@ package org.eclipse.cdt.codan.core.model; import org.eclipse.core.resources.IMarker; +/** + * + * Represents Severity of the codan problem. It is directly mapped to markers + * severity. + * + */ public enum CodanSeverity { - Info(IMarker.SEVERITY_INFO), Warning(IMarker.SEVERITY_WARNING), Error( - IMarker.SEVERITY_ERROR); + /** + * Info severity + */ + Info(IMarker.SEVERITY_INFO), + /** + * Warning severity + */ + Warning(IMarker.SEVERITY_WARNING), + /** + * Error severity + */ + Error(IMarker.SEVERITY_ERROR); private int value; private CodanSeverity(int value) { this.value = value; } + /** + * @return int value of the severity + */ public int intValue() { return value; } /** - * @return + * @return array of string value for all severities */ public static String[] stringValues() { CodanSeverity[] values = values(); diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICAstChecker.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICAstChecker.java deleted file mode 100644 index 461c0fa..0000000 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICAstChecker.java +++ /dev/null @@ -1,21 +0,0 @@ -/******************************************************************************* - * 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.core.model; - -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; - -/** - * @author Alena - * - */ -public interface ICAstChecker extends IChecker { - void processAst(IASTTranslationUnit ast); -} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java index 60f7cb2..f00fea0 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.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 @@ -13,27 +13,48 @@ package org.eclipse.cdt.codan.core.model; import org.eclipse.core.resources.IResource; /** - * Interface that checker must implement. CDT Checker must be able to process a resource. + * Interface that checker must implement (through extending directly or + * indirectly {@link AbstractChecker}. + * + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + * Extend {@link AbstractChecker} class instead. */ public interface IChecker { /** * Main method that checker should implement that actually detects errors - * @param resource - resource to run on - * @return true if need to traverse children + * + * @param resource + * - resource to run on + * @return true if framework should traverse children of the resource and + * run this checkers on them again */ boolean processResource(IResource resource); /** - * Implement this method to trim down type of resource you are interested in, - * usually it will be c/c++ files only + * 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 - * @return + * - resource to run on + * @return - true if checker should be run on this resource */ boolean enabledInContext(IResource resource); /** * Checker must implement this method to determine if it can run in editor - * "as you type", checker must be really light weight to run in this mode + * "as you type". Checker must be really light weight to run in this mode. + * If it returns true, checker must also implement + * {@link IRunnableInEditorChecker}. + * 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 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckerWithPreferences.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckerWithPreferences.java new file mode 100644 index 0000000..56619cb --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckerWithPreferences.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +/** + * Interface for checker with parameters, if checker implements this interface + * method would be called on initialization so checker has a chance to set + * default values for its parameters. It is recommended to use + * {@link AbstractCheckerWithProblemPreferences} insted of implementing it + * directly.

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ * + * @noextend This interface is not intended to be extended by clients. + */ +public interface ICheckerWithPreferences { + /** + * Implement this method to set default parameters for checkers with + * parameters. + * + * @param problem + * - instance of problem working copy + */ + void initPreferences(IProblemWorkingCopy problem); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckersRegistry.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckersRegistry.java index 052d868..04189ae 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckersRegistry.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckersRegistry.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,57 +10,125 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; +import java.util.Collection; import java.util.Iterator; import org.eclipse.core.resources.IResource; /** - * @author Alena + * This interface an API to add/remove checker and problems programmatically, + * get problem profiles and change problem default settings + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. * */ -public interface ICheckersRegistry { - public abstract Iterator iterator(); +public interface ICheckersRegistry extends Iterable { + /** + * Iterator for registered checkers + * + * @return iterator for registered checkers + */ + public Iterator iterator(); + + /** + * Add a checker + * + * @param checker instance + */ + public void addChecker(IChecker checker); - public abstract void addChecker(IChecker checker); + /** + * Add problem p into a category defined by a category id into default + * profile, category must exists in default profile + * + * @param p + * - problem + * @param categoryId + * - category id + */ + public void addProblem(IProblem p, String categoryId); - public abstract void addProblem(IProblem p, String category); + /** + * Add subcategory category into parent category with the id of + * parentCategoryId, if parent does not exist in the default profile or it + * is a null - it will be added to the root + * + * @param category + * - new category + * @param parentCategoryId + * - parent category id + */ + public abstract void addCategory(IProblemCategory category, + String parentCategoryId); - public abstract void addCategory(IProblemCategory p, String category); + /** + * Add problem reference to a checker, i.e. claim that checker can produce + * this problem. If checker does not claim any problems it cannot be + * enabled. + * + * @param c + * - checker + * @param p + * - problem + */ + public void addRefProblem(IChecker c, IProblem p); - public abstract void addRefProblem(IChecker c, IProblem p); + /** + * Return collection of problem that this checker can produce + * + * @param checker + * @return collection of problems + */ + public Collection getRefProblems(IChecker checker); /** - * @return + * Default profile is kind of "Installation Default". + * Always the same, comes from defaults in checker extensions or APIs added + * + * @return default profile */ - public abstract IProblemProfile getDefaultProfile(); + public IProblemProfile getDefaultProfile(); /** - * @return + * Get workspace profile. User can change setting for workspace profile. + * + * @return workspace profile */ - public abstract IProblemProfile getWorkspaceProfile(); + public IProblemProfile getWorkspaceProfile(); /** + * Get resource profile. For example given project can have different + * profile than a workspace. + * * @param element - * @return + * - resource + * @return resource profile */ - public abstract IProblemProfile getResourceProfile(IResource element); + public IProblemProfile getResourceProfile(IResource element); /** + * Returns profile working copy for given resource element. (If profile is + * not specified for given element it will search for parent resource and so + * on). If you planning on editing it this method should be used instead of + * getResourceProfile. You have to save your changes after updating a + * working copy, using {@link #updateProfile(IResource, IProblemProfile)} + * method. + * + * @noreference This method is not intended to be referenced by clients. * @param element - * @return + * @return resource profile */ - public abstract IProblemProfile getResourceProfileWorkingCopy( - IResource element); + public IProblemProfile getResourceProfileWorkingCopy(IResource element); /** - * Set profile for resource. This method is called by UI, and should not be - * called by clients directly + * Set profile for resource. * + * @noreference This method is not intended to be referenced by clients. * @param resource - * - resource + * - resource * @param profile - * - problems profile + * - problems profile */ - public abstract void updateProfile(IResource resource, - IProblemProfile profile); + public void updateProfile(IResource resource, IProblemProfile profile); } \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanAstReconciler.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanAstReconciler.java deleted file mode 100644 index 17bc8f7..0000000 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanAstReconciler.java +++ /dev/null @@ -1,22 +0,0 @@ -/******************************************************************************* - * 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.core.model; - -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * @author Alena - * - */ -public interface ICodanAstReconciler { - public void reconcileAst(IASTTranslationUnit ast, IProgressMonitor monitor); -} \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanBuilder.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanBuilder.java index ce1f668..dcbe4c3 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanBuilder.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanBuilder.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 @@ -14,9 +14,20 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; /** - * @author Alena + * Interface for "Codan Builder". Clients can call processResource method to + * traverse the resource tree. It will be calling all the checkers (this + * interface allows to call framework without using UI). You can obtain instance + * of this class as CodanRuntime.getInstance().getBuilder() * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. */ public interface ICodanBuilder { + /** + * Run code analysis on given resource + * + * @param resource - resource to process + * @param monitor - progress monitor + */ public void processResource(IResource resource, IProgressMonitor monitor); } \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java index bbab313..d12806d 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.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,56 +10,82 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; -import java.util.Collection; +import org.eclipse.cdt.codan.core.param.IProblemPreference; /** - * Interface representing code analysis problem - * + * Interface representing code analysis problem type. For example + * "Null Pointer Dereference" is a problem. It has user visible Name and Message + * (translatable), as well as some other parameters, changeable by user such as + * enablement, severity and so on. Same problem cannot have two severities + * determined by runtime. If it is the case - two Problems should be created + * (i.e. one for error and one for warning). All of problem attributes are + * defined in a checker extension point. + * + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. */ public interface IProblem extends IProblemElement { /** * Name of the problem - user visible "title", not the message + * + * @return title of the problem */ String getName(); /** - * Unique problem id. Should be qualified by plugin name to maintain uniqueness. - * @return + * Unique problem id. Should be qualified by plugin name to maintain + * uniqueness. + * + * @return unique problem id */ String getId(); /** * Is enabled in current context (usually within profile) + * * @return true if enabled */ boolean isEnabled(); /** * Get current severity + * * @return severity */ CodanSeverity getSeverity(); /** * Message pattern, java patter like 'Variable {0} is never used here' - * @return pattern + * + * @return pattern */ String getMessagePattern(); - void setSeverity(CodanSeverity sev); - - void setEnabled(boolean checked); - - void setMessagePattern(String message); - - public void setProperty(Object key, Object value); + /** + * Get root preference descriptor or null if not defined (used by ui to + * generate user controls for changing parameters) + * + * @return root preference or null + */ + public IProblemPreference getPreference(); /** - * Get custom property - * @param property name - * @return property object + * Get short description of a problem + * + * @return description */ - public Object getProperty(Object key); + public String getDescription(); - public Collection getPropertyKeys(); + /** + * Return marker id for the problem + * + * @return marker id + */ + public String getMarkerType(); } diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemCategory.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemCategory.java index cd3de3a..adfc897 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemCategory.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemCategory.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 @@ -11,38 +11,35 @@ package org.eclipse.cdt.codan.core.model; /** - * Problem category - * + * Problem category. Allows to group problems. + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. */ public interface IProblemCategory extends IProblemElement { /** * Category name + * + * @return category name */ String getName(); /** * Unique category id + * * @return id */ String getId(); /** * Category children (other categories or problems) - * @return + * + * @return children of the category */ IProblemElement[] getChildren(); - - /** - * Find problem by id within children recursively - * @param id - * @return - */ - IProblem findProblem(String id); - - /** - * Find category by id within children recursively - * @param id - * @return - */ - IProblemCategory findCategory(String id); } diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemElement.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemElement.java index 318f304..3068aeb 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemElement.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemElement.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 @@ -11,9 +11,17 @@ package org.eclipse.cdt.codan.core.model; /** - * Problem category or problem + * Problem category {@link IProblemCategory} or problem {@link IProblem} * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. */ public interface IProblemElement extends Cloneable { + /** + * clone method should be implemented to support problem cloning + * @see {@link Object#clone} + * @return new object which is copy of this one + * @throws CloneNotSupportedException - it is declared with this exception but it should NOT throw it + */ Object clone() throws CloneNotSupportedException; } diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocation.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocation.java index f5e4f23..1ef8546 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocation.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocation.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,19 +10,21 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; -import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IResource; /** * Interface to describe problem location. Usually contains file and linenumber, * also supports character positions for sophisticated errors. * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. */ public interface IProblemLocation { /** * * @return File for the problem - absolute full paths */ - IFile getFile(); + IResource getFile(); /** * diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocationFactory.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocationFactory.java new file mode 100644 index 0000000..4710bb1 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocationFactory.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +import org.eclipse.core.resources.IFile; + +/** + * Factory interface that allows to create problem locations. + * + * Clients may implement and extend this interface. + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ */ +public interface IProblemLocationFactory { + /** + * Create and return instance of IProblemLocation + * + * @param file + * - file where problem is found + * @param line + * - line number where problem is found, starts with 1 + * @return instance of IProblemLocation + */ + public IProblemLocation createProblemLocation(IFile file, int line); + + /** + * Create and return instance of IProblemLocation + * + * @param file + * - file where problem is found + * @param startChar + * - start char of the problem in the file, is zero-relative + * @param endChar + * - end char of the problem in the file, is zero-relative and + * exclusive. + * @return instance of IProblemLocation + */ + public IProblemLocation createProblemLocation(IFile file, int startChar, + int endChar); + + /** + * Create and return instance of IProblemLocation + * + * @param astFile - file where problem is found + * @param startChar - start char of the problem in the file, is + * zero-relative + * @param endChar - end char of the problem in the file, is zero-relative and + * exclusive. + * + * @param line + * - start line number (for visualisation purposes) + * @return instance of IProblemLocation + */ + public IProblemLocation createProblemLocation(IFile astFile, + int startChar, int endChar, int line); +} \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemProfile.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemProfile.java index 896eb10..1a0d2df 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemProfile.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemProfile.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,16 +10,29 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; +import org.eclipse.cdt.codan.internal.core.CheckersRegistry; + /** - * Problem Profile contains tree of categories and problems. For user profile is quick way - * to switch between problems sets depends on task he is doing (i.e. find real bugs, vs doing code style report) - * User can set different profiles in different projects. - * Profiles can have different categories and different problems set, problems with the same id - * can have different severities/enablement in different profiles. To obtain - * profile use class {@link CheckersRegisry#getResourceProfile, - * CheckersRegisry#getDefaultProfile() or CheckersRegisry#getWorkspaceProfile()} - * . + * Problem Profile contains tree of categories and problems. For the user + * the profile is quick way to switch between problem sets depending on the + * task he is doing (i.e. find real bugs, vs doing code style report) + * User can set different profiles for different projects. + * Profiles can have different categories and different problem sets, + * problems with the same id can have different severities/enablement in + * different profiles. + * Category tree can have few reference to a same problem, but only instance of + * Problem + * with the same id can exist in the same profile (i.e. two category can have + * same problem listed in both, + * but they both should point to the same problem instance). + * + * To obtain read-only profile use method + * {@link CheckersRegistry#getResourceProfile}, + * {@link CheckersRegistry#getDefaultProfile()} or + * {@link CheckersRegistry#getWorkspaceProfile()} * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. */ public interface IProblemProfile extends IProblemElement { /** @@ -28,25 +41,26 @@ public interface IProblemProfile extends IProblemElement { IProblemCategory getRoot(); /** - * Find and return problem by id + * Find and return problem by id if it contained in this profile * * @param id - * - problem id + * - problem id * @return problem instance */ IProblem findProblem(String id); /** - * Find and return category by id + * Find and return category by id if it is contained in this profile * * @param id - * - category id + * - category id * @return category instance */ IProblemCategory findCategory(String id); /** - * Get all defined problems + * Get all problems defined in this profile (if problem duplicated in a + * category tree, it returns only one instance of each) * * @return array of problems defined in profile */ diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporter.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporter.java index 059f155..a928593 100644 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporter.java +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporter.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,20 +10,32 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; - /** * IProblemReporter - interface to report problems - * + * + *

+ * EXPERIMENTAL. This class or interface has been added as + * part of a work in progress. There is no guarantee that this API will + * work or that it will remain the same. + *

*/ public interface IProblemReporter { - public static final String GENERIC_CODE_ANALYSIS_MARKER_TYPE = "org.eclipse.cdt.codan.core.codanProblem"; /** - * Report a problem with "problemId" id on location determined by "loc", - * using problem specific error message customised by args. - * @param problemId - id of the problem registers with checker - * @param loc - location object - * @param args - custom args, can be null, in this case default message is reported + * id of generic codan problem marker + */ + public static final String GENERIC_CODE_ANALYSIS_MARKER_TYPE = "org.eclipse.cdt.codan.core.codanProblem"; //$NON-NLS-1$ + + /** + * Report a problem with "problemId" id on the location determined by "loc", + * using problem specific error message customized by args. + * + * @param problemId - id of the problem registered with a checker + * @param loc - location object, can be created using + * getRuntime().getProblemLocationFactory().createProblemLocation + * methods + * @param args - custom arguments, can be null, in this case default message + * is reported */ - public void reportProblem(String problemId, IProblemLocation loc, - Object ... args); + public void reportProblem(String problemId, IProblemLocation loc, + Object... args); } \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporterPersistent.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporterPersistent.java new file mode 100644 index 0000000..88638d9 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporterPersistent.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +import org.eclipse.core.resources.IResource; + +/** + * IProblemReporterPersistent - interface to report problems, which are + * persistent, ex. markers + * + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ */ +public interface IProblemReporterPersistent extends IProblemReporter { + /** + * Delete all problems associated with resource created by given checker + * + * @param resource + * @param checker + */ + public void deleteProblems(IResource resource, IChecker checker); + + /** + * Delete all problems associated with resource + * + * @param resource + */ + public void deleteProblems(IResource resource); + + /** + * Delete all persisted problems + */ + public void deleteAllProblems(); +} \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java new file mode 100644 index 0000000..bb08f2e --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +import org.eclipse.cdt.codan.core.param.IProblemPreference; + +/** + * Modifiable problem. + * + * + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IProblemWorkingCopy extends IProblem { + /** + * Set severity for this this problem instance. Severity can only be changed + * in profile not by checker when printing problems. + * + * @param sev + * - codan severity + */ + void setSeverity(CodanSeverity sev); + + /** + * Set checker enablement. + * + * @param enabled + * - true if problem is enabled in profile + */ + void setEnabled(boolean enabled); + + /** + * Set default message pattern. UI would call this method if user does not + * like default settings, checker should not use method, default message + * pattern should be set in checker extension + * + * @param messagePattern + * - java style message patter i.e. "Variable {0} is never used" + */ + void setMessagePattern(String messagePattern); + + /** + * Set value for the checker parameter, checker may set value during + * initialization only, which would the default. User control this values + * through ui later. + * + * @param pref - preference to set + * + */ + public void setPreference(IProblemPreference pref); + + /** + * Set problem description + * + * @param desc + * - problem description - short version, but longer than name + */ + public void setDescription(String desc); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IRunnableInEditorChecker.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IRunnableInEditorChecker.java new file mode 100644 index 0000000..694aaf4 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IRunnableInEditorChecker.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model; + +/** + * Interface for checkers that can be run when user is typing, checker has to be + * very quick to run in this mode + *

+ * EXPERIMENTAL. This class or interface has been added as part + * of a work in progress. There is no guarantee that this API will work or that + * it will remain the same. + *

+ * + * @noextend This interface is not intended to be extended by clients. + */ +public interface IRunnableInEditorChecker { + /** + * @param model + */ + void processModel(Object model); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ProblemLocation.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ProblemLocation.java deleted file mode 100644 index ced12f0..0000000 --- a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ProblemLocation.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * 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.core.model; - -import org.eclipse.core.resources.IFile; - -/** - * Implementation of IProblemLocation - * - */ -public class ProblemLocation implements IProblemLocation { - protected IFile file; - protected int line; - protected int posStart; - protected int posEnd; - protected Object extra; - - /** - * @param file - * @param line - * @param lineEnd - * @param posStart - * @param posEnd - */ - public ProblemLocation(IFile file, int line) { - this.file = file; - this.line = line; - this.posStart = -1; - this.posEnd = -1; - } - - /** - * @param file - * @param startingLineNumber - * @param endingLineNumber - */ - public ProblemLocation(IFile file, int startChar, int endChar) { - this.file = file; - this.line = -1; - this.posStart = startChar; - this.posEnd = endChar; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getData() - */ - public Object getData() { - return extra; - } - - public void setData(Object data) { - this.extra = data; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getFile() - */ - public IFile getFile() { - return file; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getLine() - */ - public int getLineNumber() { - return getStartingLineNumber(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getStartLine() - */ - public int getStartingLineNumber() { - return line; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getStartPos() - */ - public int getStartingChar() { - return posStart; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getEndingChar() - */ - public int getEndingChar() { - return posEnd; - } -} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Entries new file mode 100644 index 0000000..60f510d --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Entries @@ -0,0 +1,13 @@ +/IBasicBlock.java/1.6/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IBranchNode.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/ICfgData.java/1.2/Tue Jun 1 02:24:14 2010//TCDT_7_0_0 +/IConnectorNode.java/1.5/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IControlFlowGraph.java/1.5/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IDecisionNode.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IExitNode.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IJumpNode.java/1.5/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/INodeFactory.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IPlainNode.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/ISingleIncoming.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/ISingleOutgoing.java/1.4/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IStartNode.java/1.3/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Repository b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Repository new file mode 100644 index 0000000..52814e4 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Repository @@ -0,0 +1 @@ +org.eclipse.cdt/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Root b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Root new file mode 100644 index 0000000..04efa23 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Root @@ -0,0 +1 @@ +:pserver:anonymous@dev.eclipse.org:/cvsroot/tools diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Tag b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Tag new file mode 100644 index 0000000..49a449a --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Tag @@ -0,0 +1 @@ +NCDT_7_0_0 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java new file mode 100644 index 0000000..406ab84 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Control flow graph's basic block node - super interface of all nodes. + * It has set on incoming nodes and outgoing nodes. + *

+ * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IBasicBlock { + /** + * Incoming nodes - nodes that executed immediately before this one + * + * @return array of incoming nodes, empty array of none + */ + IBasicBlock[] getIncomingNodes(); + + /** + * Outgoing nodes - where control would be passed. Can be more than one if + * node is condition. + * + * @return array of outgoing nodes, empty of none + */ + IBasicBlock[] getOutgoingNodes(); + + /** + * @return size of array of incoming nodes + */ + int getIncomingSize(); + + /** + * @return size of array of outgoing nodes + */ + int getOutgoingSize(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBranchNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBranchNode.java new file mode 100644 index 0000000..77e7fb3 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBranchNode.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model.cfg; + +/** + * Node that represent empty operator with label, such as case branch or label + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IBranchNode extends IBasicBlock, ISingleIncoming, + ISingleOutgoing { + /** + * Then branch of "if" statement + */ + public static String THEN = "then"; //$NON-NLS-1$ + /** + * Else branch of "if" statement + */ + public static String ELSE = "else"; //$NON-NLS-1$ + /** + * Default branch of "switch" statement + */ + public static String DEFAULT = "default"; //$NON-NLS-1$ + + /** + * @return label of a branch + */ + String getLabel(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ICfgData.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ICfgData.java new file mode 100644 index 0000000..1e43450 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ICfgData.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model.cfg; + +/** + * Interface to access data object that control flow graph block carries, + * usually it is an ast node. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface ICfgData { + /** + * @return data object + */ + public abstract Object getData(); + + /** + * Sets data object for the node + * + * @param data + */ + public abstract void setData(Object data); +} \ No newline at end of file diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java new file mode 100644 index 0000000..f58fdd1 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Connector node has multiple incoming branches and single outgoing. + * Incoming nodes are usually instance of {@link IJumpNode} + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IConnectorNode extends IBasicBlock, ISingleOutgoing { + /** + * @return true if one of the incoming arcs is backward arc + */ + boolean hasBackwardIncoming(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java new file mode 100644 index 0000000..a8f9269 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model.cfg; + +import java.util.Collection; +import java.util.Iterator; + +/** + * Represents control flow graph (CFG) object. + * This is "normalized" control flow graph, with typed nodes: + *
+ *

  • {@link IStartNode} - start node of the cfg (source) + *
  • {@link IExitNode} - exit node of the cfg (sink) + *
  • {@link IPlainNode} - has one incoming one outgoing + *
  • {@link IDecisionNode} - has one incoming and the only node that can have + * multiple outcoming + * arcs + *
  • {@link IConnectorNode} - the only node that can have multiple incoming + * arcs, and one outgoing + *
  • {@link IJumpNode} - has one incoming and one outgoing but represent + * change of control direction + *
  • {@link IBranchNode} - usually node where decision node connect to, + * labels represent a way where controls goes to + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IControlFlowGraph { + /** + * @return start node of the graph. CFG only has one start node. + */ + IStartNode getStartNode(); + + /** + * @return iterator over exit nodes of control flow graph. Exit nodes + * include return statement, + * and statements with throw and abort/exit functions. + */ + Iterator getExitNodeIterator(); + + /** + * @return size of exit nodes list + */ + int getExitNodeSize(); + + /** + * @return list of roots of dead code sections, they don't have incoming + * arcs + */ + Iterator getUnconnectedNodeIterator(); + + /** + * @return size of unconnected nodes list + */ + int getUnconnectedNodeSize(); + + /** + * @return collection of all nodes + */ + Collection getNodes(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IDecisionNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IDecisionNode.java new file mode 100644 index 0000000..7f2f561 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IDecisionNode.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * + * Interface for decision node. This node represent condition node in the graph, + * it has one incoming arc and many outgoing, each of outgoing node should be + * IBranchNode + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IDecisionNode extends IBasicBlock, ISingleIncoming { + /** + * Node where branches of decision node merge + * + * @return the "merge" node + */ + IConnectorNode getMergeNode(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IExitNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IExitNode.java new file mode 100644 index 0000000..71d7e25 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IExitNode.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model.cfg; + +/** + * Exit node of the graph. Usually return from the function, can also be throw + * or abort, such at exit(0) call. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IExitNode extends IBasicBlock, ISingleIncoming { + /** + * @return reference to a start node a graph + */ + IStartNode getStartNode(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java new file mode 100644 index 0000000..d2e298b --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Node that changes the control of the graph, i.e. passes control to non-next + * statement. Can be used to implement gotos, break, continue, end of branches. + * Outgoing node is always {@link IConnectorNode} + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IJumpNode extends IBasicBlock, ISingleOutgoing { + /** + * @return true of outgoing arc is backward one, see definition of backward + * arc in a "network" graph + */ + boolean isBackwardArc(); + + /** + * @return reference to a connector node to which this one "jumps" (same as + * outgoing node) + */ + IConnectorNode getJumpNode(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/INodeFactory.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/INodeFactory.java new file mode 100644 index 0000000..bd10ded --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/INodeFactory.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.model.cfg; + +/** + * Control Flow Graph Node factory + * + * @noextend This interface is not intended to be extended by clients. + */ +public interface INodeFactory { + /** + * @return new plain node + */ + IPlainNode createPlainNode(); + + /** + * @return new jump node + */ + IJumpNode createJumpNode(); + + /** + * @return new decision node + */ + IDecisionNode createDecisionNode(); + + /** + * @return new connector node + */ + IConnectorNode createConnectorNode(); + + /** + * @param label + * @return new branch node + */ + IBranchNode createBranchNode(String label); + + /** + * @return new start node + */ + IStartNode createStartNode(); + + /** + * @return new exit node + */ + IExitNode createExitNode(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java new file mode 100644 index 0000000..fac5599 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Has one incoming, one outgoing connection. Usually expression statement or + * declaration. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IPlainNode extends IBasicBlock, ISingleOutgoing, + ISingleIncoming { +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleIncoming.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleIncoming.java new file mode 100644 index 0000000..2900ce8 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleIncoming.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Node with one incoming arc + * + * @noextend This interface is not intended to be extended by clients. + */ +public interface ISingleIncoming { + /** + * @return single incoming node + */ + IBasicBlock getIncoming(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleOutgoing.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleOutgoing.java new file mode 100644 index 0000000..3427826 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleOutgoing.java @@ -0,0 +1,23 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Node with one outgoing arc + * + * @noextend This interface is not intended to be extended by clients. + */ +public interface ISingleOutgoing { + /** + * @return outgoing node + */ + IBasicBlock getOutgoing(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IStartNode.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IStartNode.java new file mode 100644 index 0000000..7c20c3e --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IStartNode.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2010 Alena Laskavaia and others. + * 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.core.model.cfg; + +/** + * Start node of the control flow graph. Each graph has only one start node. It + * has no incoming arcs and one outgoing arc. It also contains iterator for + * function exit nodes. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IStartNode extends IBasicBlock, ISingleOutgoing { +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemPreference.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemPreference.java new file mode 100644 index 0000000..91969fc --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemPreference.java @@ -0,0 +1,202 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.StreamTokenizer; + +/** + * Default implementation of problem preference. It keeps preference metadata + * together with preference value. Some implementations may separate them. + * + */ +public abstract class AbstractProblemPreference implements IProblemPreference { + /** + * default key for a preference + */ + public static final String PARAM = "params"; //$NON-NLS-1$ + private String key = PARAM; + private String label = ""; //$NON-NLS-1$ + private String toolTip = null; + private String uiInfo; + private IProblemPreference parent; + + public String getLabel() { + return label; + } + + public String getToolTip() { + return toolTip; + } + + public String getKey() { + return key; + } + + public String getUiInfo() { + return uiInfo; + } + + /** + * Set preference key for itself + * + * @param key + */ + public void setKey(String key) { + if (key == null) + throw new NullPointerException("key"); //$NON-NLS-1$ + if (isValidIdentifier(key)) + this.key = key; + else + throw new IllegalArgumentException( + "Key must have java identifier syntax or number, i.e no dots and other funky stuff: " + key); //$NON-NLS-1$ + } + + protected boolean isValidIdentifier(String id) { + if (id == null) + return false; + int n = id.length(); + if (n == 0) + return false; + if (id.equals("#")) //$NON-NLS-1$ + return true; + for (int i = 0; i < n; i++) + if (!Character.isJavaIdentifierPart(id.charAt(i))) + return false; + return true; + } + + /** + * Sets a label for UI control + * + * @param label + */ + public void setLabel(String label) { + if (label == null) + throw new NullPointerException("Label cannot be null"); //$NON-NLS-1$ + this.label = label; + } + + /** + * Sets tooltip for ui control. Not supported now. + * + * @param tooltip + */ + public void setToolTip(String tooltip) { + this.toolTip = tooltip; + } + + /** + * Sets uiinfo for ui control. Not supported now. + * + * @param uiinfo + */ + public void setUiInfo(String uiinfo) { + this.uiInfo = uiinfo; + } + + public Object getValue() { + throw new UnsupportedOperationException(); + } + + public void setValue(Object value) { + throw new UnsupportedOperationException(); + } + + @Override + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException e) { + return null; + } + } + + /** + * @param str + * @return + */ + protected StreamTokenizer getImportTokenizer(String str) { + ByteArrayInputStream st = new ByteArrayInputStream(str.getBytes()); + StreamTokenizer tokenizer = new StreamTokenizer(new InputStreamReader( + st)); + tokenizer.resetSyntax(); + tokenizer.quoteChar('"'); + tokenizer.wordChars('_', '_'); + tokenizer.wordChars('-', '-'); + tokenizer.wordChars('.', '.'); + tokenizer.wordChars('0', '9'); + tokenizer.wordChars('a', 'z'); + tokenizer.wordChars('A', 'Z'); + tokenizer.wordChars(128 + 32, 255); + tokenizer.whitespaceChars(0, ' '); + tokenizer.commentChar('/'); + return tokenizer; + } + + public IProblemPreference getParent() { + return parent; + } + + /** + * @param parent + * the parent to set + */ + public void setParent(IProblemPreference parent) { + this.parent = parent; + } + + public String getQualifiedKey() { + if (parent == null) + return getKey(); + return parent.getQualifiedKey() + "." + getKey(); //$NON-NLS-1$ + } + + /** + * @param tokenizer + * @throws IOException + */ + public abstract void importValue(StreamTokenizer tokenizer) + throws IOException; + + public void importValue(String str) { + StreamTokenizer tokenizer = getImportTokenizer(str); + try { + importValue(tokenizer); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(str, e); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + protected String escape(String x) { + x = x.replaceAll("[\"\\\\]", "\\\\$0"); //$NON-NLS-1$//$NON-NLS-2$ + return "\"" + x + "\""; //$NON-NLS-1$//$NON-NLS-2$ + } + + /** + * @param str + * @return + */ + protected String unescape(String str) { + StreamTokenizer tokenizer = getImportTokenizer(str); + try { + tokenizer.nextToken(); + } catch (IOException e) { + return null; + } + String sval = tokenizer.sval; + return sval; + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/BasicProblemPreference.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/BasicProblemPreference.java new file mode 100644 index 0000000..fd146b0 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/BasicProblemPreference.java @@ -0,0 +1,134 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.io.File; +import java.io.IOException; +import java.io.StreamTokenizer; +import java.util.regex.Pattern; + +/** + * Preference representing a problem preference of a basic type. + * + * @see IProblemPreferenceDescriptor.PreferenceType for types. + * + */ +public class BasicProblemPreference extends AbstractProblemPreference { + protected Object value; + private PreferenceType type = PreferenceType.TYPE_STRING; + + public PreferenceType getType() { + return type; + } + + /** + * Set preferene type + * + * @param type + */ + public void setType(PreferenceType type) { + if (type == null) + throw new NullPointerException("Type cannot be null"); //$NON-NLS-1$ + this.type = type; + } + + /** + * Generate an info with given key and label + * + * @param key + * - property id (use in actual property hash of a checker) + * @param label + * - label to be shown to user + * @param type + * - parameter type + */ + public BasicProblemPreference(String key, String label, PreferenceType type) { + this(key, label); + setType(type); + } + + /** + * Generate an info with given key and label + * + * @param key + * - property id (use in actual property hash of a checker) + * @param label + * - label to be shown to user + */ + public BasicProblemPreference(String key, String label) { + setKey(key); + setLabel(label); + } + + @Override + public void setValue(Object value) { + this.value = value; + } + + @Override + public Object getValue() { + return value; + } + + public String exportValue() { + Pattern pat = Pattern.compile("^[A-Za-z0-9._-]+$"); //$NON-NLS-1$ + String x = String.valueOf(getValue()); + if (pat.matcher(x).find() == false) + return escape(x); + return x; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.core.param.IProblemPreferenceValue#importValue( + * java.lang.String) + */ + @Override + public void importValue(String str) { + if (str.startsWith("\"")) //$NON-NLS-1$ + str = unescape(str); + switch (getType()) { + case TYPE_STRING: + setValue(str); + break; + case TYPE_INTEGER: + setValue(Integer.parseInt(str)); + break; + case TYPE_BOOLEAN: + setValue(Boolean.valueOf(str)); + break; + case TYPE_FILE: + setValue(new File(str)); + break; + default: + throw new IllegalArgumentException(getType() + + " is not supported for basic type"); //$NON-NLS-1$ + } + } + + @Override + public String toString() { + return "(" + type + ")" + getKey() + ((value == null) ? "" : "=" + value); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ + } + + @Override + public void importValue(StreamTokenizer tokenizer) { + try { + tokenizer.nextToken(); + String val = tokenizer.sval; + importValue(val); + } catch (IOException e) { + new IllegalArgumentException(e); + } + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Entries b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Entries new file mode 100644 index 0000000..4f3cdf4 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Entries @@ -0,0 +1,10 @@ +/AbstractProblemPreference.java/1.8/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/BasicProblemPreference.java/1.7/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/FileScopeProblemPreference.java/1.4/Wed Jun 2 00:39:31 2010//TCDT_7_0_0 +/IProblemPreference.java/1.3/Tue May 25 01:33:22 2010//TCDT_7_0_0 +/IProblemPreferenceCompositeDescriptor.java/1.4/Mon May 31 02:53:25 2010//TCDT_7_0_0 +/IProblemPreferenceCompositeValue.java/1.4/Tue Jun 1 02:24:14 2010//TCDT_7_0_0 +/IProblemPreferenceDescriptor.java/1.6/Thu Jun 3 17:01:53 2010//TCDT_7_0_0 +/IProblemPreferenceValue.java/1.4/Tue Jun 1 02:24:14 2010//TCDT_7_0_0 +/ListProblemPreference.java/1.6/Tue Jun 1 02:24:14 2010//TCDT_7_0_0 +/MapProblemPreference.java/1.6/Tue Jun 1 02:24:14 2010//TCDT_7_0_0 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Repository b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Repository new file mode 100644 index 0000000..d959de5 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Repository @@ -0,0 +1 @@ +org.eclipse.cdt/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Root b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Root new file mode 100644 index 0000000..04efa23 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Root @@ -0,0 +1 @@ +:pserver:anonymous@dev.eclipse.org:/cvsroot/tools diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Tag b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Tag new file mode 100644 index 0000000..49a449a --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Tag @@ -0,0 +1 @@ +NCDT_7_0_0 diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/FileScopeProblemPreference.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/FileScopeProblemPreference.java new file mode 100644 index 0000000..bdb36f0 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/FileScopeProblemPreference.java @@ -0,0 +1,267 @@ +/******************************************************************************* + * Copyright (c) 2009,2010 QNX Software Systems + * 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: + * QNX Software Systems (Alena Laskavaia) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.io.IOException; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.eclipse.cdt.codan.core.Messages; +import org.eclipse.cdt.codan.internal.core.CharOperation; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; + +/** + * Custom preference for resource scope + * + * @noextend This class is not intended to be extended by clients. + * @since 1.0 + */ +public class FileScopeProblemPreference extends AbstractProblemPreference { + /** + * Key for the scope preference + */ + public static final String KEY = "fileScope"; //$NON-NLS-1$ + /** + * Exclusion attribute + */ + public static final String EXCLUSION = "exclusion"; //$NON-NLS-1$ + /** + * Inclusion attribute + */ + public static final String INCLUSION = "inclusion"; //$NON-NLS-1$ + private IResource resource; + private IPath[] inclusion = new IPath[0]; + private IPath[] exclusion = new IPath[0]; + + /** + * Default constructor + */ + public FileScopeProblemPreference() { + setKey(KEY); + setLabel(Messages.FileScopeProblemPreference_Label); + } + + public PreferenceType getType() { + return PreferenceType.TYPE_CUSTOM; + } + + /** + * Get attribute. Possible keys are EXCUSION and INCLUSION + * + * @param key + * @return class attribute for given key + */ + public IPath[] getAttribute(String key) { + if (key == EXCLUSION) + return exclusion; + if (key == INCLUSION) + return inclusion; + return null; + } + + /** + * Set attribute to a value. Possible keys are EXCUSION and INCLUSION + * + * @param key + * @param value + */ + public void setAttribute(String key, IPath[] value) { + if (key == EXCLUSION) + exclusion = value.clone(); + if (key == INCLUSION) + inclusion = value.clone(); + } + + /** + * @return null for workspace, or project of the resource it is applicable + * for + */ + public IProject getProject() { + if (resource != null) + return resource.getProject(); + return null; + } + + /** + * @return path of the resource it is applicable to + */ + public IPath getPath() { + if (resource != null) + return resource.getFullPath(); + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IWorkspaceRoot root = workspace.getRoot(); + return root.getFullPath(); + } + + /** + * @param resource + * the resource to set + */ + public void setResource(IResource resource) { + this.resource = resource; + } + + /** + * @return the resource for which scope is define. Null if workspace. + */ + public IResource getResource() { + return resource; + } + + public String exportValue() { + return exportPathList(INCLUSION, inclusion) + "," //$NON-NLS-1$ + + exportPathList(EXCLUSION, exclusion); + } + + protected String exportPathList(String key, IPath[] arr) { + String res = key + "=>("; //$NON-NLS-1$ + for (int i = 0; i < arr.length; i++) { + if (i != 0) + res += ","; //$NON-NLS-1$ + res += escape(arr[i].toPortableString()); + } + return res + ")"; //$NON-NLS-1$ + } + + @Override + public void importValue(StreamTokenizer tokenizer) throws IOException { + List inc = importPathList(tokenizer, INCLUSION); + inclusion = inc.toArray(new IPath[inc.size()]); + checkChar(tokenizer, ','); + List exc = importPathList(tokenizer, EXCLUSION); + exclusion = exc.toArray(new IPath[exc.size()]); + } + + private void checkChar(StreamTokenizer tokenizer, char c) + throws IOException { + tokenizer.nextToken(); + if (tokenizer.ttype != c) + throw new IllegalArgumentException("Expected " + c); //$NON-NLS-1$ + } + + private void checkKeyword(StreamTokenizer tokenizer, String keyword) + throws IOException { + tokenizer.nextToken(); + if (tokenizer.sval == null || !tokenizer.sval.equals(keyword)) + throw new IllegalArgumentException("Expected " + keyword); //$NON-NLS-1$ + } + + protected List importPathList(StreamTokenizer tokenizer, + String keyword) throws IOException { + checkKeyword(tokenizer, keyword); + checkChar(tokenizer, '='); + checkChar(tokenizer, '>'); + ArrayList list = new ArrayList(); + int token; + int index = 0; + try { + checkChar(tokenizer, '('); + token = tokenizer.nextToken(); + if (token != ')') + tokenizer.pushBack(); + else + return Collections.emptyList(); + while (true) { + token = tokenizer.nextToken(); + if (tokenizer.sval == null) + throw new IllegalArgumentException(); + list.add(new Path(tokenizer.sval)); + token = tokenizer.nextToken(); + if (token == ')') + break; + tokenizer.pushBack(); + checkChar(tokenizer, ','); + index++; + } + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + return list; + } + + @Override + public Object getValue() { + return this; + } + + @Override + public void setValue(Object value) { + if (this == value) + return; + FileScopeProblemPreference scope = (FileScopeProblemPreference) value; + setAttribute(INCLUSION, scope.getAttribute(INCLUSION)); + setAttribute(EXCLUSION, scope.getAttribute(EXCLUSION)); + this.resource = scope.getResource(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.cdt.codan.core.param.AbstractProblemPreference#clone() + */ + @Override + public Object clone() { + FileScopeProblemPreference scope = (FileScopeProblemPreference) super + .clone(); + scope.setValue(this); + return scope; + } + + /** + * Checks that resource denotated by the given path is in scope (defined by + * exclusion/inclusion settings of this class). In inclusion list is defined + * check first if it belongs to it, returns false if not. + * Then checks if it belongs to exclusion list and return false if it is. + * + * @param path + * - resource path + * @return true is given path is in scope + */ + public boolean isInScope(IPath path) { + //System.err.println("test " + file + " " + exportValue()); + if (inclusion.length > 0) { + if (!matchesFilter(path, inclusion)) + return false; + } + if (exclusion.length > 0) { + if (matchesFilter(path, exclusion)) + return false; + } + return true; + } + + /** + * Checks that given path matches on the paths provided as second argument + * + * @param resourcePath - resource path + * @param paths - array of path patterns, for pattern see + * {@link CharOperation#pathMatch} + * @return true if matches with at least one pattern in the array + */ + public boolean matchesFilter(IPath resourcePath, IPath[] paths) { + char[] path = resourcePath.toString().toCharArray(); + for (int i = 0, length = paths.length; i < length; i++) { + char[] pattern = paths[i].toString().toCharArray(); + if (CharOperation.pathMatch(pattern, path, true, '/')) { + return true; + } + } + return false; + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreference.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreference.java new file mode 100644 index 0000000..6b0c316 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreference.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2009,2010 QNX Software Systems + * 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: + * QNX Software Systems (Alena Laskavaia) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +/** + * Problem preference. If problem has more than one it can be composite, i.e. + * map. Instead of implementing this interface clients must extend + * {@link AbstractProblemPreference} class. + * + * Problem Preference constist of preference metadata + * (IProblemPreferenceDescriptor) + * and value of preference (IProblemPreferenceValue). + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IProblemPreference extends Cloneable, IProblemPreferenceValue, + IProblemPreferenceDescriptor { +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeDescriptor.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeDescriptor.java new file mode 100644 index 0000000..392e0a2 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeDescriptor.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2009,2010 QNX Software Systems + * 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: + * QNX Software Systems (Alena Laskavaia) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +/** + * Composite descriptor. For descriptors like map and list. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IProblemPreferenceCompositeDescriptor { + /** + * Available if type is composite. Returns value of subdescriptor with the + * name of key. For the "list" type key is the number (index). + * + * @param key + * - name of the subdescriptor. + * @return child preference of the given key + */ + IProblemPreference getChildDescriptor(String key); + + /** + * Available for composite types. Returns array of children. + * + * @return array of children. 0 size of none. + */ + IProblemPreference[] getChildDescriptors(); + + /** + * Add preference + * + * @param preference + * @return added preference + */ + IProblemPreference addChildDescriptor(IProblemPreference preference); + + /** + * Remove preference + * + * @param preference + */ + void removeChildDescriptor(IProblemPreference preference); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeValue.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeValue.java new file mode 100644 index 0000000..f44a659 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeValue.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +/** + * Interface for container type preferences, such as map or list + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IProblemPreferenceCompositeValue { + /** + * Returns value of the child element of a given key + * + * @param key + * @return value of the child preference + */ + Object getChildValue(String key); + + /** + * Sets the value of the child element of a given key + * + * @param key + * @param value + */ + void setChildValue(String key, Object value); + + /** + * Removes child element matching the given key + * + * @param key + */ + void removeChildValue(String key); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceDescriptor.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceDescriptor.java new file mode 100644 index 0000000..f6f97e0 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceDescriptor.java @@ -0,0 +1,171 @@ +/******************************************************************************* + * 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.io.File; +import java.util.List; +import java.util.Map; + +/** + * Problem parameter usually key=value settings that allows to alter checker + * behaviour for given problem. For example if checker finds violation of naming + * conventions for function, parameter would be the pattern of allowed names. + * + * IProblemPreferenceDescriptor represent preference's meta-info for the ui. If + * more than one parameter is required it can be map or list of sub-preferences. + * This is only needed for auto-generated ui for parameter + * editing. For more complex cases custom ui control should be used. Extend + * {@link AbstractProblemPreference} class + * to implement this interface. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IProblemPreferenceDescriptor extends Cloneable { + /** + * Type of the user preference + */ + public enum PreferenceType { + /** + * String type, represented by string input field by default + */ + TYPE_STRING("string"), //$NON-NLS-1$ + /** + * Integer type, represented by integer input field by default + */ + TYPE_INTEGER("integer"), //$NON-NLS-1$ + /** + * Boolean type, represented by checkbox (boolean input field) + */ + TYPE_BOOLEAN("boolean"), //$NON-NLS-1$ + /** + * File type, represented by file picker input field + */ + TYPE_FILE("file"), //$NON-NLS-1$ + /** + * List type, represented by list (table) control + */ + TYPE_LIST("list"), //$NON-NLS-1$ + /** + * Map type, represented by composite of children fields + */ + TYPE_MAP("map"), //$NON-NLS-1$ + /** + * Custom type, represented by string input field by default + */ + TYPE_CUSTOM("custom"); //$NON-NLS-1$ + private String literal; + + private PreferenceType(String literal) { + this.literal = literal; + } + + /** + * @param name - name of the type literal (i.e. comes from name() or + * toString()) + * @return type represented by this name + */ + public static PreferenceType valueOfLiteral(String name) { + PreferenceType[] values = values(); + for (int i = 0; i < values.length; i++) { + PreferenceType e = values[i]; + if (e.literal.equals(name)) + return e; + } + return null; + } + + @Override + public String toString() { + return literal; + } + + /** + * @param value + * @return parameter type corresponding to the value java type + */ + public static PreferenceType typeOf(Object value) { + if (value instanceof Boolean) + return TYPE_BOOLEAN; + if (value instanceof String) + return TYPE_STRING; + if (value instanceof Integer) + return TYPE_INTEGER; + if (value instanceof File) + return TYPE_FILE; + if (value instanceof List) + return TYPE_LIST; + if (value instanceof Map) + return TYPE_MAP; + return TYPE_CUSTOM; + } + } + + /** + * Key of the preference. Key must be java-like identified or number. Cannot + * contain dots. Cannot be null. + * + * @return key + */ + String getKey(); + + /** + * type of the parameter, supports boolean, integer, string, file, list and + * map. For list type child preference can be + * accessed by number (index), if map is the type child preference can be + * accessed by a key (string) + * + * @return type of the preference + */ + PreferenceType getType(); + + /** + * Additional info on how it is represented in the ui, for example boolean + * can be represented as checkbox, drop-down and so on, Values TBD. + * Not supported at the moment. + * + * @return ui info or null if not set + */ + String getUiInfo(); + + /** + * User visible label for the parameter control in UI + * + * @return the label + */ + String getLabel(); + + /** + * Detailed explanation of parameter. Not supported at the moment. + * + * @return the toolTip text + */ + String getToolTip(); + + /** + * default clone implementation + * + * @return clone of the object + */ + Object clone(); + + /** + * @return parent preference + */ + IProblemPreference getParent(); + + /** + * Combined key of values from parents plus itself separated by dot + * + * @return qualified key + */ + String getQualifiedKey(); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceValue.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceValue.java new file mode 100644 index 0000000..cbe9f4f --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceValue.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2009,2010 QNX Software Systems + * 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: + * QNX Software Systems (Alena Laskavaia) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +/** + * Value of the problem preference. If more than one it can be composite, i.e. + * map.Extend {@link AbstractProblemPreference} class + * to implement this interface. + * + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface IProblemPreferenceValue extends Cloneable { + /** + * Get value of preference. + * + * @return object that represents the value. Limited number of object types + * are allowed. + * @see IProblemPreferenceDescriptor.PreferenceType + */ + Object getValue(); + + /** + * Set value of preference represented by this object. + * + * @param value + */ + void setValue(Object value); + + /** + * Export value in string representation required for storing in eclipse + * preferences. + * + * @return string representation of the value + */ + String exportValue(); + + /** + * Import value from string into internal object state. + * + * @param str + * - string from preferences, previously exported by exportValue + * method. + */ + void importValue(String str); +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListProblemPreference.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListProblemPreference.java new file mode 100644 index 0000000..333cb31 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListProblemPreference.java @@ -0,0 +1,323 @@ +/******************************************************************************* + * Copyright (c) 2009,2010 QNX Software Systems + * 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: + * QNX Software Systems (Alena Laskavaia) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.io.IOException; +import java.io.StreamTokenizer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; + +/** + * List implementation of IProblemPreference. + * + * @noextend This class is not intended to be extended by clients. + */ +public class ListProblemPreference extends AbstractProblemPreference implements + IProblemPreferenceCompositeValue, IProblemPreferenceCompositeDescriptor { + /** + * Constant that represent a key for "shared" child preference (descriptor) + * of all elements + */ + public static final String COMMON_DESCRIPTOR_KEY = "#"; //$NON-NLS-1$ + protected ArrayList list = new ArrayList(); + protected IProblemPreference childDescriptor; + + /** + * @param key + * - key to access this preference + * @param label + * - label to be shown in UI + */ + public ListProblemPreference(String key, String label) { + setKey(key); + setLabel(label); + } + + public PreferenceType getType() { + return PreferenceType.TYPE_LIST; + } + + /** + * Set child descriptor (all elements have the same). Value and key + * of it would be ignored and reset. + * + * @param desc + * @return set child descriptor + */ + public IProblemPreference setChildDescriptor(IProblemPreference desc) { + childDescriptor = desc; + if (desc != null) { + childDescriptor.setValue(null); + ((AbstractProblemPreference) childDescriptor) + .setKey(COMMON_DESCRIPTOR_KEY); + } + return desc; + } + + /** + * Sets common descriptor for all elements, if value if not null sets the + * value for its key also. Do not make assumptions of values of desc after + * you pass it to this function. + * + * @return read only preference matching the key + */ + public IProblemPreference addChildDescriptor(IProblemPreference desc) { + Object value = desc.getValue(); + String key = desc.getKey(); + setChildDescriptor(desc); + setChildValue(key, value); + return getChildDescriptor(key); + } + + /** + * + * @return descriptor of the child elements + */ + public IProblemPreference getChildDescriptor() { + return childDescriptor; + } + + /** + * Returns cloned descriptor of the i'th child. Modifying return value would + * not affect internal state of the list element. + * + * @param i - index of the element + * @return child preference + */ + public IProblemPreference getChildDescriptor(int i) { + Object value = list.get(i); + AbstractProblemPreference desc = (AbstractProblemPreference) childDescriptor + .clone(); + desc.setKey(String.valueOf(i)); + desc.setValue(value); + return desc; + } + + /** + * Get read only problem preference for element equal to key's int value. + * If key is null or # return generic descriptor with null value. + * + * @throws NumberFormatException + * if key is not number + */ + public IProblemPreference getChildDescriptor(String key) + throws NumberFormatException { + if (key == null || key.equals(COMMON_DESCRIPTOR_KEY)) { + // return common descriptor + return getChildDescriptor(); + } + Integer iv = Integer.valueOf(key); + if (iv.intValue() >= list.size()) { + // create one + AbstractProblemPreference clone = (AbstractProblemPreference) childDescriptor + .clone(); + clone.setKey(key); + return clone; + } + return getChildDescriptor(iv.intValue()); + } + + /** + * Return array of clones values of child preferences. + */ + public IProblemPreference[] getChildDescriptors() { + IProblemPreference[] res = new IProblemPreference[list.size()]; + for (int i = 0; i < res.length; i++) { + res[i] = getChildDescriptor(i); + } + return res; + } + + public Object getChildValue(String key) { + int index = Integer.parseInt(key); + return getChildValue(index); + } + + /** + * @param index - index of the element + * @return child value by index + */ + public Object getChildValue(int index) { + return list.get(index); + } + + public void setChildValue(String key, Object value) { + int i = Integer.valueOf(key).intValue(); + setChildValue(i, value); + } + + /** + * @param i - index of the element + * @param value - value of the child element + */ + public void setChildValue(int i, Object value) { + if (value != null) { + while (i >= list.size()) { + list.add(null); + } + list.set(i, value); + } else { + while (i == list.size() - 1) { + list.remove(i); + } + } + } + + /** + * Adds value to the list + * + * @param value + */ + public void addChildValue(Object value) { + list.add(value); + } + + /** + * Removes child value by key + */ + public void removeChildValue(String key) { + int index = Integer.parseInt(key); + list.remove(index); + } + + @Override + public Object clone() { + ListProblemPreference list1 = (ListProblemPreference) super.clone(); + list1.list = new ArrayList(); + list1.setChildDescriptor((IProblemPreference) getChildDescriptor() + .clone()); + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + Object value = iterator.next(); + list1.addChildValue(value); + } + return list1; + } + + public String exportValue() { + StringBuffer buf = new StringBuffer("("); //$NON-NLS-1$ + for (Iterator iterator = list.iterator(); iterator.hasNext();) { + IProblemPreference d = (IProblemPreference) childDescriptor.clone(); + d.setValue(iterator.next()); + buf.append(d.exportValue()); + if (iterator.hasNext()) + buf.append(","); //$NON-NLS-1$ + } + return buf.toString() + ")"; //$NON-NLS-1$ + } + + @Override + public void importValue(String str) { + StreamTokenizer tokenizer = getImportTokenizer(str); + try { + importValue(tokenizer); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(str, e); + } + } + + @Override + public void importValue(StreamTokenizer tokenizer) { + clear(); + int token; + int index = 0; + try { + token = tokenizer.nextToken(); + String chara = String.valueOf((char) token); + if (token != '(') + throw new IllegalArgumentException(chara); + token = tokenizer.nextToken(); + if (token != ')') + tokenizer.pushBack(); + else + return; + while (true) { + String ik = String.valueOf(index); + IProblemPreference desc = getChildDescriptor(ik); + if (desc != null && desc instanceof AbstractProblemPreference) { + ((AbstractProblemPreference) desc).importValue(tokenizer); + setChildValue(ik, desc.getValue()); + } + token = tokenizer.nextToken(); + if (token == ')') + break; + if (token != ',') + throw new IllegalArgumentException(chara); + index++; + } + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + /** + * If info key is '#' resets common descriptor to null, otherwise removes + * value + */ + public void removeChildDescriptor(IProblemPreference info) { + if (info.getKey().equals(COMMON_DESCRIPTOR_KEY)) + setChildDescriptor(null); + else + removeChildValue(info.getKey()); + } + + /** + * @return children size + */ + public int size() { + return list.size(); + } + + /** + * Removes all values from the list + */ + public void clear() { + list.clear(); + } + + /** + * @return array of values of children elements. + */ + @Override + public Object getValue() { + return getValues(); + } + + /** + * Sets list value to values of array given as argument. + * + * @param value - must be Object[] + */ + @Override + public void setValue(Object value) { + Object[] values = (Object[]) value; + if (Arrays.deepEquals(getValues(), values)) { + return; + } + list.clear(); + for (int i = 0; i < values.length; i++) { + Object object = values[i]; + list.add(object); + } + } + + @Override + public String toString() { + return childDescriptor + ":" + list.toString(); //$NON-NLS-1$ + } + + /** + * @return array of values of children elements. + */ + public Object[] getValues() { + return list.toArray(new Object[list.size()]); + } +} diff --git a/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/MapProblemPreference.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/MapProblemPreference.java new file mode 100644 index 0000000..6e865f0 --- /dev/null +++ b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/MapProblemPreference.java @@ -0,0 +1,261 @@ +/******************************************************************************* + * Copyright (c) 2009,2010 QNX Software Systems + * 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: + * QNX Software Systems (Alena Laskavaia) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.io.IOException; +import java.io.StreamTokenizer; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences; + +/** + * MapProblemPreference - for checker that needs more than one preferences and + * they all differently "named". + * For example checker for parameter names shadowing would have two boolean + * options: + * "check contructors" and + * "check setters". In this case you use this type. + * {@link AbstractCheckerWithProblemPreferences} class has map as default top + * level parameter preference. + * + * @noextend This class is not intended to be extended by clients. + */ +public class MapProblemPreference extends AbstractProblemPreference implements + IProblemPreferenceCompositeValue, IProblemPreferenceCompositeDescriptor { + protected LinkedHashMap hash = new LinkedHashMap(); + + /** + * Default constuctor + */ + public MapProblemPreference() { + super(); + } + + /** + * @param key + * - key for itself + * @param label + * - label for this group of parameters + */ + public MapProblemPreference(String key, String label) { + setKey(key); + setLabel(label); + } + + public PreferenceType getType() { + return PreferenceType.TYPE_MAP; + } + + /** + * Get parameter preference for element by key + * + */ + public IProblemPreference getChildDescriptor(String key) { + return hash.get(key); + } + + /** + * Adds or replaces child descriptor and value for the element with the key + * equals to desc.getKey(). The desc object would be put in the map, some of + * its field may be modified. + * + * @param desc + */ + public IProblemPreference addChildDescriptor(IProblemPreference desc) { + ((AbstractProblemPreference) desc).setParent(this); + hash.put(desc.getKey(), desc); + return desc; + } + + /** + * Return list of child descriptors. Client should threat returned value as + * read only, + * and not assume that modifying its elements would modify actual child + * values. + */ + public IProblemPreference[] getChildDescriptors() { + return hash.values().toArray( + new IProblemPreference[hash.values().size()]); + } + + /** + * Returns value of the child element by its key + */ + public Object getChildValue(String key) { + IProblemPreference childInfo = getChildDescriptor(key); + return childInfo.getValue(); + } + + /** + * Set child value by its key + */ + public void setChildValue(String key, Object value) { + IProblemPreference pref = getChildDescriptor(key); + if (pref == null) + throw new IllegalArgumentException("Preference for " + key //$NON-NLS-1$ + + " must exists before setting its value"); //$NON-NLS-1$ + pref.setValue(value); + hash.put(key, pref); // cannot assume getChildDescriptor returns shared value + } + + /** + * Removes child value and descriptor by key + */ + public void removeChildValue(String key) { + hash.remove(key); + } + + @Override + public Object clone() { + MapProblemPreference map = (MapProblemPreference) super.clone(); + map.hash = new LinkedHashMap(); + for (Iterator iterator = hash.keySet().iterator(); iterator + .hasNext();) { + String key = iterator.next(); + map.hash.put(key, (IProblemPreference) hash.get(key).clone()); + } + return map; + } + + public String exportValue() { + StringBuffer buf = new StringBuffer("{"); //$NON-NLS-1$ + for (Iterator iterator = hash.keySet().iterator(); iterator + .hasNext();) { + String key = iterator.next(); + IProblemPreference d = hash.get(key); + buf.append(key + "=>" + d.exportValue()); //$NON-NLS-1$ + if (iterator.hasNext()) + buf.append(","); //$NON-NLS-1$ + } + return buf.toString() + "}"; //$NON-NLS-1$ + } + + @Override + public void importValue(String str) { + StreamTokenizer tokenizer = getImportTokenizer(str); + try { + importValue(tokenizer); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException(str + ":" + e.toString(), e); //$NON-NLS-1$ + } + } + + /** + * @param tokenizer + */ + @Override + public void importValue(StreamTokenizer tokenizer) { + int token; + try { + token = tokenizer.nextToken(); + String chara = String.valueOf((char) token); + if (token != '{') { + throw new IllegalArgumentException(chara); + } + while (true) { + token = tokenizer.nextToken(); + String key = tokenizer.sval; + token = tokenizer.nextToken(); + if (token != '=') + throw new IllegalArgumentException(chara); + token = tokenizer.nextToken(); + if (token != '>') + throw new IllegalArgumentException(chara); + IProblemPreference desc = getChildDescriptor(key); + if (desc != null && desc instanceof AbstractProblemPreference) { + ((AbstractProblemPreference) desc).importValue(tokenizer); + setChildValue(key, desc.getValue()); + } + token = tokenizer.nextToken(); + if (token == '}') + break; + if (token != ',') + throw new IllegalArgumentException(chara); + } + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + /** + * Removes child descriptor by its key + */ + public void removeChildDescriptor(IProblemPreference info) { + hash.remove(info.getKey()); + } + + /** + * @return size of the map + */ + public int size() { + return hash.size(); + } + + /** + * Clears the map + */ + public void clear() { + hash.clear(); + } + + @Override + public String toString() { + return hash.values().toString(); + } + + /** + * Value of this preference is a map key=>value of child preferences. + * Modifying this returned map would not change internal state of this + * object. + */ + @Override + public Object getValue() { + LinkedHashMap map = new LinkedHashMap(); + for (Iterator iterator = hash.values().iterator(); iterator + .hasNext();) { + IProblemPreference pref = iterator.next(); + map.put(pref.getKey(), pref.getValue()); + } + return map; + } + + /** + * Set values for this object child elements. Elements are not present in + * this map would be removed. + * Preference descriptors for the keys must be set before calling this + * method, unless value if instanceof {@link IProblemPreference}. + * + * @param value - must be Map + */ + @SuppressWarnings("unchecked") + @Override + public void setValue(Object value) { + Map map = (Map) value; + LinkedHashMap hash2 = (LinkedHashMap) hash + .clone(); + hash.clear(); + for (Iterator iterator = map.keySet().iterator(); iterator + .hasNext();) { + String key = iterator.next(); + Object value2 = map.get(key); + if (value2 instanceof IProblemPreference) { + hash.put(key, (IProblemPreference) value2); + } else { + setChildValue(key, value2); + IProblemPreference pref = hash2.get(key); + pref.setValue(value2); + hash.put(key, pref); + } + } + } +} -- cgit