mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-23 14:42:11 +02:00
Bug 350144 - suppressing the "No break" problem with regexp
added regex support for suppression comment Change-Id: I590d171fcce23d547a489e42a791aa484963d4a6 Signed-off-by: Alena Laskavaia <elaskavaia.cdt@gmail.com>
This commit is contained in:
parent
89ec7fe8b8
commit
ce18aad766
3 changed files with 58 additions and 3 deletions
|
@ -12,6 +12,10 @@
|
|||
*******************************************************************************/
|
||||
package org.eclipse.cdt.codan.internal.checkers;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.regex.PatternSyntaxException;
|
||||
|
||||
import org.eclipse.cdt.codan.checkers.CodanCheckersActivator;
|
||||
import org.eclipse.cdt.codan.core.cxx.CxxAstUtils;
|
||||
import org.eclipse.cdt.codan.core.cxx.model.AbstractIndexAstChecker;
|
||||
import org.eclipse.cdt.codan.core.model.ICheckerWithPreferences;
|
||||
|
@ -50,9 +54,11 @@ public class CaseBreakChecker extends AbstractIndexAstChecker implements IChecke
|
|||
private boolean fCheckLastCase; // Should we check the last case in the switch?
|
||||
private boolean fCheckEmptyCase; // Should we check an empty case (a case without any statements within it)
|
||||
private String fNoBreakComment; // The comment suppressing this warning
|
||||
private Pattern fNoBreakRegex;
|
||||
|
||||
/**
|
||||
* This visitor looks for "switch" statements and invokes "SwitchVisitor" on them.
|
||||
* This visitor looks for "switch" statements and invokes "SwitchVisitor" on
|
||||
* them.
|
||||
*/
|
||||
class SwitchFindingVisitor extends ASTVisitor {
|
||||
SwitchFindingVisitor() {
|
||||
|
@ -129,9 +135,14 @@ public class CaseBreakChecker extends AbstractIndexAstChecker implements IChecke
|
|||
comment = getFreestandingComment(body);
|
||||
}
|
||||
if (comment != null) {
|
||||
// for backward compatibility leave original rule of checking string as non-regex
|
||||
String str = getTrimmedComment(comment);
|
||||
if (str.toLowerCase().contains(fNoBreakComment.toLowerCase()))
|
||||
continue;
|
||||
|
||||
if (fNoBreakRegex != null && fNoBreakRegex.matcher(str).find()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
reportProblem(curr);
|
||||
}
|
||||
|
@ -261,7 +272,8 @@ public class CaseBreakChecker extends AbstractIndexAstChecker implements IChecke
|
|||
DEFAULT_NO_BREAK_COMMENT);
|
||||
addPreference(problem, PARAM_LAST_CASE, CheckersMessages.CaseBreakChecker_LastCaseDescription, Boolean.FALSE);
|
||||
addPreference(problem, PARAM_EMPTY_CASE, CheckersMessages.CaseBreakChecker_EmptyCaseDescription, Boolean.FALSE);
|
||||
addPreference(problem, PARAM_ENABLE_FALLTHROUGH_QUICKFIX, CheckersMessages.CaseBreakChecker_EnableFallthroughQuickfixDescription, Boolean.FALSE);
|
||||
addPreference(problem, PARAM_ENABLE_FALLTHROUGH_QUICKFIX, CheckersMessages.CaseBreakChecker_EnableFallthroughQuickfixDescription,
|
||||
Boolean.FALSE);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -269,6 +281,13 @@ public class CaseBreakChecker extends AbstractIndexAstChecker implements IChecke
|
|||
fCheckLastCase = (Boolean) getPreference(getProblemById(ER_ID, getFile()), PARAM_LAST_CASE);
|
||||
fCheckEmptyCase = (Boolean) getPreference(getProblemById(ER_ID, getFile()), PARAM_EMPTY_CASE);
|
||||
fNoBreakComment = (String) getPreference(getProblemById(ER_ID, getFile()), PARAM_NO_BREAK_COMMENT);
|
||||
try {
|
||||
if (fNoBreakComment != null)
|
||||
fNoBreakRegex = Pattern.compile(fNoBreakComment, Pattern.CASE_INSENSITIVE);
|
||||
} catch (PatternSyntaxException e) {
|
||||
CodanCheckersActivator.log(e);
|
||||
fNoBreakRegex = null;
|
||||
}
|
||||
SwitchFindingVisitor visitor = new SwitchFindingVisitor();
|
||||
ast.accept(visitor);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
# Contributors:
|
||||
# Alena Laskavaia - initial API and implementation
|
||||
###############################################################################
|
||||
CaseBreakChecker_DefaultNoBreakCommentDescription=Comment text to suppress the problem:
|
||||
CaseBreakChecker_DefaultNoBreakCommentDescription=Comment text to suppress the problem (or regular expression):
|
||||
CaseBreakChecker_EmptyCaseDescription=Check also empty 'case' statement (except if last)
|
||||
CaseBreakChecker_LastCaseDescription=Check also the last 'case' statement
|
||||
CaseBreakChecker_EnableFallthroughQuickfixDescription=Enable quick fix to add fallthrough attribute (C++17)
|
||||
|
|
|
@ -627,6 +627,11 @@ public class CaseBreakCheckerTest extends CheckerTestCase {
|
|||
pref.setValue(val);
|
||||
}
|
||||
|
||||
private void setComment(String str) {
|
||||
IProblemPreference pref = getPreference(CaseBreakChecker.ER_ID, CaseBreakChecker.PARAM_NO_BREAK_COMMENT);
|
||||
pref.setValue(str);
|
||||
}
|
||||
|
||||
// void foo(int a) {
|
||||
// switch (a) {
|
||||
// case 1:
|
||||
|
@ -765,4 +770,35 @@ public class CaseBreakCheckerTest extends CheckerTestCase {
|
|||
loadCodeAndRun(code);
|
||||
checkNoErrorsOfKind(ER_ID);
|
||||
}
|
||||
|
||||
// void foo(void) {
|
||||
// int a, b;
|
||||
// switch (a) {
|
||||
// case 1:
|
||||
// b = 2;
|
||||
// // lolo
|
||||
// /* fallthru */
|
||||
// case 2:
|
||||
// b = 2;
|
||||
// /* falls thru */
|
||||
// // lolo
|
||||
// case 3:
|
||||
// /* no break */
|
||||
// b = 2;
|
||||
// // loo
|
||||
// case 4:
|
||||
// b = 2;
|
||||
// // lolo
|
||||
// /* fallthrough */
|
||||
// case 5:
|
||||
// // lolo
|
||||
// b = 2;
|
||||
// /* fall-thru */
|
||||
// }
|
||||
// }
|
||||
public void testCommentsParam() throws Exception {
|
||||
setComment("fall(s)?[ \\t-]*thr(ough|u)");
|
||||
loadCodeAndRun(getAboveComment());
|
||||
checkErrorLines(9, 14);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue