2つの重要なバインダー関数はbindSourceFile
とmergeSymbolTable
です。これらを次に見ていきます。
基本的にfile.locals
が定義されているかどうかを確認し、そうでなければ(ローカル関数)bind
に渡します。
注: locals
はNode
で定義され、SymbolTable
型です。SourceFile
もまたNode
(実際にはASTのルートNode)であることに注意してください。
TIP: ローカル関数は、TypeScriptコンパイラで頻繁に使用されます。ローカル関数は親関数(クロージャによって捕捉される)からの変数を使用することが非常に多いです。bind
(bindSourceFile
内のローカル関数)の場合、それ(またはそれが呼び出す関数)はsymbolCount
とclassifiableNames
をセットアップし、返された SourceFile
に格納されます。
Bindは(ただのSourceFile
ではなく)何らかのNode
を取ります。最初に行うことは、node.parent
(もしparent
変数がセットアップされていれば ... それは、BinderがbindChildren
関数内の処理中に行うことです)を代入し、重い作業を行うbindWorker
に渡します。最後に、これはbindChildren
を呼び出します(単にバインダーの状態を格納する関数です。例えば現在のparent
をその関数のローカル変数に格納し、子それぞれにbind
を呼び出して、それからbinderの状態を復元します)。もっと興味深い関数であるbindWorker
を見てみましょう。
この関数はnode.kind
(SyntaxKind
型)によってスイッチし、適切なbindFoo
関数(binder.ts
で定義されています)に処理をデリゲートします。例えばnode
がSourceFile
であればbindAnonymousDeclaration
を呼び出します(最終的に外部ファイルモジュールである場合のみ)。
bindFoo
関数に共通するパターンと、これらが使用するいくつかのユーティリティ関数があります。ほぼ常に使用される関数の1つは、createSymbol
関数です。以下にその全体を示します。
function createSymbol(flags: SymbolFlags, name: string): Symbol {
symbolCount++;
return new Symbol(flags, name);
}
ご覧のとおり、symbolCount
(bindSourceFile
のローカル)を最新の状態にし、指定されたパラメータでSymbolを作成しています。