public final class SymbolTable
extends java.lang.Object
Contains an index of all the symbols in the code within a compilation job. The API is designed for people who want to visit all the symbols, rather than people who want to lookup a specific symbol by a certain key.
We can use this to combine different types of symbol tables. For example, one class might have
a StaticSymbolTable
of all variable references, and another class might have a StaticSymbolTable
of all type names in JSDoc comments. This class allows you to combine them
into a unified index.
Most passes build their own "partial" symbol table that implements the same interface (StaticSymbolTable, StaticSlot, and friends). Individual compiler passes usually need more or less metadata about the certainty of symbol information. Building a complete symbol table with all the necessary metadata for all passes would be too slow. However, as long as these "partial" symbol tables implement the proper interfaces, we should be able to add them to this symbol table to make it more complete.
If clients want fast lookup, they should build their own wrapper around this symbol table that indexes symbols or references by the desired lookup key.
By design, when this symbol table creates symbols for types, it tries to mimic the symbol table you would get in an OO language. For example, the "type Foo" and "the constructor that creates objects of type Foo" are the same symbol. The types of "Foo.prototype" and "new Foo()" also have the same symbol. Although JSCompiler internally treats these as distinct symbols, we assume that most clients will not care about the distinction.
Modifier and Type | Class and Description |
---|---|
static class |
SymbolTable.Reference
Reference
|
static class |
SymbolTable.Symbol
A symbol-table entry
|
static class |
SymbolTable.SymbolScope
Scope of a symbol
|
Modifier and Type | Field and Description |
---|---|
static java.lang.String |
GLOBAL_THIS
The name we use for the JavaScript built-in Global object.
|
Modifier and Type | Method and Description |
---|---|
void |
addAnonymousFunctions()
Finds anonymous functions in local scopes, and gives them names and symbols.
|
java.util.Collection<Node> |
getAllJSDocInfoNodes() |
java.util.Collection<SymbolTable.SymbolScope> |
getAllScopes()
Gets all the scopes in this symbol table.
|
com.google.common.collect.ImmutableList<SymbolTable.Symbol> |
getAllSymbols() |
java.util.List<SymbolTable.Symbol> |
getAllSymbolsForType(JSType type)
Gets all symbols associated with the given type.
|
java.lang.Iterable<SymbolTable.Symbol> |
getAllSymbolsForTypeOf(SymbolTable.Symbol sym)
Get all symbols associated with the type of the given symbol.
|
java.util.List<SymbolTable.Symbol> |
getAllSymbolsSorted()
Get the symbols in their natural ordering.
|
SymbolTable.SymbolScope |
getEnclosingFunctionScope(Node n)
Gets the scope that contains the given node.
|
SymbolTable.SymbolScope |
getEnclosingScope(Node n)
Gets the scope that contains the given node.
|
SymbolTable.SymbolScope |
getGlobalScope()
Returns the global scope.
|
com.google.common.collect.Ordering<SymbolTable.Symbol> |
getNaturalSymbolOrdering()
Gets the 'natural' ordering of symbols.
|
SymbolTable.Symbol |
getParameterInFunction(SymbolTable.Symbol sym,
java.lang.String paramName)
If
sym is a function, try to find a Symbol for a parameter with the given name. |
com.google.common.collect.ImmutableList<SymbolTable.Reference> |
getReferenceList(SymbolTable.Symbol symbol) |
java.lang.Iterable<SymbolTable.Reference> |
getReferences(SymbolTable.Symbol symbol) |
SymbolTable.SymbolScope |
getScope(SymbolTable.Symbol slot) |
SymbolTable.Symbol |
getSymbolDeclaredBy(EnumType enumType)
Gets the symbol for the given enum.
|
SymbolTable.Symbol |
getSymbolDeclaredBy(FunctionType fn)
Gets the symbol for the given constructor or interface.
|
SymbolTable.Symbol |
getSymbolForInstancesOf(FunctionType fn)
Gets the symbol for the prototype of the given constructor or interface.
|
SymbolTable.Symbol |
getSymbolForInstancesOf(SymbolTable.Symbol sym)
Gets the symbol for the prototype if this is the symbol for a constructor or interface.
|
SymbolTable.Symbol |
getSymbolForScope(SymbolTable.SymbolScope scope)
All local scopes are associated with a function, and some functions are associated with a
symbol.
|
java.lang.String |
toDebugString() |
public static final java.lang.String GLOBAL_THIS
public java.lang.Iterable<SymbolTable.Reference> getReferences(SymbolTable.Symbol symbol)
public com.google.common.collect.ImmutableList<SymbolTable.Reference> getReferenceList(SymbolTable.Symbol symbol)
public com.google.common.collect.ImmutableList<SymbolTable.Symbol> getAllSymbols()
public java.util.List<SymbolTable.Symbol> getAllSymbolsSorted()
public com.google.common.collect.Ordering<SymbolTable.Symbol> getNaturalSymbolOrdering()
Right now, we only guarantee that symbols in the global scope will come before symbols in local scopes. After that, the order is deterministic but undefined.
public SymbolTable.SymbolScope getScope(SymbolTable.Symbol slot)
public java.util.Collection<Node> getAllJSDocInfoNodes()
public SymbolTable.SymbolScope getEnclosingScope(Node n)
n
is a function name, we return the
scope that contains the function, not the function itself.public SymbolTable.SymbolScope getEnclosingFunctionScope(Node n)
n
is a function name, we return the
scope that contains the function, not the function itself. The returned scope is either
function or global scope.public SymbolTable.Symbol getParameterInFunction(SymbolTable.Symbol sym, java.lang.String paramName)
sym
is a function, try to find a Symbol for a parameter with the given name.
Returns null if we couldn't find one.
Notice that this just makes a best effort, and may not be able to find parameters for
non-conventional function definitions. For example, we would not be able to find "y" in this
code:
var x = x() ? function(y) {} : function(y) {};
public SymbolTable.Symbol getSymbolForScope(SymbolTable.SymbolScope scope)
public java.lang.Iterable<SymbolTable.Symbol> getAllSymbolsForTypeOf(SymbolTable.Symbol sym)
For example, given a variable x declared as /* @type {Array|Date} / var x = f(); this will return the constructors for Array and Date.
public SymbolTable.SymbolScope getGlobalScope()
public SymbolTable.Symbol getSymbolDeclaredBy(FunctionType fn)
public SymbolTable.Symbol getSymbolDeclaredBy(EnumType enumType)
public SymbolTable.Symbol getSymbolForInstancesOf(SymbolTable.Symbol sym)
public SymbolTable.Symbol getSymbolForInstancesOf(FunctionType fn)
public java.util.List<SymbolTable.Symbol> getAllSymbolsForType(JSType type)
public java.lang.String toDebugString()
public java.util.Collection<SymbolTable.SymbolScope> getAllScopes()
public void addAnonymousFunctions()
Copyright © 2009-2019 Google. All Rights Reserved.