summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core')
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Entries10
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CVS/Tag1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanApplication.java94
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanCorePlugin.java14
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/CodanRuntime.java76
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/Messages.java36
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/PreferenceConstants.java14
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/messages.properties19
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractChecker.java115
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractCheckerWithProblemPreferences.java223
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractIndexAstChecker.java103
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemLocation.java (renamed from org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ProblemLocation.java)45
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Entries35
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CVS/Tag1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/CodanSeverity.java27
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IChecker.java37
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckerWithPreferences.java35
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICheckersRegistry.java114
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanBuilder.java15
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java64
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemCategory.java33
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemElement.java12
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocation.java8
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemLocationFactory.java67
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemProfile.java42
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporter.java34
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemReporterPersistent.java45
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java73
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IRunnableInEditorChecker.java29
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Entries13
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Repository1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Root1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/CVS/Tag1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBasicBlock.java46
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IBranchNode.java38
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ICfgData.java32
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java25
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java69
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IDecisionNode.java29
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IExitNode.java25
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java33
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/INodeFactory.java54
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java22
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleIncoming.java (renamed from org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICodanAstReconciler.java)21
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleOutgoing.java (renamed from org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/ICAstChecker.java)18
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IStartNode.java22
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemPreference.java202
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/BasicProblemPreference.java134
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Entries10
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Repository1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Root1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/CVS/Tag1
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/FileScopeProblemPreference.java267
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreference.java27
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeDescriptor.java51
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceCompositeValue.java42
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceDescriptor.java171
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemPreferenceValue.java54
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListProblemPreference.java323
-rw-r--r--org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/MapProblemPreference.java261
60 files changed, 3023 insertions, 393 deletions
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<String> projects = new ArrayList<String>();
- 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] <project1> <project2> ...");
- 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.
+ *
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
*/
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
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
*/
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] <project1> <project2> ...
+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<IProblem> refProblems = getRuntime().getChechersRegistry()
+ .getRefProblems(this);
+ for (Iterator<IProblem> 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/ProblemLocation.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemLocation.java
index ced12f0..c2bcd2a 100644
--- 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/AbstractProblemLocation.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,36 +13,30 @@ package org.eclipse.cdt.codan.core.model;
import org.eclipse.core.resources.IFile;
/**
- * Implementation of IProblemLocation
+ * Abstract Implementation of IProblemLocation
*
+ * Clients may extend this class.
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
*/
-public class ProblemLocation implements IProblemLocation {
+public abstract class AbstractProblemLocation 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) {
+ protected AbstractProblemLocation(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) {
+ protected AbstractProblemLocation(IFile file, int startChar, int endChar) {
this.file = file;
this.line = -1;
this.posStart = startChar;
@@ -58,6 +52,11 @@ public class ProblemLocation implements IProblemLocation {
return extra;
}
+ /**
+ * Sets extra data for the problem location
+ *
+ * @param data
+ */
public void setData(Object data) {
this.extra = data;
}
@@ -71,19 +70,15 @@ public class ProblemLocation implements IProblemLocation {
return file;
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getLine()
+ /**
+ * Problem line number referenced in problem view in location field
*/
public int getLineNumber() {
return getStartingLineNumber();
}
- /*
- * (non-Javadoc)
- *
- * @see org.eclipse.cdt.codan.core.model.IProblemLocation#getStartLine()
+ /**
+ * @return line number where problem starts
*/
public int getStartingLineNumber() {
return line;
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/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}.
+ *
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ *
+ * @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.<p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ *
+ * @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<IChecker> iterator();
+public interface ICheckersRegistry extends Iterable<IChecker> {
+ /**
+ * Iterator for registered checkers
+ *
+ * @return iterator for registered checkers
+ */
+ public Iterator<IChecker> 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<IProblem> 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/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.
+ *
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ *
+ * @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<Object> 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.
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ *
+ * @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.
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ */
+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
- *
+ *
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
*/
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
+ *
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ */
+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.
+ *
+ *
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ *
+ * @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
+ * <p>
+ * <strong>EXPERIMENTAL</strong>. 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.
+ * </p>
+ *
+ * @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/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.
+ * <p/>
+ *
+ * @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:
+ * <br>
+ * <li> {@link IStartNode} - start node of the cfg (source)
+ * <li> {@link IExitNode} - exit node of the cfg (sink)
+ * <li> {@link IPlainNode} - has one incoming one outgoing
+ * <li> {@link IDecisionNode} - has one incoming and the only node that can have
+ * multiple outcoming
+ * arcs
+ * <li> {@link IConnectorNode} - the only node that can have multiple incoming
+ * arcs, and one outgoing
+ * <li> {@link IJumpNode} - has one incoming and one outgoing but represent
+ * change of control direction
+ * <li> {@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<IExitNode> getExitNodeIterator();
+
+ /**
+ * @return size of exit nodes list
+ */
+ int getExitNodeSize();
+
+ /**
+ * @return list of roots of dead code sections, they don't have incoming
+ * arcs
+ */
+ Iterator<IBasicBlock> getUnconnectedNodeIterator();
+
+ /**
+ * @return size of unconnected nodes list
+ */
+ int getUnconnectedNodeSize();
+
+ /**
+ * @return collection of all nodes
+ */
+ Collection<IBasicBlock> 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/ICodanAstReconciler.java b/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/ISingleIncoming.java
index 17bc8f7..2900ce8 100644
--- 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/cfg/ISingleIncoming.java
@@ -1,22 +1,23 @@
/*******************************************************************************
- * Copyright (c) 2009 Alena Laskavaia
+ * 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
+ * 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;
+package org.eclipse.cdt.codan.core.model.cfg;
/**
- * @author Alena
+ * Node with one incoming arc
*
+ * @noextend This interface is not intended to be extended by clients.
*/
-public interface ICodanAstReconciler {
- public void reconcileAst(IASTTranslationUnit ast, IProgressMonitor monitor);
-} \ No newline at end of file
+public interface ISingleIncoming {
+ /**
+ * @return single incoming node
+ */
+ IBasicBlock getIncoming();
+}
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/cfg/ISingleOutgoing.java
index 461c0fa..3427826 100644
--- 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/cfg/ISingleOutgoing.java
@@ -1,21 +1,23 @@
/*******************************************************************************
- * Copyright (c) 2009 Alena Laskavaia
+ * 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
+ * Alena Laskavaia - initial API and implementation
*******************************************************************************/
-package org.eclipse.cdt.codan.core.model;
-
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+package org.eclipse.cdt.codan.core.model.cfg;
/**
- * @author Alena
+ * Node with one outgoing arc
*
+ * @noextend This interface is not intended to be extended by clients.
*/
-public interface ICAstChecker extends IChecker {
- void processAst(IASTTranslationUnit ast);
+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<IPath> inc = importPathList(tokenizer, INCLUSION);
+ inclusion = inc.toArray(new IPath[inc.size()]);
+ checkChar(tokenizer, ',');
+ List<IPath> 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<IPath> importPathList(StreamTokenizer tokenizer,
+ String keyword) throws IOException {
+ checkKeyword(tokenizer, keyword);
+ checkChar(tokenizer, '=');
+ checkChar(tokenizer, '>');
+ ArrayList<IPath> list = new ArrayList<IPath>();
+ 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<Object> list = new ArrayList<Object>();
+ 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<Object>();
+ list1.setChildDescriptor((IProblemPreference) getChildDescriptor()
+ .clone());
+ for (Iterator<Object> 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<Object> 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<String, IProblemPreference> hash = new LinkedHashMap<String, IProblemPreference>();
+
+ /**
+ * 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<String, IProblemPreference>();
+ for (Iterator<String> 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<String> 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<String, Object> map = new LinkedHashMap<String, Object>();
+ for (Iterator<IProblemPreference> 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<String,Object>
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setValue(Object value) {
+ Map<String, Object> map = (Map<String, Object>) value;
+ LinkedHashMap<String, IProblemPreference> hash2 = (LinkedHashMap<String, IProblemPreference>) hash
+ .clone();
+ hash.clear();
+ for (Iterator<String> 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);
+ }
+ }
+ }
+}