/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.lang.java.symboltable; import java.util.Set; import net.sourceforge.pmd.lang.symboltable.AbstractScope; import net.sourceforge.pmd.lang.symboltable.NameDeclaration; import net.sourceforge.pmd.lang.symboltable.NameOccurrence; /** * Provides the basic java scope implementation. * * @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3">JLS 6.3</a> */ public abstract class AbstractJavaScope extends AbstractScope { @Override public void addDeclaration(NameDeclaration declaration) { checkForDuplicatedNameDeclaration(declaration); super.addDeclaration(declaration); } protected void checkForDuplicatedNameDeclaration(NameDeclaration declaration) { if (declaration instanceof VariableNameDeclaration && getDeclarations().keySet().contains(declaration)) { throw new RuntimeException(declaration + " is already in the symbol table"); } } @Override public boolean contains(NameOccurrence occurrence) { return !findVariableHere((JavaNameOccurrence) occurrence).isEmpty(); } protected abstract Set<NameDeclaration> findVariableHere(JavaNameOccurrence occurrence); protected <T> String glomNames(Set<T> s) { StringBuilder result = new StringBuilder(); for (T t : s) { result.append(t.toString()); result.append(','); } return result.length() == 0 ? "" : result.toString().substring(0, result.length() - 1); } }