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