/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.symboltable; import net.sourceforge.pmd.ast.ASTName; import net.sourceforge.pmd.ast.ASTPrimaryExpression; import net.sourceforge.pmd.ast.ASTPrimaryPrefix; import net.sourceforge.pmd.ast.ASTPrimarySuffix; import net.sourceforge.pmd.ast.SimpleNode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; public class NameOccurrences { private List names = new ArrayList(); public NameOccurrences(ASTPrimaryExpression node) { buildOccurrences(node); } public List getNames() { return names; } public Iterator iterator() { return names.iterator(); } private void buildOccurrences(ASTPrimaryExpression node) { ASTPrimaryPrefix prefix = (ASTPrimaryPrefix) node.jjtGetChild(0); if (prefix.usesSuperModifier()) { add(new NameOccurrence(prefix, "super")); } else if (prefix.usesThisModifier()) { add(new NameOccurrence(prefix, "this")); } checkForNameChild(prefix); for (int i = 1; i < node.jjtGetNumChildren(); i++) { checkForNameChild((ASTPrimarySuffix) node.jjtGetChild(i)); } } private void checkForNameChild(SimpleNode node) { // TODO when is this null? if (node.getImage() != null) { add(new NameOccurrence(node, node.getImage())); } if (node.jjtGetNumChildren() > 0 && node.jjtGetChild(0) instanceof ASTName) { ASTName grandchild = (ASTName) node.jjtGetChild(0); for (StringTokenizer st = new StringTokenizer(grandchild.getImage(), "."); st.hasMoreTokens();) { add(new NameOccurrence(grandchild, st.nextToken())); } } if (node instanceof ASTPrimarySuffix && ((ASTPrimarySuffix) node).isArguments()) { ((NameOccurrence) names.get(names.size() - 1)).setIsMethodOrConstructorInvocation(); } } private void add(NameOccurrence name) { names.add(name); if (names.size() > 1) { NameOccurrence qualifiedName = (NameOccurrence) names.get(names.size() - 2); qualifiedName.setNameWhichThisQualifies(name); } } public String toString() { String result = ""; for (Iterator i = names.iterator(); i.hasNext();) { NameOccurrence occ = (NameOccurrence) i.next(); result += occ.getImage(); } return result; } }