View Javadoc
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