1
2
3
4 package net.sourceforge.pmd.lang.java.symboltable;
5
6 import java.util.List;
7 import java.util.Map;
8
9 import net.sourceforge.pmd.lang.ast.Node;
10 import net.sourceforge.pmd.lang.java.ast.ASTName;
11 import net.sourceforge.pmd.lang.symboltable.NameDeclaration;
12 import net.sourceforge.pmd.lang.symboltable.NameOccurrence;
13
14
15
16
17 public class LocalScope extends AbstractJavaScope {
18
19 public Map<VariableNameDeclaration, List<NameOccurrence>> getVariableDeclarations() {
20 return getDeclarations(VariableNameDeclaration.class);
21 }
22
23 public NameDeclaration addNameOccurrence(NameOccurrence occurrence) {
24 JavaNameOccurrence javaOccurrence = (JavaNameOccurrence) occurrence;
25 NameDeclaration decl = findVariableHere(javaOccurrence);
26 if (decl != null && !javaOccurrence.isThisOrSuper()) {
27 List<NameOccurrence> nameOccurrences = getVariableDeclarations().get(decl);
28 nameOccurrences.add(javaOccurrence);
29 Node n = javaOccurrence.getLocation();
30 if (n instanceof ASTName) {
31 ((ASTName) n).setNameDeclaration(decl);
32 }
33 }
34 return decl;
35 }
36
37 public void addDeclaration(NameDeclaration nameDecl) {
38 if (!(nameDecl instanceof VariableNameDeclaration || nameDecl instanceof ClassNameDeclaration)) {
39 throw new IllegalArgumentException(
40 "A LocalScope can contain only VariableNameDeclarations or ClassNameDeclarations. "
41 + "Tried to add " + nameDecl.getClass() + "(" + nameDecl + ")");
42 }
43 super.addDeclaration(nameDecl);
44 }
45
46 public NameDeclaration findVariableHere(JavaNameOccurrence occurrence) {
47 if (occurrence.isThisOrSuper() || occurrence.isMethodOrConstructorInvocation()) {
48 return null;
49 }
50 ImageFinderFunction finder = new ImageFinderFunction(occurrence.getImage());
51 Applier.apply(finder, getVariableDeclarations().keySet().iterator());
52 return finder.getDecl();
53 }
54
55 public String toString() {
56 return "LocalScope:" + glomNames(getVariableDeclarations().keySet());
57 }
58 }