diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index ac7aa0f00dc..620abbe156d 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -460,7 +460,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi const { write, writeTextOfNode, writeLine, increaseIndent, decreaseIndent } = writer; const sourceMap = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? createSourceMapWriter(host, writer) : getNullSourceMapWriter(); - const { setSourceFile, emitStart, emitEnd, emitPos, pushScope: scopeEmitStart, popScope: scopeEmitEnd } = sourceMap; + const { setSourceFile, emitStart, emitEnd, emitPos, pushScope, popScope } = sourceMap; let currentSourceFile: SourceFile; let currentText: string; @@ -2692,7 +2692,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi emitToken(SyntaxKind.OpenBraceToken, node.pos); increaseIndent(); - scopeEmitStart(node.parent); + pushScope(node.parent); if (node.kind === SyntaxKind.ModuleBlock) { Debug.assert(node.parent.kind === SyntaxKind.ModuleDeclaration); emitCaptureThisForNodeIfNecessary(node.parent); @@ -2704,7 +2704,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi decreaseIndent(); writeLine(); emitToken(SyntaxKind.CloseBraceToken, node.statements.end); - scopeEmitEnd(); + popScope(); } function emitEmbeddedStatement(node: Node) { @@ -4549,7 +4549,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi function emitDownLevelExpressionFunctionBody(node: FunctionLikeDeclaration, body: Expression) { write(" {"); - scopeEmitStart(node); + pushScope(node); increaseIndent(); const outPos = writer.getTextPos(); @@ -4590,12 +4590,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi write("}"); emitEnd(node.body); - scopeEmitEnd(); + popScope(); } function emitBlockFunctionBody(node: FunctionLikeDeclaration, body: Block) { write(" {"); - scopeEmitStart(node); + pushScope(node); const initialTextPos = writer.getTextPos(); @@ -4630,7 +4630,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } emitToken(SyntaxKind.CloseBraceToken, body.statements.end); - scopeEmitEnd(); + popScope(); } function findInitialSuperCall(ctor: ConstructorDeclaration): ExpressionStatement { @@ -4916,7 +4916,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi let startIndex = 0; write(" {"); - scopeEmitStart(node, "constructor"); + pushScope(node, "constructor"); increaseIndent(); if (ctor) { // Emit all the directive prologues (like "use strict"). These have to come before @@ -4966,7 +4966,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } decreaseIndent(); emitToken(SyntaxKind.CloseBraceToken, ctor ? (ctor.body).statements.end : node.members.end); - scopeEmitEnd(); + popScope(); emitEnd(ctor || node); if (ctor) { emitTrailingComments(ctor); @@ -5103,14 +5103,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi write(" {"); increaseIndent(); - scopeEmitStart(node); + pushScope(node); writeLine(); emitConstructor(node, baseTypeNode); emitMemberFunctionsForES6AndHigher(node); decreaseIndent(); writeLine(); emitToken(SyntaxKind.CloseBraceToken, node.members.end); - scopeEmitEnd(); + popScope(); // TODO(rbuckton): Need to go back to `let _a = class C {}` approach, removing the defineProperty call for now. @@ -5197,7 +5197,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi tempParameters = undefined; computedPropertyNamesToGeneratedNames = undefined; increaseIndent(); - scopeEmitStart(node); + pushScope(node); if (baseTypeNode) { writeLine(); emitStart(baseTypeNode); @@ -5230,7 +5230,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi decreaseIndent(); writeLine(); emitToken(SyntaxKind.CloseBraceToken, node.members.end); - scopeEmitEnd(); + popScope(); emitStart(node); write(")("); if (baseTypeNode) { @@ -5792,12 +5792,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi emitEnd(node.name); write(") {"); increaseIndent(); - scopeEmitStart(node); + pushScope(node); emitLines(node.members); decreaseIndent(); writeLine(); emitToken(SyntaxKind.CloseBraceToken, node.members.end); - scopeEmitEnd(); + popScope(); write(")("); emitModuleMemberName(node); write(" || ("); @@ -5921,7 +5921,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi else { write("{"); increaseIndent(); - scopeEmitStart(node); + pushScope(node); emitCaptureThisForNodeIfNecessary(node); writeLine(); emit(node.body); @@ -5929,7 +5929,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi writeLine(); const moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body; emitToken(SyntaxKind.CloseBraceToken, moduleBlock.statements.end); - scopeEmitEnd(); + popScope(); } write(")("); // write moduleDecl = containingModule.m only if it is not exported es6 module member diff --git a/src/compiler/sourcemap.ts b/src/compiler/sourcemap.ts index ffb1a7001a9..d29e3213588 100644 --- a/src/compiler/sourcemap.ts +++ b/src/compiler/sourcemap.ts @@ -22,17 +22,17 @@ namespace ts { export function getNullSourceMapWriter(): SourceMapWriter { if (nullSourceMapWriter === undefined) { nullSourceMapWriter = { - getSourceMapData: nop, - setSourceFile: nop, - emitStart: nop, - emitEnd: nop, - emitPos: nop, - pushScope: nop, - popScope: nop, - getText: nop, - getSourceMappingURL: nop, - initialize: nop, - reset: nop, + getSourceMapData(): SourceMapData { return undefined; }, + setSourceFile(sourceFile: SourceFile): void { }, + emitStart(range: TextRange): void { }, + emitEnd(range: TextRange): void { }, + emitPos(pos: number): void { }, + pushScope(scopeDeclaration: Node, scopeName?: string): void { }, + popScope(): void { }, + getText(): string { return undefined; }, + getSourceMappingURL(): string { return undefined; }, + initialize(filePath: string, sourceMapFilePath: string, sourceFiles: SourceFile[], isBundledEmit: boolean): void { }, + reset(): void { }, }; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index e649edf2115..e9175a5d5ef 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2418,14 +2418,10 @@ namespace ts { * Serialize an object graph into a JSON string. This is intended only for use on an acyclic graph * as the fallback implementation does not check for circular references by default. */ - export const stringify: (value: any) => string = JSON && JSON.stringify ? JSON.stringify : function stringify(value: any): string { - if (Debug.shouldAssert(AssertionLevel.Aggressive)) { - Debug.assert(!hasCycles(value, []), "Detected circular reference before serializing object graph."); - } - - return value === undefined ? undefined : stringifyValue(value); - }; - + export const stringify: (value: any) => string = JSON && JSON.stringify + ? JSON.stringify + : stringifyFallback; + function hasCycles(value: any, stack: any[]) { /* tslint:disable:no-null */ if (typeof value !== "object" || value === null) { @@ -2449,6 +2445,19 @@ namespace ts { return false; } + /** + * Serialize an object graph into a JSON string. This is intended only for use on an acyclic graph + * as the fallback implementation does not check for circular references by default. + */ + function stringifyFallback(value: any): string { + if (Debug.shouldAssert(AssertionLevel.Aggressive)) { + Debug.assert(!hasCycles(value, []), "Detected circular reference before serializing object graph."); + } + + // JSON.stringify returns `undefined` here, instead of the string "undefined". + return value === undefined ? undefined : stringifyValue(value); + } + function stringifyValue(value: any): string { return typeof value === "string" ? `"${escapeString(value)}"` : typeof value === "number" ? isFinite(value) ? String(value) : "null"