Added flags to createNode and factory methods

This commit is contained in:
Ron Buckton
2015-07-10 15:55:16 -07:00
parent 3fe0f31e17
commit fae1d50bd7
5 changed files with 560 additions and 481 deletions

View File

@@ -574,31 +574,21 @@ function generateFactory(outputFile: string) {
writer.write(`export function create${syntaxNode.kindName}(`);
let first = true;
for (let member of syntaxNode.members) {
if (!first) {
writer.write(`, `);
}
else {
first = false;
}
let type =
member.isNodeArray ? `Array<${member.elementTypeName}>` :
member.isModifiersArray ? `Array<Node>` :
member.typeName;
writer.write(`${member.paramName}?: ${type}`);
writer.write(`${member.paramName}?: ${type}, `);
}
writer.write(`): ${syntaxNode.typeName} {`);
writer.write(`location?: TextRange, flags?: NodeFlags): ${syntaxNode.typeName} {`);
writer.writeLine();
writer.increaseIndent();
if (syntaxNode.members.length) {
writer.write(`let node = createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName});`);
writer.write(`let node = createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName}, location, flags);`);
writer.writeLine();
if (syntaxNode.members.length > 1) {
writer.write(`if (arguments.length) {`);
@@ -630,7 +620,7 @@ function generateFactory(outputFile: string) {
writer.writeLine();
}
else {
writer.write(`return createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName});`);
writer.write(`return createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName}, location, flags);`);
writer.writeLine();
}
@@ -760,16 +750,11 @@ function generateFactory(outputFile: string) {
writer.increaseIndent();
writer.write(`return factory.create${syntaxNode.kindName}(`);
for (let i = 0; i < syntaxNode.members.length; ++i) {
if (i > 0) {
writer.write(`, `);
}
let member = syntaxNode.members[i];
writer.write(`(<${syntaxNode.typeName}>node).${member.propertyName}`);
for (let member of syntaxNode.members) {
writer.write(`(<${syntaxNode.typeName}>node).${member.propertyName}, `);
}
writer.write(`);`);
writer.write(`/*location*/ undefined, node.flags);`);
writer.writeLine();
writer.decreaseIndent();

File diff suppressed because it is too large Load Diff

View File

@@ -13,6 +13,15 @@ namespace ts {
// @internal
export namespace factory {
export function setNodeFlags<T extends Node>(node: T, flags: NodeFlags): T {
if (!node || flags === undefined) {
return node;
}
node.flags = flags;
return node;
}
export function setTextRange<T extends TextRange>(node: T, range: TextRange): T {
if (!node || !range) {
return node;
@@ -23,7 +32,7 @@ namespace ts {
return node;
}
export function setModifiers<TNode extends Node>(node: TNode, modifiers: Node[]): TNode {
export function setModifiers<T extends Node>(node: T, modifiers: Node[]): T {
if (modifiers) {
node.modifiers = createModifiersArray(modifiers);
node.flags |= node.modifiers.flags;
@@ -43,18 +52,17 @@ namespace ts {
}
newNode.flags = flags;
newNode.pos = oldNode.pos;
newNode.end = oldNode.end;
newNode.parent = oldNode.parent;
return newNode;
newNode.original = oldNode;
return setTextRange(newNode, oldNode);
}
export function createNode<T extends Node>(kind: SyntaxKind, location?: TextRange): T {
return setTextRange(<T>new (getNodeConstructor(kind))(), location);
export function createNode<T extends Node>(kind: SyntaxKind, location?: TextRange, flags?: NodeFlags): T {
return setNodeFlags(setTextRange(<T>new (getNodeConstructor(kind))(), location), flags);
}
export function createNodeArray<TNode extends Node>(elements?: TNode[], location?: TextRange) {
let nodes = <NodeArray<TNode>>(elements || []);
export function createNodeArray<T extends Node>(elements?: T[], location?: TextRange) {
let nodes = <NodeArray<T>>(elements || []);
if (nodes.pos === undefined) {
nodes.pos = -1;
nodes.end = -1;

View File

@@ -440,6 +440,7 @@ namespace ts {
// @factoryhidden("decorators", true)
// @factoryhidden("modifiers", true)
// @factoryhidden("parent", true)
// @factoryhidden("original", true)
// @factoryhidden("jsDocComment", true)
// @factoryhidden("nextContainer", true)
// @factoryorder("decorators", "modifiers")
@@ -453,7 +454,8 @@ namespace ts {
decorators?: NodeArray<Decorator>; // Array of decorators (in document order)
modifiers?: ModifiersArray; // Array of modifiers
/* @internal */ id?: number; // Unique id (used to look up NodeLinks)
parent?: Node; // Parent node (initialized by binding
parent?: Node; // Parent node (initialized by binding)
/* @internal */ original?: Node; // The original node if this is an updated node.
/* @internal */ jsDocComment?: JSDocComment; // JSDoc for the node, if it has any. Only for .js files.
/* @internal */ symbol?: Symbol; // Symbol declared by node (initialized by binding)
/* @internal */ locals?: SymbolTable; // Locals associated with node (initialized by binding)

View File

@@ -380,6 +380,15 @@ namespace ts {
return node.kind === SyntaxKind.ExpressionStatement && (<ExpressionStatement>node).expression.kind === SyntaxKind.StringLiteral;
}
/** Gets the original node for a node that was updated via one of the factory.updateX functions */
export function getOriginalNode(node: Node) {
while (node.original) {
node = node.original;
}
return node;
}
export function getLeadingCommentRangesOfNode(node: Node, sourceFileOfNode: SourceFile) {
// If parameter/type parameter, the prev token trailing comments are part of this node too
if (node.kind === SyntaxKind.Parameter || node.kind === SyntaxKind.TypeParameter) {