Merge branch 'generateFactoryMethods' into generateTransformMethods
This commit is contained in:
commit
01b34906c7
|
@ -545,6 +545,7 @@ function generateFactory(outputFile: string) {
|
|||
writer.writeLine();
|
||||
writer.increaseIndent();
|
||||
writeCreateAndUpdateFunctions();
|
||||
writeCloneFunction();
|
||||
writer.decreaseIndent();
|
||||
writer.write(`}`);
|
||||
writer.writeLine();
|
||||
|
@ -581,31 +582,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) {`);
|
||||
|
@ -637,7 +628,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();
|
||||
}
|
||||
|
||||
|
@ -734,6 +725,58 @@ function generateFactory(outputFile: string) {
|
|||
writer.writeLine();
|
||||
}
|
||||
|
||||
function writeCloneFunction() {
|
||||
writer.write(`export function cloneNode<TNode extends Node>(node: TNode): TNode;`);
|
||||
writer.writeLine();
|
||||
|
||||
writer.write(`export function cloneNode(node: Node): Node {`);
|
||||
writer.writeLine();
|
||||
writer.increaseIndent();
|
||||
|
||||
writer.write(`if (!node) {`);
|
||||
writer.writeLine();
|
||||
writer.increaseIndent();
|
||||
|
||||
writer.write(`return node;`);
|
||||
writer.writeLine();
|
||||
|
||||
writer.decreaseIndent();
|
||||
writer.write(`}`);
|
||||
writer.writeLine();
|
||||
|
||||
writer.write(`switch (node.kind) {`);
|
||||
writer.writeLine();
|
||||
writer.increaseIndent();
|
||||
|
||||
for (let syntaxNode of syntax) {
|
||||
if (!syntaxNode.options.create) {
|
||||
continue;
|
||||
}
|
||||
|
||||
writer.write(`case SyntaxKind.${syntaxNode.kindName}:`);
|
||||
writer.writeLine();
|
||||
writer.increaseIndent();
|
||||
|
||||
writer.write(`return factory.create${syntaxNode.kindName}(`);
|
||||
for (let member of syntaxNode.members) {
|
||||
writer.write(`(<${syntaxNode.typeName}>node).${member.propertyName}, `);
|
||||
}
|
||||
|
||||
writer.write(`/*location*/ undefined, node.flags);`);
|
||||
writer.writeLine();
|
||||
|
||||
writer.decreaseIndent();
|
||||
}
|
||||
|
||||
writer.decreaseIndent();
|
||||
writer.write(`}`);
|
||||
writer.writeLine();
|
||||
|
||||
writer.decreaseIndent();
|
||||
writer.write(`}`);
|
||||
writer.writeLine();
|
||||
}
|
||||
|
||||
function writeUpdateFunction(syntaxNode: SyntaxNode) {
|
||||
if (!syntaxNode.options.update || !hasChildNodes(syntaxNode)) {
|
||||
return;
|
||||
|
|
|
@ -330,8 +330,6 @@ namespace ts {
|
|||
return writeTextOfNode(currentSourceFile, type);
|
||||
case SyntaxKind.ExpressionWithTypeArguments:
|
||||
return emitExpressionWithTypeArguments(<ExpressionWithTypeArguments>type);
|
||||
case SyntaxKind.TypePredicate:
|
||||
return emitTypePredicate(<TypePredicateNode>type);
|
||||
case SyntaxKind.TypeReference:
|
||||
return emitTypeReference(<TypeReferenceNode>type);
|
||||
case SyntaxKind.TypeQuery:
|
||||
|
@ -393,12 +391,6 @@ namespace ts {
|
|||
}
|
||||
}
|
||||
|
||||
function emitTypePredicate(type: TypePredicateNode) {
|
||||
writeTextOfNode(currentSourceFile, type.parameterName);
|
||||
write(" is ");
|
||||
emitType(type.type);
|
||||
}
|
||||
|
||||
function emitTypeReference(type: TypeReferenceNode) {
|
||||
emitEntityName(type.typeName);
|
||||
if (type.typeArguments) {
|
||||
|
|
|
@ -3045,31 +3045,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
|||
return expr;
|
||||
}
|
||||
|
||||
function createDefaultValueCheck(value: Expression, defaultValue: Expression): Expression {
|
||||
// The value expression will be evaluated twice, so for anything but a simple identifier
|
||||
// we need to generate a temporary variable
|
||||
value = ensureIdentifier(value);
|
||||
// Return the expression 'value === void 0 ? defaultValue : value'
|
||||
return factory.createConditionalExpression2(
|
||||
factory.createBinaryExpression2(
|
||||
value,
|
||||
SyntaxKind.EqualsEqualsEqualsToken,
|
||||
factory.createVoidZeroExpression()
|
||||
),
|
||||
defaultValue,
|
||||
value
|
||||
);
|
||||
}
|
||||
|
||||
function createPropertyAccessForDestructuringProperty(object: Expression, propName: Identifier | LiteralExpression): Expression {
|
||||
// We create a synthetic copy of the identifier in order to avoid the rewriting that might
|
||||
// otherwise occur when the identifier is emitted.
|
||||
return factory.createPropertyOrElementAccessExpression(
|
||||
factory.parenthesizeForAccess(object),
|
||||
factory.cloneIdentifierOrLiteralExpression(propName)
|
||||
);
|
||||
}
|
||||
|
||||
function emitObjectLiteralAssignment(target: ObjectLiteralExpression, value: Expression) {
|
||||
let properties = target.properties;
|
||||
if (properties.length !== 1) {
|
||||
|
@ -3108,7 +3083,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
|||
|
||||
function emitDestructuringAssignment(target: Expression, value: Expression) {
|
||||
if (target.kind === SyntaxKind.BinaryExpression && (<BinaryExpression>target).operatorToken.kind === SyntaxKind.EqualsToken) {
|
||||
value = createDefaultValueCheck(value, (<BinaryExpression>target).right);
|
||||
value = factory.createDefaultValueCheck(value, (<BinaryExpression>target).right, ensureIdentifier);
|
||||
target = (<BinaryExpression>target).left;
|
||||
}
|
||||
if (target.kind === SyntaxKind.ObjectLiteralExpression) {
|
||||
|
@ -3145,7 +3120,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
|||
function emitBindingElement(target: BindingElement, value: Expression) {
|
||||
if (target.initializer) {
|
||||
// Combine value and initializer
|
||||
value = value ? createDefaultValueCheck(value, target.initializer) : target.initializer;
|
||||
value = value ? factory.createDefaultValueCheck(value, target.initializer, ensureIdentifier) : target.initializer;
|
||||
}
|
||||
else if (!value) {
|
||||
// Use 'void 0' in absence of value and initializer
|
||||
|
@ -6601,4 +6576,4 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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;
|
||||
|
@ -148,21 +156,10 @@ namespace ts {
|
|||
export function createVoidZeroExpression(): VoidExpression {
|
||||
return factory.createVoidExpression(factory.createNumericLiteral2(0));
|
||||
}
|
||||
|
||||
export function cloneIdentifier(node: Identifier) {
|
||||
return factory.createIdentifier(
|
||||
node.text);
|
||||
}
|
||||
|
||||
export function cloneIdentifierOrLiteralExpression(node: Identifier | LiteralExpression) {
|
||||
let newNode = factory.createNode<Identifier | LiteralExpression>(node.kind);
|
||||
newNode.text = node.text;
|
||||
return newNode;
|
||||
}
|
||||
|
||||
|
||||
export function createPropertyOrElementAccessExpression(expression: Expression, propName: Identifier | LiteralExpression): LeftHandSideExpression {
|
||||
if (!nodeIsSynthesized(propName)) {
|
||||
propName = cloneIdentifierOrLiteralExpression(propName);
|
||||
propName = cloneNode(propName);
|
||||
}
|
||||
|
||||
if (propName.kind !== SyntaxKind.Identifier) {
|
||||
|
@ -197,5 +194,22 @@ namespace ts {
|
|||
]
|
||||
);
|
||||
}
|
||||
|
||||
export function createDefaultValueCheck(value: Expression, defaultValue: Expression, ensureIdentifier: (value: Expression) => Expression): Expression {
|
||||
// The value expression will be evaluated twice, so for anything but a simple identifier
|
||||
// we need to generate a temporary variable
|
||||
value = ensureIdentifier(value);
|
||||
|
||||
// <value> === void 0 ? <defaultValue> : <value>
|
||||
return factory.createConditionalExpression2(
|
||||
factory.createBinaryExpression2(
|
||||
value,
|
||||
SyntaxKind.EqualsEqualsEqualsToken,
|
||||
factory.createVoidZeroExpression()
|
||||
),
|
||||
defaultValue,
|
||||
value
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -453,6 +453,7 @@ namespace ts {
|
|||
// @factoryhidden("decorators", true)
|
||||
// @factoryhidden("modifiers", true)
|
||||
// @factoryhidden("parent", true)
|
||||
// @factoryhidden("original", true)
|
||||
// @factoryhidden("jsDocComment", true)
|
||||
// @factoryhidden("nextContainer", true)
|
||||
// @factoryorder("decorators", "modifiers")
|
||||
|
@ -467,7 +468,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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue