1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd.rules;
5
6 import net.sourceforge.pmd.AbstractRule;
7 import net.sourceforge.pmd.RuleContext;
8 import net.sourceforge.pmd.ast.ASTFieldDeclaration;
9 import net.sourceforge.pmd.ast.ASTInterfaceMemberDeclaration;
10 import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration;
11 import net.sourceforge.pmd.ast.ASTName;
12 import net.sourceforge.pmd.ast.ASTPrimitiveType;
13 import net.sourceforge.pmd.ast.ASTType;
14 import net.sourceforge.pmd.ast.ASTVariableDeclarator;
15 import net.sourceforge.pmd.ast.ASTVariableDeclaratorId;
16 import net.sourceforge.pmd.ast.AccessNode;
17 import net.sourceforge.pmd.ast.Node;
18
19 public class VariableNamingConventionsRule extends AbstractRule {
20
21 public Object visit(ASTLocalVariableDeclaration node, Object data) {
22 return checkNames(node, data);
23 }
24
25 public Object visit(ASTFieldDeclaration node, Object data) {
26 return checkNames(node, data);
27 }
28
29 public Object checkNames(AccessNode node, Object data) {
30 ASTType childNodeType = (ASTType)node.jjtGetChild(0);
31 String varType = "";
32 if (childNodeType.jjtGetChild(0)instanceof ASTName ) {
33 varType = ((ASTName)childNodeType.jjtGetChild(0)).getImage();
34 } else if (childNodeType.jjtGetChild(0) instanceof ASTPrimitiveType) {
35 varType = ((ASTPrimitiveType)childNodeType.jjtGetChild(0)).getImage();
36 }
37 if (varType != null && varType.length() > 0) {
38 //Get the variable name
39 ASTVariableDeclarator childNodeName = (ASTVariableDeclarator)node.jjtGetChild(1);
40 ASTVariableDeclaratorId childNodeId = (ASTVariableDeclaratorId)childNodeName.jjtGetChild(0);
41 String varName = childNodeId.getImage();
42
43 if (varName.equals("serialVersionUID")) {
44 return data;
45 }
46
47 // non static final class fields are OK
48 if (node.isFinal() && !node.isStatic() && !(node.jjtGetParent() instanceof ASTInterfaceMemberDeclaration)) {
49 return data;
50 }
51
52 // final, non static, class, fields are OK
53 if (node.isFinal() && !node.isStatic() && !(node.jjtGetParent() instanceof ASTInterfaceMemberDeclaration)) {
54 return data;
55 }
56
57 // static finals (and interface fields, which are implicitly static and final) are checked for uppercase
58 if ((node.isStatic() && node.isFinal()) || node.jjtGetParent() instanceof ASTInterfaceMemberDeclaration) {
59 if (!varName.equals(varName.toUpperCase())) {
60 RuleContext ctx = (RuleContext)data;
61 ctx.getReport().addRuleViolation(createRuleViolation(ctx, childNodeName.getBeginLine(), "Variables that are final and static should be in all caps."));
62 }
63 return data;
64 }
65
66 // if
67 if (varName.indexOf("_") >= 0) {
68 RuleContext ctx = (RuleContext)data;
69 ctx.getReport().addRuleViolation(createRuleViolation(ctx, childNodeName.getBeginLine(), "Variables that are not final should not contain underscores."));
70 }
71 if (Character.isUpperCase(varName.charAt(0))) {
72 RuleContext ctx = (RuleContext)data;
73 ctx.getReport().addRuleViolation(createRuleViolation(ctx, childNodeName.getBeginLine(), "Variables should start with a lowercase character"));
74 }
75 }
76 return data;
77 }
78 }
This page was automatically generated by Maven