mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-21 21:52:10 +02:00
Bug 372551. Removed the external tool checker support until all design
issues are resolved.
This commit is contained in:
parent
c510e7ad5b
commit
ada23a9a2f
39 changed files with 10 additions and 2212 deletions
|
@ -10,13 +10,4 @@
|
|||
###############################################################################
|
||||
#Properties file for org.eclipse.cdt.codan.checkers.ui
|
||||
Bundle-Vendor = Eclipse CDT
|
||||
Bundle-Name = Codan Checkers Ui
|
||||
|
||||
checker.name.Cppcheck = Cppcheck
|
||||
problem.description.Cppcheck.Error = Errors reported by Cppcheck (http://cppcheck.sourceforge.net/)
|
||||
problem.name.Cppcheck.Error = Errors
|
||||
problem.description.Cppcheck.Warning = Warnings reported by Cppcheck (http://cppcheck.sourceforge.net/)
|
||||
problem.name.Cppcheck.Warning = Warnings
|
||||
problem.description.Cppcheck.Syntax = Syntax problems reported by Cppcheck (http://cppcheck.sourceforge.net/)
|
||||
problem.name.Cppcheck.Syntax = Syntax Problems
|
||||
problem.messagePattern.Cppcheck.all = {0}
|
||||
Bundle-Name = Codan Checkers UI
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?eclipse version="3.4"?>
|
||||
<plugin>
|
||||
|
||||
|
||||
<extension
|
||||
point="org.eclipse.cdt.codan.ui.codanMarkerResolution">
|
||||
<resolution
|
||||
|
@ -45,46 +43,5 @@
|
|||
class="org.eclipse.cdt.codan.internal.checkers.ui.quickfix.CaseBreakQuickFixComment"
|
||||
problemId="org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem">
|
||||
</resolution>
|
||||
|
||||
</extension>
|
||||
<extension
|
||||
point="org.eclipse.cdt.codan.core.checkers"
|
||||
id="org.eclipse.cdt.codan.core.internal.checkers">
|
||||
<category
|
||||
id="org.eclipse.cdt.codan.checkers.cppcheck"
|
||||
name="%checker.name.Cppcheck">
|
||||
</category>
|
||||
<checker
|
||||
class="org.eclipse.cdt.codan.internal.checkers.ui.CppcheckChecker"
|
||||
id="org.eclipse.cdt.codan.checkers.CppcheckChecker"
|
||||
name="Cppcheck">
|
||||
<problem
|
||||
category="org.eclipse.cdt.codan.checkers.cppcheck"
|
||||
defaultEnabled="false"
|
||||
defaultSeverity="Error"
|
||||
description="%problem.description.Cppcheck.Error"
|
||||
id="org.eclipse.cdt.codan.checkers.cppcheck.error"
|
||||
messagePattern="%problem.messagePattern.Cppcheck.all"
|
||||
name="%problem.name.Cppcheck.Error">
|
||||
</problem>
|
||||
<problem
|
||||
category="org.eclipse.cdt.codan.checkers.cppcheck"
|
||||
defaultEnabled="false"
|
||||
defaultSeverity="Warning"
|
||||
description="%problem.description.Cppcheck.Warning"
|
||||
id="org.eclipse.cdt.codan.checkers.cppcheck.warning"
|
||||
messagePattern="%problem.messagePattern.Cppcheck.all"
|
||||
name="%problem.name.Cppcheck.Warning">
|
||||
</problem>
|
||||
<problem
|
||||
category="org.eclipse.cdt.codan.checkers.cppcheck"
|
||||
defaultEnabled="false"
|
||||
defaultSeverity="Warning"
|
||||
description="%problem.description.Cppcheck.Syntax"
|
||||
id="org.eclipse.cdt.codan.checkers.cppcheck.style"
|
||||
messagePattern="%problem.messagePattern.Cppcheck.all"
|
||||
name="%problem.name.Cppcheck.Syntax">
|
||||
</problem>
|
||||
</checker>
|
||||
</extension>
|
||||
</plugin>
|
||||
|
|
|
@ -1,80 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.checkers.ui;
|
||||
|
||||
import static java.util.Collections.singletonList;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.AbstractOutputParser;
|
||||
import org.eclipse.cdt.codan.core.externaltool.ConfigurationSettings;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationParameters;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemLocation;
|
||||
import org.eclipse.cdt.codan.internal.checkers.externaltool.CppcheckOutputParser;
|
||||
import org.eclipse.cdt.codan.ui.cxx.externaltool.AbstractCxxExternalToolBasedChecker;
|
||||
|
||||
/**
|
||||
* Checker that invokes <a href="http://cppcheck.sourceforge.net/">Cppcheck</a> when a C/C++ file is
|
||||
* saved.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class CppcheckChecker extends AbstractCxxExternalToolBasedChecker {
|
||||
private static final String TOOL_NAME = "Cppcheck"; //$NON-NLS-1$
|
||||
private static final String EXECUTABLE_NAME = "cppcheck"; //$NON-NLS-1$
|
||||
private static final String DEFAULT_ARGS = ""; //$NON-NLS-1$
|
||||
|
||||
private static final String DESCRIPTION_FORMAT = "[" + TOOL_NAME + "] %s"; //$NON-NLS-1$ //$NON-NLS-2$
|
||||
|
||||
private static final String ERROR_PROBLEM_ID;
|
||||
|
||||
// key: severity (error, warning, etc.) - value : problem ID associated to severity
|
||||
private static final Map<String, String> PROBLEM_IDS = new HashMap<String, String>();
|
||||
|
||||
static {
|
||||
ERROR_PROBLEM_ID = addProblemId("error"); //$NON-NLS-1$
|
||||
addProblemId("warning"); //$NON-NLS-1$
|
||||
addProblemId("style"); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
private static String addProblemId(String severity) {
|
||||
String problemId = "org.eclipse.cdt.codan.checkers.cppcheck." + severity; //$NON-NLS-1$
|
||||
PROBLEM_IDS.put(severity, problemId);
|
||||
return problemId;
|
||||
}
|
||||
|
||||
public CppcheckChecker() {
|
||||
super(new ConfigurationSettings(TOOL_NAME, new File(EXECUTABLE_NAME), DEFAULT_ARGS, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reportProblem(IProblemLocation location, String description, String severity) {
|
||||
String problemId = PROBLEM_IDS.get(severity);
|
||||
if (problemId == null) {
|
||||
problemId = getReferenceProblemId();
|
||||
}
|
||||
super.reportProblem(problemId, location, String.format(DESCRIPTION_FORMAT, description));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReferenceProblemId() {
|
||||
return ERROR_PROBLEM_ID;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<AbstractOutputParser> createParsers(InvocationParameters parameters) {
|
||||
AbstractOutputParser parser = new CppcheckOutputParser(parameters, this);
|
||||
return singletonList(parser);
|
||||
}
|
||||
}
|
|
@ -15,5 +15,4 @@ Bundle-Vendor: %Bundle-Vendor
|
|||
Export-Package: org.eclipse.cdt.codan.checkers,
|
||||
org.eclipse.cdt.codan.internal.checkers;
|
||||
x-friends:="org.eclipse.cdt.codan.checkers.ui,
|
||||
org.eclipse.cdt.codan.core.test",
|
||||
org.eclipse.cdt.codan.internal.checkers.externaltool
|
||||
org.eclipse.cdt.codan.core.test"
|
||||
|
|
|
@ -1,83 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.checkers.externaltool;
|
||||
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import org.eclipse.cdt.codan.core.CodanRuntime;
|
||||
import org.eclipse.cdt.codan.core.externaltool.AbstractOutputParser;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IProblemDisplay;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationParameters;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemLocation;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemLocationFactory;
|
||||
import org.eclipse.core.resources.IFile;
|
||||
|
||||
/**
|
||||
* Parses the output of Cppcheck.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 1.1
|
||||
*/
|
||||
public class CppcheckOutputParser extends AbstractOutputParser {
|
||||
// sample line to parse:
|
||||
//
|
||||
// [/src/HelloWorld.cpp:19]: (style) The scope of the variable 'i' can be reduced
|
||||
// ----------1--------- -2 --3-- ------------------4-------------------------
|
||||
//
|
||||
// groups:
|
||||
// 1: file path and name
|
||||
// 2: line where problem was found
|
||||
// 3: problem severity
|
||||
// 4: problem description
|
||||
private static Pattern pattern = Pattern.compile("\\[(.*):(\\d+)\\]:\\s*\\((.*)\\)\\s*(.*)"); //$NON-NLS-1$
|
||||
|
||||
private final InvocationParameters parameters;
|
||||
private final IProblemDisplay problemDisplay;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param parameters the parameters to pass to Cppcheck.
|
||||
* @param problemDisplay displays any problems reported by Cppcheck as markers.
|
||||
*/
|
||||
public CppcheckOutputParser(InvocationParameters parameters, IProblemDisplay problemDisplay) {
|
||||
this.parameters = parameters;
|
||||
this.problemDisplay = problemDisplay;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean parse(String line) {
|
||||
Matcher matcher = pattern.matcher(line);
|
||||
if (!matcher.matches()) {
|
||||
return false;
|
||||
}
|
||||
String filePath = matcher.group(1);
|
||||
if (parameters.getActualFilePath().equals(filePath)) {
|
||||
int lineNumber = Integer.parseInt(matcher.group(2));
|
||||
String severity = matcher.group(3);
|
||||
String description = matcher.group(4);
|
||||
IProblemLocation location = createProblemLocation(lineNumber);
|
||||
problemDisplay.reportProblem(location, description, severity);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private IProblemLocation createProblemLocation(int lineNumber) {
|
||||
IProblemLocationFactory factory = CodanRuntime.getInstance().getProblemLocationFactory();
|
||||
IFile actualFile = (IFile) parameters.getActualFile();
|
||||
return factory.createProblemLocation(actualFile, -1, -1, lineNumber);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
}
|
||||
}
|
|
@ -10,9 +10,12 @@ Require-Bundle: org.eclipse.core.runtime,
|
|||
org.eclipse.core.resources
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Export-Package: org.eclipse.cdt.codan.core.cxx,
|
||||
org.eclipse.cdt.codan.core.cxx.internal.model;x-friends:="org.eclipse.cdt.codan.checkers.ui,org.eclipse.cdt.codan.ui,org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.core.cxx.internal.model.cfg;x-friends:="org.eclipse.cdt.codan.core.test",
|
||||
org.eclipse.cdt.codan.core.cxx.model,
|
||||
org.eclipse.cdt.codan.core.cxx.util
|
||||
org.eclipse.cdt.codan.core.cxx.internal.model;
|
||||
x-friends:="org.eclipse.cdt.codan.checkers.ui,
|
||||
org.eclipse.cdt.codan.ui,
|
||||
org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.core.cxx.internal.model.cfg;
|
||||
x-friends:="org.eclipse.cdt.codan.core.test",
|
||||
org.eclipse.cdt.codan.core.cxx.model
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||
Bundle-Vendor: %Bundle-Vendor
|
||||
|
|
|
@ -1,68 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc.
|
||||
* 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:
|
||||
* Alex Ruiz - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.cxx.util;
|
||||
|
||||
import org.eclipse.core.resources.IFile;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
|
||||
/**
|
||||
* Utility methods related to C++ file types.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public final class FileTypes {
|
||||
private static final String[] CPP_FILE_EXTENSIONS = {
|
||||
"cc", //$NON-NLS-1$
|
||||
"cpp", //$NON-NLS-1$
|
||||
"cxx" //$NON-NLS-1$
|
||||
};
|
||||
private static final String[] HEADER_FILE_EXTENSIONS = { "h" }; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Indicates whether the given <code>{@link IResource}</code> is a C++ file.
|
||||
* @param resource the {@code IResource} to check.
|
||||
* @return {@code true} if the given {@code IResource} is a C++ file; {@code false} otherwise.
|
||||
*/
|
||||
public static boolean isCppFile(IResource resource) {
|
||||
return isFileWithExtension(resource, CPP_FILE_EXTENSIONS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the given <code>{@link IResource}</code> is a header file.
|
||||
* @param resource the {@code IResource} to check.
|
||||
* @return {@code true} if the given {@code IResource} is a header file; {@code false}
|
||||
* otherwise.
|
||||
*/
|
||||
public static boolean isHeaderFile(IResource resource) {
|
||||
return isFileWithExtension(resource, HEADER_FILE_EXTENSIONS);
|
||||
}
|
||||
|
||||
private static boolean isFileWithExtension(IResource resource, String[] validExtensions) {
|
||||
if (!(resource instanceof IFile)) {
|
||||
return false;
|
||||
}
|
||||
IPath path = resource.getFullPath();
|
||||
return doesPathHaveExtension(path, validExtensions);
|
||||
}
|
||||
|
||||
private static boolean doesPathHaveExtension(IPath path, String[] validExtensions) {
|
||||
String fileExtension = path.getFileExtension();
|
||||
for (String extension : validExtensions) {
|
||||
if (extension.equalsIgnoreCase(fileExtension)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private FileTypes() {}
|
||||
}
|
|
@ -30,12 +30,10 @@ import org.eclipse.cdt.codan.core.internal.checkers.StatementHasNoEffectCheckerT
|
|||
import org.eclipse.cdt.codan.core.internal.checkers.SuggestedParenthesisCheckerTest;
|
||||
import org.eclipse.cdt.codan.core.internal.checkers.SuspiciousSemicolonCheckerTest;
|
||||
import org.eclipse.cdt.codan.core.internal.checkers.UnusedSymbolInFileScopeCheckerTest;
|
||||
import org.eclipse.cdt.codan.internal.checkers.externaltool.CppcheckOutputParserTest;
|
||||
import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.CaseBreakQuickFixTest;
|
||||
import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.CatchByReferenceQuickFixTest;
|
||||
import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.CreateLocalVariableQuickFixTest;
|
||||
import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.SuggestedParenthesisQuickFixTest;
|
||||
import org.eclipse.cdt.codan.internal.core.externaltool.ExternalToolInvokerTest;
|
||||
|
||||
public class AutomatedIntegrationSuite extends TestSuite {
|
||||
public AutomatedIntegrationSuite() {
|
||||
|
@ -71,8 +69,6 @@ public class AutomatedIntegrationSuite extends TestSuite {
|
|||
suite.addTestSuite(SuggestedParenthesisCheckerTest.class);
|
||||
suite.addTestSuite(SuspiciousSemicolonCheckerTest.class);
|
||||
suite.addTestSuite(UnusedSymbolInFileScopeCheckerTest.class);
|
||||
suite.addTestSuite(ExternalToolInvokerTest.class);
|
||||
suite.addTestSuite(CppcheckOutputParserTest.class);
|
||||
// framework
|
||||
suite.addTest(CodanFastTestSuite.suite());
|
||||
// quick fixes
|
||||
|
|
|
@ -1,111 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.checkers.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.IProblemDisplay;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationParameters;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemLocation;
|
||||
import org.eclipse.cdt.codan.core.test.CodanTestCase;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
|
||||
/**
|
||||
* Tests for <code>{@link CppcheckOutputParser}</code>.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
@SuppressWarnings("nls")
|
||||
public class CppcheckOutputParserTest extends CodanTestCase {
|
||||
private static final String MATCHING_LINE_FORMAT = "[%s:%d]: (%s) %s";
|
||||
|
||||
private ProblemDisplayStub problemDisplay;
|
||||
|
||||
private CppcheckOutputParser parser;
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
problemDisplay = new ProblemDisplayStub();
|
||||
loadcode("void f(int x) {}", "test.cpp");
|
||||
InvocationParameters parameters = new InvocationParameters(currentIFile, currentIFile,
|
||||
actualFilePath(), null);
|
||||
parser = new CppcheckOutputParser(parameters, problemDisplay);
|
||||
}
|
||||
|
||||
public void testProblemIsReportedWhenParsingMatchingLine() {
|
||||
int lineNumber = 2;
|
||||
String severity = "warning";
|
||||
String description = "The scope of the variable 'i' can be reduced";
|
||||
boolean parsed = parser.parse(createMatchingLine(lineNumber, severity, description));
|
||||
assertTrue(parsed);
|
||||
problemDisplay.assertThatLocationHasFile(currentIFile);
|
||||
problemDisplay.assertThatLocationHasLineNumber(lineNumber);
|
||||
problemDisplay.assertThatLocationHasNoStartingAndEndingChars();
|
||||
problemDisplay.assertThatReceivedDescription(description);
|
||||
problemDisplay.assertThatReceivedSeverity(severity);
|
||||
}
|
||||
|
||||
private String createMatchingLine(int lineNumber, String severity, String description) {
|
||||
return String.format(MATCHING_LINE_FORMAT, actualFilePath(), lineNumber, severity, description);
|
||||
}
|
||||
|
||||
private String actualFilePath() {
|
||||
return currentIFile.getLocation().toOSString();
|
||||
}
|
||||
|
||||
public void testProblemIsNotReportedWhenLineDoesNotMatch() {
|
||||
boolean parsed = parser.parse("Checking usage of global functions..");
|
||||
assertFalse(parsed);
|
||||
problemDisplay.assertThatProblemWasNotReported();
|
||||
}
|
||||
|
||||
private static class ProblemDisplayStub implements IProblemDisplay {
|
||||
private boolean problemReported;
|
||||
private IProblemLocation location;
|
||||
private String description;
|
||||
private String severity;
|
||||
|
||||
public void reportProblem(IProblemLocation location, String description) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public void reportProblem(IProblemLocation location, String description, String severity) {
|
||||
problemReported = true;
|
||||
this.location = location;
|
||||
this.description = description;
|
||||
this.severity = severity;
|
||||
}
|
||||
|
||||
void assertThatLocationHasFile(IResource expected) {
|
||||
assertSame(expected, location.getFile());
|
||||
}
|
||||
|
||||
void assertThatLocationHasLineNumber(int expected) {
|
||||
assertEquals(expected, location.getLineNumber());
|
||||
}
|
||||
|
||||
void assertThatLocationHasNoStartingAndEndingChars() {
|
||||
assertEquals(-1, location.getStartingChar());
|
||||
assertEquals(-1, location.getEndingChar());
|
||||
}
|
||||
|
||||
void assertThatReceivedDescription(String expected) {
|
||||
assertEquals(expected, description);
|
||||
}
|
||||
|
||||
void assertThatReceivedSeverity(String expected) {
|
||||
assertEquals(expected, severity);
|
||||
}
|
||||
|
||||
void assertThatProblemWasNotReported() {
|
||||
assertFalse(problemReported);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,290 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import static java.util.Arrays.asList;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.AbstractOutputParser;
|
||||
import org.eclipse.cdt.codan.core.externaltool.ConfigurationSettings;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IArgsSeparator;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinter;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinterProvider;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationFailure;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationParameters;
|
||||
import org.eclipse.cdt.codan.core.externaltool.SpaceArgsSeparator;
|
||||
import org.eclipse.cdt.codan.core.param.BasicProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.MapProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.test.CodanTestCase;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Tests for <code>{@link ExternalToolInvoker}</code>.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
@SuppressWarnings("nls")
|
||||
public class ExternalToolInvokerTest extends CodanTestCase {
|
||||
private String externalToolName;
|
||||
private String externalToolPath;
|
||||
private boolean shouldDisplayOutput;
|
||||
private IPath workingDirectory;
|
||||
private ConsolePrinterProviderStub consolePrinterProvider;
|
||||
private String[] externalToolOutput;
|
||||
private ProcessInvokerStub processInvoker;
|
||||
private OutputParserStub outputParser;
|
||||
private List<AbstractOutputParser> outputParsers;
|
||||
private ConfigurationSettings settings;
|
||||
private IArgsSeparator argsSeparator;
|
||||
|
||||
private ExternalToolInvoker externalToolInvoker;
|
||||
|
||||
@Override
|
||||
public void setUp() throws Exception {
|
||||
super.setUp();
|
||||
externalToolName = "TestTool";
|
||||
externalToolPath = "/usr/local/testtool";
|
||||
shouldDisplayOutput = true;
|
||||
workingDirectory = new Path("/usr/local/project");
|
||||
consolePrinterProvider = new ConsolePrinterProviderStub();
|
||||
externalToolOutput = new String[] { "line1", "line2" };
|
||||
processInvoker = new ProcessInvokerStub(externalToolOutput);
|
||||
outputParser = new OutputParserStub();
|
||||
outputParsers = new ArrayList<AbstractOutputParser>();
|
||||
outputParsers.add(outputParser);
|
||||
settings = new ConfigurationSettings(externalToolName, new File("testtool"), "", false);
|
||||
MapProblemPreference preferences = createPreferences(new File(externalToolPath),
|
||||
"--include=all --debug=true", shouldDisplayOutput);
|
||||
settings.updateValuesFrom(preferences);
|
||||
argsSeparator = new SpaceArgsSeparator();
|
||||
externalToolInvoker = new ExternalToolInvoker(consolePrinterProvider, processInvoker);
|
||||
}
|
||||
|
||||
private MapProblemPreference createPreferences(File executablePath, String args,
|
||||
boolean shouldDisplayOutput) {
|
||||
MapProblemPreference preferences = new MapProblemPreference();
|
||||
preferences.addChildDescriptor(createPreference(PathSetting.KEY, executablePath));
|
||||
preferences.addChildDescriptor(createPreference(ArgsSetting.KEY, args));
|
||||
preferences.addChildDescriptor(
|
||||
createPreference(ConsoleOutputSetting.KEY, shouldDisplayOutput));
|
||||
return preferences;
|
||||
}
|
||||
|
||||
private IProblemPreference createPreference(String key, Object value) {
|
||||
BasicProblemPreference preference = new BasicProblemPreference(key, "");
|
||||
preference.setValue(value);
|
||||
return preference;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCpp() {
|
||||
return true;
|
||||
}
|
||||
|
||||
// class C {
|
||||
// };
|
||||
public void testInvokesProcessCorrectly() throws Throwable {
|
||||
String aboveComment = getAboveComment();
|
||||
loadcode(aboveComment);
|
||||
String expectedCommand = expectedCommand();
|
||||
InvocationParameters parameters = new InvocationParameters(currentIFile, currentIFile,
|
||||
actualFilePath(), workingDirectory);
|
||||
externalToolInvoker.invoke(parameters, settings, argsSeparator, outputParsers);
|
||||
consolePrinterProvider.assertThatReceivedExternalToolName(externalToolName);
|
||||
consolePrinterProvider.assertThatReceivedShouldDisplayOutputFlag(shouldDisplayOutput);
|
||||
consolePrinterProvider.consolePrinter.assertThatPrinted(expectedCommand, externalToolOutput);
|
||||
consolePrinterProvider.consolePrinter.assertThatIsClosed();
|
||||
processInvoker.assertThatReceivedCommand(expectedCommand);
|
||||
processInvoker.assertThatReceivedWorkingDirectory(workingDirectory);
|
||||
processInvoker.process.assertThatIsDestroyed();
|
||||
outputParser.assertThatParsed(externalToolOutput);
|
||||
outputParser.assertThatWasReset();
|
||||
}
|
||||
|
||||
private String expectedCommand() {
|
||||
StringBuilder commandBuilder = new StringBuilder();
|
||||
commandBuilder.append(externalToolPath).append(" ")
|
||||
.append(actualFilePath()).append(" ")
|
||||
.append(settings.getArgs().getValue());
|
||||
return commandBuilder.toString();
|
||||
}
|
||||
|
||||
private String actualFilePath() {
|
||||
return currentIFile.getLocation().toOSString();
|
||||
}
|
||||
|
||||
private static class ConsolePrinterProviderStub implements IConsolePrinterProvider {
|
||||
private String externalToolName;
|
||||
private boolean shouldDisplayOutput;
|
||||
|
||||
final ConsolePrinterStub consolePrinter = new ConsolePrinterStub();
|
||||
|
||||
@Override
|
||||
public ConsolePrinterStub createConsole(String externalToolName, boolean shouldDisplayOutput) {
|
||||
this.externalToolName = externalToolName;
|
||||
this.shouldDisplayOutput = shouldDisplayOutput;
|
||||
return consolePrinter;
|
||||
}
|
||||
|
||||
void assertThatReceivedExternalToolName(String expected) {
|
||||
assertEquals(expected, externalToolName);
|
||||
}
|
||||
|
||||
void assertThatReceivedShouldDisplayOutputFlag(boolean expected) {
|
||||
assertEquals(expected, shouldDisplayOutput);
|
||||
}
|
||||
}
|
||||
|
||||
private static class ConsolePrinterStub implements IConsolePrinter {
|
||||
private final List<String> printed = new ArrayList<String>();
|
||||
private boolean closed;
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
printed.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(String message) {
|
||||
printed.add(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println() {}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
closed = true;
|
||||
}
|
||||
|
||||
void assertThatPrinted(String command, String[] externalToolOutput) {
|
||||
List<String> expected = new ArrayList<String>();
|
||||
expected.add(command);
|
||||
expected.addAll(asList(externalToolOutput));
|
||||
assertEquals(expected, printed);
|
||||
}
|
||||
|
||||
void assertThatIsClosed() {
|
||||
assertTrue(closed);
|
||||
}
|
||||
}
|
||||
|
||||
private static class ProcessInvokerStub extends ProcessInvoker {
|
||||
final ProcessStub process;
|
||||
|
||||
private String command;
|
||||
private IPath workingDirectory;
|
||||
|
||||
ProcessInvokerStub(String[] externalToolOutput) {
|
||||
process = new ProcessStub(externalToolOutput);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProcessStub invoke(String command, IPath workingDirectory) throws InvocationFailure {
|
||||
this.command = command;
|
||||
this.workingDirectory = workingDirectory;
|
||||
return process;
|
||||
}
|
||||
|
||||
void assertThatReceivedCommand(String expected) {
|
||||
assertEquals(expected, command);
|
||||
}
|
||||
|
||||
void assertThatReceivedWorkingDirectory(IPath expected) {
|
||||
assertSame(expected, workingDirectory);
|
||||
}
|
||||
}
|
||||
|
||||
private static class ProcessStub extends Process {
|
||||
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
|
||||
|
||||
private final InputStream inputStream;
|
||||
private final InputStream errorStream;
|
||||
|
||||
private boolean destroyed;
|
||||
|
||||
ProcessStub(String[] externalToolOutput) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (String s : externalToolOutput) {
|
||||
builder.append(s).append(LINE_SEPARATOR);
|
||||
}
|
||||
inputStream = new ByteArrayInputStream(builder.toString().getBytes());
|
||||
errorStream = new ByteArrayInputStream(new byte[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public OutputStream getOutputStream() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getInputStream() {
|
||||
return inputStream;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream getErrorStream() {
|
||||
return errorStream;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int waitFor() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int exitValue() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroy() {
|
||||
destroyed = true;
|
||||
}
|
||||
|
||||
void assertThatIsDestroyed() {
|
||||
assertTrue(destroyed);
|
||||
}
|
||||
}
|
||||
|
||||
private static class OutputParserStub extends AbstractOutputParser {
|
||||
private final List<String> parsed = new ArrayList<String>();
|
||||
private boolean reset;
|
||||
|
||||
@Override
|
||||
public boolean parse(String line) throws InvocationFailure {
|
||||
parsed.add(line);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
reset = true;
|
||||
}
|
||||
|
||||
void assertThatParsed(String[] expected) {
|
||||
assertArrayEquals(expected, parsed.toArray());
|
||||
}
|
||||
|
||||
void assertThatWasReset() {
|
||||
assertTrue(reset);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,7 +10,6 @@ Require-Bundle: org.eclipse.core.runtime,
|
|||
Bundle-ActivationPolicy: lazy
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||
Export-Package: org.eclipse.cdt.codan.core,
|
||||
org.eclipse.cdt.codan.core.externaltool,
|
||||
org.eclipse.cdt.codan.core.model,
|
||||
org.eclipse.cdt.codan.core.model.cfg;
|
||||
x-friends:="org.eclipse.cdt.codan.core.cxx,
|
||||
|
@ -22,7 +21,6 @@ Export-Package: org.eclipse.cdt.codan.core,
|
|||
org.eclipse.cdt.codan.core.test,
|
||||
org.eclipse.cdt.codan.ui",
|
||||
org.eclipse.cdt.codan.internal.core.cfg;x-friends:="org.eclipse.cdt.codan.core.cxx",
|
||||
org.eclipse.cdt.codan.internal.core.externaltool;x-friends:="org.eclipse.cdt.codan.core.test",
|
||||
org.eclipse.cdt.codan.internal.core.model;
|
||||
x-friends:="org.eclipse.cdt.codan.core.cxx,
|
||||
org.eclipse.cdt.codan.core.test,
|
||||
|
|
|
@ -1,200 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.CodanCorePlugin;
|
||||
import org.eclipse.cdt.codan.core.model.AbstractCheckerWithProblemPreferences;
|
||||
import org.eclipse.cdt.codan.core.model.IProblem;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemLocation;
|
||||
import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.MapProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.RootProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.SharedRootProblemPreference;
|
||||
import org.eclipse.cdt.codan.internal.core.externaltool.ExternalToolInvoker;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Base class for checkers that invoke external command-line tools to perform code checking.
|
||||
* <p>
|
||||
* A file, to be processed by this type of checker, must:
|
||||
* <ol>
|
||||
* <li>be in the current active editor</li>
|
||||
* <li>not have any unsaved changes</li>
|
||||
* </ol>
|
||||
* </p>
|
||||
* By default, implementations of this checker are not allowed to run while the user types, since
|
||||
* external tools cannot see unsaved changes.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public abstract class AbstractExternalToolBasedChecker extends AbstractCheckerWithProblemPreferences
|
||||
implements IProblemDisplay {
|
||||
private static final boolean DO_NOT_TRAVERSE_CHILDREN = false;
|
||||
|
||||
private final IInvocationParametersProvider parametersProvider;
|
||||
private final IArgsSeparator argsSeparator;
|
||||
private final ConfigurationSettings settings;
|
||||
private final ExternalToolInvoker externalToolInvoker;
|
||||
private final RootProblemPreference preferences;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param parametersProvider provides the parameters to pass when invoking the external tool.
|
||||
* @param argsSeparator separates the arguments to pass to the external tool executable. These
|
||||
* arguments are stored in a single {@code String}.
|
||||
* @param consolePrinterProvider creates an Eclipse console that uses the name of an external
|
||||
* tool as its own.
|
||||
* @param settings user-configurable external tool configuration settings.
|
||||
*/
|
||||
public AbstractExternalToolBasedChecker(IInvocationParametersProvider parametersProvider,
|
||||
IArgsSeparator argsSeparator, IConsolePrinterProvider consolePrinterProvider,
|
||||
ConfigurationSettings settings) {
|
||||
this.parametersProvider = parametersProvider;
|
||||
this.argsSeparator = argsSeparator;
|
||||
this.settings = settings;
|
||||
externalToolInvoker = new ExternalToolInvoker(consolePrinterProvider);
|
||||
preferences = new SharedRootProblemPreference();
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether this checker is enabled to run while the user types. By default, this
|
||||
* method returns {@code false}.
|
||||
* <p>
|
||||
* Running command-line based checkers while the user types is unnecessary and wasteful, since
|
||||
* command-line tools are expensive to call (they run in a separate process) and they cannot
|
||||
* see unsaved changes.
|
||||
* </p>
|
||||
* @return {@code false}.
|
||||
*/
|
||||
@Override
|
||||
public boolean runInEditor() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean processResource(IResource resource) {
|
||||
process(resource);
|
||||
return DO_NOT_TRAVERSE_CHILDREN;
|
||||
}
|
||||
|
||||
private void process(IResource resource) {
|
||||
try {
|
||||
InvocationParameters parameters = parametersProvider.createParameters(resource);
|
||||
if (parameters != null) {
|
||||
invokeExternalTool(parameters);
|
||||
}
|
||||
} catch (Throwable error) {
|
||||
logResourceProcessingFailure(error, resource);
|
||||
}
|
||||
}
|
||||
|
||||
private void invokeExternalTool(InvocationParameters parameters) throws Throwable {
|
||||
updateConfigurationSettingsFromPreferences(parameters.getActualFile());
|
||||
List<AbstractOutputParser> parsers = createParsers(parameters);
|
||||
try {
|
||||
externalToolInvoker.invoke(parameters, settings, argsSeparator, parsers);
|
||||
} catch (InvocationFailure error) {
|
||||
handleInvocationFailure(error, parameters);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateConfigurationSettingsFromPreferences(IResource fileToProcess) {
|
||||
IProblem problem = getProblemById(getReferenceProblemId(), fileToProcess);
|
||||
MapProblemPreference preferences = (MapProblemPreference) problem.getPreference();
|
||||
settings.updateValuesFrom(preferences);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates instances of <code>{@link AbstractOutputParser}</code>.
|
||||
* @param parameters the parameters to pass when invoking an external tool.
|
||||
*/
|
||||
protected abstract List<AbstractOutputParser> createParsers(InvocationParameters parameters);
|
||||
|
||||
/**
|
||||
* Handles a failure reported when invoking the external tool. This implementation simply
|
||||
* logs the failure.
|
||||
* @param error the reported failure.
|
||||
* @param parameters the parameters passed to the external tool executable.
|
||||
*/
|
||||
protected void handleInvocationFailure(InvocationFailure error, InvocationParameters parameters) {
|
||||
logResourceProcessingFailure(error, parameters.getActualFile());
|
||||
}
|
||||
|
||||
private void logResourceProcessingFailure(Throwable error, IResource resource) {
|
||||
String location = resource.getLocation().toOSString();
|
||||
String msg = String.format("Unable to process resource %s", location); //$NON-NLS-1$
|
||||
CodanCorePlugin.log(msg, error);
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void reportProblem(IProblemLocation location, String description) {
|
||||
String severity = null;
|
||||
reportProblem(location, description, severity);
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public void reportProblem(IProblemLocation location, String description, String severity) {
|
||||
super.reportProblem(getReferenceProblemId(), location, description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the id of the problem used as reference to obtain this checker's preferences. All
|
||||
* preferences in a external-tool-based checker are shared among its defined problems.
|
||||
* @return the id of the problem used as reference to obtain this checker's preferences.
|
||||
*/
|
||||
protected abstract String getReferenceProblemId();
|
||||
|
||||
/**
|
||||
* Initializes the preferences of the given problem. All preferences in a external-tool-based
|
||||
* checker are shared among its defined problems.
|
||||
* @param problem the given problem.
|
||||
*/
|
||||
@Override
|
||||
public void initPreferences(IProblemWorkingCopy problem) {
|
||||
super.initPreferences(problem);
|
||||
addPreference(problem, settings.getPath());
|
||||
addPreference(problem, settings.getArgs());
|
||||
addPreference(problem, settings.getShouldDisplayOutput());
|
||||
}
|
||||
|
||||
private void addPreference(IProblemWorkingCopy problem, SingleConfigurationSetting<?> setting) {
|
||||
IProblemPreference descriptor = (IProblemPreference) setting.getDescriptor();
|
||||
addPreference(problem, descriptor, setting.getDefaultValue());
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
protected void setDefaultPreferenceValue(IProblemWorkingCopy problem, String key,
|
||||
Object defaultValue) {
|
||||
MapProblemPreference map = getTopLevelPreference(problem);
|
||||
map.setChildValue(key, defaultValue);
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
@Override
|
||||
public RootProblemPreference getTopLevelPreference(IProblem problem) {
|
||||
RootProblemPreference map = (RootProblemPreference) problem.getPreference();
|
||||
if (map == null) {
|
||||
map = preferences;
|
||||
if (problem instanceof IProblemWorkingCopy) {
|
||||
((IProblemWorkingCopy) problem).setPreference(map);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
/**
|
||||
* Parses the output of an external tool.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public abstract class AbstractOutputParser {
|
||||
/**
|
||||
* Parses one line of output. Implementations are free to create markers from the information
|
||||
* retrieved from the parsed output.
|
||||
* @param line the line to parse.
|
||||
* @return {@code true} if the line was successfully parsed; {@code false} otherwise.
|
||||
* @throws InvocationFailure if the output indicates that the invocation of the external tool
|
||||
* failed.
|
||||
*/
|
||||
public abstract boolean parse(String line) throws InvocationFailure;
|
||||
|
||||
/**
|
||||
* Resets the value of this parser, usually after the execution of the external tool is
|
||||
* finished.
|
||||
*/
|
||||
public abstract void reset();
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.param.MapProblemPreference;
|
||||
import org.eclipse.cdt.codan.internal.core.externaltool.ArgsSetting;
|
||||
import org.eclipse.cdt.codan.internal.core.externaltool.PathSetting;
|
||||
import org.eclipse.cdt.codan.internal.core.externaltool.ConsoleOutputSetting;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* User-configurable external tool settings.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public final class ConfigurationSettings {
|
||||
private final PathSetting path;
|
||||
private final ArgsSetting args;
|
||||
private final ConsoleOutputSetting shouldDisplayOutput;
|
||||
private final String externalToolName;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param externalToolName the name of the external tool, to be displayed to the user.
|
||||
* @param defaultPath the default path of the external tool.
|
||||
* @param defaultArgs the default arguments to pass when invoking the external tool.
|
||||
* @param defaultShouldDisplayOutput indicates whether output of an external tool should be
|
||||
* displayed in an Eclipse console.
|
||||
*/
|
||||
public ConfigurationSettings(String externalToolName, File defaultPath, String defaultArgs,
|
||||
boolean defaultShouldDisplayOutput) {
|
||||
this.externalToolName = externalToolName;
|
||||
this.path = new PathSetting(externalToolName, defaultPath);
|
||||
this.args = new ArgsSetting(externalToolName, defaultArgs);
|
||||
this.shouldDisplayOutput = new ConsoleOutputSetting(defaultShouldDisplayOutput);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the name of the external tool, to be displayed to the user.
|
||||
* @return the name of the external tool, to be displayed to the user.
|
||||
*/
|
||||
public String getExternalToolName() {
|
||||
return externalToolName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the setting that specifies the path and name of the external tool to invoke.
|
||||
* @return the setting that specifies the path and name of the external tool to invoke.
|
||||
*/
|
||||
public SingleConfigurationSetting<File> getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the setting that specifies the arguments to pass when invoking the external tool.
|
||||
* @return the setting that specifies the arguments to pass when invoking the external tool.
|
||||
*/
|
||||
public SingleConfigurationSetting<String> getArgs() {
|
||||
return args;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the setting that specifies whether the output of the external tools should be
|
||||
* displayed in an Eclipse console.
|
||||
* @return the shouldDisplayOutput the setting that specifies whether the output of the external
|
||||
* tools should be displayed in an Eclipse console.
|
||||
*/
|
||||
public SingleConfigurationSetting<Boolean> getShouldDisplayOutput() {
|
||||
return shouldDisplayOutput;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the values of the configuration settings value with the ones stored in the given
|
||||
* preference map.
|
||||
* @param preferences the given preference map that may contain the values to set.
|
||||
* @throws ClassCastException if any of the values to set is not of the same type as the one
|
||||
* supported by a setting.
|
||||
*/
|
||||
public void updateValuesFrom(MapProblemPreference preferences) {
|
||||
path.updateValue(preferences);
|
||||
args.updateValue(preferences);
|
||||
shouldDisplayOutput.updateValue(preferences);
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
/**
|
||||
* Parses a given {@code String} containing the arguments to pass to an external tool and separates
|
||||
* them into individual values.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public interface IArgsSeparator {
|
||||
/**
|
||||
* Parses a given {@code String} containing the arguments to pass to an external tool and
|
||||
* separates them into individual values.
|
||||
* @param args contains the arguments to pass to the external tool executable.
|
||||
* @return the separated argument values.
|
||||
*/
|
||||
String[] separateArgs(String args);
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
/**
|
||||
* Prints the output of an external tool to an Eclipse console. It uses the name of the external
|
||||
* tool as the console ID.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
* @noextend This interface is not intended to be extended by clients.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public interface IConsolePrinter {
|
||||
/**
|
||||
* Clears the contents of the console.
|
||||
*/
|
||||
public void clear();
|
||||
|
||||
/**
|
||||
* Prints the specified message to the console, followed by a line separator string.
|
||||
* @param message the message to print.
|
||||
*/
|
||||
public void println(String message);
|
||||
|
||||
/**
|
||||
* Prints a line separator to the console.
|
||||
*/
|
||||
public void println();
|
||||
|
||||
/**
|
||||
* Closes the output stream of the console.
|
||||
*/
|
||||
public void close();
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
/**
|
||||
* Creates or finds an Eclipse console that uses the name of an external tool as its own.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
* @noextend This interface is not intended to be extended by clients.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public interface IConsolePrinterProvider {
|
||||
/**
|
||||
* Creates an Eclipse console that uses the name of an external tool as its own.
|
||||
* @param externalToolName the name of the external tool that will be used as the name of the
|
||||
* console.
|
||||
* @param shouldDisplayOutput indicates whether the user wants to see the output of the external
|
||||
* tool in the console.
|
||||
* @return the created or found console.
|
||||
*/
|
||||
public IConsolePrinter createConsole(String externalToolName, boolean shouldDisplayOutput);
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.core.resources.IResource;
|
||||
|
||||
/**
|
||||
* Provides the parameters to pass when invoking an external tool.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public interface IInvocationParametersProvider {
|
||||
/**
|
||||
* Creates the parameters to pass when invoking an external tool.
|
||||
* @param fileToProcess the file to process.
|
||||
* @return the created parameters.
|
||||
* @throws Throwable if something goes wrong.
|
||||
*/
|
||||
InvocationParameters createParameters(IResource fileToProcess) throws Throwable;
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.model.IProblemLocation;
|
||||
|
||||
/**
|
||||
* Reports problems found in code, reported by an external tool.
|
||||
*
|
||||
* @noimplement This interface is not intended to be implemented by clients.
|
||||
* @noextend This interface is not intended to be extended by clients.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public interface IProblemDisplay {
|
||||
/**
|
||||
* Reports a problem found by an external tool.
|
||||
* @param location the problem's location (e.g. file and line number.)
|
||||
* @param description the description of the problem.
|
||||
*/
|
||||
public void reportProblem(IProblemLocation location, String description);
|
||||
|
||||
/**
|
||||
* Reports a problem found by an external tool.
|
||||
* @param location the problem's location (e.g. file and line number.)
|
||||
* @param description the description of the problem.
|
||||
* @param severity the problem's severity (e.g. "error", "warning", etc.)
|
||||
*/
|
||||
public void reportProblem(IProblemLocation location, String description, String severity);
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
/**
|
||||
* Indicates that invocation of an external tool failed.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public class InvocationFailure extends Exception {
|
||||
private static final long serialVersionUID = 6727101323050538885L;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param message the detail message.
|
||||
*/
|
||||
public InvocationFailure(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param message the detail message.
|
||||
* @param cause the cause (which is saved for later retrieval by
|
||||
* the <code>{@link #getCause()}</code> method.)
|
||||
*/
|
||||
public InvocationFailure(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
}
|
|
@ -1,90 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
|
||||
/**
|
||||
* Parameters to pass when invoking an external tool.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public final class InvocationParameters {
|
||||
private final IResource originalFile;
|
||||
private final IResource actualFile;
|
||||
private final String actualFilePath;
|
||||
private final IPath workingDirectory;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param originalFile the original file to process.
|
||||
* @param actualFile the actual file to process.
|
||||
* @param actualFilePath the path of {@code actual}, in a format that the external tool can
|
||||
* understand.
|
||||
* @param workingDirectory the directory where the external tool should be executed.
|
||||
* @see #getOriginalFile()
|
||||
* @see #getActualFile()
|
||||
*/
|
||||
public InvocationParameters(IResource originalFile, IResource actualFile, String actualFilePath,
|
||||
IPath workingDirectory) {
|
||||
this.originalFile = originalFile;
|
||||
this.actualFile = actualFile;
|
||||
this.actualFilePath = actualFilePath;
|
||||
this.workingDirectory = workingDirectory;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the original file to process. This is the file that triggered execution of
|
||||
* a command-line tool when saved.
|
||||
* @return the original file to process.
|
||||
*/
|
||||
public IResource getOriginalFile() {
|
||||
return originalFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the actual file to process. It may not be the same as
|
||||
* <code>{@link #getOriginalFile()}</code>, depending on how the external tool works.
|
||||
* <p>
|
||||
* A good example is an external tool that can only process C++ source files but not header
|
||||
* files. If the <em>original</em> file is a header file, the checker could potentially find
|
||||
* a C++ file that includes such header and use it as the <em>actual</em> file to process.
|
||||
* </p>
|
||||
* <p>
|
||||
* We still need to keep a reference to the <em>actual</em> file, in order to add markers to
|
||||
* the editor in case of problems found.
|
||||
* </p>
|
||||
* @return the actual file to process.
|
||||
*/
|
||||
public IResource getActualFile() {
|
||||
return actualFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the path of <code>{@link #getActualFile()}</code>, in a format the external tool can
|
||||
* understand.
|
||||
* @return the path of the <em>actual</em> file to process.
|
||||
*/
|
||||
public String getActualFilePath() {
|
||||
return actualFilePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the directory where the external tool should be executed.
|
||||
* @return the directory where the external tool should be executed.
|
||||
*/
|
||||
public IPath getWorkingDirectory() {
|
||||
return workingDirectory;
|
||||
}
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.core.resources.IResource;
|
||||
|
||||
/**
|
||||
* Default implementation of <code>{@link InvocationParameters}</code>
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public class InvocationParametersProvider implements IInvocationParametersProvider {
|
||||
/**
|
||||
* Creates the parameters to pass when invoking an external tool.
|
||||
* <p>
|
||||
* In this implementation:
|
||||
* <ul>
|
||||
* <li>the <em>actual</em> file to process is the same as the <em>original</em> file</li>
|
||||
* <li>the path of the actual file is its absolute path in the file system</li>
|
||||
* <li>the working directory is {@code null}</li>
|
||||
* </ul>
|
||||
* @param fileToProcess the file to process.
|
||||
* @return the created parameters.
|
||||
*/
|
||||
@Override
|
||||
public InvocationParameters createParameters(IResource fileToProcess) {
|
||||
String path = fileToProcess.getLocation().toOSString();
|
||||
return new InvocationParameters(fileToProcess, fileToProcess, path, null);
|
||||
}
|
||||
}
|
|
@ -1,82 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor;
|
||||
import org.eclipse.cdt.codan.core.param.MapProblemPreference;
|
||||
|
||||
/**
|
||||
* Single external tool configuration setting.
|
||||
* @param <T> the type of the value this setting stores.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @noextend This class is not intended to be extended by clients.
|
||||
* @since 2.1
|
||||
*/
|
||||
public class SingleConfigurationSetting<T> {
|
||||
private final IProblemPreferenceDescriptor descriptor;
|
||||
private final T defaultValue;
|
||||
private final Class<T> valueType;
|
||||
|
||||
private T value;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param descriptor meta-data that tells the UI how to display this setting.
|
||||
* @param defaultValue the setting's default value.
|
||||
* @param valueType the type of the value to store (used for safe casting.)
|
||||
*/
|
||||
public SingleConfigurationSetting(IProblemPreferenceDescriptor descriptor, T defaultValue,
|
||||
Class<T> valueType) {
|
||||
this.descriptor = descriptor;
|
||||
this.defaultValue = defaultValue;
|
||||
this.valueType = valueType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this setting's value.
|
||||
* @return this setting's value.
|
||||
*/
|
||||
public T getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the meta-data that tells the UI how to display this setting.
|
||||
* @return the meta-data that tells the UI how to display this setting.
|
||||
*/
|
||||
public IProblemPreferenceDescriptor getDescriptor() {
|
||||
return descriptor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns this setting's default value.
|
||||
* @return this setting's default value.
|
||||
*/
|
||||
public T getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates this setting's value with the one stored in the given preference map.
|
||||
* @param preferences the given preference map that may contain the value to set.
|
||||
* @throws ClassCastException if the value to set is not of the same type as the one supported
|
||||
* by this setting.
|
||||
*/
|
||||
public void updateValue(MapProblemPreference preferences) {
|
||||
IProblemPreference childDescriptor = preferences.getChildDescriptor(descriptor.getKey());
|
||||
if (childDescriptor != null) {
|
||||
value = valueType.cast(childDescriptor.getValue());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,34 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.externaltool;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Default implementation of <code>{@link IArgsSeparator}</code> that uses an empty space as
|
||||
* the delimiter to separate the arguments to pass to an external tool.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public final class SpaceArgsSeparator implements IArgsSeparator {
|
||||
private static final String[] NO_ARGS = {};
|
||||
private static final Pattern EMPTY_SPACE_PATTERN = Pattern.compile("\\s+"); //$NON-NLS-1$
|
||||
|
||||
@Override
|
||||
public String[] separateArgs(String args) {
|
||||
if (args == null || args.isEmpty()) {
|
||||
return NO_ARGS;
|
||||
}
|
||||
return EMPTY_SPACE_PATTERN.split(args);
|
||||
}
|
||||
}
|
|
@ -1,28 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc.
|
||||
* 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:
|
||||
* Alex Ruiz - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.core.param;
|
||||
|
||||
/**
|
||||
* Preferences that can be shared among several problems.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 2.1
|
||||
*/
|
||||
public class SharedRootProblemPreference extends RootProblemPreference {
|
||||
@Override
|
||||
public Object clone() {
|
||||
SharedRootProblemPreference map = (SharedRootProblemPreference) super.clone();
|
||||
// alruiz: sharing the internal hash is the only way I could make this work.
|
||||
map.hash = hash;
|
||||
return map;
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import static org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType.TYPE_STRING;
|
||||
import static org.eclipse.cdt.codan.internal.core.externaltool.Messages.ConfigurationSettings_args_format;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.SingleConfigurationSetting;
|
||||
import org.eclipse.cdt.codan.core.param.BasicProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor;
|
||||
|
||||
/**
|
||||
* User-configurable setting that specifies the arguments to pass when invoking the external tool.
|
||||
* The arguments are stored in a single {@code String}.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class ArgsSetting extends SingleConfigurationSetting<String> {
|
||||
static final String KEY = "externalToolArgs"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param externalToolName the name of the external tool, to be displayed to the user.
|
||||
* @param defaultValue the default value of the setting.
|
||||
*/
|
||||
public ArgsSetting(String externalToolName, String defaultValue) {
|
||||
super(newPreferenceDescriptor(externalToolName), defaultValue, String.class);
|
||||
}
|
||||
|
||||
private static IProblemPreferenceDescriptor newPreferenceDescriptor(String externalToolName) {
|
||||
String label = String.format(ConfigurationSettings_args_format, externalToolName);
|
||||
return new BasicProblemPreference(KEY, label, TYPE_STRING);
|
||||
}
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import static org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType.TYPE_BOOLEAN;
|
||||
import static org.eclipse.cdt.codan.internal.core.externaltool.Messages.ConfigurationSettings_should_display_output;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.SingleConfigurationSetting;
|
||||
import org.eclipse.cdt.codan.core.param.BasicProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor;
|
||||
|
||||
/**
|
||||
* User-configurable setting that specifies whether the output of an external tool should be
|
||||
* displayed in an Eclipse console.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class ConsoleOutputSetting extends SingleConfigurationSetting<Boolean> {
|
||||
static final String KEY = "externalToolShouldDisplayOutput"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param defaultValue the default value of the setting.
|
||||
*/
|
||||
public ConsoleOutputSetting(boolean defaultValue) {
|
||||
super(newPreferenceDescriptor(), defaultValue, Boolean.class);
|
||||
}
|
||||
|
||||
private static IProblemPreferenceDescriptor newPreferenceDescriptor() {
|
||||
String label = ConfigurationSettings_should_display_output;
|
||||
return new BasicProblemPreference(KEY, label, TYPE_BOOLEAN);
|
||||
}
|
||||
}
|
|
@ -1,176 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinter;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinterProvider;
|
||||
import org.eclipse.cdt.codan.core.externaltool.AbstractOutputParser;
|
||||
import org.eclipse.cdt.codan.core.externaltool.ConfigurationSettings;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IArgsSeparator;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationFailure;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationParameters;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Invokes an external tool to perform checks on a single file.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class ExternalToolInvoker {
|
||||
private final IConsolePrinterProvider consolePrinterProvider;
|
||||
private final ProcessInvoker processInvoker;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param consolePrinterProvider creates an Eclipse console that uses the name of an external
|
||||
* tool as its own.
|
||||
*/
|
||||
public ExternalToolInvoker(IConsolePrinterProvider consolePrinterProvider) {
|
||||
this(consolePrinterProvider, new ProcessInvoker());
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor, for testing purposes only.
|
||||
* @param consolePrinterProvider creates an Eclipse console that uses the name of an external
|
||||
* tool as its own.
|
||||
* @param processInvoker executes a command in a separate process.
|
||||
*/
|
||||
public ExternalToolInvoker(IConsolePrinterProvider consolePrinterProvider,
|
||||
ProcessInvoker processInvoker) {
|
||||
this.consolePrinterProvider = consolePrinterProvider;
|
||||
this.processInvoker = processInvoker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invokes an external tool.
|
||||
*
|
||||
* @param parameters the parameters to pass to the external tool executable.
|
||||
* @param configurationSettings user-configurable settings.
|
||||
* @param argsSeparator separates the arguments to pass to the external tool executable. These
|
||||
* arguments are stored in a single {@code String}.
|
||||
* @param parsers parse the output of the external tool.
|
||||
* @throws InvocationFailure if the external tool reports that it cannot be executed.
|
||||
* @throws Throwable if the external tool cannot be launched.
|
||||
*/
|
||||
public void invoke(InvocationParameters parameters, ConfigurationSettings configurationSettings,
|
||||
IArgsSeparator argsSeparator, List<AbstractOutputParser> parsers)
|
||||
throws InvocationFailure, Throwable {
|
||||
IPath executablePath = executablePath(configurationSettings);
|
||||
String[] args = argsToPass(parameters, configurationSettings, argsSeparator);
|
||||
boolean shouldDisplayOutput = configurationSettings.getShouldDisplayOutput().getValue();
|
||||
try {
|
||||
buildAndLaunchCommand(configurationSettings.getExternalToolName(), executablePath, args,
|
||||
parameters.getWorkingDirectory(), shouldDisplayOutput, parsers);
|
||||
} finally {
|
||||
reset(parsers);
|
||||
}
|
||||
}
|
||||
|
||||
private IPath executablePath(ConfigurationSettings configurationSettings) {
|
||||
File executablePath = configurationSettings.getPath().getValue();
|
||||
return new Path(executablePath.toString());
|
||||
}
|
||||
|
||||
private String[] argsToPass(InvocationParameters parameters,
|
||||
ConfigurationSettings configurationSettings, IArgsSeparator argsSeparator) {
|
||||
String actualFilePath = parameters.getActualFilePath();
|
||||
String[] args = configuredArgs(configurationSettings, argsSeparator);
|
||||
return addFilePathToArgs(actualFilePath, args);
|
||||
}
|
||||
|
||||
private String[] configuredArgs(ConfigurationSettings configurationSettings,
|
||||
IArgsSeparator argsSeparator) {
|
||||
String args = configurationSettings.getArgs().getValue();
|
||||
return argsSeparator.separateArgs(args);
|
||||
}
|
||||
|
||||
private String[] addFilePathToArgs(String actualFilePath, String[] configuredArgs) {
|
||||
int argCount = configuredArgs.length;
|
||||
String[] allArgs = new String[argCount + 1];
|
||||
// alruiz: Arrays.copyOf leaves empty cells at the end. We need an empty cell at the
|
||||
// beginning of the array.
|
||||
System.arraycopy(configuredArgs, 0, allArgs, 1, argCount);
|
||||
// add file to process as the first argument
|
||||
allArgs[0] = actualFilePath;
|
||||
return allArgs;
|
||||
}
|
||||
|
||||
private void buildAndLaunchCommand(String externalToolName, IPath executablePath, String[] args,
|
||||
IPath workingDirectory, boolean shouldDisplayOutput, List<AbstractOutputParser> parsers)
|
||||
throws InvocationFailure, Throwable {
|
||||
String command = buildCommand(executablePath, args);
|
||||
Process process = null;
|
||||
IConsolePrinter console =
|
||||
consolePrinterProvider.createConsole(externalToolName, shouldDisplayOutput);
|
||||
try {
|
||||
console.clear();
|
||||
console.println(command);
|
||||
console.println();
|
||||
process = processInvoker.invoke(command, workingDirectory);
|
||||
processStream(process.getInputStream(), parsers, console);
|
||||
processStream(process.getErrorStream(), parsers, console);
|
||||
} finally {
|
||||
if (process != null) {
|
||||
process.destroy();
|
||||
}
|
||||
console.close();
|
||||
}
|
||||
}
|
||||
|
||||
private String buildCommand(IPath executablePath, String[] args) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(executablePath.toOSString());
|
||||
for (String arg : args) {
|
||||
builder.append(" ").append(arg); //$NON-NLS-1$
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private void processStream(InputStream inputStream, List<AbstractOutputParser> parsers,
|
||||
IConsolePrinter console) throws IOException, InvocationFailure {
|
||||
Reader reader = null;
|
||||
try {
|
||||
reader = new InputStreamReader(inputStream);
|
||||
BufferedReader bufferedReader = new BufferedReader(reader);
|
||||
String line = null;
|
||||
while ((line = bufferedReader.readLine()) != null) {
|
||||
console.println(line);
|
||||
for (AbstractOutputParser parser : parsers) {
|
||||
if (parser.parse(line)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
if (reader != null) {
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void reset(List<AbstractOutputParser> parsers) {
|
||||
for (AbstractOutputParser parser : parsers) {
|
||||
parser.reset();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import org.eclipse.osgi.util.NLS;
|
||||
|
||||
/**
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class Messages extends NLS {
|
||||
public static String ConfigurationSettings_args_format;
|
||||
public static String ConfigurationSettings_path_format;
|
||||
public static String ConfigurationSettings_should_display_output;
|
||||
|
||||
static {
|
||||
NLS.initializeMessages(Messages.class.getName(), Messages.class);
|
||||
}
|
||||
|
||||
private Messages() {
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
###############################################################################
|
||||
# Copyright (c) 2012 Google, Inc 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:
|
||||
# Alex Ruiz (Google) - initial API and implementation
|
||||
###############################################################################
|
||||
ConfigurationSettings_args_format=%s Args:
|
||||
ConfigurationSettings_path_format=%s Path:
|
||||
ConfigurationSettings_should_display_output=Display Output in Console
|
|
@ -1,43 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import static org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor.PreferenceType.TYPE_FILE;
|
||||
import static org.eclipse.cdt.codan.internal.core.externaltool.Messages.ConfigurationSettings_path_format;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.SingleConfigurationSetting;
|
||||
import org.eclipse.cdt.codan.core.param.BasicProblemPreference;
|
||||
import org.eclipse.cdt.codan.core.param.IProblemPreferenceDescriptor;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* User-configurable setting that specifies the path and name of an external tool's executable.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class PathSetting extends SingleConfigurationSetting<File> {
|
||||
static final String KEY = "externalToolPath"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param externalToolName the name of the external tool, to be displayed to the user.
|
||||
* @param defaultValue the default value of the setting.
|
||||
*/
|
||||
public PathSetting(String externalToolName, File defaultValue) {
|
||||
super(newPreferenceDescriptor(externalToolName), defaultValue, File.class);
|
||||
}
|
||||
|
||||
private static IProblemPreferenceDescriptor newPreferenceDescriptor(String externalToolName) {
|
||||
String label = String.format(ConfigurationSettings_path_format, externalToolName);
|
||||
return new BasicProblemPreference(KEY, label, TYPE_FILE);
|
||||
}
|
||||
}
|
|
@ -1,46 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.core.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationFailure;
|
||||
import org.eclipse.core.runtime.IPath;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Executes a command in a separate process.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class ProcessInvoker {
|
||||
private static final String[] ENVIRONMENT_VARIABLE_SETTINGS = {};
|
||||
private static final String ERROR_FORMAT = "Unable to invoke command '%s'"; //$NON-NLS-1$
|
||||
|
||||
/**
|
||||
* Invokes the given command in a separate process.
|
||||
* @param command the command to execute.
|
||||
* @param workingDirectory the working directory of the process, or {@code null} should inherit
|
||||
* the working directory of the current process.
|
||||
* @return the process where the given command is being executed.
|
||||
* @throws InvocationFailure if the command fails to be executed.
|
||||
*/
|
||||
public Process invoke(String command, IPath workingDirectory) throws InvocationFailure {
|
||||
try {
|
||||
Runtime runtime = Runtime.getRuntime();
|
||||
if (workingDirectory == null) {
|
||||
return runtime.exec(command);
|
||||
}
|
||||
return runtime.exec(command, ENVIRONMENT_VARIABLE_SETTINGS, workingDirectory.toFile());
|
||||
} catch (IOException e) {
|
||||
throw new InvocationFailure(String.format(ERROR_FORMAT, command), e);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -19,5 +19,4 @@ Require-Bundle: org.eclipse.ui,
|
|||
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
|
||||
Bundle-ActivationPolicy: lazy
|
||||
Export-Package: org.eclipse.cdt.codan.internal.ui.cxx;x-internal:=true,
|
||||
org.eclipse.cdt.codan.ui,
|
||||
org.eclipse.cdt.codan.ui.cxx.externaltool
|
||||
org.eclipse.cdt.codan.ui
|
||||
|
|
|
@ -1,97 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.ui.cxx.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.cxx.util.FileTypes;
|
||||
import org.eclipse.cdt.codan.core.externaltool.AbstractExternalToolBasedChecker;
|
||||
import org.eclipse.cdt.codan.core.externaltool.ConfigurationSettings;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IArgsSeparator;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IInvocationParametersProvider;
|
||||
import org.eclipse.cdt.codan.core.externaltool.InvocationParametersProvider;
|
||||
import org.eclipse.cdt.codan.core.externaltool.SpaceArgsSeparator;
|
||||
import org.eclipse.cdt.codan.internal.ui.externaltool.ConsolePrinterProvider;
|
||||
import org.eclipse.cdt.codan.ui.CodanEditorUtility;
|
||||
import org.eclipse.cdt.codan.ui.cxx.util.CEditors;
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.ui.editors.text.TextEditor;
|
||||
|
||||
/**
|
||||
* Base class for checkers that invoke external command-line tools to perform code checking
|
||||
* on C++ files.
|
||||
* <p>
|
||||
* A file, to be processed by this type of checker, must:
|
||||
* <ol>
|
||||
* <li>a C++ file</li>
|
||||
* <li>be in the current active editor</li>
|
||||
* <li>not have any unsaved changes</li>
|
||||
* </ol>
|
||||
* </p>
|
||||
* By default, implementations of this checker are not allowed to run while the user types, since
|
||||
* external tools cannot see unsaved changes.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*
|
||||
* @since 3.0
|
||||
*/
|
||||
public abstract class AbstractCxxExternalToolBasedChecker extends AbstractExternalToolBasedChecker {
|
||||
/**
|
||||
* Constructor
|
||||
* @param configurationSettings user-configurable external tool configuration settings.
|
||||
*/
|
||||
public AbstractCxxExternalToolBasedChecker(ConfigurationSettings configurationSettings) {
|
||||
this(new InvocationParametersProvider(), new SpaceArgsSeparator(), configurationSettings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param parametersProvider provides the parameters to pass when invoking the external tool.
|
||||
* @param argsSeparator separates the arguments to pass to the external tool executable. These
|
||||
* arguments are stored in a single {@code String}.
|
||||
* @param configurationSettings user-configurable external tool configuration settings.
|
||||
*/
|
||||
public AbstractCxxExternalToolBasedChecker(IInvocationParametersProvider parametersProvider,
|
||||
IArgsSeparator argsSeparator, ConfigurationSettings configurationSettings) {
|
||||
super(parametersProvider, argsSeparator, new ConsolePrinterProvider(),
|
||||
configurationSettings);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates whether the external tool is capable of processing the given
|
||||
* <code>{@link IResource}</code>.
|
||||
* <p>
|
||||
* The minimum requirements that the given {@code IResource} should satisfy are:
|
||||
* <ul>
|
||||
* <li>should be C/C++ file</li>
|
||||
* <li>should be displayed in the current active {@code CEditor}</li>
|
||||
* <li>should not have any unsaved changes</li>
|
||||
* </ul>
|
||||
* </p>
|
||||
* @param resource the given {@code IResource}.
|
||||
* @return {@code true} if the external tool is capable of processing the given file,
|
||||
* {@code false} otherwise.
|
||||
*/
|
||||
@Override
|
||||
public boolean enabledInContext(IResource resource) {
|
||||
return isFileOfSupportedType(resource) && isOpenInActiveCleanEditor(resource);
|
||||
}
|
||||
|
||||
private boolean isFileOfSupportedType(IResource resource) {
|
||||
return FileTypes.isCppFile(resource) || FileTypes.isHeaderFile(resource);
|
||||
}
|
||||
|
||||
private boolean isOpenInActiveCleanEditor(IResource resource) {
|
||||
TextEditor editor = CEditors.activeCEditor();
|
||||
if (editor == null) {
|
||||
return false;
|
||||
}
|
||||
return !editor.isDirty() && CodanEditorUtility.isResourceOpenInEditor(resource, editor);
|
||||
}
|
||||
}
|
|
@ -1,45 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc.
|
||||
* 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:
|
||||
* Alex Ruiz - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.ui.cxx.util;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.editor.CEditor;
|
||||
import org.eclipse.ui.IEditorPart;
|
||||
import org.eclipse.ui.IWorkbench;
|
||||
import org.eclipse.ui.IWorkbenchPage;
|
||||
import org.eclipse.ui.IWorkbenchWindow;
|
||||
import org.eclipse.ui.PlatformUI;
|
||||
import org.eclipse.ui.editors.text.TextEditor;
|
||||
|
||||
/**
|
||||
* Utility methods related to <code>{@link CEditor}</code>.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
@SuppressWarnings("restriction") // CEditor is internal API
|
||||
public final class CEditors {
|
||||
/**
|
||||
* Finds the current {@code CEditor}.
|
||||
* @return the current {@code CEditor}, or {@code null} if one cannot be found.
|
||||
*/
|
||||
public static TextEditor activeCEditor() {
|
||||
IWorkbench workbench = PlatformUI.getWorkbench();
|
||||
for (IWorkbenchWindow w : workbench.getWorkbenchWindows()) {
|
||||
IWorkbenchPage activePage = w.getActivePage();
|
||||
IEditorPart editor = activePage.getActiveEditor();
|
||||
if (editor instanceof CEditor) {
|
||||
return (CEditor) editor;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private CEditors() {}
|
||||
}
|
|
@ -20,7 +20,6 @@ Bundle-ActivationPolicy: lazy
|
|||
Export-Package: org.eclipse.cdt.codan.internal.ui;x-friends:="org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.internal.ui.actions;x-friends:="org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.internal.ui.dialogs;x-friends:="org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.internal.ui.externaltool;x-friends:="org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.internal.ui.preferences;x-friends:="org.eclipse.cdt.codan.ui.cxx",
|
||||
org.eclipse.cdt.codan.internal.ui.views;x-internal:=true,
|
||||
org.eclipse.cdt.codan.internal.ui.widgets;x-internal:=true,
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.ui.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinter;
|
||||
import org.eclipse.ui.console.MessageConsole;
|
||||
import org.eclipse.ui.console.MessageConsoleStream;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Default implementation of <code>{@link IConsolePrinter}</code>.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
class ConsolePrinter implements IConsolePrinter {
|
||||
private final MessageConsole console;
|
||||
private final MessageConsoleStream out;
|
||||
|
||||
ConsolePrinter(MessageConsole console) {
|
||||
this.console = console;
|
||||
out = console.newMessageStream();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
console.clearConsole();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(String s) {
|
||||
out.println(s);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println() {
|
||||
out.println();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
try {
|
||||
out.close();
|
||||
} catch (IOException ignored) {}
|
||||
}
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.ui.externaltool;
|
||||
|
||||
import static org.eclipse.ui.console.IConsoleConstants.ID_CONSOLE_VIEW;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinter;
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinterProvider;
|
||||
import org.eclipse.cdt.codan.internal.ui.CodanUIActivator;
|
||||
import org.eclipse.cdt.codan.ui.CodanEditorUtility;
|
||||
import org.eclipse.ui.IWorkbenchPage;
|
||||
import org.eclipse.ui.PartInitException;
|
||||
import org.eclipse.ui.console.ConsolePlugin;
|
||||
import org.eclipse.ui.console.IConsole;
|
||||
import org.eclipse.ui.console.IConsoleManager;
|
||||
import org.eclipse.ui.console.IConsoleView;
|
||||
import org.eclipse.ui.console.MessageConsole;
|
||||
|
||||
/**
|
||||
* Default implementation of <code>{@link IConsolePrinterProvider}</code>.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
public class ConsolePrinterProvider implements IConsolePrinterProvider {
|
||||
private static final NullConsolePrinter NULL_CONSOLE = new NullConsolePrinter();
|
||||
|
||||
@Override
|
||||
public IConsolePrinter createConsole(String externalToolName, boolean shouldDisplayOutput) {
|
||||
if (shouldDisplayOutput) {
|
||||
try {
|
||||
return createOrFindConsole(externalToolName);
|
||||
} catch (Throwable e) {
|
||||
CodanUIActivator.log("Unable to create/find console", e); //$NON-NLS-1$
|
||||
}
|
||||
}
|
||||
return NULL_CONSOLE;
|
||||
}
|
||||
|
||||
private IConsolePrinter createOrFindConsole(String externalToolName) throws PartInitException {
|
||||
MessageConsole console = findConsole(externalToolName);
|
||||
IWorkbenchPage page = CodanEditorUtility.getActivePage();
|
||||
if (page != null) {
|
||||
IConsoleView view = (IConsoleView) page.showView(ID_CONSOLE_VIEW);
|
||||
view.display(console);
|
||||
}
|
||||
return new ConsolePrinter(console);
|
||||
}
|
||||
|
||||
private static MessageConsole findConsole(String externalToolName) {
|
||||
IConsoleManager consoleManager = ConsolePlugin.getDefault().getConsoleManager();
|
||||
for (IConsole console : consoleManager.getConsoles()) {
|
||||
if (externalToolName.equals(console.getName()) && console instanceof MessageConsole) {
|
||||
return (MessageConsole) console;
|
||||
}
|
||||
}
|
||||
MessageConsole console = new MessageConsole(externalToolName, null);
|
||||
consoleManager.addConsoles(new IConsole[] { console });
|
||||
return console;
|
||||
}
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (c) 2012 Google, Inc 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:
|
||||
* Alex Ruiz (Google) - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.ui.externaltool;
|
||||
|
||||
import org.eclipse.cdt.codan.core.externaltool.IConsolePrinter;
|
||||
|
||||
/**
|
||||
* No-op implementation of <code>{@link IConsolePrinter}</code>.
|
||||
*
|
||||
* @author alruiz@google.com (Alex Ruiz)
|
||||
*/
|
||||
class NullConsolePrinter implements IConsolePrinter {
|
||||
@Override
|
||||
public void clear() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(String message) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue