01 /**
02 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03 */
04 package net.sourceforge.pmd.lang.java.symboltable;
05
06 public class Search {
07 private static final boolean TRACE = false;
08
09 private NameOccurrence occ;
10 private NameDeclaration decl;
11
12 public Search(NameOccurrence occ) {
13 if (TRACE) {
14 System.out.println("new search for " + (occ.isMethodOrConstructorInvocation() ? "method" : "variable") + " " + occ);
15 }
16 this.occ = occ;
17 }
18
19 public void execute() {
20 decl = searchUpward(occ, occ.getLocation().getScope());
21 if (TRACE) {
22 System.out.println("found " + decl);
23 }
24 }
25
26 public void execute(Scope startingScope) {
27 decl = searchUpward(occ, startingScope);
28 if (TRACE) {
29 System.out.println("found " + decl);
30 }
31 }
32
33 public NameDeclaration getResult() {
34 return decl;
35 }
36
37 private NameDeclaration searchUpward(NameOccurrence nameOccurrence, Scope scope) {
38 if (TRACE) {
39 System.out.println("checking scope " + scope + " for name occurrence " + nameOccurrence);
40 }
41 if (!scope.contains(nameOccurrence) && scope.getParent() != null) {
42 if (TRACE) {
43 System.out.println("moving up fm " + scope + " to " + scope.getParent());
44 }
45 return searchUpward(nameOccurrence, scope.getParent());
46 }
47 if (scope.contains(nameOccurrence)) {
48 if (TRACE) {
49 System.out.println("found it!");
50 }
51 return scope.addVariableNameOccurrence(nameOccurrence);
52 }
53 return null;
54 }
55 }
|