diff --git a/conf/quality-config/cs-conf.xml b/conf/quality-config/cs-conf.xml index abc40250ae3ee2096bc33bd415fa6aaca24c182a..d20519281593302861590f2bf05b70888052a02e 100644 --- a/conf/quality-config/cs-conf.xml +++ b/conf/quality-config/cs-conf.xml @@ -1210,6 +1210,8 @@ <property name="allowEmptyConstructors" value="true"/> <property name="allowEmptyMethods" value="true"/> </module> + + <module name="qa.PluralForCollectionVariableCheck" /> </module> diff --git a/src/test/java/qa/PluralForCollectionVariableCheck.java b/src/test/java/qa/PluralForCollectionVariableCheck.java new file mode 100644 index 0000000000000000000000000000000000000000..91577379b6ce33a2e628b6770d7fa8f2b26ee458 --- /dev/null +++ b/src/test/java/qa/PluralForCollectionVariableCheck.java @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://teetime.sourceforge.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package qa; + +import java.util.HashSet; +import java.util.Set; + +import com.puppycrawl.tools.checkstyle.api.Check; +import com.puppycrawl.tools.checkstyle.api.DetailAST; +import com.puppycrawl.tools.checkstyle.api.TokenTypes; + +public class PluralForCollectionVariableCheck extends Check { + + private final Set<String> collectionNames = new HashSet<String>(); + + public PluralForCollectionVariableCheck() { + collectionNames.add("Collection"); + collectionNames.add("Set"); + collectionNames.add("List"); + } + + @Override + public int[] getDefaultTokens() { + return new int[] { TokenTypes.VARIABLE_DEF }; + } + + @Override + public void visitToken(final DetailAST ast) { + DetailAST typeAst = ast.findFirstToken(TokenTypes.TYPE); + DetailAST identifierAst = ast.findFirstToken(TokenTypes.IDENT); + + DetailAST actualTypeAst = typeAst.getFirstChild(); + DetailAST typeArgumentsAst = actualTypeAst.getNextSibling(); + String actualTypeName = actualTypeAst.getText(); + if (collectionNames.contains(actualTypeName)) { + String identifierName = identifierAst.getText(); + if (!identifierName.endsWith("s")) { + String message = "The variable '" + identifierName + "' should be named in plural since it represents a " + actualTypeName + " of " + + typeArgumentsAst.getText(); + log(ast.getLineNo(), message); + } + } + } + +} diff --git a/src/test/java/teetime/framework/AnalysisTest.java b/src/test/java/teetime/framework/AnalysisTest.java index 24c3341b7329025189deeb112337b624399f3ba1..61929e185cdd5ef58826e36f7f63f218b21a22ae 100644 --- a/src/test/java/teetime/framework/AnalysisTest.java +++ b/src/test/java/teetime/framework/AnalysisTest.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://teetime.sourceforge.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package teetime.framework; import static org.hamcrest.Matchers.greaterThanOrEqualTo; diff --git a/src/test/java/teetime/framework/TraversorTest.java b/src/test/java/teetime/framework/TraversorTest.java index 209fb6c81a5a0e0e383345ccee82ae9510a193bc..8427febdef0106495214796a2e2a3edfbc4352cf 100644 --- a/src/test/java/teetime/framework/TraversorTest.java +++ b/src/test/java/teetime/framework/TraversorTest.java @@ -1,3 +1,18 @@ +/** + * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://teetime.sourceforge.net) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package teetime.framework; import static org.junit.Assert.assertTrue;