Class SymbolTable
- java.lang.Object
-
- com.google.javascript.jscomp.SymbolTable
-
public final class SymbolTable extends java.lang.Object
A symbol table for people that want to use Closure Compiler as an indexer.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 aStaticSymbolTable
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.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
SymbolTable.Reference
Referencestatic class
SymbolTable.Symbol
A symbol-table entrystatic class
SymbolTable.SymbolScope
Scope of a symbol
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
GLOBAL_THIS
The name we use for the JavaScript built-in Global object.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method 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)
Ifsym
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(SymbolTable.Symbol sym)
Gets the symbol for the prototype if this is the symbol for a constructor or interface.SymbolTable.Symbol
getSymbolForInstancesOf(FunctionType fn)
Gets the symbol for the prototype of the given 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()
java.lang.String
toDebugStringTree()
Methods returns debug representation of the SymbolTable.
-
-
-
Field Detail
-
GLOBAL_THIS
public static final java.lang.String GLOBAL_THIS
The name we use for the JavaScript built-in Global object. It's anonymous in JavaScript, so we have to give it an invalid identifier to avoid conflicts with user-defined property names.- See Also:
- Constant Field Values
-
-
Method Detail
-
getReferences
public java.lang.Iterable<SymbolTable.Reference> getReferences(SymbolTable.Symbol symbol)
-
getReferenceList
public com.google.common.collect.ImmutableList<SymbolTable.Reference> getReferenceList(SymbolTable.Symbol symbol)
-
getAllSymbols
public com.google.common.collect.ImmutableList<SymbolTable.Symbol> getAllSymbols()
-
getAllSymbolsSorted
public java.util.List<SymbolTable.Symbol> getAllSymbolsSorted()
Get the symbols in their natural ordering. Always returns a mutable list.
-
getNaturalSymbolOrdering
public com.google.common.collect.Ordering<SymbolTable.Symbol> getNaturalSymbolOrdering()
Gets the 'natural' ordering of symbols.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.
-
getScope
public SymbolTable.SymbolScope getScope(SymbolTable.Symbol slot)
-
getAllJSDocInfoNodes
public java.util.Collection<Node> getAllJSDocInfoNodes()
-
getEnclosingScope
public SymbolTable.SymbolScope getEnclosingScope(Node n)
Gets the scope that contains the given node. Ifn
is a function name, we return the scope that contains the function, not the function itself.
-
getEnclosingFunctionScope
public SymbolTable.SymbolScope getEnclosingFunctionScope(Node n)
Gets the scope that contains the given node. Ifn
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.
-
getParameterInFunction
public SymbolTable.Symbol getParameterInFunction(SymbolTable.Symbol sym, java.lang.String paramName)
Ifsym
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) {};
-
getSymbolForScope
public SymbolTable.Symbol getSymbolForScope(SymbolTable.SymbolScope scope)
All local scopes are associated with a function, and some functions are associated with a symbol. Returns the symbol associated with the given scope.
-
getAllSymbolsForTypeOf
public java.lang.Iterable<SymbolTable.Symbol> getAllSymbolsForTypeOf(SymbolTable.Symbol sym)
Get all symbols associated with the type of the given symbol.For example, given a variable x declared as /* @type {Array|Date} / var x = f(); this will return the constructors for Array and Date.
-
getGlobalScope
public SymbolTable.SymbolScope getGlobalScope()
Returns the global scope.
-
getSymbolDeclaredBy
public SymbolTable.Symbol getSymbolDeclaredBy(FunctionType fn)
Gets the symbol for the given constructor or interface.
-
getSymbolDeclaredBy
public SymbolTable.Symbol getSymbolDeclaredBy(EnumType enumType)
Gets the symbol for the given enum.
-
getSymbolForInstancesOf
public SymbolTable.Symbol getSymbolForInstancesOf(SymbolTable.Symbol sym)
Gets the symbol for the prototype if this is the symbol for a constructor or interface.
-
getSymbolForInstancesOf
public SymbolTable.Symbol getSymbolForInstancesOf(FunctionType fn)
Gets the symbol for the prototype of the given constructor or interface.
-
getAllSymbolsForType
public java.util.List<SymbolTable.Symbol> getAllSymbolsForType(JSType type)
Gets all symbols associated with the given type. For union types, this may be multiple symbols. For instance types, this will return the constructor of that instance.
-
toDebugStringTree
public java.lang.String toDebugStringTree()
Methods returns debug representation of the SymbolTable. It starts with the global scope and all its symbols recursively going to children scopes and printing their symbols.
-
toDebugString
public java.lang.String toDebugString()
-
getAllScopes
public java.util.Collection<SymbolTable.SymbolScope> getAllScopes()
Gets all the scopes in this symbol table.
-
addAnonymousFunctions
public void addAnonymousFunctions()
Finds anonymous functions in local scopes, and gives them names and symbols. They will show up as local variables with names "function%0", "function%1", etc.
-
-