mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 321471 Return statement style patch from Marc-Andre Laperle
This commit is contained in:
parent
06d3ea27fc
commit
cefc281f9f
5 changed files with 197 additions and 1 deletions
|
@ -48,4 +48,8 @@ problem.name.NoReturn = No return
|
||||||
checker.name.AssignmentToItself = Assignment to itself
|
checker.name.AssignmentToItself = Assignment to itself
|
||||||
problem.messagePattern.AssignmentToItself = Assignment to itself ''{0}''
|
problem.messagePattern.AssignmentToItself = Assignment to itself ''{0}''
|
||||||
problem.name.AssignmentToItself = Assignment to itself
|
problem.name.AssignmentToItself = Assignment to itself
|
||||||
problem.description.AssignmentToItself = Finds expression where left and right side of the assignment is the same, i.e. 'var = var'
|
problem.description.AssignmentToItself = Finds expression where left and right side of the assignment is the same, i.e. 'var = var'
|
||||||
|
checker.name.ReturnStyle = Return with parenthesis
|
||||||
|
problem.name.ReturnStyle = Return with parenthesis
|
||||||
|
problem.messagePattern.ReturnStyle = Return statement has invalid style. Return value should be surrounded by parenthesis
|
||||||
|
problem.description.ReturnStyle = Checks for return statements that do no return the value in parenthesis. For example 'return 0;'
|
|
@ -278,5 +278,19 @@
|
||||||
name="%problem.name.AssignmentToItself">
|
name="%problem.name.AssignmentToItself">
|
||||||
</problem>
|
</problem>
|
||||||
</checker>
|
</checker>
|
||||||
|
<checker
|
||||||
|
class="org.eclipse.cdt.codan.internal.checkers.ReturnStyleChecker"
|
||||||
|
id="org.eclipse.cdt.codan.internal.checkers.ReturnStyle"
|
||||||
|
name="%checker.name.ReturnStyle">
|
||||||
|
<problem
|
||||||
|
category="org.eclipse.cdt.codan.core.categories.CodeStyle"
|
||||||
|
defaultEnabled="false"
|
||||||
|
defaultSeverity="Warning"
|
||||||
|
description="%problem.description.ReturnStyle"
|
||||||
|
id="org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem"
|
||||||
|
messagePattern="%problem.messagePattern.ReturnStyle"
|
||||||
|
name="%problem.name.ReturnStyle">
|
||||||
|
</problem>
|
||||||
|
</checker>
|
||||||
</extension>
|
</extension>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2010 Marc-Andre Laperle and others.
|
||||||
|
* 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:
|
||||||
|
* Marc-Andre Laperle - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.codan.internal.checkers;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.codan.core.cxx.model.AbstractIndexAstChecker;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTNode;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTStatement;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
|
||||||
|
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
||||||
|
|
||||||
|
public class ReturnStyleChecker extends AbstractIndexAstChecker {
|
||||||
|
public final String ERR_ID = "org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean runInEditor() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void processAst(IASTTranslationUnit ast) {
|
||||||
|
ast.accept(new ASTVisitor() {
|
||||||
|
{
|
||||||
|
shouldVisitStatements = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int visit(IASTStatement statement) {
|
||||||
|
if (statement instanceof IASTReturnStatement) {
|
||||||
|
|
||||||
|
boolean isValidStyle = false;
|
||||||
|
|
||||||
|
IASTNode[] children = statement.getChildren();
|
||||||
|
|
||||||
|
if (children.length == 0) {
|
||||||
|
isValidStyle = true;
|
||||||
|
} else if (children.length == 1
|
||||||
|
&& children[0] instanceof IASTUnaryExpression) {
|
||||||
|
IASTUnaryExpression unaryExpression = (IASTUnaryExpression) children[0];
|
||||||
|
if (unaryExpression.getOperator() == IASTUnaryExpression.op_bracketedPrimary) {
|
||||||
|
isValidStyle = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!isValidStyle) {
|
||||||
|
reportProblem(ERR_ID, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return PROCESS_CONTINUE;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,115 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2010 Marc-Andre Laperle and others.
|
||||||
|
* 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:
|
||||||
|
* Marc-Andre Laperle - Initial API and implementation
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.cdt.codan.core.internal.checkers;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.codan.core.test.CheckerTestCase;
|
||||||
|
|
||||||
|
public class ReturnStyleCheckerTest extends CheckerTestCase {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
super.setUp();
|
||||||
|
enableProblems("org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
// void foo() {
|
||||||
|
// return; // no error
|
||||||
|
// }
|
||||||
|
public void testSimpleReturn() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// void foo() {
|
||||||
|
// return
|
||||||
|
// ; // no error
|
||||||
|
// }
|
||||||
|
public void testSimpleReturnMultiLine() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// int foo() {
|
||||||
|
// return(0); // no error
|
||||||
|
// }
|
||||||
|
public void testSimpleReturnValue() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// int foo() {
|
||||||
|
// return 0; // error line 2
|
||||||
|
// }
|
||||||
|
public void testSimpleReturnValueError() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLine(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// int foo() {
|
||||||
|
// return // no error
|
||||||
|
// (
|
||||||
|
// 0
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
public void testReturnValueMultiline() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// int foo() {
|
||||||
|
// return // error line 2
|
||||||
|
// 0
|
||||||
|
// ;
|
||||||
|
// }
|
||||||
|
public void testReturnValueMultilineError() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLine(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// int foo() {
|
||||||
|
// return ((0));// no error
|
||||||
|
// }
|
||||||
|
public void testReturnValueMultipleBrackets() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// int foo() {
|
||||||
|
// return // no error
|
||||||
|
// (
|
||||||
|
// (0)
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
public void testReturnValueMultilineMultipleBrackets() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// #define MY_RETURN return(0);
|
||||||
|
//
|
||||||
|
// int foo() {
|
||||||
|
// MY_RETURN // no error
|
||||||
|
// }
|
||||||
|
public void testReturnDefine() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkNoErrors();
|
||||||
|
}
|
||||||
|
|
||||||
|
// #define MY_RETURN return 0;
|
||||||
|
//
|
||||||
|
// int foo() {
|
||||||
|
// MY_RETURN // error line 4
|
||||||
|
// }
|
||||||
|
public void testReturnDefineError() {
|
||||||
|
loadCodeAndRun(getAboveComment());
|
||||||
|
checkErrorLine(4);
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ import org.eclipse.cdt.codan.core.internal.checkers.AssignmentInConditionChecker
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.AssignmentToItselfCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.AssignmentToItselfCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.CatchByReferenceTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.CatchByReferenceTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.ReturnCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.ReturnCheckerTest;
|
||||||
|
import org.eclipse.cdt.codan.core.internal.checkers.ReturnStyleCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.StatementHasNoEffectCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.StatementHasNoEffectCheckerTest;
|
||||||
import org.eclipse.cdt.codan.core.internal.checkers.SuggestedParenthesisCheckerTest;
|
import org.eclipse.cdt.codan.core.internal.checkers.SuggestedParenthesisCheckerTest;
|
||||||
import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.SuggestedParenthesisQuickFixTest;
|
import org.eclipse.cdt.codan.internal.checkers.ui.quickfix.SuggestedParenthesisQuickFixTest;
|
||||||
|
@ -47,6 +48,7 @@ public class AutomatedIntegrationSuite extends TestSuite {
|
||||||
suite.addTestSuite(CatchByReferenceTest.class);
|
suite.addTestSuite(CatchByReferenceTest.class);
|
||||||
suite.addTestSuite(AssignmentInConditionCheckerTest.class);
|
suite.addTestSuite(AssignmentInConditionCheckerTest.class);
|
||||||
suite.addTestSuite(AssignmentToItselfCheckerTest.class);
|
suite.addTestSuite(AssignmentToItselfCheckerTest.class);
|
||||||
|
suite.addTestSuite(ReturnStyleCheckerTest.class);
|
||||||
// framework
|
// framework
|
||||||
suite.addTest(CodanFastTestSuite.suite());
|
suite.addTest(CodanFastTestSuite.suite());
|
||||||
// quick fixes
|
// quick fixes
|
||||||
|
|
Loading…
Add table
Reference in a new issue