mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-08 18:26:01 +02:00
Bug 335901 - Suspicious semicolon is not reported in "else" clause
This commit is contained in:
parent
55b32bcd97
commit
f895d0411b
4 changed files with 29 additions and 4 deletions
|
@ -27,6 +27,7 @@ public class CheckersMessages extends NLS {
|
||||||
public static String GenericParameter_ParameterExceptionsItem;
|
public static String GenericParameter_ParameterExceptionsItem;
|
||||||
public static String StatementHasNoEffectChecker_ParameterMacro;
|
public static String StatementHasNoEffectChecker_ParameterMacro;
|
||||||
public static String SuggestedParenthesisChecker_SuggestParanthesesAroundNot;
|
public static String SuggestedParenthesisChecker_SuggestParanthesesAroundNot;
|
||||||
|
public static String SuspiciousSemicolonChecker_ParamAfterElse;
|
||||||
public static String SuspiciousSemicolonChecker_ParamElse;
|
public static String SuspiciousSemicolonChecker_ParamElse;
|
||||||
public static String ProblemBindingChecker_Candidates;
|
public static String ProblemBindingChecker_Candidates;
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,9 @@ GenericParameter_ParameterExceptions=Exceptions (value of the problem argument)
|
||||||
GenericParameter_ParameterExceptionsItem=Value of the argument
|
GenericParameter_ParameterExceptionsItem=Value of the argument
|
||||||
StatementHasNoEffectChecker_ParameterMacro=Report problem in statements that comes from macro expansion
|
StatementHasNoEffectChecker_ParameterMacro=Report problem in statements that comes from macro expansion
|
||||||
SuggestedParenthesisChecker_SuggestParanthesesAroundNot=Suggest parenthesis around not operator
|
SuggestedParenthesisChecker_SuggestParanthesesAroundNot=Suggest parenthesis around not operator
|
||||||
SuspiciousSemicolonChecker_ParamElse=Do not report an error if 'else' exists
|
SuspiciousSemicolonChecker_ParamAfterElse=Report an error if semicolon is right after else statement
|
||||||
|
SuspiciousSemicolonChecker_ParamElse=Do not report an error after 'if' when 'else' exists
|
||||||
|
|
||||||
ProblemBindingChecker_Candidates=Candidates are:
|
ProblemBindingChecker_Candidates=Candidates are:
|
||||||
UnusedSymbolInFileScopeChecker_CharacterSequence=Ident character sequence:
|
UnusedSymbolInFileScopeChecker_CharacterSequence=Identifier character sequence:
|
||||||
UnusedSymbolInFileScopeChecker_Exceptions=Exceptions (ident character sequence)
|
UnusedSymbolInFileScopeChecker_Exceptions=Exceptions (identifier character sequence)
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker {
|
public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker {
|
||||||
public static final String ER_ID = "org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem"; //$NON-NLS-1$
|
public static final String ER_ID = "org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem"; //$NON-NLS-1$
|
||||||
public static final String PARAM_ELSE = "else"; //$NON-NLS-1$
|
public static final String PARAM_ELSE = "else"; //$NON-NLS-1$
|
||||||
|
public static final String PARAM_ALFTER_ELSE = "afterelse"; //$NON-NLS-1$
|
||||||
|
|
||||||
public void processAst(IASTTranslationUnit ast) {
|
public void processAst(IASTTranslationUnit ast) {
|
||||||
ast.accept(new ASTVisitor() {
|
ast.accept(new ASTVisitor() {
|
||||||
|
@ -37,11 +38,15 @@ public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker {
|
||||||
if (statement instanceof IASTIfStatement) {
|
if (statement instanceof IASTIfStatement) {
|
||||||
IASTStatement thenStmt = ((IASTIfStatement) statement).getThenClause();
|
IASTStatement thenStmt = ((IASTIfStatement) statement).getThenClause();
|
||||||
IASTStatement elseStmt = ((IASTIfStatement) statement).getElseClause();
|
IASTStatement elseStmt = ((IASTIfStatement) statement).getElseClause();
|
||||||
|
if (elseStmt instanceof IASTNullStatement && noMacroInvolved(elseStmt) && doReportAfterElse()) {
|
||||||
|
reportProblem(ER_ID, elseStmt);
|
||||||
|
}
|
||||||
if (elseStmt != null && doNotReportIfElse() == true)
|
if (elseStmt != null && doNotReportIfElse() == true)
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
if (thenStmt instanceof IASTNullStatement && noMacroInvolved(thenStmt)) {
|
if (thenStmt instanceof IASTNullStatement && noMacroInvolved(thenStmt)) {
|
||||||
reportProblem(ER_ID, thenStmt, (Object) null);
|
reportProblem(ER_ID, thenStmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return PROCESS_CONTINUE;
|
return PROCESS_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -52,6 +57,10 @@ public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker {
|
||||||
final IProblem pt = getProblemById(ER_ID, getFile());
|
final IProblem pt = getProblemById(ER_ID, getFile());
|
||||||
return (Boolean) getPreference(pt, PARAM_ELSE);
|
return (Boolean) getPreference(pt, PARAM_ELSE);
|
||||||
}
|
}
|
||||||
|
protected boolean doReportAfterElse() {
|
||||||
|
final IProblem pt = getProblemById(ER_ID, getFile());
|
||||||
|
return (Boolean) getPreference(pt, PARAM_ALFTER_ELSE);
|
||||||
|
}
|
||||||
|
|
||||||
protected boolean noMacroInvolved(IASTStatement node) {
|
protected boolean noMacroInvolved(IASTStatement node) {
|
||||||
IASTNodeSelector nodeSelector = node.getTranslationUnit().getNodeSelector(node.getTranslationUnit().getFilePath());
|
IASTNodeSelector nodeSelector = node.getTranslationUnit().getNodeSelector(node.getTranslationUnit().getFilePath());
|
||||||
|
@ -63,5 +72,6 @@ public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker {
|
||||||
public void initPreferences(IProblemWorkingCopy problem) {
|
public void initPreferences(IProblemWorkingCopy problem) {
|
||||||
super.initPreferences(problem);
|
super.initPreferences(problem);
|
||||||
addPreference(problem, PARAM_ELSE, CheckersMessages.SuspiciousSemicolonChecker_ParamElse, Boolean.FALSE);
|
addPreference(problem, PARAM_ELSE, CheckersMessages.SuspiciousSemicolonChecker_ParamElse, Boolean.FALSE);
|
||||||
|
addPreference(problem, PARAM_ALFTER_ELSE, CheckersMessages.SuspiciousSemicolonChecker_ParamAfterElse, Boolean.FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
package org.eclipse.cdt.codan.core.internal.checkers;
|
package org.eclipse.cdt.codan.core.internal.checkers;
|
||||||
|
|
||||||
import org.eclipse.cdt.codan.core.test.CheckerTestCase;
|
import org.eclipse.cdt.codan.core.test.CheckerTestCase;
|
||||||
|
import org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonChecker;
|
||||||
|
|
||||||
public class SuspiciousSemicolonCheckerTest extends CheckerTestCase {
|
public class SuspiciousSemicolonCheckerTest extends CheckerTestCase {
|
||||||
@Override
|
@Override
|
||||||
|
@ -150,4 +151,16 @@ public class SuspiciousSemicolonCheckerTest extends CheckerTestCase {
|
||||||
loadCodeAndRun(getAboveComment());
|
loadCodeAndRun(getAboveComment());
|
||||||
checkNoErrors();
|
checkNoErrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// main() {
|
||||||
|
// if (false)
|
||||||
|
// ; // only this one is reported
|
||||||
|
// else
|
||||||
|
// ;
|
||||||
|
// }
|
||||||
|
public void testIfElse() {
|
||||||
|
setPreferenceValue(SuspiciousSemicolonChecker.ER_ID, SuspiciousSemicolonChecker.PARAM_ALFTER_ELSE, Boolean.TRUE);
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLines(3, 5);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue