/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
/* Generated By:JJTree: Do not edit this line. ASTVariableDeclaratorId.java */
package net.sourceforge.pmd.lang.java.ast;
import java.util.List;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
import net.sourceforge.pmd.lang.symboltable.NameOccurrence;
public class ASTVariableDeclaratorId extends AbstractJavaTypeNode {
private int arrayDepth;
private VariableNameDeclaration nameDeclaration;
private boolean explicitReceiverParameter = false;
public ASTVariableDeclaratorId(int id) {
super(id);
}
public ASTVariableDeclaratorId(JavaParser p, int id) {
super(p, id);
}
/**
* Accept the visitor. *
*/
@Override
public Object jjtAccept(JavaParserVisitor visitor, Object data) {
return visitor.visit(this, data);
}
public VariableNameDeclaration getNameDeclaration() {
return nameDeclaration;
}
public void setNameDeclaration(VariableNameDeclaration decl) {
nameDeclaration = decl;
}
public List<NameOccurrence> getUsages() {
return getScope().getDeclarations(VariableNameDeclaration.class).get(nameDeclaration);
}
public void bumpArrayDepth() {
arrayDepth++;
}
public int getArrayDepth() {
return arrayDepth;
}
public boolean isArray() {
return arrayDepth > 0;
}
public boolean isExceptionBlockParameter() {
return jjtGetParent().jjtGetParent() instanceof ASTTryStatement;
}
public void setExplicitReceiverParameter() {
explicitReceiverParameter = true;
}
public boolean isExplicitReceiverParameter() {
return explicitReceiverParameter;
}
public Node getTypeNameNode() {
if (jjtGetParent() instanceof ASTFormalParameter) {
return findTypeNameNode(jjtGetParent());
} else if (jjtGetParent() instanceof ASTLambdaExpression) {
// lambda expression with lax types. The type is inferred...
return null;
} else if (jjtGetParent().jjtGetParent() instanceof ASTLocalVariableDeclaration
|| jjtGetParent().jjtGetParent() instanceof ASTFieldDeclaration) {
return findTypeNameNode(jjtGetParent().jjtGetParent());
}
return null;
}
/**
* Determines the type node of this variable id.
*
* @return the type node or <code>null</code> if there is no explicit type.
*/
public ASTType getTypeNode() {
if (jjtGetParent() instanceof ASTFormalParameter) {
return ((ASTFormalParameter) jjtGetParent()).getTypeNode();
} else if (jjtGetParent() instanceof ASTLambdaExpression) {
// lambda expression with lax types. The type is inferred...
return null;
} else {
Node n = jjtGetParent().jjtGetParent();
if (n instanceof ASTLocalVariableDeclaration || n instanceof ASTFieldDeclaration) {
return n.getFirstChildOfType(ASTType.class);
}
}
return null;
}
private Node findTypeNameNode(Node node) {
int i = 0;
while (node.jjtGetChild(i) instanceof ASTAnnotation) {
// skip annotations
i++;
}
ASTType typeNode = (ASTType) node.jjtGetChild(i);
return typeNode.jjtGetChild(0);
}
}