Ми вже аналізували, що основна частина emitter.ts є локальною функцією emitJavaScript (раніше процедуруа ініціалізації цієї функції була приведена). Нижче наведено переглянуту версію функції emitJavaScript, цього разу з фокусом на функціоналість SourceMap:
functionemitJavaScript(jsFilePath:string, root?:SourceFile) {// STUFF ........... removedlet writeComment = writeCommentRange;/** Write emitted output to disk */let writeEmittedFiles = writeJavaScriptFile;/** Emit a node */let emit = emitNodeWithoutSourceMap;/** Called just before starting emit of a node */letemitStart=function (node:Node) { };/** Called once the emit of the node is done */letemitEnd=function (node:Node) { };/** Emit the text for the given token that comes after startPos * This by default writes the text provided with the given tokenKind * but if optional emitFn callback is provided the text is emitted using the callback instead of default text * @param tokenKind the kind of the token to search and emit * @param startPos the position in the source to start searching for the token * @param emitFn if given will be invoked to emit the text instead of actual token emit */let emitToken = emitTokenText;/** Called to before starting the lexical scopes as in function/class in the emitted code because of node * @param scopeDeclaration node that starts the lexical scope * @param scopeName Optional name of this scope instead of deducing one from the declaration node */letscopeEmitStart=function(scopeDeclaration:Node, scopeName?:string) { };/** Called after coming out of the scope */letscopeEmitEnd=function() { };/** Sourcemap data that will get encoded */let sourceMapData:SourceMapData;if (compilerOptions.sourceMap ||compilerOptions.inlineSourceMap) {initializeEmitterWithSourceMaps(); }if (root) {// Do not call emit directly. It does not set the currentSourceFile.emitSourceFile(root); }else {forEach(host.getSourceFiles(), sourceFile => {if (!isExternalModuleOrDeclarationFile(sourceFile)) {emitSourceFile(sourceFile); } }); }writeLine();writeEmittedFiles(writer.getText(),/*writeByteOrderMark*/compilerOptions.emitBOM);return;/// BUNCH OF LOCAL FUNCTIONS
Важливий викликом є виклик функціі initializeEmitterWithSourceMaps. Вона представляє собою локальну функцію emitJavaScript і перевизначає деякі раніше визначені локальні змінні. У кінці функції initializeEmitterWithSourceMaps ви помітите ці перевизначення:
Це означає, що основна частина коду еміттера може бути нечутливою до SourceMap і просто використовувати ці локальні функції однаковим чином з або без SourceMap.