initialize fields from constructor parameters

This commit is contained in:
Vladimir Matveev
2015-10-21 15:33:30 -07:00
parent 7fc29d1b62
commit 7c064af052
6 changed files with 22 additions and 27 deletions
+6 -8
View File
@@ -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 <any>Node;
},
getSymbolConstructor: () => <any>Symbol,
+5 -9
View File
@@ -2,15 +2,15 @@
/// <reference path="utilities.ts"/>
namespace ts {
let nodeConstructors = new Array<new () => Node>(SyntaxKind.Count);
let nodeConstructors = new Array<new (pos: number, end: number) => 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<T>(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<T extends Node>(node: T, end?: number): T {
+1
View File
@@ -361,6 +361,7 @@ namespace ts {
}
export const enum NodeFlags {
None = 0,
Export = 0x00000001, // Declarations
Ambient = 0x00000002, // Declarations
Public = 0x00000010, // Property/Method
+1 -1
View File
@@ -1505,7 +1505,7 @@ namespace ts {
}
export function createSynthesizedNode(kind: SyntaxKind, startsOnNewLine?: boolean): Node {
let node = <SynthesizedNode>createNode(kind);
let node = <SynthesizedNode>createNode(kind, /* pos */ -1, /* end */ -1);
node.startsOnNewLine = startsOnNewLine;
return node;
}
+3 -1
View File
@@ -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":
+6 -8
View File
@@ -174,9 +174,7 @@ namespace ts {
let jsDocCompletionEntries: CompletionEntry[];
function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject {
let node = <NodeObject> new (getNodeConstructor(kind))();
node.pos = pos;
node.end = end;
let node = <NodeObject> 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 <any>Node;
},