1
2
3
4 package net.sourceforge.pmd.lang.java.symboltable;
5
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.List;
9 import java.util.Map;
10
11 import net.sourceforge.pmd.lang.ast.Node;
12 import net.sourceforge.pmd.lang.java.ast.ASTConstructorDeclaration;
13 import net.sourceforge.pmd.lang.java.ast.ASTName;
14
15 public class MethodScope extends AbstractScope {
16
17 protected Map<VariableNameDeclaration, List<NameOccurrence>> variableNames = new HashMap<VariableNameDeclaration, List<NameOccurrence>>();
18 private Node node;
19
20 public MethodScope(Node node) {
21 this.node = node;
22 }
23
24 public MethodScope getEnclosingMethodScope() {
25 return this;
26 }
27
28 public Map<VariableNameDeclaration, List<NameOccurrence>> getVariableDeclarations() {
29 VariableUsageFinderFunction f = new VariableUsageFinderFunction(variableNames);
30 Applier.apply(f, variableNames.keySet().iterator());
31 return f.getUsed();
32 }
33
34 public NameDeclaration addVariableNameOccurrence(NameOccurrence occurrence) {
35 NameDeclaration decl = findVariableHere(occurrence);
36 if (decl != null && !occurrence.isThisOrSuper()) {
37 variableNames.get(decl).add(occurrence);
38 Node n = occurrence.getLocation();
39 if (n instanceof ASTName) {
40 ((ASTName) n).setNameDeclaration(decl);
41 }
42 }
43 return decl;
44 }
45
46 public void addDeclaration(VariableNameDeclaration variableDecl) {
47 if (variableNames.containsKey(variableDecl)) {
48 throw new RuntimeException("Variable " + variableDecl + " is already in the symbol table");
49 }
50 variableNames.put(variableDecl, new ArrayList<NameOccurrence>());
51 }
52
53 public NameDeclaration findVariableHere(NameOccurrence occurrence) {
54 if (occurrence.isThisOrSuper() || occurrence.isMethodOrConstructorInvocation()) {
55 return null;
56 }
57 ImageFinderFunction finder = new ImageFinderFunction(occurrence.getImage());
58 Applier.apply(finder, variableNames.keySet().iterator());
59 return finder.getDecl();
60 }
61
62 public String getName() {
63 if (node instanceof ASTConstructorDeclaration) {
64 return this.getEnclosingClassScope().getClassName();
65 }
66 return node.jjtGetChild(1).getImage();
67 }
68
69 public String toString() {
70 return "MethodScope:" + glomNames(variableNames.keySet());
71 }
72 }