diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 5aa5850e028..8fd92818c46 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -775,7 +775,7 @@ namespace ts { }; export interface ObjectAllocator { - getNodeConstructor(kind: SyntaxKind): new () => Node; + getNodeConstructor(kind: SyntaxKind): new (pos?: number, end?: number) => Node; getSymbolConstructor(): new (flags: SymbolFlags, name: string) => Symbol; getTypeConstructor(): new (checker: TypeChecker, flags: TypeFlags) => Type; getSignatureConstructor(): new (checker: TypeChecker) => Signature; @@ -796,15 +796,13 @@ namespace ts { export let objectAllocator: ObjectAllocator = { getNodeConstructor: kind => { - function Node() { - this.pos = -1; - this.end = -1; - this.flags = 0; + function Node(pos: number, end: number) { + this.pos = pos; + this.end = end; + this.flags = NodeFlags.None; this.parent = undefined; } - Node.prototype = { - kind: kind - }; + Node.prototype = { kind }; return Node; }, getSymbolConstructor: () => Symbol, diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index f021251f7d9..d2344722ed5 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2,15 +2,15 @@ /// namespace ts { - let nodeConstructors = new Array Node>(SyntaxKind.Count); + let nodeConstructors = new Array Node>(SyntaxKind.Count); /* @internal */ export let parseTime = 0; - export function getNodeConstructor(kind: SyntaxKind): new () => Node { + export function getNodeConstructor(kind: SyntaxKind): new (pos?: number, end?: number) => Node { return nodeConstructors[kind] || (nodeConstructors[kind] = objectAllocator.getNodeConstructor(kind)); } - export function createNode(kind: SyntaxKind): Node { - return new (getNodeConstructor(kind))(); + export function createNode(kind: SyntaxKind, pos?: number, end?: number): Node { + return new (getNodeConstructor(kind))(pos, end); } function visitNode(cbNode: (node: Node) => T, node: Node): T { @@ -993,14 +993,10 @@ namespace ts { function createNode(kind: SyntaxKind, pos?: number): Node { nodeCount++; - let node = new (nodeConstructors[kind] || (nodeConstructors[kind] = objectAllocator.getNodeConstructor(kind)))(); if (!(pos >= 0)) { pos = scanner.getStartPos(); } - - node.pos = pos; - node.end = pos; - return node; + return new (nodeConstructors[kind] || (nodeConstructors[kind] = objectAllocator.getNodeConstructor(kind)))(pos, pos); } function finishNode(node: T, end?: number): T { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 2818ef04a48..8e0338696dd 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -361,6 +361,7 @@ namespace ts { } export const enum NodeFlags { + None = 0, Export = 0x00000001, // Declarations Ambient = 0x00000002, // Declarations Public = 0x00000010, // Property/Method diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 7c1b606dd00..eeca6a43d07 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1505,7 +1505,7 @@ namespace ts { } export function createSynthesizedNode(kind: SyntaxKind, startsOnNewLine?: boolean): Node { - let node = createNode(kind); + let node = createNode(kind, /* pos */ -1, /* end */ -1); node.startsOnNewLine = startsOnNewLine; return node; } diff --git a/src/harness/harness.ts b/src/harness/harness.ts index a37b647a124..806f89be04d 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -274,7 +274,9 @@ namespace Utils { case "flags": // Print out flags with their enum names. - o[propertyName] = getNodeFlagName(n.flags); + if (n.flags) { + o[propertyName] = getNodeFlagName(n.flags); + } break; case "parserContextFlags": diff --git a/src/services/services.ts b/src/services/services.ts index 15c6e3df56f..ec29a89bdbc 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -174,9 +174,7 @@ namespace ts { let jsDocCompletionEntries: CompletionEntry[]; function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject { - let node = new (getNodeConstructor(kind))(); - node.pos = pos; - node.end = end; + let node = new (getNodeConstructor(kind))(pos, end); node.flags = flags; node.parent = parent; return node; @@ -7967,14 +7965,14 @@ namespace ts { function initializeServices() { objectAllocator = { getNodeConstructor: kind => { - function Node() { + function Node(pos: number, end: number) { + this.pos = pos; + this.end = end; + this.flags = NodeFlags.None; + this.parent = undefined; } let proto = kind === SyntaxKind.SourceFile ? new SourceFileObject() : new NodeObject(); proto.kind = kind; - proto.pos = -1; - proto.end = -1; - proto.flags = 0; - proto.parent = undefined; Node.prototype = proto; return Node; },