diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractAstFunctionChecker.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractAstFunctionChecker.java index fbc9c550fe7..5dc141cd78a 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractAstFunctionChecker.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/model/AbstractAstFunctionChecker.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.cxx.model; +import org.eclipse.cdt.codan.core.model.ICheckerWithParameters; +import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; @@ -22,7 +24,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; * Abstract class for checkers that do all the work on function definition level */ public abstract class AbstractAstFunctionChecker extends - AbstractIndexAstChecker { + AbstractIndexAstChecker implements ICheckerWithParameters{ public void processAst(IASTTranslationUnit ast) { // traverse the ast using the visitor pattern. ast.accept(new ASTVisitor() { @@ -55,4 +57,8 @@ public abstract class AbstractAstFunctionChecker extends * - ast node representing function definition */ protected abstract void processFunction(IASTFunctionDefinition func); + + public void initParameters(IProblemWorkingCopy problem) { + // do nothing + } } diff --git a/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF index 72c1b965319..dd79c040d02 100644 --- a/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF +++ b/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF @@ -12,6 +12,7 @@ Bundle-RequiredExecutionEnvironment: J2SE-1.5 Export-Package: org.eclipse.cdt.codan.core, org.eclipse.cdt.codan.core.model, org.eclipse.cdt.codan.core.model.cfg;x-friends:="org.eclipse.cdt.codan.core.cxx,org.eclipse.cdt.codan.checkers", + org.eclipse.cdt.codan.core.param;x-friends:="org.eclipse.cdt.codan.checkers,org.eclipse.cdt.codan.checkers.ui,org.eclipse.cdt.codan.ui", org.eclipse.cdt.codan.internal.core; x-friends:="org.eclipse.cdt.codan.core, org.eclipse.cdt.codan.core.cxx, diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java index 62d3a3e840d..5e04b40994f 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblem.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo; + /** * Interface representing code analysis problem type. For example * "Null Pointer Dereference" is a problem. It has user visible Name and Message diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java index 741e7b11e8b..81fd5d78dde 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemWorkingCopy.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.cdt.codan.core.model; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo; + /** * Modifiable problem. * diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemParameterInfo.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemParameterInfo.java similarity index 94% rename from codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemParameterInfo.java rename to codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemParameterInfo.java index 3f5e7b72b1d..1866fc32833 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractProblemParameterInfo.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/AbstractProblemParameterInfo.java @@ -8,7 +8,7 @@ * Contributors: * Alena Laskavaia - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.codan.core.model; +package org.eclipse.cdt.codan.core.param; import java.util.Iterator; @@ -34,8 +34,8 @@ public abstract class AbstractProblemParameterInfo implements * * @see org.eclipse.cdt.codan.core.model.IProblemParameterInfo#getType() */ - public ParameterTypes getType() { - return ParameterTypes.TYPE_STRING; + public ParameterType getType() { + return ParameterType.TYPE_STRING; } /* diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/HashParameterInfo.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/HashParameterInfo.java new file mode 100644 index 00000000000..87ba7593b5b --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/HashParameterInfo.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * Copyright (c) 2009 Alena Laskavaia + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +import java.util.HashMap; +import java.util.Iterator; + +/** + * HashParamterInfo - for checker that needs more than one parameter and they + * all different "named". + * For example checker has 2 optional boolean parameters. For example checker + * for parameter names + * shadowing would have two boolean options: "check contructors" and + * "check setters". In this case you use this type. + * + */ +public class HashParameterInfo extends SingleParameterInfo { + protected HashMap hash = new HashMap(); + + public HashParameterInfo() { + super(""); //$NON-NLS-1$ + } + + /** + * @param label + * - label for this group of parameters + */ + public HashParameterInfo(String label) { + super(label); + } + + /** + * @param key + * - key for itself + * @param label + * - label for this group of parameters + */ + public HashParameterInfo(String key, String label) { + super(key, label); + } + + @Override + public ParameterType getType() { + return ParameterType.TYPE_HASH; + } + + @Override + public void setType(ParameterType type) { + throw new UnsupportedOperationException(); + } + + /** + * Get parameter into for element by key + * + */ + @Override + public IProblemParameterInfo getElement(String key) { + return hash.get(key); + } + + /** + * Set parameter info for element with the key equals to info.getKey() + * + * @param i + * @param info + */ + public void setElement(IProblemParameterInfo info) { + hash.put(info.getKey(), info); + } + + @Override + public Iterator getIterator() { + return hash.values().iterator(); + } +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemParameterInfo.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemParameterInfo.java similarity index 87% rename from codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemParameterInfo.java rename to codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemParameterInfo.java index 2d01d791b43..42258710f37 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/IProblemParameterInfo.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/IProblemParameterInfo.java @@ -8,7 +8,7 @@ * Contributors: * Alena Laskavaia - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.codan.core.model; +package org.eclipse.cdt.codan.core.param; import java.util.Iterator; @@ -19,13 +19,15 @@ import java.util.Iterator; * ProblemParameterInfo represent parameter meta-info for the ui. If more that * one parameter required ParameterInfo should describe hash or array of * parameters. This is only needed for auto-generated ui for parameter editing. - * For complex case custom ui control should be used + * For complex case custom ui control should be used. Extend + * AbstractProblemParamterInfo class + * to implement this interface. * * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. */ public interface IProblemParameterInfo { - enum ParameterTypes { + public enum ParameterType { TYPE_STRING("string"), //$NON-NLS-1$ TYPE_INTEGER("integer"), //$NON-NLS-1$ TYPE_BOOLEAN("boolean"), //$NON-NLS-1$ @@ -34,14 +36,14 @@ public interface IProblemParameterInfo { TYPE_HASH("hash"); //$NON-NLS-1$ private String literal; - private ParameterTypes(String literal) { + private ParameterType(String literal) { this.literal = literal; } - public static ParameterTypes valueOfLiteral(String name) { - ParameterTypes[] values = values(); + public static ParameterType valueOfLiteral(String name) { + ParameterType[] values = values(); for (int i = 0; i < values.length; i++) { - ParameterTypes e = values[i]; + ParameterType e = values[i]; if (e.literal.equals(name)) return e; } @@ -64,7 +66,7 @@ public interface IProblemParameterInfo { * * @return string value of the type */ - ParameterTypes getType(); + ParameterType getType(); /** * Additional info on how it is represented in the ui, for example boolean @@ -84,7 +86,7 @@ public interface IProblemParameterInfo { /** * Detailed explanation of parameter * - * @return the tooltip text + * @return the toolTip text */ String getToolTip(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractListParameterInfo.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListParameterInfo.java similarity index 77% rename from codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractListParameterInfo.java rename to codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListParameterInfo.java index 73eab896a08..90a298bc6fc 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/AbstractListParameterInfo.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/ListParameterInfo.java @@ -8,7 +8,7 @@ * Contributors: * Alena Laskavaia - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.codan.core.model; +package org.eclipse.cdt.codan.core.param; import java.util.ArrayList; import java.util.Iterator; @@ -17,20 +17,26 @@ import java.util.Iterator; * @author Alena * */ -public abstract class AbstractListParameterInfo extends - AbstractProblemParameterInfo { +public class ListParameterInfo extends SingleParameterInfo { protected ArrayList list = new ArrayList( 1); - /* - * (non-Javadoc) - * - * @see - * org.eclipse.cdt.codan.core.model.AbstractProblemParameterInfo#getType() + /** + * @param key + * @param label */ + public ListParameterInfo(String key, String label) { + super(key, label); + } + @Override - public ParameterTypes getType() { - return ParameterTypes.TYPE_LIST; + public ParameterType getType() { + return ParameterType.TYPE_LIST; + } + + @Override + public void setType(ParameterType type) { + throw new UnsupportedOperationException(); } /** @@ -63,14 +69,14 @@ public abstract class AbstractListParameterInfo extends * @param i * @param info */ - protected void setElement(int i, IProblemParameterInfo info) { + public void setElement(int i, IProblemParameterInfo info) { while (i >= list.size()) { list.add(null); } list.set(i, info); } - protected IProblemParameterInfo getElement(int i) { + public IProblemParameterInfo getElement(int i) { return list.get(i); } diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/SingleParameterInfo.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/SingleParameterInfo.java new file mode 100644 index 00000000000..d2c1047e4b8 --- /dev/null +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/param/SingleParameterInfo.java @@ -0,0 +1,114 @@ +/******************************************************************************* + * Copyright (c) 2009 Alena Laskavaia + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Alena Laskavaia - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.codan.core.param; + +/** + * ParameterInfo representing a single checker parameter + * + */ +public class SingleParameterInfo extends AbstractProblemParameterInfo { + protected String key = PARAM; + protected String label; + protected String toolTip = null; + protected ParameterType type = ParameterType.TYPE_STRING; + protected String uiInfo; + + /** + * Generate an info with given key and label + * + * @param key + * - property id (use in actual property hash of a checker) + * @param label + * - label to be shown to user + * @param type + * - parameter type + * @return + */ + public SingleParameterInfo(String key, String label, ParameterType type) { + if (key == null) + throw new NullPointerException("key"); //$NON-NLS-1$ + if (type == null) + throw new NullPointerException("type"); //$NON-NLS-1$ + setKey(key); + setLabel(label); + setType(type); + } + + /** + * Generate an info with given key and label + * + * @param key + * - property id (use in actual property hash of a checker) + * @param label + * - label to be shown to user + * @return + */ + public SingleParameterInfo(String key, String label) { + setKey(key); + setLabel(label); + } + + /** + * Generate an info with given label, default key PARAM would be as a key + * + * @param label + * - label to be shown to user + * @return + */ + public SingleParameterInfo(String label) { + setLabel(label); + } + + @Override + public ParameterType getType() { + return type; + } + + @Override + public String getLabel() { + return label; + } + + @Override + public String getToolTip() { + return toolTip; + } + + @Override + public String getKey() { + return key; + } + + @Override + public String getUiInfo() { + return uiInfo; + } + + public void setKey(String key) { + this.key = key; + } + + public void setLabel(String label) { + this.label = label; + } + + public void setToolTip(String tooltip) { + this.toolTip = tooltip; + } + + public void setType(ParameterType type) { + this.type = type; + } + + public void setUiInfo(String uiinfo) { + this.uiInfo = uiinfo; + } +} diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblem.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblem.java index b6365758646..2a0ea72213c 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblem.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/model/CodanProblem.java @@ -13,9 +13,9 @@ package org.eclipse.cdt.codan.internal.core.model; import java.util.HashMap; import org.eclipse.cdt.codan.core.model.CodanSeverity; -import org.eclipse.cdt.codan.core.model.IProblemParameterInfo; import org.eclipse.cdt.codan.core.model.IProblemReporter; import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo; public class CodanProblem implements IProblemWorkingCopy { private String id; diff --git a/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/NamingConventionFunctionIIndexChecker.java b/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/NamingConventionFunctionIIndexChecker.java index d23a587914a..2daaf0d0a3f 100644 --- a/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/NamingConventionFunctionIIndexChecker.java +++ b/codan/org.eclipse.cdt.codan.examples/src/org/eclipse/cdt/codan/examples/checkers/NamingConventionFunctionIIndexChecker.java @@ -12,11 +12,11 @@ package org.eclipse.cdt.codan.examples.checkers; import java.util.regex.Pattern; import org.eclipse.cdt.codan.core.cxx.model.AbstractCIndexChecker; -import org.eclipse.cdt.codan.core.model.AbstractProblemParameterInfo; import org.eclipse.cdt.codan.core.model.ICheckerWithParameters; import org.eclipse.cdt.codan.core.model.IProblem; -import org.eclipse.cdt.codan.core.model.IProblemParameterInfo; import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy; +import org.eclipse.cdt.codan.core.param.AbstractProblemParameterInfo; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElementVisitor; import org.eclipse.cdt.core.model.ITranslationUnit; diff --git a/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/dialogs/ParametersComposite.java b/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/dialogs/ParametersComposite.java index 4fdf10341fb..c17fac51c2d 100644 --- a/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/dialogs/ParametersComposite.java +++ b/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/dialogs/ParametersComposite.java @@ -10,10 +10,14 @@ *******************************************************************************/ package org.eclipse.cdt.codan.internal.ui.dialogs; +import java.util.Iterator; + import org.eclipse.cdt.codan.core.model.IProblem; -import org.eclipse.cdt.codan.core.model.IProblemParameterInfo; import org.eclipse.cdt.codan.core.model.IProblemWorkingCopy; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo.ParameterType; import org.eclipse.cdt.codan.internal.ui.CodanUIMessages; +import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.PreferenceStore; import org.eclipse.jface.preference.StringFieldEditor; @@ -61,14 +65,32 @@ public class ParametersComposite extends Composite { if (info == null) return; switch (info.getType()) { - case TYPE_STRING: - StringFieldEditor fe = new StringFieldEditor(info.getKey(), - info.getLabel(), getFieldEditorParent()); - addField(fe); - break; - default: - throw new UnsupportedOperationException(info.getType() - .toString()); + case TYPE_STRING: { + StringFieldEditor fe = new StringFieldEditor( + info.getKey(), info.getLabel(), + getFieldEditorParent()); + addField(fe); + break; + } + case TYPE_BOOLEAN: { + BooleanFieldEditor fe = new BooleanFieldEditor( + info.getKey(), info.getLabel(), + getFieldEditorParent()); + addField(fe); + break; + } + case TYPE_HASH: { + Iterator iterator = info + .getIterator(); + while (iterator.hasNext()) { + IProblemParameterInfo info1 = iterator.next(); + createFieldEditorsForParameters(info1); + } + break; + } + default: + throw new UnsupportedOperationException(info.getType() + .toString()); } } }; @@ -99,9 +121,18 @@ public class ParametersComposite extends Composite { return; String key = info.getKey(); Object parameter = problem.getParameter(key); - if (parameter instanceof String) { + if (info.getType() == ParameterType.TYPE_HASH && parameter == null) { + Iterator iterator = info.getIterator(); + while (iterator.hasNext()) { + IProblemParameterInfo info1 = iterator.next(); + savePrefStore(info1, problemwc); + } + } else if (parameter instanceof String) { String newValue = pref.getString(key); problemwc.setParameter(key, newValue); + } else if (parameter instanceof Boolean) { + boolean newValue = pref.getBoolean(key); + problemwc.setParameter(key, newValue); } else throw new UnsupportedOperationException(info.getType().toString()); } @@ -114,9 +145,18 @@ public class ParametersComposite extends Composite { return; String key = info.getKey(); Object parameter = problem.getParameter(key); - if (parameter instanceof String) { + if (info.getType() == ParameterType.TYPE_HASH && parameter == null) { + Iterator iterator = info.getIterator(); + while (iterator.hasNext()) { + IProblemParameterInfo info1 = iterator.next(); + initPrefStore(info1); + } + } else if (parameter instanceof String) { pref.setDefault(key, (String) parameter); pref.setValue(key, (String) parameter); + } else if (parameter instanceof Boolean) { + pref.setDefault(key, (Boolean) parameter); + pref.setValue(key, (Boolean) parameter); } else throw new UnsupportedOperationException(info.getType().toString()); } diff --git a/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/CodanPreferencePage.java b/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/CodanPreferencePage.java index 5cfe2930748..2820176fde9 100644 --- a/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/CodanPreferencePage.java +++ b/codan/org.eclipse.cdt.codan.ui/src/org/eclipse/cdt/codan/internal/ui/preferences/CodanPreferencePage.java @@ -16,8 +16,8 @@ import org.eclipse.cdt.codan.core.CodanCorePlugin; import org.eclipse.cdt.codan.core.CodanRuntime; import org.eclipse.cdt.codan.core.model.ICheckersRegistry; import org.eclipse.cdt.codan.core.model.IProblem; -import org.eclipse.cdt.codan.core.model.IProblemParameterInfo; import org.eclipse.cdt.codan.core.model.IProblemProfile; +import org.eclipse.cdt.codan.core.param.IProblemParameterInfo; import org.eclipse.cdt.codan.internal.ui.CodanUIActivator; import org.eclipse.cdt.codan.internal.ui.CodanUIMessages; import org.eclipse.cdt.codan.internal.ui.dialogs.CustomizeProblemDialog;