View Javadoc

    1   /***
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.symboltable;
    5
    6   public class Search {
    7       private static final boolean TRACE = false;
    8
    9       private NameOccurrence occ;
    10      private NameDeclaration decl;
    11
    12      public Search(NameOccurrence occ) {
    13          if (TRACE) System.out.println("new search for " + (occ.isMethodOrConstructorInvocation() ? "method" : "variable") + " " + occ);
    14          this.occ = occ;
    15      }
    16
    17      public void execute() {
    18          decl = searchUpward(occ, occ.getLocation().getScope());
    19          if (TRACE) System.out.println("found " + decl);
    20      }
    21
    22      public void execute(Scope startingScope) {
    23          decl = searchUpward(occ, startingScope);
    24          if (TRACE) System.out.println("found " + decl);
    25      }
    26
    27      public NameDeclaration getResult() {
    28          return decl;
    29      }
    30
    31      private NameDeclaration searchUpward(NameOccurrence nameOccurrence, Scope scope) {
    32          if (TRACE) System.out.println("checking scope " + scope + " for name occurrence " + nameOccurrence);
    33          if (!scope.contains(nameOccurrence) && scope.getParent() != null) {
    34              if (TRACE) System.out.println("moving up fm " + scope + " to " + scope.getParent());
    35              return searchUpward(nameOccurrence, scope.getParent());
    36          }
    37          if (scope.contains(nameOccurrence)) {
    38              if (TRACE) System.out.println("found it!");
    39              return scope.addVariableNameOccurrence(nameOccurrence);
    40          }
    41          return null;
    42      }
    43  }