/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.symboltable; import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter; import net.sourceforge.pmd.lang.java.ast.ASTLambdaExpression; import net.sourceforge.pmd.lang.java.ast.ASTPrimitiveType; import net.sourceforge.pmd.lang.java.ast.ASTReferenceType; import net.sourceforge.pmd.lang.java.ast.ASTType; import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId; import net.sourceforge.pmd.lang.java.ast.AccessNode; import net.sourceforge.pmd.lang.java.ast.Dimensionable; import net.sourceforge.pmd.lang.java.ast.TypeNode; import net.sourceforge.pmd.lang.symboltable.AbstractNameDeclaration; import net.sourceforge.pmd.lang.symboltable.Scope; public class VariableNameDeclaration extends AbstractNameDeclaration implements TypedNameDeclaration { public VariableNameDeclaration(ASTVariableDeclaratorId node) { super(node); } @Override public Scope getScope() { return node.getScope().getEnclosingScope(ClassScope.class); } public boolean isArray() { ASTVariableDeclaratorId astVariableDeclaratorId = (ASTVariableDeclaratorId) node; ASTType typeNode = astVariableDeclaratorId.getTypeNode(); if (typeNode != null) { return ((Dimensionable) typeNode.jjtGetParent()).isArray(); } else { return false; } } public boolean isVarargs() { ASTVariableDeclaratorId astVariableDeclaratorId = (ASTVariableDeclaratorId) node; ASTFormalParameter parameter = astVariableDeclaratorId.getFirstParentOfType(ASTFormalParameter.class); return parameter != null && parameter.isVarargs(); } public boolean isExceptionBlockParameter() { return ((ASTVariableDeclaratorId) node).isExceptionBlockParameter(); } public boolean isLambdaTypelessParameter() { return getAccessNodeParent() instanceof ASTLambdaExpression; } public boolean isPrimitiveType() { return !isLambdaTypelessParameter() && getAccessNodeParent().getFirstChildOfType(ASTType.class).jjtGetChild(0) instanceof ASTPrimitiveType; } public String getTypeImage() { TypeNode typeNode = getTypeNode(); if (typeNode != null) { return typeNode.getImage(); } return null; } /** * Note that an array of primitive types (int[]) is a reference type. */ public boolean isReferenceType() { return !isLambdaTypelessParameter() && getAccessNodeParent().getFirstChildOfType(ASTType.class).jjtGetChild(0) instanceof ASTReferenceType; } public AccessNode getAccessNodeParent() { if (node.jjtGetParent() instanceof ASTFormalParameter || node.jjtGetParent() instanceof ASTLambdaExpression) { return (AccessNode) node.jjtGetParent(); } return (AccessNode) node.jjtGetParent().jjtGetParent(); } public ASTVariableDeclaratorId getDeclaratorId() { return (ASTVariableDeclaratorId) node; } private TypeNode getTypeNode() { if (isPrimitiveType()) { return (TypeNode) getAccessNodeParent().getFirstChildOfType(ASTType.class).jjtGetChild(0); } if (!isLambdaTypelessParameter()) { return (TypeNode) getAccessNodeParent().getFirstChildOfType(ASTType.class).jjtGetChild(0).jjtGetChild(0); } return null; } public Class<?> getType() { TypeNode typeNode = getTypeNode(); if (typeNode != null) { return typeNode.getType(); } return null; } @Override public boolean equals(Object o) { if (!(o instanceof VariableNameDeclaration)) { return false; } VariableNameDeclaration n = (VariableNameDeclaration) o; return n.node.getImage().equals(node.getImage()); } @Override public int hashCode() { return node.getImage().hashCode(); } @Override public String toString() { return "Variable: image = '" + node.getImage() + "', line = " + node.getBeginLine(); } }