Binder Functions

2つの重要なバインダー関数はbindSourceFilemergeSymbolTableです。これらを次に見ていきます。

bindSourceFile

基本的にfile.localsが定義されているかどうかを確認し、そうでなければ(ローカル関数)bindに渡します。

注: localsNodeで定義され、SymbolTable型です。SourceFileもまたNode(実際にはASTのルートNode)であることに注意してください。

TIP: ローカル関数は、TypeScriptコンパイラで頻繁に使用されます。ローカル関数は親関数(クロージャによって捕捉される)からの変数を使用することが非常に多いです。bind(bindSourceFile内のローカル関数)の場合、それ(またはそれが呼び出す関数)はsymbolCountclassifiableNamesをセットアップし、返された SourceFileに格納されます。

bind

Bindは(ただのSourceFileではなく)何らかのNodeを取ります。最初に行うことは、node.parent(もしparent変数がセットアップされていれば ... それは、BinderがbindChildren関数内の処理中に行うことです)を代入し、重い作業を行うbindWorkerに渡します。最後に、これはbindChildrenを呼び出します(単にバインダーの状態を格納する関数です。例えば現在のparentをその関数のローカル変数に格納し、子それぞれにbindを呼び出して、それからbinderの状態を復元します)。もっと興味深い関数であるbindWorkerを見てみましょう。

bindWorker

この関数はnode.kind(SyntaxKind型)によってスイッチし、適切なbindFoo関数(binder.tsで定義されています)に処理をデリゲートします。例えばnodeSourceFileであればbindAnonymousDeclarationを呼び出します(最終的に外部ファイルモジュールである場合のみ)。

bindFoo関数

bindFoo関数に共通するパターンと、これらが使用するいくつかのユーティリティ関数があります。ほぼ常に使用される関数の1つは、createSymbol関数です。以下にその全体を示します。

function createSymbol(flags: SymbolFlags, name: string): Symbol {
symbolCount++;
return new Symbol(flags, name);
}

ご覧のとおり、symbolCount(bindSourceFileのローカル)を最新の状態にし、指定されたパラメータでSymbolを作成しています。