Skip to content

Commit 17fb50e

Browse files
authored
Merge pull request #5 from garbbraf/additional_premium_options
feat: add new premium checks
2 parents 5c8a2b9 + 1ab8493 commit 17fb50e

File tree

9 files changed

+248
-4
lines changed

9 files changed

+248
-4
lines changed

com.googlecode.cppcheclipse.core.tests/src/com/googlecode/cppcheclipse/core/command/TestVersion.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,26 @@ public void testCompatibility() {
340340
assertTrue(version3.isCompatible());
341341
}
342342

343+
@Test
344+
public void testPremium() {
345+
Version version1 = new Version("cppcheck 1.56");
346+
Version version2 = new Version("cppcheck 1.56.0");
347+
Version version3 = new Version("cppcheck 1.56.0.0");
348+
assertFalse(version1.isPremium());
349+
assertFalse(version2.isPremium());
350+
assertFalse(version3.isPremium());
351+
version1 = new Version("cppcheck premium 1.56");
352+
version2 = new Version("cppcheck premium 1.56.0");
353+
version3 = new Version("cppcheck premium 1.56.0.0");
354+
assertTrue(version1.isPremium());
355+
assertTrue(version2.isPremium());
356+
assertTrue(version3.isPremium());
357+
version1 = new Version("cppcheck premium 1.56s");
358+
version2 = new Version("cppcheck premium 1.56.0s");
359+
version3 = new Version("cppcheck premium 1.56.0.0s");
360+
assertTrue(version1.isPremium());
361+
assertTrue(version2.isPremium());
362+
assertTrue(version3.isPremium());
363+
}
364+
343365
}

com.googlecode.cppcheclipse.core/src/com/googlecode/cppcheclipse/core/IPreferenceConstants.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Constant definitions for plug-in preferences
55
*/
66
public interface IPreferenceConstants {
7+
public static final String P_PREMIUM = "premium";
78
public static final String P_RUN_ON_BUILD = "runOnBuild";
89
public static final String P_PROBLEMS = "problems";
910
public static final String P_USE_PARENT_SUFFIX = "_useParentScope";
@@ -18,6 +19,14 @@ public interface IPreferenceConstants {
1819
public static final String P_CHECK_INCONCLUSIVE = "checkInconclusive";
1920
public static final String P_CHECK_FORCE = "checkForce";
2021
public static final String P_CHECK_DEBUG = "checkDebug";
22+
public static final String P_PREMIUM_BUG_HUNTING = "bughunting";
23+
public static final String P_PREMIUM_MISRA_C_12 = "misrac12";
24+
public static final String P_PREMIUM_MISRA_C_23 = "misrac23";
25+
public static final String P_PREMIUM_MISRA_CPP_08 = "misracpp08";
26+
public static final String P_PREMIUM_MISRA_CPP_23 = "misracpp23";
27+
public static final String P_PREMIUM_CERT_C = "certc";
28+
public static final String P_PREMIUM_CERT_CPP = "certcpp";
29+
public static final String P_PREMIUM_AUTOSAR = "autosar";
2130
public static final String P_USE_INLINE_SUPPRESSIONS = "useInlineSuppressions";
2231
public static final String P_CHECK_UNUSED_FUNCTIONS = "checkUnusedFunctions";
2332
public static final String P_FOLLOW_SYSTEM_INCLUDES = "followSystemIncludes";

com.googlecode.cppcheclipse.core/src/com/googlecode/cppcheclipse/core/command/CppcheckCommand.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,39 @@ public class CppcheckCommand extends AbstractCppcheckCommand {
5555
private final static Pattern FILE_PATTERN = Pattern
5656
.compile("^Checking (.*)...");
5757

58+
private static final String CPPCHECK_PROJ_STRING = ".cppcheck";
59+
5860
private final Collection<String> arguments;
5961
private String advancedArguments;
6062

63+
64+
private void addPremiumChecks(IPreferenceStore settingsStore) {
65+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_BUG_HUNTING)) {
66+
arguments.add("--premium=bughunting");
67+
}
68+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_C_12)) {
69+
arguments.add("--premium=misra-c-2012");
70+
}
71+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_C_23)) {
72+
arguments.add("--premium=misra-c-2023");
73+
}
74+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_CPP_08)) {
75+
arguments.add("--premium=misra-c++-2008");
76+
}
77+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_MISRA_CPP_23)) {
78+
arguments.add("--premium=misra-c++-2023");
79+
}
80+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_CERT_C)) {
81+
arguments.add("--premium=cert-c-2016");
82+
}
83+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_CERT_CPP)) {
84+
arguments.add("--premium=cert-c++-2016");
85+
}
86+
if (settingsStore.getBoolean(IPreferenceConstants.P_PREMIUM_AUTOSAR)) {
87+
arguments.add("--premium=autosar");
88+
}
89+
}
90+
6191
/**
6292
* For testing purposes either use interfaces or simple types as parameters.
6393
* No dependency to Eclipse classes allowed.
@@ -132,6 +162,10 @@ public CppcheckCommand(IConsole console, String binaryPath,
132162
arguments.add("--file-list=-");
133163
}
134164

165+
if (projectFile.isEmpty() || !projectFile.endsWith(CPPCHECK_PROJ_STRING)) {
166+
addPremiumChecks(settingsStore);
167+
}
168+
135169
if (settingsStore.getBoolean(IPreferenceConstants.P_CHECK_VERBOSE)) {
136170
arguments.add("--verbose");
137171
}

com.googlecode.cppcheclipse.core/src/com/googlecode/cppcheclipse/core/command/Version.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,14 @@ public boolean isCompatible() {
124124
}
125125

126126

127+
/**
128+
* @return true if the version is a premium version
129+
*/
130+
public boolean isPremium() {
131+
return getType() == VersionType.PREMIUM || getType() == VersionType.PREMIUM_SAFETY_CERTIFIED;
132+
}
133+
134+
127135
@Override
128136
public String toString() {
129137
StringBuffer version = new StringBuffer();

com.googlecode.cppcheclipse.ui/src/com/googlecode/cppcheclipse/ui/Messages.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,19 +100,29 @@ public class Messages extends NLS {
100100
public static String SettingsPreferencePage_Debug;
101101
public static String SettingsPreferencePage_ChecksLabel;
102102
public static String SettingsPreferencePage_InlineSuppressions;
103-
103+
104+
public static String SettingsPreferencePage_PremiumBugHunting;
105+
public static String SettingsPreferencePage_PremiumMisraC2012;
106+
public static String SettingsPreferencePage_PremiumMisraC2023;
107+
public static String SettingsPreferencePage_PremiumMisraCpp2008;
108+
public static String SettingsPreferencePage_PremiumMisraCpp2023;
109+
public static String SettingsPreferencePage_PremiumCertC;
110+
public static String SettingsPreferencePage_PremiumCertCpp;
111+
public static String SettingsPreferencePage_PremiumAutosar;
112+
public static String SettingsPreferencePage_PremiumLabel;
113+
104114
public static String SymbolsPropertyPage_Description;
105115

106116
public static String SettingsPreferencePage_Inconclusive;
107-
117+
108118
public static String SettingsPreferencePage_TargetPlatform;
109119

110120
public static String SettingsPreferencePage_LanguageStandard_Posix;
111121

112122
public static String SettingsPreferencePage_LanguageStandard_C99;
113123

114124
public static String SettingsPreferencePage_LanguageStandardsLabel;
115-
125+
116126
static {
117127
// initialize resource bundle
118128
NLS.initializeMessages(BUNDLE_NAME, Messages.class);

com.googlecode.cppcheclipse.ui/src/com/googlecode/cppcheclipse/ui/messages.properties

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ SettingsPreferencePage_CheckPortability=Check for portability issues (portabilit
3838
SettingsPreferencePage_CheckInformation=Informative checks (information)
3939
SettingsPreferencePage_CheckMissingInclude=Check for missing includes (missingInclude)
4040
SettingsPreferencePage_ChecksLabel=Checks (--enable=<check>)
41+
SettingsPreferencePage_PremiumBugHunting=Bug Hunting
42+
SettingsPreferencePage_PremiumMisraC2012=Misra C 2012
43+
SettingsPreferencePage_PremiumMisraC2023=Misra C 2023
44+
SettingsPreferencePage_PremiumMisraCpp2008=Misra C++ 2008
45+
SettingsPreferencePage_PremiumMisraCpp2023=Misra C++ 2023
46+
SettingsPreferencePage_PremiumCertC=Cert C 2016
47+
SettingsPreferencePage_PremiumCertCpp=Cert C++ 2016
48+
SettingsPreferencePage_PremiumAutosar=Autosar
49+
SettingsPreferencePage_PremiumLabel=Premium (--premium=<option>)
4150
SettingsPreferencePage_Description=General settings of cppcheck.
4251
SettingsPreferencePage_FollowUserIncludes=Follow user-defined includes (taken from CDT settings)
4352
SettingsPreferencePage_FollowSystemIncludes=Follow system-defined includes (taken from CDT settings)

com.googlecode.cppcheclipse.ui/src/com/googlecode/cppcheclipse/ui/preferences/BinaryPathPreferencePage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.eclipse.jface.preference.StringButtonFieldEditor;
1515
import org.eclipse.debug.ui.StringVariableSelectionDialog;
1616
import org.eclipse.jface.preference.IPreferenceNode;
17+
import org.eclipse.jface.preference.IPersistentPreferenceStore;
1718
import org.eclipse.jface.preference.PreferenceDialog;
1819
import org.eclipse.jface.preference.PreferenceManager;
1920
import org.eclipse.jface.preference.RadioGroupFieldEditor;
@@ -128,6 +129,10 @@ protected boolean checkState() {
128129
Version version = versionCommand
129130
.run(new NullProgressMonitor());
130131
currentVersion = version.toString();
132+
IPersistentPreferenceStore store = CppcheclipsePlugin.getConfigurationPreferenceStore();
133+
boolean isPremium = store.getBoolean(IPreferenceConstants.P_PREMIUM);
134+
store.setValue(IPreferenceConstants.P_PREMIUM, version.isPremium());
135+
store.save();
131136
// check for minimal required version
132137
if (!version.isCompatible()) {
133138
showErrorMessage(Messages
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.googlecode.cppcheclipse.ui.preferences;
2+
3+
import org.eclipse.jface.preference.BooleanFieldEditor;
4+
import org.eclipse.swt.widgets.Composite;
5+
6+
public class ExclusiveBooleanFieldEditor extends BooleanFieldEditor {
7+
8+
private BooleanFieldEditor dependencyFieldEditor;
9+
private Composite parent;
10+
11+
public ExclusiveBooleanFieldEditor(String name, String label, Composite parent) {
12+
super(name, label, parent);
13+
this.parent = parent;
14+
}
15+
16+
public ExclusiveBooleanFieldEditor(String name, String labelText, int style, Composite parent) {
17+
super(name, labelText, style, parent);
18+
this.parent = parent;
19+
}
20+
21+
public ExclusiveBooleanFieldEditor(BooleanFieldEditor dependencyFieldEditor, String name, String label,
22+
Composite parent) {
23+
super(name, label, parent);
24+
this.dependencyFieldEditor = dependencyFieldEditor;
25+
this.parent = parent;
26+
}
27+
28+
public ExclusiveBooleanFieldEditor(BooleanFieldEditor dependencyFieldEditor, String name, String labelText,
29+
int style, Composite parent) {
30+
super(name, labelText, style, parent);
31+
this.dependencyFieldEditor = dependencyFieldEditor;
32+
this.parent = parent;
33+
}
34+
35+
public void addDependent(BooleanFieldEditor dependencyFieldEditor, Composite parent) {
36+
this.dependencyFieldEditor = dependencyFieldEditor;
37+
this.parent = parent;
38+
}
39+
40+
@Override
41+
public void setEnabled(boolean enabled, Composite parent) {
42+
if (enabled) {
43+
if (dependencyFieldEditor != null) {
44+
enabled = !dependencyFieldEditor.getBooleanValue();
45+
}
46+
}
47+
super.setEnabled(enabled, parent);
48+
}
49+
50+
@Override
51+
protected void valueChanged(boolean oldValue, boolean newValue) {
52+
super.valueChanged(oldValue, newValue);
53+
if (dependencyFieldEditor != null) {
54+
dependencyFieldEditor.setEnabled(!newValue, parent);
55+
}
56+
}
57+
}

com.googlecode.cppcheclipse.ui/src/com/googlecode/cppcheclipse/ui/preferences/SettingsPreferencePage.java

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.eclipse.jface.preference.BooleanFieldEditor;
77
import org.eclipse.jface.preference.ComboFieldEditor;
88
import org.eclipse.jface.preference.IntegerFieldEditor;
9+
import org.eclipse.jface.preference.IPreferenceStore;
10+
import org.eclipse.jface.preference.IPersistentPreferenceStore;
911
import org.eclipse.jface.preference.StringButtonFieldEditor;
1012
import org.eclipse.swt.SWT;
1113
import org.eclipse.swt.widgets.Composite;
@@ -23,13 +25,23 @@
2325
public class SettingsPreferencePage extends FieldEditorOverlayPage implements
2426
IWorkbenchPreferencePage {
2527

28+
private static final String CPPCHECK_PROJ_STRING = ".cppcheck";
29+
2630
private BooleanFieldEditor allCheck;
2731
private BooleanFieldEditor unusedFunctionsCheck;
2832
private IntegerFieldEditor numberOfThreads;
2933
private StringButtonFieldEditor projectFile;
3034
private List<BooleanFieldEditor> checkEditors;
3135
private Group checkGroup;
3236

37+
38+
ExclusiveBooleanFieldEditor misrac12Editor;
39+
ExclusiveBooleanFieldEditor misrac23Editor;
40+
ExclusiveBooleanFieldEditor misracpp08Editor;
41+
ExclusiveBooleanFieldEditor misracpp23Editor;
42+
private List<BooleanFieldEditor> premiumEditors;
43+
private Group premiumGroup;
44+
3345
public SettingsPreferencePage() {
3446
super(GRID, true);
3547
// this is overridden in case of project properties
@@ -122,6 +134,70 @@ protected void valueChanged(boolean oldValue, boolean newValue) {
122134
setCompositeLayout(checkGroup);
123135
}
124136

137+
138+
private void enablePremiumChecks(boolean val) {
139+
misrac12Editor.setEnabled(val && !misrac23Editor.getBooleanValue(), premiumGroup);
140+
misrac23Editor.setEnabled(val && !misrac12Editor.getBooleanValue(), premiumGroup);
141+
misracpp08Editor.setEnabled(val && !misracpp23Editor.getBooleanValue(), premiumGroup);
142+
misracpp23Editor.setEnabled(val && !misracpp08Editor.getBooleanValue(), premiumGroup);
143+
for (BooleanFieldEditor premiumEditor : premiumEditors) {
144+
premiumEditor.setEnabled(val, premiumGroup);
145+
}
146+
}
147+
148+
private void createPremiumGroup() {
149+
// available premium options
150+
final Composite parent = getFieldEditorParent();
151+
premiumGroup = new Group(parent, SWT.NONE);
152+
premiumGroup.setText(Messages.SettingsPreferencePage_PremiumLabel);
153+
154+
premiumEditors = new LinkedList<BooleanFieldEditor>();
155+
156+
BooleanFieldEditor bughuntingEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_BUG_HUNTING,
157+
Messages.SettingsPreferencePage_PremiumBugHunting, premiumGroup);
158+
addField(bughuntingEditor, premiumGroup);
159+
premiumEditors.add(bughuntingEditor);
160+
161+
misrac12Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_C_12,
162+
Messages.SettingsPreferencePage_PremiumMisraC2012, premiumGroup);
163+
addField(misrac12Editor, premiumGroup);
164+
165+
misrac23Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_C_23,
166+
Messages.SettingsPreferencePage_PremiumMisraC2023, premiumGroup);
167+
addField(misrac23Editor, premiumGroup);
168+
169+
misrac12Editor.addDependent(misrac23Editor, premiumGroup);
170+
misrac23Editor.addDependent(misrac12Editor, premiumGroup);
171+
172+
misracpp08Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_CPP_08,
173+
Messages.SettingsPreferencePage_PremiumMisraCpp2008, premiumGroup);
174+
addField(misracpp08Editor, premiumGroup);
175+
176+
misracpp23Editor = new ExclusiveBooleanFieldEditor(IPreferenceConstants.P_PREMIUM_MISRA_CPP_23,
177+
Messages.SettingsPreferencePage_PremiumMisraCpp2023, premiumGroup);
178+
addField(misracpp23Editor, premiumGroup);
179+
180+
misracpp08Editor.addDependent(misracpp23Editor, premiumGroup);
181+
misracpp23Editor.addDependent(misracpp08Editor, premiumGroup);
182+
183+
BooleanFieldEditor certcEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_CERT_C,
184+
Messages.SettingsPreferencePage_PremiumCertC, premiumGroup);
185+
addField(certcEditor, premiumGroup);
186+
premiumEditors.add(certcEditor);
187+
188+
BooleanFieldEditor certcppEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_CERT_CPP,
189+
Messages.SettingsPreferencePage_PremiumCertCpp, premiumGroup);
190+
addField(certcppEditor, premiumGroup);
191+
premiumEditors.add(certcppEditor);
192+
193+
BooleanFieldEditor autosarEditor = new BooleanFieldEditor(IPreferenceConstants.P_PREMIUM_AUTOSAR,
194+
Messages.SettingsPreferencePage_PremiumAutosar, premiumGroup);
195+
addField(autosarEditor, premiumGroup);
196+
premiumEditors.add(autosarEditor);
197+
198+
setCompositeLayout(premiumGroup);
199+
}
200+
125201
@Override
126202
protected void createFieldEditors() {
127203

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

213+
@Override
214+
protected void valueChanged() {
215+
super.valueChanged();
216+
IPersistentPreferenceStore store = CppcheclipsePlugin.getConfigurationPreferenceStore();
217+
boolean isPremium = store.getBoolean(IPreferenceConstants.P_PREMIUM);
218+
enablePremiumChecks(isPremium && (getStringValue().isEmpty() || !getStringValue().endsWith(CPPCHECK_PROJ_STRING)));
219+
}
220+
137221
};
138222
projectFile.setChangeButtonText(Messages.SettingsPreferencePage_ProjectFileDialogButton);
139223
projectFile.setEmptyStringAllowed(true);
@@ -157,7 +241,8 @@ public void setEnabled(boolean enabled, Composite parent) {
157241
addField(numberOfThreads);
158242

159243
createCheckGroup();
160-
244+
createPremiumGroup();
245+
161246
final BooleanFieldEditor inconclusiveChecks = new BooleanFieldEditor(
162247
IPreferenceConstants.P_CHECK_INCONCLUSIVE,
163248
Messages.SettingsPreferencePage_Inconclusive,
@@ -252,5 +337,10 @@ private void refresh() {
252337
for (BooleanFieldEditor editor : checkEditors) {
253338
editor.setEnabled(!allCheck.getBooleanValue(), checkGroup);
254339
}
340+
341+
IPersistentPreferenceStore store = CppcheclipsePlugin.getConfigurationPreferenceStore();
342+
boolean isPremium = store.getBoolean(IPreferenceConstants.P_PREMIUM);
343+
enablePremiumChecks(isPremium && (projectFile.getStringValue().isEmpty()
344+
|| !projectFile.getStringValue().endsWith(CPPCHECK_PROJ_STRING)));
255345
}
256346
}

0 commit comments

Comments
 (0)