/****************************************************************************** * Copyright (c) 2002 - 2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *****************************************************************************/ import java.io.FileReader; import java.util.HashMap; import java.util.Map; import org.mozilla.javascript.CompilerEnvirons; import org.mozilla.javascript.FunctionNode; import org.mozilla.javascript.Node; import org.mozilla.javascript.Parser; import org.mozilla.javascript.ScriptOrFnNode; import org.mozilla.javascript.Token; import org.mozilla.javascript.tools.ToolErrorReporter; class walkRhinoTree { private final Map results = new HashMap(); private int nextValue = 1; private int nextValueNumber() { return nextValue++; } private int setValue(Node n, int v) { results.put(n, new Integer(v)); return v; } private int allocValue(Node n) { return setValue(n, nextValueNumber()); } private int getValue(Node n) { return results.get(n).intValue(); } private interface Symbol { int valueNumber(); boolean isParameter(); } private final static int TYPE_LOCAL = 1; private final static int TYPE_GLOBAL = 2; private final static int TYPE_SCRIPT = 3; private final static int TYPE_FUNCTION = 4; private interface Scope { int type(); void declare(String name); boolean contains(String name); Symbol lookup(String name); } private static abstract class AbstractScope implements Scope { private final Scope parent; private final Map values = new HashMap(); public void declare(String nm) { if (! contains(nm)) { values.put(nm, makeSymbol(nm)); } } AbstractScope(Scope parent) { this.parent = parent; } abstract protected Symbol makeSymbol(String nm); public Symbol lookup(String nm) { if (contains(nm)) return values.get(nm); else return parent.lookup(nm); } public boolean contains(String nm) { return values.containsKey(nm); } }; Scope makeScriptScope(final ScriptOrFnNode s, Scope parent) { return new AbstractScope(parent) { public int type() { return TYPE_SCRIPT; } protected Symbol makeSymbol(final String nm) { final int v = nextValueNumber(); return new Symbol() { public String toString() { return nm; } public int valueNumber() { return v; } public boolean isParameter() { return false; } }; } }; } Scope makeLocalScope(Node s, Scope parent) { return new AbstractScope(parent) { public int type() { return TYPE_LOCAL; } protected Symbol makeSymbol(final String nm) { final int v = nextValueNumber(); return new Symbol() { public String toString() { return nm; } public int valueNumber() { return v; } public boolean isParameter() { return false; } }; } }; } Scope makeFunctionScope(final FunctionNode f, Scope parent) { Scope s = new AbstractScope(parent) { public int type() { return TYPE_FUNCTION; } protected Symbol makeSymbol(final String nm) { final int v = nextValueNumber(); return new Symbol() { public String toString() { return nm; } public int valueNumber() { return v; } public boolean isParameter() { return f.getParamOrVarIndex(nm)