Symbols and Declarations
Linking between a node
and a symbol
is performed by a few functions. One function that is used to bind the SourceFile
node to the source file Symbol (in case of an external module) is the addDeclarationToSymbol
function
Note : the Symbol
for an external module source file is setup as flags : SymbolFlags.ValueModule
and name: '"' + removeFileExtension(file.fileName) + '"'
).
function addDeclarationToSymbol(symbol: Symbol, node: Declaration, symbolFlags: SymbolFlags) {
symbol.flags |= symbolFlags;
node.symbol = symbol;
if (!symbol.declarations) {
symbol.declarations = [];
}
symbol.declarations.push(node);
if (symbolFlags & SymbolFlags.HasExports && !symbol.exports) {
symbol.exports = {};
}
if (symbolFlags & SymbolFlags.HasMembers && !symbol.members) {
symbol.members = {};
}
if (symbolFlags & SymbolFlags.Value && !symbol.valueDeclaration) {
symbol.valueDeclaration = node;
}
}
The important linking portions:
- creates a link to the Symbol from the AST node (
node.symbol
). - add the node as one of the declarations of the Symbol (
symbol.declarations
).
Declaration
Declaration is just a node
with an optional name. In types.ts
interface Declaration extends Node {
_declarationBrand: any;
name?: DeclarationName;
}