Skip to main content
summaryrefslogtreecommitdiffstats
path: root/codan
diff options
context:
space:
mode:
authorAlena Laskavaia2015-03-04 15:18:03 -0500
committerElena Laskavaia2015-03-06 15:38:59 -0500
commitacbd1e14f8dbc5c1e2ec0de5059de09b158f850d (patch)
tree47f8fb5fe1d401ad14e458d08544b0b5af45d1ec /codan
parentdd528c19b6c4ec9245c076e46ae4ea23c0914abb (diff)
downloadorg.eclipse.cdt-acbd1e14f8dbc5c1e2ec0de5059de09b158f850d.tar.gz
org.eclipse.cdt-acbd1e14f8dbc5c1e2ec0de5059de09b158f850d.tar.xz
org.eclipse.cdt-acbd1e14f8dbc5c1e2ec0de5059de09b158f850d.zip
codan: example of CElement checker - external invoke
Change-Id: I0b88fb611372ffdbcceda3d0588c9fb65486cb03 Signed-off-by: Alena Laskavaia <elaskavaia.cdt@gmail.com>
Diffstat (limited to 'codan')
-rw-r--r--codan/org.eclipse.cdt.codan.examples/plugin.xml15
-rw-r--r--codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/Activator.java46
-rw-r--r--codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/CToolChecker.java113
3 files changed, 174 insertions, 0 deletions
diff --git a/codan/org.eclipse.cdt.codan.examples/plugin.xml b/codan/org.eclipse.cdt.codan.examples/plugin.xml
index dacd7a972f..21410722a7 100644
--- a/codan/org.eclipse.cdt.codan.examples/plugin.xml
+++ b/codan/org.eclipse.cdt.codan.examples/plugin.xml
@@ -78,6 +78,21 @@
name="%problem.name.Cppcheck.Syntax">
</problem>
</checker>
+
+ <checker
+ class="org.eclipse.cdt.codan.examples.checkers.CToolChecker"
+ id="org.eclipse.cdt.codan.examples.checkers.CToolChecker"
+ name="External C Tool">
+ <problem
+ category="org.eclipse.cdt.codan.core.categories.CodeStyle"
+ defaultEnabled="false"
+ defaultSeverity="Info"
+ description="Runs external tool and reports errors that this tool finds"
+ id="org.eclipse.cdt.codan.examples.checkers.CToolChecker.error"
+ messagePattern="{0}"
+ name="External C Tool">
+ </problem>
+ </checker>
</extension>
<extension
point="org.eclipse.cdt.codan.ui.codanProblemDetails">
diff --git a/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/Activator.java b/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/Activator.java
index 9338f1ca6c..7e9aecd21a 100644
--- a/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/Activator.java
+++ b/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/Activator.java
@@ -11,7 +11,9 @@
package org.eclipse.cdt.codan.examples;
import org.eclipse.cdt.codan.examples.uicontrib.ProfileChangeListener;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
import org.osgi.framework.BundleContext;
/**
@@ -61,4 +63,48 @@ public class Activator extends Plugin {
public static Activator getDefault() {
return plugin;
}
+
+ /**
+ * Logs the specified status with this plug-in's log.
+ *
+ * @param status
+ * status to log
+ */
+ public static void log(IStatus status) {
+ getDefault().getLog().log(status);
+ }
+
+ /**
+ * Logs an internal error with the specified {@code Throwable}.
+ *
+ * @param t
+ * the {@code Throwable} to be logged
+ */
+ public static void log(Throwable t) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, 1, "Internal Error", t)); //$NON-NLS-1$
+ }
+
+ /**
+ * Logs an internal error with the specified message.
+ *
+ * @param message
+ * the error message to log
+ */
+ public static void log(String message) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, 1, message, null));
+ }
+
+ /**
+ * Logs an internal error with the specified message and {@code Throwable}.
+ *
+ * @param message
+ * the error message to log
+ * @param t
+ * the {@code Throwable} to be logged
+ *
+ * @since 2.1
+ */
+ public static void log(String message, Throwable t) {
+ log(new Status(IStatus.ERROR, PLUGIN_ID, 1, message, t));
+ }
}
diff --git a/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/CToolChecker.java b/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/CToolChecker.java
new file mode 100644
index 0000000000..60541c7a85
--- /dev/null
+++ b/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/CToolChecker.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) Mar 4, 2015 QNX Software Systems. All Rights Reserved.
+ *
+ * You must obtain a written license from and pay applicable license fees to QNX
+ * Software Systems before you may reproduce, modify or distribute this software,
+ * or any work that includes all or part of this software. Free development
+ * licenses are available for evaluation and non-commercial purposes. For more
+ * information visit [http://licensing.qnx.com] or email licensing@qnx.com.
+ *
+ * This file may contain contributions from others. Please review this entire
+ * file for other proprietary rights or license notices, as well as the QNX
+ * Development Suite License Guide at [http://licensing.qnx.com/license-guide/]
+ * for other information.
+ *******************************************************************************/
+package org.eclipse.cdt.codan.examples.checkers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.cdt.codan.core.cxx.externaltool.InvocationFailure;
+import org.eclipse.cdt.codan.core.cxx.internal.externaltool.ExternalToolInvoker;
+import org.eclipse.cdt.codan.core.cxx.model.AbstractCElementChecker;
+import org.eclipse.cdt.codan.core.cxx.model.CodanMarkerGenerator;
+import org.eclipse.cdt.codan.core.model.CheckerLaunchMode;
+import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy;
+import org.eclipse.cdt.codan.examples.Activator;
+import org.eclipse.cdt.core.ErrorParserManager;
+import org.eclipse.cdt.core.IConsoleParser;
+import org.eclipse.cdt.core.IMarkerGenerator;
+import org.eclipse.cdt.core.model.ITranslationUnit;
+import org.eclipse.cdt.core.parser.IScannerInfo;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+
+/**
+ * @author elaskavaia
+ *
+ */
+public class CToolChecker extends AbstractCElementChecker {
+ public final static String ID = "org.eclipse.cdt.codan.examples.checkers.CToolChecker.error";
+ public static final String MAKE_PLUGIN_ID = "org.eclipse.cdt.make.core"; //$NON-NLS-1$
+ final ExternalToolInvoker externalToolInvoker = new ExternalToolInvoker();
+
+ @Override
+ public void initPreferences(IProblemWorkingCopy problem) {
+ getTopLevelPreference(problem); // initialize
+ getLaunchModePreference(problem).enableInLaunchModes(
+ CheckerLaunchMode.RUN_ON_FILE_SAVE,
+ CheckerLaunchMode.RUN_ON_DEMAND);
+ }
+
+ @Override
+ public void processUnit(ITranslationUnit unit) {
+ IScannerInfo scannerInfo = unit.getScannerInfo(true);
+ List<String> res = getCompilerOptionsList(scannerInfo);
+ res.add("-c");
+ res.add("-o/dev/null");
+ res.add("-O2");
+ res.add("-Wall");
+ res.add("-Werror");
+ res.add(unit.getFile().getLocation().toPortableString());
+ String args[] = res.toArray(new String[res.size()]);
+ try {
+ externalToolInvoker.launchOnBuildConsole(unit.getResource().getProject(), new IConsoleParser[] { getConsoleParser(unit) },
+ "check", getToolPath(), args, new String[] {}, getWorkingDirectory(), new NullProgressMonitor());
+ } catch (CoreException | InvocationFailure e) {
+ Activator.log(e);
+ }
+ }
+
+ protected List<String> getCompilerOptionsList(IScannerInfo scannerInfo) {
+ final Map<String, String> symbols = scannerInfo.getDefinedSymbols();
+ List<String> res = new ArrayList<>();
+ for (String macro : symbols.keySet()) {
+ if (macro.startsWith("_"))
+ continue; // likely embedded macro
+ String value = symbols.get(macro);
+ if (value.isEmpty())
+ res.add("-D" + macro);
+ else
+ res.add("-D" + macro + "=" + value);
+ }
+ for (String inc : scannerInfo.getIncludePaths()) {
+ res.add("-I" + inc);
+ }
+ return res;
+ }
+
+ protected Path getToolPath() {
+ return new Path("gcc");
+ }
+
+ protected IConsoleParser getConsoleParser(ITranslationUnit unit) {
+ IProject project = unit.getResource().getProject();
+ return new ErrorParserManager(project, getWorkingDirectory(), getMarkerGenerator(), getParserIDs());
+ }
+
+ protected IMarkerGenerator getMarkerGenerator() {
+ return new CodanMarkerGenerator(ID, getProblemReporter());
+ }
+
+ protected String[] getParserIDs() {
+ return null; // null means all default error parsers
+ }
+
+ protected IPath getWorkingDirectory() {
+ return null; // null means project root path
+ }
+}

Back to the top