From f895d0411b0f1805e5e36008012ea6b25c7d947f Mon Sep 17 00:00:00 2001 From: Alena Laskavaia Date: Mon, 2 May 2011 01:30:34 +0000 Subject: [PATCH] Bug 335901 - Suspicious semicolon is not reported in "else" clause --- .../codan/internal/checkers/CheckersMessages.java | 1 + .../internal/checkers/CheckersMessages.properties | 7 ++++--- .../checkers/SuspiciousSemicolonChecker.java | 12 +++++++++++- .../checkers/SuspiciousSemicolonCheckerTest.java | 13 +++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.java index 32397ef13ca..ee770a93c81 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.java @@ -27,6 +27,7 @@ public class CheckersMessages extends NLS { public static String GenericParameter_ParameterExceptionsItem; public static String StatementHasNoEffectChecker_ParameterMacro; public static String SuggestedParenthesisChecker_SuggestParanthesesAroundNot; + public static String SuspiciousSemicolonChecker_ParamAfterElse; public static String SuspiciousSemicolonChecker_ParamElse; public static String ProblemBindingChecker_Candidates; diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.properties b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.properties index 3296e70fa2c..2aefeb03335 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.properties +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/CheckersMessages.properties @@ -19,8 +19,9 @@ GenericParameter_ParameterExceptions=Exceptions (value of the problem argument) GenericParameter_ParameterExceptionsItem=Value of the argument StatementHasNoEffectChecker_ParameterMacro=Report problem in statements that comes from macro expansion 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: -UnusedSymbolInFileScopeChecker_CharacterSequence=Ident character sequence: -UnusedSymbolInFileScopeChecker_Exceptions=Exceptions (ident character sequence) +UnusedSymbolInFileScopeChecker_CharacterSequence=Identifier character sequence: +UnusedSymbolInFileScopeChecker_Exceptions=Exceptions (identifier character sequence) diff --git a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/SuspiciousSemicolonChecker.java b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/SuspiciousSemicolonChecker.java index ff8273fbbb9..dce5cee2077 100644 --- a/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/SuspiciousSemicolonChecker.java +++ b/codan/org.eclipse.cdt.codan.checkers/src/org/eclipse/cdt/codan/internal/checkers/SuspiciousSemicolonChecker.java @@ -25,6 +25,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; 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 PARAM_ELSE = "else"; //$NON-NLS-1$ + public static final String PARAM_ALFTER_ELSE = "afterelse"; //$NON-NLS-1$ public void processAst(IASTTranslationUnit ast) { ast.accept(new ASTVisitor() { @@ -37,11 +38,15 @@ public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker { if (statement instanceof IASTIfStatement) { IASTStatement thenStmt = ((IASTIfStatement) statement).getThenClause(); IASTStatement elseStmt = ((IASTIfStatement) statement).getElseClause(); + if (elseStmt instanceof IASTNullStatement && noMacroInvolved(elseStmt) && doReportAfterElse()) { + reportProblem(ER_ID, elseStmt); + } if (elseStmt != null && doNotReportIfElse() == true) return PROCESS_CONTINUE; if (thenStmt instanceof IASTNullStatement && noMacroInvolved(thenStmt)) { - reportProblem(ER_ID, thenStmt, (Object) null); + reportProblem(ER_ID, thenStmt); } + } return PROCESS_CONTINUE; } @@ -52,6 +57,10 @@ public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker { final IProblem pt = getProblemById(ER_ID, getFile()); 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) { IASTNodeSelector nodeSelector = node.getTranslationUnit().getNodeSelector(node.getTranslationUnit().getFilePath()); @@ -63,5 +72,6 @@ public class SuspiciousSemicolonChecker extends AbstractIndexAstChecker { public void initPreferences(IProblemWorkingCopy problem) { super.initPreferences(problem); addPreference(problem, PARAM_ELSE, CheckersMessages.SuspiciousSemicolonChecker_ParamElse, Boolean.FALSE); + addPreference(problem, PARAM_ALFTER_ELSE, CheckersMessages.SuspiciousSemicolonChecker_ParamAfterElse, Boolean.FALSE); } } diff --git a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/SuspiciousSemicolonCheckerTest.java b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/SuspiciousSemicolonCheckerTest.java index ee0b9bf82a9..2b4d1d39e94 100644 --- a/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/SuspiciousSemicolonCheckerTest.java +++ b/codan/org.eclipse.cdt.codan.core.test/src/org/eclipse/cdt/codan/core/internal/checkers/SuspiciousSemicolonCheckerTest.java @@ -11,6 +11,7 @@ package org.eclipse.cdt.codan.core.internal.checkers; import org.eclipse.cdt.codan.core.test.CheckerTestCase; +import org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonChecker; public class SuspiciousSemicolonCheckerTest extends CheckerTestCase { @Override @@ -150,4 +151,16 @@ public class SuspiciousSemicolonCheckerTest extends CheckerTestCase { loadCodeAndRun(getAboveComment()); 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); + } }