Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -340,4 +340,26 @@ public void testCompatibility() {
assertTrue(version3.isCompatible());
}

@Test
public void testPremium() {
Version version1 = new Version("cppcheck 1.56");
Version version2 = new Version("cppcheck 1.56.0");
Version version3 = new Version("cppcheck 1.56.0.0");
assertFalse(version1.isPremium());
assertFalse(version2.isPremium());
assertFalse(version3.isPremium());
version1 = new Version("cppcheck premium 1.56");
version2 = new Version("cppcheck premium 1.56.0");
version3 = new Version("cppcheck premium 1.56.0.0");
assertTrue(version1.isPremium());
assertTrue(version2.isPremium());
assertTrue(version3.isPremium());
version1 = new Version("cppcheck premium 1.56s");
version2 = new Version("cppcheck premium 1.56.0s");
version3 = new Version("cppcheck premium 1.56.0.0s");
assertTrue(version1.isPremium());
assertTrue(version2.isPremium());
assertTrue(version3.isPremium());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* Constant definitions for plug-in preferences
*/
public interface IPreferenceConstants {
public static final String P_PREMIUM = "premium";
public static final String P_RUN_ON_BUILD = "runOnBuild";
public static final String P_PROBLEMS = "problems";
public static final String P_USE_PARENT_SUFFIX = "_useParentScope";
Expand All @@ -18,6 +19,14 @@ public interface IPreferenceConstants {
public static final String P_CHECK_INCONCLUSIVE = "checkInconclusive";
public static final String P_CHECK_FORCE = "checkForce";
public static final String P_CHECK_DEBUG = "checkDebug";
public static final String P_PREMIUM_BUG_HUNTING = "bughunting";
public static final String P_PREMIUM_MISRA_C_12 = "misrac12";
public static final String P_PREMIUM_MISRA_C_23 = "misrac23";
public static final String P_PREMIUM_MISRA_CPP_08 = "misracpp08";
public static final String P_PREMIUM_MISRA_CPP_23 = "misracpp23";
public static final String P_PREMIUM_CERT_C = "certc";
public static final String P_PREMIUM_CERT_CPP = "certcpp";
public static final String P_PREMIUM_AUTOSAR = "autosar";
public static final String P_USE_INLINE_SUPPRESSIONS = "useInlineSuppressions";
public static final String P_CHECK_UNUSED_FUNCTIONS = "checkUnusedFunctions";
public static final String P_FOLLOW_SYSTEM_INCLUDES = "followSystemIncludes";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,39 @@ public class CppcheckCommand extends AbstractCppcheckCommand {
private final static Pattern FILE_PATTERN = Pattern
.compile("^Checking (.*)...");

private static final String CPPCHECK_PROJ_STRING = ".cppcheck";

private final Collection<String> arguments;
private String advancedArguments;


private void addPremiumChecks(IPreferenceStore settingsStore) {
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_BUG_HUNTING)) {
arguments.add("--premium=bughunting");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_C_12)) {
arguments.add("--premium=misra-c-2012");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_C_23)) {
arguments.add("--premium=misra-c-2023");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_CPP_08)) {
arguments.add("--premium=misra-c++-2008");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_CPP_23)) {
arguments.add("--premium=misra-c++-2023");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_CERT_C)) {
arguments.add("--premium=cert-c-2016");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_CERT_CPP)) {
arguments.add("--premium=cert-c++-2016");
}
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_AUTOSAR)) {
arguments.add("--premium=autosar");
}
}

/**
* For testing purposes either use interfaces or simple types as parameters.
* No dependency to Eclipse classes allowed.
Expand Down Expand Up @@ -132,6 +162,10 @@ public CppcheckCommand(IConsole console, String binaryPath,
arguments.add("--file-list=-");
}

if (projectFile.isEmpty() || !projectFile.endsWith(CPPCHECK_PROJ_STRING)) {
addPremiumChecks(settingsStore);
}

if (settingsStore.getBoolean(IPreferenceConstants.P_CHECK_VERBOSE)) {
arguments.add("--verbose");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,14 @@ public boolean isCompatible() {
}


/**
* @return true if the version is a premium version
*/
public boolean isPremium() {
return getType() == VersionType.PREMIUM || getType() == VersionType.PREMIUM_SAFETY_CERTIFIED;
}


@Override
public String toString() {
StringBuffer version = new StringBuffer();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,19 +100,29 @@ public class Messages extends NLS {
public static String SettingsPreferencePage_Debug;
public static String SettingsPreferencePage_ChecksLabel;
public static String SettingsPreferencePage_InlineSuppressions;


public static String SettingsPreferencePage_PremiumBugHunting;
public static String SettingsPreferencePage_PremiumMisraC2012;
public static String SettingsPreferencePage_PremiumMisraC2023;
public static String SettingsPreferencePage_PremiumMisraCpp2008;
public static String SettingsPreferencePage_PremiumMisraCpp2023;
public static String SettingsPreferencePage_PremiumCertC;
public static String SettingsPreferencePage_PremiumCertCpp;
public static String SettingsPreferencePage_PremiumAutosar;
public static String SettingsPreferencePage_PremiumLabel;

public static String SymbolsPropertyPage_Description;

public static String SettingsPreferencePage_Inconclusive;

public static String SettingsPreferencePage_TargetPlatform;

public static String SettingsPreferencePage_LanguageStandard_Posix;

public static String SettingsPreferencePage_LanguageStandard_C99;

public static String SettingsPreferencePage_LanguageStandardsLabel;

static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,15 @@ SettingsPreferencePage_CheckPortability=Check for portability issues (portabilit
SettingsPreferencePage_CheckInformation=Informative checks (information)
SettingsPreferencePage_CheckMissingInclude=Check for missing includes (missingInclude)
SettingsPreferencePage_ChecksLabel=Checks (--enable=<check>)
SettingsPreferencePage_PremiumBugHunting=Bug Hunting
SettingsPreferencePage_PremiumMisraC2012=Misra C 2012
SettingsPreferencePage_PremiumMisraC2023=Misra C 2023
SettingsPreferencePage_PremiumMisraCpp2008=Misra C++ 2008
SettingsPreferencePage_PremiumMisraCpp2023=Misra C++ 2023
SettingsPreferencePage_PremiumCertC=Cert C 2016
SettingsPreferencePage_PremiumCertCpp=Cert C++ 2016
SettingsPreferencePage_PremiumAutosar=Autosar
SettingsPreferencePage_PremiumLabel=Premium (--premium=<option>)
SettingsPreferencePage_Description=General settings of cppcheck.
SettingsPreferencePage_FollowUserIncludes=Follow user-defined includes (taken from CDT settings)
SettingsPreferencePage_FollowSystemIncludes=Follow system-defined includes (taken from CDT settings)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.eclipse.jface.preference.StringButtonFieldEditor;
import org.eclipse.debug.ui.StringVariableSelectionDialog;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.preference.RadioGroupFieldEditor;
Expand Down Expand Up @@ -128,6 +129,10 @@ protected boolean checkState() {
Version version = versionCommand
.run(new NullProgressMonitor());
currentVersion = version.toString();
IPersistentPreferenceStore store = CppcheclipsePlugin.getConfigurationPreferenceStore();
boolean isPremium = store.getBoolean(IPreferenceConstants.P_PREMIUM);
store.setValue(IPreferenceConstants.P_PREMIUM, version.isPremium());
store.save();
// check for minimal required version
if (!version.isCompatible()) {
showErrorMessage(Messages
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.googlecode.cppcheclipse.ui.preferences;

import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.swt.widgets.Composite;

public class ExclusiveBooleanFieldEditor extends BooleanFieldEditor {

private BooleanFieldEditor dependencyFieldEditor;
private Composite parent;

public ExclusiveBooleanFieldEditor(String name, String label, Composite parent) {
super(name, label, parent);
this.parent = parent;
}

public ExclusiveBooleanFieldEditor(String name, String labelText, int style, Composite parent) {
super(name, labelText, style, parent);
this.parent = parent;
}

public ExclusiveBooleanFieldEditor(BooleanFieldEditor dependencyFieldEditor, String name, String label,
Composite parent) {
super(name, label, parent);
this.dependencyFieldEditor = dependencyFieldEditor;
this.parent = parent;
}

public ExclusiveBooleanFieldEditor(BooleanFieldEditor dependencyFieldEditor, String name, String labelText,
int style, Composite parent) {
super(name, labelText, style, parent);
this.dependencyFieldEditor = dependencyFieldEditor;
this.parent = parent;
}

public void addDependent(BooleanFieldEditor dependencyFieldEditor, Composite parent) {
this.dependencyFieldEditor = dependencyFieldEditor;
this.parent = parent;
}

@Override
public void setEnabled(boolean enabled, Composite parent) {
if (enabled) {
if (dependencyFieldEditor != null) {
enabled = !dependencyFieldEditor.getBooleanValue();
}
}
super.setEnabled(enabled, parent);
}

@Override
protected void valueChanged(boolean oldValue, boolean newValue) {
super.valueChanged(oldValue, newValue);
if (dependencyFieldEditor != null) {
dependencyFieldEditor.setEnabled(!newValue, parent);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.StringButtonFieldEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
Expand All @@ -23,13 +25,23 @@
public class SettingsPreferencePage extends FieldEditorOverlayPage implements
IWorkbenchPreferencePage {

private static final String CPPCHECK_PROJ_STRING = ".cppcheck";

private BooleanFieldEditor allCheck;
private BooleanFieldEditor unusedFunctionsCheck;
private IntegerFieldEditor numberOfThreads;
private StringButtonFieldEditor projectFile;
private List<BooleanFieldEditor> checkEditors;
private Group checkGroup;


ExclusiveBooleanFieldEditor misrac12Editor;
ExclusiveBooleanFieldEditor misrac23Editor;
ExclusiveBooleanFieldEditor misracpp08Editor;
ExclusiveBooleanFieldEditor misracpp23Editor;
private List<BooleanFieldEditor> premiumEditors;
private Group premiumGroup;

public SettingsPreferencePage() {
super(GRID, true);
// this is overridden in case of project properties
Expand Down Expand Up @@ -122,6 +134,70 @@ protected void valueChanged(boolean oldValue, boolean newValue) {
setCompositeLayout(checkGroup);
}


private void enablePremiumChecks(boolean val) {
misrac12Editor.setEnabled(val && !misrac23Editor.getBooleanValue(), premiumGroup);
misrac23Editor.setEnabled(val && !misrac12Editor.getBooleanValue(), premiumGroup);
misracpp08Editor.setEnabled(val && !misracpp23Editor.getBooleanValue(), premiumGroup);
misracpp23Editor.setEnabled(val && !misracpp08Editor.getBooleanValue(), premiumGroup);
for (BooleanFieldEditor premiumEditor : premiumEditors) {
premiumEditor.setEnabled(val, premiumGroup);
}
}

private void createPremiumGroup() {
// available premium options
final Composite parent = getFieldEditorParent();
premiumGroup = new Group(parent, SWT.NONE);
premiumGroup.setText(Messages.SettingsPreferencePage_PremiumLabel);

premiumEditors = new LinkedList<BooleanFieldEditor>();

BooleanFieldEditor bughuntingEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_BUG_HUNTING,
Messages.SettingsPreferencePage_PremiumBugHunting, premiumGroup);
addField(bughuntingEditor, premiumGroup);
premiumEditors.add(bughuntingEditor);

misrac12Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_C_12,
Messages.SettingsPreferencePage_PremiumMisraC2012, premiumGroup);
addField(misrac12Editor, premiumGroup);

misrac23Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_C_23,
Messages.SettingsPreferencePage_PremiumMisraC2023, premiumGroup);
addField(misrac23Editor, premiumGroup);

misrac12Editor.addDependent(misrac23Editor, premiumGroup);
misrac23Editor.addDependent(misrac12Editor, premiumGroup);

misracpp08Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_CPP_08,
Messages.SettingsPreferencePage_PremiumMisraCpp2008, premiumGroup);
addField(misracpp08Editor, premiumGroup);

misracpp23Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_CPP_23,
Messages.SettingsPreferencePage_PremiumMisraCpp2023, premiumGroup);
addField(misracpp23Editor, premiumGroup);

misracpp08Editor.addDependent(misracpp23Editor, premiumGroup);
misracpp23Editor.addDependent(misracpp08Editor, premiumGroup);

BooleanFieldEditor certcEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_CERT_C,
Messages.SettingsPreferencePage_PremiumCertC, premiumGroup);
addField(certcEditor, premiumGroup);
premiumEditors.add(certcEditor);

BooleanFieldEditor certcppEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_CERT_CPP,
Messages.SettingsPreferencePage_PremiumCertCpp, premiumGroup);
addField(certcppEditor, premiumGroup);
premiumEditors.add(certcppEditor);

BooleanFieldEditor autosarEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_AUTOSAR,
Messages.SettingsPreferencePage_PremiumAutosar, premiumGroup);
addField(autosarEditor, premiumGroup);
premiumEditors.add(autosarEditor);

setCompositeLayout(premiumGroup);
}

@Override
protected void createFieldEditors() {

Expand All @@ -134,6 +210,14 @@ protected String changePressed() {
return projectFileDialog.open();
}

@Override
protected void valueChanged() {
super.valueChanged();
IPersistentPreferenceStore store = CppcheclipsePlugin.getConfigurationPreferenceStore();
boolean isPremium = store.getBoolean(IPreferenceConstants.P_PREMIUM);
enablePremiumChecks(isPremium && (getStringValue().isEmpty() || !getStringValue().endsWith(CPPCHECK_PROJ_STRING)));
}

};
projectFile.setChangeButtonText(Messages.SettingsPreferencePage_ProjectFileDialogButton);
projectFile.setEmptyStringAllowed(true);
Expand All @@ -157,7 +241,8 @@ public void setEnabled(boolean enabled, Composite parent) {
addField(numberOfThreads);

createCheckGroup();

createPremiumGroup();

final BooleanFieldEditor inconclusiveChecks = new BooleanFieldEditor(
IPreferenceConstants.P_CHECK_INCONCLUSIVE,
Messages.SettingsPreferencePage_Inconclusive,
Expand Down Expand Up @@ -252,5 +337,10 @@ private void refresh() {
for (BooleanFieldEditor editor : checkEditors) {
editor.setEnabled(!allCheck.getBooleanValue(), checkGroup);
}

IPersistentPreferenceStore store = CppcheclipsePlugin.getConfigurationPreferenceStore();
boolean isPremium = store.getBoolean(IPreferenceConstants.P_PREMIUM);
enablePremiumChecks(isPremium && (projectFile.getStringValue().isEmpty()
|| !projectFile.getStringValue().endsWith(CPPCHECK_PROJ_STRING)));
}
}