Search.java
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 }