/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.symboltable; public class Search { private static final boolean TRACE = false; private NameOccurrence occ; private NameDeclaration decl; public Search(NameOccurrence occ) { if (TRACE) System.out.println("new search for " + occ); this.occ = occ; } public void execute() { decl = searchUpward(occ, occ.getScope()); if (TRACE) System.out.println("found " + decl); } public void execute(Scope startingScope) { decl = searchUpward(occ, startingScope); if (TRACE) System.out.println("found " + decl); } public NameDeclaration getResult() { return decl; } private NameDeclaration searchUpward(NameOccurrence nameOccurrence, Scope scope) { if (!scope.contains(nameOccurrence) && scope.getParent() != null) { if (TRACE) System.out.println("moving up fm " + scope + " to " + scope.getParent()); return searchUpward(nameOccurrence, scope.getParent()); } if (scope.contains(nameOccurrence)) { return scope.addVariableNameOccurrence(nameOccurrence); } return null; } }