Cleanup and organization

This commit is contained in:
Ron Buckton 2015-08-26 13:19:18 -07:00
parent 152e3ebc44
commit 5d0797b2e0
15 changed files with 1750 additions and 1951 deletions

View file

@ -72,6 +72,7 @@ interface SyntaxMember {
isNode?: boolean;
isNodeArray?: boolean;
isModifiersArray?: boolean;
startsNewLexicalEnvironment?: boolean;
}
interface EnumValue<T extends number> {
@ -267,7 +268,9 @@ function discover() {
propertyIsNodeArray ? normalizeTypeName((<TypeReferenceNode>typeNode).typeArguments[0].getText()) :
propertyIsModifiersArray ? "Modifier" :
undefined;
let propertyStartsNewLexicalEnvironment = propertyIsNode && startsNewLexicalEnvironment(property);
members.push({
propertyName: property.name,
paramName: property.name === "arguments" ? "_arguments" : property.name,
@ -277,7 +280,8 @@ function discover() {
isFactoryParam: propertyIsFactoryParam,
isNodeArray: propertyIsNodeArray,
isModifiersArray: propertyIsModifiersArray,
isNode: propertyIsNode
isNode: propertyIsNode,
startsNewLexicalEnvironment: propertyStartsNewLexicalEnvironment
});
if (!propertyIsFactoryParam) {
@ -470,7 +474,20 @@ function generateFactory(outputFile: string) {
writer.write(`let node = createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName}, location, flags);`);
writer.writeLine();
if (syntaxNode.members.length > 1) {
writer.write(`if (arguments.length) {`);
writer.write(`if (`);
let first = true;
for (let member of syntaxNode.members) {
if (first) {
first = false;
}
else {
writer.write(` || `);
}
writer.write(member.paramName);
}
writer.write(`) {`);
writer.writeLine();
writer.increaseIndent();
}
@ -744,78 +761,14 @@ function generateTransform(outputFile: string) {
writer.writeLine();
writer.increaseIndent();
writeAcceptFunction();
writeVisitNodesFunctions();
writer.decreaseIndent();
writer.write(`}`);
writer.writeLine();
sys.writeFile(outputFile, writer.getText());
function writeVisitNodesFunctions() {
// for (let typeName in memberTypeUsages) {
// if (hasProperty(memberTypeUsages, typeName)) {
// writeVisitNodeFunction(typeName);
// }
// }
// for (let typeName in nodeArrayTypeUsages) {
// if (getProperty(nodeArrayTypeUsages, typeName)) {
// writeVisitNodesFunction(typeName);
// }
// }
}
function writeVisitNodeFunction(typeName: string) {
// if (typeName === "Node") {
// return;
// }
// // Skip the visit function for this node if it is defined in transform.ts
// if (resolveQualifiedName(transformSourceFile, `ts.transform.visit${typeNameToMethodNameSuffix(typeName)}`, SymbolFlags.Function)) {
// return;
// }
// writer.write(`export function visit${typeNameToMethodNameSuffix(typeName)}(context: VisitorContext, node: ${typeName}, visitor: Visitor, mutator?: NodeWriter<${typeName}>): ${typeName} {`);
// writer.writeLine();
// writer.increaseIndent();
// writer.write(`let visited = visit(context, node, visitor, mutator);`);
// writer.writeLine();
// writer.write(`Debug.assert(!visited || is${typeNameToMethodNameSuffix(typeName)}(visited), "Wrong node kind after visit.");`);
// writer.writeLine();
// writer.write(`return <${typeName}>visited;`);
// writer.writeLine();
// writer.decreaseIndent();
// writer.write(`}`);
// writer.writeLine();
}
function writeVisitNodesFunction(typeName: string) {
if (typeName === "Node") {
return;
}
// Skip the visitNodes function for this node if it is defined in transform.ts
if (resolveQualifiedName(transformSourceFile, `ts.transform.visitNodeArrayOf${typeNameToMethodNameSuffix(typeName)}`, SymbolFlags.Function)) {
return;
}
writer.write(`export function visitNodeArrayOf${typeNameToMethodNameSuffix(typeName)}(context: VisitorContext, nodes: Array<${typeName}>, visitor: (context: VisitorContext, input: Node, write: (node: Node) => void) => void): NodeArray<${typeName}> {`);
writer.writeLine();
writer.increaseIndent();
writer.write(`return <NodeArray<${typeName}>>visitNodes(context, nodes, visitor, visit${typeNameToMethodNameSuffix(typeName)});`);
writer.writeLine();
writer.decreaseIndent();
writer.write(`}`);
writer.writeLine();
}
function writeAcceptFunction() {
writer.write(`export function accept(context: VisitorContext, node: Node, visitor: Visitor, write: (node: Node) => void): void {`);
writer.write(`export function accept(node: Node, visitor: (input: Node, write: (node: Node) => void) => void, write: (node: Node) => void): void {`);
writer.writeLine();
writer.increaseIndent();
@ -860,17 +813,13 @@ function generateTransform(outputFile: string) {
writer.write(`(<${syntaxNode.typeName}>node).${member.propertyName}`);
}
else {
// let visitorFunction =
// member.visitorFunction ? member.visitorFunction :
// member.isNodeArray || member.isModifiersArray ? `visitNodeArrayOf${typeNameToMethodNameSuffix(member.elementTypeName)}` :
// `visit${typeNameToMethodNameSuffix(member.typeName)}`;
let visitorFunction =
member.visitorFunction ? member.visitorFunction :
member.isNodeArray || member.isModifiersArray ? `<NodeArray<${member.elementTypeName}>>visitNodes` :
member.startsNewLexicalEnvironment ? `<${member.typeName}>visitNewLexicalEnvironment` :
`<${member.typeName}>visitNode`;
writer.write(`${visitorFunction}(context, (<${syntaxNode.typeName}>node).${member.propertyName}, visitor)`);
writer.write(`${visitorFunction}((<${syntaxNode.typeName}>node).${member.propertyName}, visitor)`);
}
}
@ -1614,6 +1563,15 @@ class MemberVisitorAnnotation extends Annotation {
}
}
@annotation("newlexicalenvironment")
class NewLexicalEnvironmentAnnotation extends Annotation {
public name = "newlexicalenvironment";
public static match(annotation: Annotation): annotation is NewLexicalEnvironmentAnnotation {
return annotation instanceof NewLexicalEnvironmentAnnotation;
}
}
function createAnnotation(name: string, _arguments: any[]): Annotation {
let ctor = getProperty(annotationConstructors, name);
if (ctor) {
@ -1763,5 +1721,9 @@ function getFactoryOrder(symbol: Symbol, inherited?: boolean): string[] {
return propertyNames;
}
function startsNewLexicalEnvironment(symbol: Symbol): boolean {
return !!findFirstAnnotation(symbol, NewLexicalEnvironmentAnnotation.match);
}
// Main entry point
main();

View file

@ -82,6 +82,10 @@ namespace ts {
bindSourceFileWorker(file);
bindTime += new Date().getTime() - start;
}
// function computeTransformFlagsForNode(node: Node, subtreeFlags: TransformFlags) {
// return 0;
// }
function bindSourceFileWorker(file: SourceFile) {
let parent: Node;
@ -816,7 +820,7 @@ namespace ts {
let saveTransformFlags = transformFlags;
transformFlags = 0;
let result = cbNode(node);
transformFlags = saveTransformFlags | transform.computeTransformFlagsForNode(node, transformFlags);
transformFlags = saveTransformFlags | computeTransformFlagsForNode(node, transformFlags);
return result;
}

View file

@ -803,6 +803,10 @@ namespace ts {
end: -1,
flags: 0,
parent: undefined,
original: undefined,
transformFlags: undefined,
excludeTransformFlags: undefined,
modifiers: undefined
};
return <any>Node;
},

View file

@ -7271,8 +7271,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
// Process tree transformations
let statements = node.statements;
if (compilerOptions.experimentalTransforms) {
let context = new transform.VisitorContext(compilerOptions, currentSourceFile, resolver, generatedNameSet, nodeToGeneratedName);
statements = transformationChain(context, node.statements);
statements = runTransformationChain(statements, transformationChain, compilerOptions, currentSourceFile, resolver, generatedNameSet, nodeToGeneratedName);
}
// emit prologue directives prior to __extends

View file

@ -40,7 +40,7 @@ namespace ts {
}
export function createIdentifier(text?: string, originalKeywordKind?: SyntaxKind, location?: TextRange, flags?: NodeFlags): Identifier {
let node = createNode<Identifier>(SyntaxKind.Identifier, location, flags);
if (arguments.length) {
if (text || originalKeywordKind) {
node.text = text;
node.originalKeywordKind = originalKeywordKind;
}
@ -60,7 +60,7 @@ namespace ts {
}
export function createQualifiedName(left?: EntityName, right?: Identifier, location?: TextRange, flags?: NodeFlags): QualifiedName {
let node = createNode<QualifiedName>(SyntaxKind.QualifiedName, location, flags);
if (arguments.length) {
if (left || right) {
node.left = left;
node.right = right;
}
@ -88,7 +88,7 @@ namespace ts {
export function createTypeParameter(name?: Identifier, constraint?: TypeNode, expression?: Expression,
location?: TextRange, flags?: NodeFlags): TypeParameterDeclaration {
let node = createNode<TypeParameterDeclaration>(SyntaxKind.TypeParameter, location, flags);
if (arguments.length) {
if (name || constraint || expression) {
node.name = name;
node.constraint = constraint;
node.expression = expression;
@ -107,7 +107,7 @@ namespace ts {
name?: BindingPattern | Identifier, questionToken?: Node, type?: TypeNode, initializer?: Expression,
location?: TextRange, flags?: NodeFlags): ParameterDeclaration {
let node = createNode<ParameterDeclaration>(SyntaxKind.Parameter, location, flags);
if (arguments.length) {
if (decorators || modifiers || dotDotDotToken || name || questionToken || type || initializer) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.dotDotDotToken = dotDotDotToken;
@ -142,7 +142,7 @@ namespace ts {
export function createPropertySignature(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: PropertyName, questionToken?: Node,
type?: TypeNode, location?: TextRange, flags?: NodeFlags): PropertySignature {
let node = createNode<PropertySignature>(SyntaxKind.PropertySignature, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || questionToken || type) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -162,7 +162,7 @@ namespace ts {
export function createPropertyDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: PropertyName, type?: TypeNode,
initializer?: Expression, location?: TextRange, flags?: NodeFlags): PropertyDeclaration {
let node = createNode<PropertyDeclaration>(SyntaxKind.PropertyDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || type || initializer) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -184,7 +184,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>, type?: TypeNode,
location?: TextRange, flags?: NodeFlags): MethodSignature {
let node = createNode<MethodSignature>(SyntaxKind.MethodSignature, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || questionToken || typeParameters || parameters || type) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -208,7 +208,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>, type?: TypeNode, body?: Block,
location?: TextRange, flags?: NodeFlags): MethodDeclaration {
let node = createNode<MethodDeclaration>(SyntaxKind.MethodDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || asteriskToken || name || typeParameters || parameters || type || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.asteriskToken = asteriskToken;
@ -233,7 +233,7 @@ namespace ts {
export function createConstructor(decorators?: Array<Decorator>, modifiers?: Array<Node>, parameters?: Array<ParameterDeclaration>,
type?: TypeNode, body?: Block, location?: TextRange, flags?: NodeFlags): ConstructorDeclaration {
let node = createNode<ConstructorDeclaration>(SyntaxKind.Constructor, location, flags);
if (arguments.length) {
if (decorators || modifiers || parameters || type || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.parameters = parameters && createNodeArray(parameters)
@ -255,7 +255,7 @@ namespace ts {
parameters?: Array<ParameterDeclaration>, type?: TypeNode, body?: Block,
location?: TextRange, flags?: NodeFlags): GetAccessorDeclaration {
let node = createNode<GetAccessorDeclaration>(SyntaxKind.GetAccessor, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || parameters || type || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -278,7 +278,7 @@ namespace ts {
parameters?: Array<ParameterDeclaration>, type?: TypeNode, body?: Block,
location?: TextRange, flags?: NodeFlags): SetAccessorDeclaration {
let node = createNode<SetAccessorDeclaration>(SyntaxKind.SetAccessor, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || parameters || type || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -300,7 +300,7 @@ namespace ts {
export function createCallSignature(typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>,
type?: TypeNode, questionToken?: Node, location?: TextRange, flags?: NodeFlags): CallSignatureDeclaration {
let node = createNode<CallSignatureDeclaration>(SyntaxKind.CallSignature, location, flags);
if (arguments.length) {
if (typeParameters || parameters || type || questionToken) {
node.typeParameters = typeParameters && createNodeArray(typeParameters)
node.parameters = parameters && createNodeArray(parameters)
node.type = type;
@ -319,7 +319,7 @@ namespace ts {
export function createConstructSignature(typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>,
type?: TypeNode, questionToken?: Node, location?: TextRange, flags?: NodeFlags): ConstructSignatureDeclaration {
let node = createNode<ConstructSignatureDeclaration>(SyntaxKind.ConstructSignature, location, flags);
if (arguments.length) {
if (typeParameters || parameters || type || questionToken) {
node.typeParameters = typeParameters && createNodeArray(typeParameters)
node.parameters = parameters && createNodeArray(parameters)
node.type = type;
@ -338,7 +338,7 @@ namespace ts {
export function createIndexSignature(decorators?: Array<Decorator>, modifiers?: Array<Node>, parameters?: Array<ParameterDeclaration>,
type?: TypeNode, questionToken?: Node, location?: TextRange, flags?: NodeFlags): IndexSignatureDeclaration {
let node = createNode<IndexSignatureDeclaration>(SyntaxKind.IndexSignature, location, flags);
if (arguments.length) {
if (decorators || modifiers || parameters || type || questionToken) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.parameters = parameters && createNodeArray(parameters)
@ -358,7 +358,7 @@ namespace ts {
export function createTypePredicate(parameterName?: Identifier, type?: TypeNode,
location?: TextRange, flags?: NodeFlags): TypePredicateNode {
let node = createNode<TypePredicateNode>(SyntaxKind.TypePredicate, location, flags);
if (arguments.length) {
if (parameterName || type) {
node.parameterName = parameterName;
node.type = type;
}
@ -374,7 +374,7 @@ namespace ts {
export function createTypeReference(typeName?: EntityName, typeArguments?: Array<TypeNode>,
location?: TextRange, flags?: NodeFlags): TypeReferenceNode {
let node = createNode<TypeReferenceNode>(SyntaxKind.TypeReference, location, flags);
if (arguments.length) {
if (typeName || typeArguments) {
node.typeName = typeName;
node.typeArguments = typeArguments && createNodeArray(typeArguments)
}
@ -390,7 +390,7 @@ namespace ts {
export function createFunctionType(typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>,
type?: TypeNode, location?: TextRange, flags?: NodeFlags): FunctionTypeNode {
let node = createNode<FunctionTypeNode>(SyntaxKind.FunctionType, location, flags);
if (arguments.length) {
if (typeParameters || parameters || type) {
node.typeParameters = typeParameters && createNodeArray(typeParameters)
node.parameters = parameters && createNodeArray(parameters)
node.type = type;
@ -408,7 +408,7 @@ namespace ts {
export function createConstructorType(typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>,
type?: TypeNode, location?: TextRange, flags?: NodeFlags): ConstructorTypeNode {
let node = createNode<ConstructorTypeNode>(SyntaxKind.ConstructorType, location, flags);
if (arguments.length) {
if (typeParameters || parameters || type) {
node.typeParameters = typeParameters && createNodeArray(typeParameters)
node.parameters = parameters && createNodeArray(parameters)
node.type = type;
@ -535,7 +535,7 @@ namespace ts {
dotDotDotToken?: Node, name?: BindingPattern | Identifier, initializer?: Expression,
location?: TextRange, flags?: NodeFlags): BindingElement {
let node = createNode<BindingElement>(SyntaxKind.BindingElement, location, flags);
if (arguments.length) {
if (decorators || modifiers || propertyName || dotDotDotToken || name || initializer) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.propertyName = propertyName;
@ -569,7 +569,7 @@ namespace ts {
export function createObjectLiteralExpression(decorators?: Array<Decorator>, modifiers?: Array<Node>,
properties?: Array<ObjectLiteralElement>, location?: TextRange, flags?: NodeFlags): ObjectLiteralExpression {
let node = createNode<ObjectLiteralExpression>(SyntaxKind.ObjectLiteralExpression, location, flags);
if (arguments.length) {
if (decorators || modifiers || properties) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.properties = properties && createNodeArray(properties)
@ -587,7 +587,7 @@ namespace ts {
export function createPropertyAccessExpression(expression?: LeftHandSideExpression, dotToken?: Node, name?: Identifier,
location?: TextRange, flags?: NodeFlags): PropertyAccessExpression {
let node = createNode<PropertyAccessExpression>(SyntaxKind.PropertyAccessExpression, location, flags);
if (arguments.length) {
if (expression || dotToken || name) {
node.expression = expression;
node.dotToken = dotToken;
node.name = name;
@ -605,7 +605,7 @@ namespace ts {
export function createElementAccessExpression(expression?: LeftHandSideExpression, argumentExpression?: Expression,
location?: TextRange, flags?: NodeFlags): ElementAccessExpression {
let node = createNode<ElementAccessExpression>(SyntaxKind.ElementAccessExpression, location, flags);
if (arguments.length) {
if (expression || argumentExpression) {
node.expression = expression;
node.argumentExpression = argumentExpression;
}
@ -622,7 +622,7 @@ namespace ts {
export function createCallExpression(expression?: LeftHandSideExpression, typeArguments?: Array<TypeNode>, _arguments?: Array<Expression>,
location?: TextRange, flags?: NodeFlags): CallExpression {
let node = createNode<CallExpression>(SyntaxKind.CallExpression, location, flags);
if (arguments.length) {
if (expression || typeArguments || _arguments) {
node.expression = expression;
node.typeArguments = typeArguments && createNodeArray(typeArguments)
node.arguments = _arguments && createNodeArray(_arguments)
@ -640,7 +640,7 @@ namespace ts {
export function createNewExpression(expression?: LeftHandSideExpression, typeArguments?: Array<TypeNode>, _arguments?: Array<Expression>,
location?: TextRange, flags?: NodeFlags): NewExpression {
let node = createNode<NewExpression>(SyntaxKind.NewExpression, location, flags);
if (arguments.length) {
if (expression || typeArguments || _arguments) {
node.expression = expression;
node.typeArguments = typeArguments && createNodeArray(typeArguments)
node.arguments = _arguments && createNodeArray(_arguments)
@ -658,7 +658,7 @@ namespace ts {
export function createTaggedTemplateExpression(tag?: LeftHandSideExpression, template?: LiteralExpression | TemplateExpression,
location?: TextRange, flags?: NodeFlags): TaggedTemplateExpression {
let node = createNode<TaggedTemplateExpression>(SyntaxKind.TaggedTemplateExpression, location, flags);
if (arguments.length) {
if (tag || template) {
node.tag = tag;
node.template = template;
}
@ -675,7 +675,7 @@ namespace ts {
export function createTypeAssertionExpression(type?: TypeNode, expression?: UnaryExpression,
location?: TextRange, flags?: NodeFlags): TypeAssertion {
let node = createNode<TypeAssertion>(SyntaxKind.TypeAssertionExpression, location, flags);
if (arguments.length) {
if (type || expression) {
node.type = type;
node.expression = expression;
}
@ -704,7 +704,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>, type?: TypeNode, body?: Block | Expression,
location?: TextRange, flags?: NodeFlags): FunctionExpression {
let node = createNode<FunctionExpression>(SyntaxKind.FunctionExpression, location, flags);
if (arguments.length) {
if (decorators || modifiers || asteriskToken || name || typeParameters || parameters || type || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.asteriskToken = asteriskToken;
@ -730,7 +730,7 @@ namespace ts {
parameters?: Array<ParameterDeclaration>, type?: TypeNode, equalsGreaterThanToken?: Node, body?: Block | Expression,
location?: TextRange, flags?: NodeFlags): ArrowFunction {
let node = createNode<ArrowFunction>(SyntaxKind.ArrowFunction, location, flags);
if (arguments.length) {
if (decorators || modifiers || typeParameters || parameters || type || equalsGreaterThanToken || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.typeParameters = typeParameters && createNodeArray(typeParameters)
@ -802,7 +802,7 @@ namespace ts {
export function createPrefixUnaryExpression(operator?: SyntaxKind, operand?: UnaryExpression,
location?: TextRange, flags?: NodeFlags): PrefixUnaryExpression {
let node = createNode<PrefixUnaryExpression>(SyntaxKind.PrefixUnaryExpression, location, flags);
if (arguments.length) {
if (operator || operand) {
node.operator = operator;
node.operand = operand;
}
@ -818,7 +818,7 @@ namespace ts {
export function createPostfixUnaryExpression(operand?: LeftHandSideExpression, operator?: SyntaxKind,
location?: TextRange, flags?: NodeFlags): PostfixUnaryExpression {
let node = createNode<PostfixUnaryExpression>(SyntaxKind.PostfixUnaryExpression, location, flags);
if (arguments.length) {
if (operand || operator) {
node.operand = operand;
node.operator = operator;
}
@ -834,7 +834,7 @@ namespace ts {
export function createBinaryExpression(left?: Expression, operatorToken?: Node, right?: Expression,
location?: TextRange, flags?: NodeFlags): BinaryExpression {
let node = createNode<BinaryExpression>(SyntaxKind.BinaryExpression, location, flags);
if (arguments.length) {
if (left || operatorToken || right) {
node.left = left;
node.operatorToken = operatorToken;
node.right = right;
@ -851,7 +851,7 @@ namespace ts {
export function createConditionalExpression(condition?: Expression, questionToken?: Node, whenTrue?: Expression, colonToken?: Node,
whenFalse?: Expression, location?: TextRange, flags?: NodeFlags): ConditionalExpression {
let node = createNode<ConditionalExpression>(SyntaxKind.ConditionalExpression, location, flags);
if (arguments.length) {
if (condition || questionToken || whenTrue || colonToken || whenFalse) {
node.condition = condition;
node.questionToken = questionToken;
node.whenTrue = whenTrue;
@ -871,7 +871,7 @@ namespace ts {
export function createTemplateExpression(head?: LiteralExpression, templateSpans?: Array<TemplateSpan>,
location?: TextRange, flags?: NodeFlags): TemplateExpression {
let node = createNode<TemplateExpression>(SyntaxKind.TemplateExpression, location, flags);
if (arguments.length) {
if (head || templateSpans) {
node.head = head;
node.templateSpans = templateSpans && createNodeArray(templateSpans)
}
@ -888,7 +888,7 @@ namespace ts {
export function createYieldExpression(asteriskToken?: Node, expression?: Expression,
location?: TextRange, flags?: NodeFlags): YieldExpression {
let node = createNode<YieldExpression>(SyntaxKind.YieldExpression, location, flags);
if (arguments.length) {
if (asteriskToken || expression) {
node.asteriskToken = asteriskToken;
node.expression = expression;
}
@ -917,7 +917,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, heritageClauses?: Array<HeritageClause>, members?: Array<ClassElement>,
location?: TextRange, flags?: NodeFlags): ClassExpression {
let node = createNode<ClassExpression>(SyntaxKind.ClassExpression, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || typeParameters || heritageClauses || members) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -943,7 +943,7 @@ namespace ts {
export function createExpressionWithTypeArguments(expression?: LeftHandSideExpression, typeArguments?: Array<TypeNode>,
location?: TextRange, flags?: NodeFlags): ExpressionWithTypeArguments {
let node = createNode<ExpressionWithTypeArguments>(SyntaxKind.ExpressionWithTypeArguments, location, flags);
if (arguments.length) {
if (expression || typeArguments) {
node.expression = expression;
node.typeArguments = typeArguments && createNodeArray(typeArguments)
}
@ -959,7 +959,7 @@ namespace ts {
}
export function createAsExpression(expression?: Expression, type?: TypeNode, location?: TextRange, flags?: NodeFlags): AsExpression {
let node = createNode<AsExpression>(SyntaxKind.AsExpression, location, flags);
if (arguments.length) {
if (expression || type) {
node.expression = expression;
node.type = type;
}
@ -975,7 +975,7 @@ namespace ts {
export function createTemplateSpan(expression?: Expression, literal?: LiteralExpression,
location?: TextRange, flags?: NodeFlags): TemplateSpan {
let node = createNode<TemplateSpan>(SyntaxKind.TemplateSpan, location, flags);
if (arguments.length) {
if (expression || literal) {
node.expression = expression;
node.literal = literal;
}
@ -1006,7 +1006,7 @@ namespace ts {
export function createVariableStatement(decorators?: Array<Decorator>, modifiers?: Array<Node>, declarationList?: VariableDeclarationList,
location?: TextRange, flags?: NodeFlags): VariableStatement {
let node = createNode<VariableStatement>(SyntaxKind.VariableStatement, location, flags);
if (arguments.length) {
if (decorators || modifiers || declarationList) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.declarationList = declarationList;
@ -1039,7 +1039,7 @@ namespace ts {
export function createIfStatement(expression?: Expression, thenStatement?: Statement, elseStatement?: Statement,
location?: TextRange, flags?: NodeFlags): IfStatement {
let node = createNode<IfStatement>(SyntaxKind.IfStatement, location, flags);
if (arguments.length) {
if (expression || thenStatement || elseStatement) {
node.expression = expression;
node.thenStatement = thenStatement;
node.elseStatement = elseStatement;
@ -1056,7 +1056,7 @@ namespace ts {
}
export function createDoStatement(statement?: Statement, expression?: Expression, location?: TextRange, flags?: NodeFlags): DoStatement {
let node = createNode<DoStatement>(SyntaxKind.DoStatement, location, flags);
if (arguments.length) {
if (statement || expression) {
node.statement = statement;
node.expression = expression;
}
@ -1072,7 +1072,7 @@ namespace ts {
export function createWhileStatement(expression?: Expression, statement?: Statement,
location?: TextRange, flags?: NodeFlags): WhileStatement {
let node = createNode<WhileStatement>(SyntaxKind.WhileStatement, location, flags);
if (arguments.length) {
if (expression || statement) {
node.expression = expression;
node.statement = statement;
}
@ -1088,7 +1088,7 @@ namespace ts {
export function createForStatement(initializer?: Expression | VariableDeclarationList, condition?: Expression, incrementor?: Expression,
statement?: Statement, location?: TextRange, flags?: NodeFlags): ForStatement {
let node = createNode<ForStatement>(SyntaxKind.ForStatement, location, flags);
if (arguments.length) {
if (initializer || condition || incrementor || statement) {
node.initializer = initializer;
node.condition = condition;
node.incrementor = incrementor;
@ -1108,7 +1108,7 @@ namespace ts {
export function createForInStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement,
location?: TextRange, flags?: NodeFlags): ForInStatement {
let node = createNode<ForInStatement>(SyntaxKind.ForInStatement, location, flags);
if (arguments.length) {
if (initializer || expression || statement) {
node.initializer = initializer;
node.expression = expression;
node.statement = statement;
@ -1126,7 +1126,7 @@ namespace ts {
export function createForOfStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement,
location?: TextRange, flags?: NodeFlags): ForOfStatement {
let node = createNode<ForOfStatement>(SyntaxKind.ForOfStatement, location, flags);
if (arguments.length) {
if (initializer || expression || statement) {
node.initializer = initializer;
node.expression = expression;
node.statement = statement;
@ -1179,7 +1179,7 @@ namespace ts {
}
export function createWithStatement(expression?: Expression, statement?: Statement, location?: TextRange, flags?: NodeFlags): WithStatement {
let node = createNode<WithStatement>(SyntaxKind.WithStatement, location, flags);
if (arguments.length) {
if (expression || statement) {
node.expression = expression;
node.statement = statement;
}
@ -1195,7 +1195,7 @@ namespace ts {
export function createSwitchStatement(expression?: Expression, caseBlock?: CaseBlock,
location?: TextRange, flags?: NodeFlags): SwitchStatement {
let node = createNode<SwitchStatement>(SyntaxKind.SwitchStatement, location, flags);
if (arguments.length) {
if (expression || caseBlock) {
node.expression = expression;
node.caseBlock = caseBlock;
}
@ -1211,7 +1211,7 @@ namespace ts {
export function createLabeledStatement(label?: Identifier, statement?: Statement,
location?: TextRange, flags?: NodeFlags): LabeledStatement {
let node = createNode<LabeledStatement>(SyntaxKind.LabeledStatement, location, flags);
if (arguments.length) {
if (label || statement) {
node.label = label;
node.statement = statement;
}
@ -1239,7 +1239,7 @@ namespace ts {
export function createTryStatement(tryBlock?: Block, catchClause?: CatchClause, finallyBlock?: Block,
location?: TextRange, flags?: NodeFlags): TryStatement {
let node = createNode<TryStatement>(SyntaxKind.TryStatement, location, flags);
if (arguments.length) {
if (tryBlock || catchClause || finallyBlock) {
node.tryBlock = tryBlock;
node.catchClause = catchClause;
node.finallyBlock = finallyBlock;
@ -1259,7 +1259,7 @@ namespace ts {
export function createVariableDeclaration(name?: BindingPattern | Identifier, type?: TypeNode, initializer?: Expression,
location?: TextRange, flags?: NodeFlags): VariableDeclaration {
let node = createNode<VariableDeclaration>(SyntaxKind.VariableDeclaration, location, flags);
if (arguments.length) {
if (name || type || initializer) {
node.name = name;
node.type = type;
node.initializer = initializer;
@ -1292,7 +1292,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, parameters?: Array<ParameterDeclaration>, type?: TypeNode, body?: Block,
location?: TextRange, flags?: NodeFlags): FunctionDeclaration {
let node = createNode<FunctionDeclaration>(SyntaxKind.FunctionDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || asteriskToken || name || typeParameters || parameters || type || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.asteriskToken = asteriskToken;
@ -1318,7 +1318,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, heritageClauses?: Array<HeritageClause>, members?: Array<ClassElement>,
location?: TextRange, flags?: NodeFlags): ClassDeclaration {
let node = createNode<ClassDeclaration>(SyntaxKind.ClassDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || typeParameters || heritageClauses || members) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -1342,7 +1342,7 @@ namespace ts {
typeParameters?: Array<TypeParameterDeclaration>, heritageClauses?: Array<HeritageClause>, members?: Array<TypeElement>,
location?: TextRange, flags?: NodeFlags): InterfaceDeclaration {
let node = createNode<InterfaceDeclaration>(SyntaxKind.InterfaceDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || typeParameters || heritageClauses || members) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -1365,7 +1365,7 @@ namespace ts {
export function createTypeAliasDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: Identifier,
typeParameters?: Array<TypeParameterDeclaration>, type?: TypeNode, location?: TextRange, flags?: NodeFlags): TypeAliasDeclaration {
let node = createNode<TypeAliasDeclaration>(SyntaxKind.TypeAliasDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || typeParameters || type) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -1386,7 +1386,7 @@ namespace ts {
export function createEnumDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: Identifier, members?: Array<EnumMember>,
location?: TextRange, flags?: NodeFlags): EnumDeclaration {
let node = createNode<EnumDeclaration>(SyntaxKind.EnumDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || members) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -1405,7 +1405,7 @@ namespace ts {
export function createModuleDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: Identifier | LiteralExpression,
body?: ModuleBlock | ModuleDeclaration, location?: TextRange, flags?: NodeFlags): ModuleDeclaration {
let node = createNode<ModuleDeclaration>(SyntaxKind.ModuleDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || body) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -1448,7 +1448,7 @@ namespace ts {
export function createImportEqualsDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: Identifier,
moduleReference?: EntityName | ExternalModuleReference, location?: TextRange, flags?: NodeFlags): ImportEqualsDeclaration {
let node = createNode<ImportEqualsDeclaration>(SyntaxKind.ImportEqualsDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || name || moduleReference) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.name = name;
@ -1467,7 +1467,7 @@ namespace ts {
export function createImportDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, importClause?: ImportClause,
moduleSpecifier?: Expression, location?: TextRange, flags?: NodeFlags): ImportDeclaration {
let node = createNode<ImportDeclaration>(SyntaxKind.ImportDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || importClause || moduleSpecifier) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.importClause = importClause;
@ -1487,7 +1487,7 @@ namespace ts {
export function createImportClause(name?: Identifier, namedBindings?: NamedImports | NamespaceImport,
location?: TextRange, flags?: NodeFlags): ImportClause {
let node = createNode<ImportClause>(SyntaxKind.ImportClause, location, flags);
if (arguments.length) {
if (name || namedBindings) {
node.name = name;
node.namedBindings = namedBindings;
}
@ -1527,7 +1527,7 @@ namespace ts {
export function createImportSpecifier(propertyName?: Identifier, name?: Identifier,
location?: TextRange, flags?: NodeFlags): ImportSpecifier {
let node = createNode<ImportSpecifier>(SyntaxKind.ImportSpecifier, location, flags);
if (arguments.length) {
if (propertyName || name) {
node.propertyName = propertyName;
node.name = name;
}
@ -1543,7 +1543,7 @@ namespace ts {
export function createExportAssignment(decorators?: Array<Decorator>, modifiers?: Array<Node>, expression?: Expression,
location?: TextRange, flags?: NodeFlags): ExportAssignment {
let node = createNode<ExportAssignment>(SyntaxKind.ExportAssignment, location, flags);
if (arguments.length) {
if (decorators || modifiers || expression) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.expression = expression;
@ -1561,7 +1561,7 @@ namespace ts {
export function createExportDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, exportClause?: NamedExports,
moduleSpecifier?: Expression, location?: TextRange, flags?: NodeFlags): ExportDeclaration {
let node = createNode<ExportDeclaration>(SyntaxKind.ExportDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || exportClause || moduleSpecifier) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.exportClause = exportClause;
@ -1593,7 +1593,7 @@ namespace ts {
export function createExportSpecifier(propertyName?: Identifier, name?: Identifier,
location?: TextRange, flags?: NodeFlags): ExportSpecifier {
let node = createNode<ExportSpecifier>(SyntaxKind.ExportSpecifier, location, flags);
if (arguments.length) {
if (propertyName || name) {
node.propertyName = propertyName;
node.name = name;
}
@ -1609,7 +1609,7 @@ namespace ts {
export function createMissingDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, questionToken?: Node,
location?: TextRange, flags?: NodeFlags): MissingDeclaration {
let node = createNode<MissingDeclaration>(SyntaxKind.MissingDeclaration, location, flags);
if (arguments.length) {
if (decorators || modifiers || questionToken) {
node.decorators = decorators && createNodeArray(decorators)
setModifiers(node, modifiers);
node.questionToken = questionToken;
@ -1639,7 +1639,7 @@ namespace ts {
export function createJsxElement(openingElement?: JsxOpeningElement, children?: Array<JsxChild>, closingElement?: JsxClosingElement,
location?: TextRange, flags?: NodeFlags): JsxElement {
let node = createNode<JsxElement>(SyntaxKind.JsxElement, location, flags);
if (arguments.length) {
if (openingElement || children || closingElement) {
node.openingElement = openingElement;
node.children = children && createNodeArray(children)
node.closingElement = closingElement;
@ -1657,7 +1657,7 @@ namespace ts {
export function createJsxSelfClosingElement(tagName?: EntityName, attributes?: Array<JsxAttribute | JsxSpreadAttribute>,
location?: TextRange, flags?: NodeFlags): JsxSelfClosingElement {
let node = createNode<JsxSelfClosingElement>(SyntaxKind.JsxSelfClosingElement, location, flags);
if (arguments.length) {
if (tagName || attributes) {
node.tagName = tagName;
node.attributes = attributes && createNodeArray(attributes)
}
@ -1674,7 +1674,7 @@ namespace ts {
export function createJsxOpeningElement(tagName?: EntityName, attributes?: Array<JsxAttribute | JsxSpreadAttribute>,
location?: TextRange, flags?: NodeFlags): JsxOpeningElement {
let node = createNode<JsxOpeningElement>(SyntaxKind.JsxOpeningElement, location, flags);
if (arguments.length) {
if (tagName || attributes) {
node.tagName = tagName;
node.attributes = attributes && createNodeArray(attributes)
}
@ -1705,7 +1705,7 @@ namespace ts {
}
export function createJsxAttribute(name?: Identifier, initializer?: Expression, location?: TextRange, flags?: NodeFlags): JsxAttribute {
let node = createNode<JsxAttribute>(SyntaxKind.JsxAttribute, location, flags);
if (arguments.length) {
if (name || initializer) {
node.name = name;
node.initializer = initializer;
}
@ -1745,7 +1745,7 @@ namespace ts {
export function createCaseClause(expression?: Expression, statements?: Array<Statement>,
location?: TextRange, flags?: NodeFlags): CaseClause {
let node = createNode<CaseClause>(SyntaxKind.CaseClause, location, flags);
if (arguments.length) {
if (expression || statements) {
node.expression = expression;
node.statements = statements && createNodeArray(statements)
}
@ -1773,7 +1773,7 @@ namespace ts {
export function createHeritageClause(token?: SyntaxKind, types?: Array<ExpressionWithTypeArguments>,
location?: TextRange, flags?: NodeFlags): HeritageClause {
let node = createNode<HeritageClause>(SyntaxKind.HeritageClause, location, flags);
if (arguments.length) {
if (token || types) {
node.token = token;
node.types = types && createNodeArray(types)
}
@ -1789,7 +1789,7 @@ namespace ts {
export function createCatchClause(variableDeclaration?: VariableDeclaration, block?: Block,
location?: TextRange, flags?: NodeFlags): CatchClause {
let node = createNode<CatchClause>(SyntaxKind.CatchClause, location, flags);
if (arguments.length) {
if (variableDeclaration || block) {
node.variableDeclaration = variableDeclaration;
node.block = block;
}
@ -1805,7 +1805,7 @@ namespace ts {
export function createPropertyAssignment(name?: PropertyName, initializer?: Expression,
location?: TextRange, flags?: NodeFlags): PropertyAssignment {
let node = createNode<PropertyAssignment>(SyntaxKind.PropertyAssignment, location, flags);
if (arguments.length) {
if (name || initializer) {
node.name = name;
node.initializer = initializer;
}
@ -1832,7 +1832,7 @@ namespace ts {
}
export function createEnumMember(name?: DeclarationName, initializer?: Expression, location?: TextRange, flags?: NodeFlags): EnumMember {
let node = createNode<EnumMember>(SyntaxKind.EnumMember, location, flags);
if (arguments.length) {
if (name || initializer) {
node.name = name;
node.initializer = initializer;
}
@ -1938,7 +1938,7 @@ namespace ts {
export function createJSDocRecordMember(name?: Identifier | LiteralExpression, type?: JSDocType,
location?: TextRange, flags?: NodeFlags): JSDocRecordMember {
let node = createNode<JSDocRecordMember>(SyntaxKind.JSDocRecordMember, location, flags);
if (arguments.length) {
if (name || type) {
node.name = name;
node.type = type;
}
@ -1954,7 +1954,7 @@ namespace ts {
export function createJSDocTypeReference(name?: EntityName, typeArguments?: Array<JSDocType>,
location?: TextRange, flags?: NodeFlags): JSDocTypeReference {
let node = createNode<JSDocTypeReference>(SyntaxKind.JSDocTypeReference, location, flags);
if (arguments.length) {
if (name || typeArguments) {
node.name = name;
node.typeArguments = typeArguments && createNodeArray(typeArguments)
}
@ -1982,7 +1982,7 @@ namespace ts {
export function createJSDocFunctionType(parameters?: Array<ParameterDeclaration>, type?: JSDocType,
location?: TextRange, flags?: NodeFlags): JSDocFunctionType {
let node = createNode<JSDocFunctionType>(SyntaxKind.JSDocFunctionType, location, flags);
if (arguments.length) {
if (parameters || type) {
node.parameters = parameters && createNodeArray(parameters)
node.type = type;
}
@ -2046,7 +2046,7 @@ namespace ts {
}
export function createJSDocTag(atToken?: Node, tagName?: Identifier, location?: TextRange, flags?: NodeFlags): JSDocTag {
let node = createNode<JSDocTag>(SyntaxKind.JSDocTag, location, flags);
if (arguments.length) {
if (atToken || tagName) {
node.atToken = atToken;
node.tagName = tagName;
}
@ -2062,7 +2062,7 @@ namespace ts {
export function createJSDocParameterTag(preParameterName?: Identifier, typeExpression?: JSDocTypeExpression, postParameterName?: Identifier,
atToken?: Node, tagName?: Identifier, location?: TextRange, flags?: NodeFlags): JSDocParameterTag {
let node = createNode<JSDocParameterTag>(SyntaxKind.JSDocParameterTag, location, flags);
if (arguments.length) {
if (preParameterName || typeExpression || postParameterName || atToken || tagName) {
node.preParameterName = preParameterName;
node.typeExpression = typeExpression;
node.postParameterName = postParameterName;
@ -2083,7 +2083,7 @@ namespace ts {
export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, atToken?: Node, tagName?: Identifier,
location?: TextRange, flags?: NodeFlags): JSDocReturnTag {
let node = createNode<JSDocReturnTag>(SyntaxKind.JSDocReturnTag, location, flags);
if (arguments.length) {
if (typeExpression || atToken || tagName) {
node.typeExpression = typeExpression;
node.atToken = atToken;
node.tagName = tagName;
@ -2100,7 +2100,7 @@ namespace ts {
export function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, atToken?: Node, tagName?: Identifier,
location?: TextRange, flags?: NodeFlags): JSDocTypeTag {
let node = createNode<JSDocTypeTag>(SyntaxKind.JSDocTypeTag, location, flags);
if (arguments.length) {
if (typeExpression || atToken || tagName) {
node.typeExpression = typeExpression;
node.atToken = atToken;
node.tagName = tagName;
@ -2117,7 +2117,7 @@ namespace ts {
export function createJSDocTemplateTag(typeParameters?: Array<TypeParameterDeclaration>, atToken?: Node, tagName?: Identifier,
location?: TextRange, flags?: NodeFlags): JSDocTemplateTag {
let node = createNode<JSDocTemplateTag>(SyntaxKind.JSDocTemplateTag, location, flags);
if (arguments.length) {
if (typeParameters || atToken || tagName) {
node.typeParameters = typeParameters && createNodeArray(typeParameters)
node.atToken = atToken;
node.tagName = tagName;

View file

@ -64,9 +64,11 @@ namespace ts {
newNode.flags = flags;
newNode.original = oldNode;
newNode.pos = oldNode.pos;
newNode.end = oldNode.end;
mergeCommentRanges(oldNode, newNode);
return setTextRange(newNode, oldNode);
//mergeCommentRanges(oldNode, newNode);
return newNode;
}
function mergeCommentRanges(oldNode: Node, newNode: Node) {
@ -83,21 +85,33 @@ namespace ts {
}
export function createNode<T extends Node>(kind: SyntaxKind, location?: TextRange, flags?: NodeFlags): T {
return setNodeFlags(setTextRange(<T>new (getNodeConstructor(kind))(), location), flags);
let node = <T>new (getNodeConstructor(kind))();
if (location) {
node.pos = location.pos;
node.end = location.end;
}
if (flags) {
node.flags = flags;
}
return node;
}
export function createNodeArray<T extends Node>(elements?: T[], location?: TextRange) {
let nodes = <NodeArray<T>>(elements || []);
if (nodes.pos === undefined) {
if (location) {
nodes.pos = location.pos;
nodes.end = location.end;
}
else if (nodes.pos === undefined) {
nodes.pos = -1;
nodes.end = -1;
}
return setTextRange(nodes, location);
return nodes;
}
export function createModifiersArray(elements?: Node[], location?: TextRange) {
let modifiers = <ModifiersArray>(elements || []);
let modifiers = <ModifiersArray>createNodeArray(elements || [], location);
if (modifiers.flags === undefined) {
let flags = 0;
for (let modifier of modifiers) {
@ -107,7 +121,7 @@ namespace ts {
modifiers.flags = flags;
}
return setTextRange(modifiers, location);
return modifiers;
}
export function createSourceFile(): SourceFile {

File diff suppressed because it is too large Load diff

View file

@ -713,6 +713,10 @@ namespace ts {
options.target !== ScriptTarget.ES6) {
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_experimentalAsyncFunctions_cannot_be_specified_when_targeting_ES5_or_lower));
}
if (FORCE_TRANSFORMS) {
options.experimentalTransforms = true;
}
}
}
}

View file

@ -3,7 +3,7 @@
/// <reference path="transform.ts" />
/* @internal */
namespace ts.transform {
export function accept(context: VisitorContext, node: Node, visitor: Visitor, write: (node: Node) => void): void {
export function accept(node: Node, visitor: (input: Node, write: (node: Node) => void) => void, write: (node: Node) => void): void {
if (!node) {
return;
}
@ -11,684 +11,684 @@ namespace ts.transform {
case SyntaxKind.QualifiedName:
return write(factory.updateQualifiedName(
<QualifiedName>node,
<EntityName>visitNode(context, (<QualifiedName>node).left, visitor),
<Identifier>visitNode(context, (<QualifiedName>node).right, visitor)));
<EntityName>visitNode((<QualifiedName>node).left, visitor),
<Identifier>visitNode((<QualifiedName>node).right, visitor)));
case SyntaxKind.ComputedPropertyName:
return write(factory.updateComputedPropertyName(
<ComputedPropertyName>node,
<Expression>visitNode(context, (<ComputedPropertyName>node).expression, visitor)));
<Expression>visitNode((<ComputedPropertyName>node).expression, visitor)));
case SyntaxKind.TypeParameter:
return write(factory.updateTypeParameter(
<TypeParameterDeclaration>node,
<Identifier>visitNode(context, (<TypeParameterDeclaration>node).name, visitor),
<TypeNode>visitNode(context, (<TypeParameterDeclaration>node).constraint, visitor),
<Expression>visitNode(context, (<TypeParameterDeclaration>node).expression, visitor)));
<Identifier>visitNode((<TypeParameterDeclaration>node).name, visitor),
<TypeNode>visitNode((<TypeParameterDeclaration>node).constraint, visitor),
<Expression>visitNode((<TypeParameterDeclaration>node).expression, visitor)));
case SyntaxKind.Parameter:
return write(factory.updateParameter(
<ParameterDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ParameterDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ParameterDeclaration>node).modifiers, visitor),
<BindingPattern | Identifier>visitNode(context, (<ParameterDeclaration>node).name, visitor),
<NodeArray<Decorator>>visitNodes((<ParameterDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ParameterDeclaration>node).modifiers, visitor),
<BindingPattern | Identifier>visitNode((<ParameterDeclaration>node).name, visitor),
(<ParameterDeclaration>node).questionToken,
<TypeNode>visitNode(context, (<ParameterDeclaration>node).type, visitor),
<Expression>visitNode(context, (<ParameterDeclaration>node).initializer, visitor)));
<TypeNode>visitNode((<ParameterDeclaration>node).type, visitor),
<Expression>visitNode((<ParameterDeclaration>node).initializer, visitor)));
case SyntaxKind.Decorator:
return write(factory.updateDecorator(
<Decorator>node,
<LeftHandSideExpression>visitNode(context, (<Decorator>node).expression, visitor)));
<LeftHandSideExpression>visitNode((<Decorator>node).expression, visitor)));
case SyntaxKind.PropertySignature:
return write(factory.updatePropertySignature(
<PropertySignature>node,
<NodeArray<Decorator>>visitNodes(context, (<PropertySignature>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<PropertySignature>node).modifiers, visitor),
<PropertyName>visitNode(context, (<PropertySignature>node).name, visitor),
<TypeNode>visitNode(context, (<PropertySignature>node).type, visitor)));
<NodeArray<Decorator>>visitNodes((<PropertySignature>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<PropertySignature>node).modifiers, visitor),
<PropertyName>visitNode((<PropertySignature>node).name, visitor),
<TypeNode>visitNode((<PropertySignature>node).type, visitor)));
case SyntaxKind.PropertyDeclaration:
return write(factory.updatePropertyDeclaration(
<PropertyDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<PropertyDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<PropertyDeclaration>node).modifiers, visitor),
<PropertyName>visitNode(context, (<PropertyDeclaration>node).name, visitor),
<TypeNode>visitNode(context, (<PropertyDeclaration>node).type, visitor),
<Expression>visitNode(context, (<PropertyDeclaration>node).initializer, visitor)));
<NodeArray<Decorator>>visitNodes((<PropertyDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<PropertyDeclaration>node).modifiers, visitor),
<PropertyName>visitNode((<PropertyDeclaration>node).name, visitor),
<TypeNode>visitNode((<PropertyDeclaration>node).type, visitor),
<Expression>visitNode((<PropertyDeclaration>node).initializer, visitor)));
case SyntaxKind.MethodSignature:
return write(factory.updateMethodSignature(
<MethodSignature>node,
<NodeArray<Decorator>>visitNodes(context, (<MethodSignature>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<MethodSignature>node).modifiers, visitor),
<PropertyName>visitNode(context, (<MethodSignature>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<MethodSignature>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<MethodSignature>node).parameters, visitor),
<TypeNode>visitNode(context, (<MethodSignature>node).type, visitor)));
<NodeArray<Decorator>>visitNodes((<MethodSignature>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<MethodSignature>node).modifiers, visitor),
<PropertyName>visitNode((<MethodSignature>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<MethodSignature>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<MethodSignature>node).parameters, visitor),
<TypeNode>visitNode((<MethodSignature>node).type, visitor)));
case SyntaxKind.MethodDeclaration:
return write(factory.updateMethodDeclaration(
<MethodDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<MethodDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<MethodDeclaration>node).modifiers, visitor),
<PropertyName>visitNode(context, (<MethodDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<MethodDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<MethodDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<MethodDeclaration>node).type, visitor),
<Block>visitNode(context, (<MethodDeclaration>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<MethodDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<MethodDeclaration>node).modifiers, visitor),
<PropertyName>visitNode((<MethodDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<MethodDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<MethodDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<MethodDeclaration>node).type, visitor),
<Block>visitNewLexicalEnvironment((<MethodDeclaration>node).body, visitor)));
case SyntaxKind.Constructor:
return write(factory.updateConstructor(
<ConstructorDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ConstructorDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ConstructorDeclaration>node).modifiers, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<ConstructorDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<ConstructorDeclaration>node).type, visitor),
<Block>visitNode(context, (<ConstructorDeclaration>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<ConstructorDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ConstructorDeclaration>node).modifiers, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<ConstructorDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<ConstructorDeclaration>node).type, visitor),
<Block>visitNewLexicalEnvironment((<ConstructorDeclaration>node).body, visitor)));
case SyntaxKind.GetAccessor:
return write(factory.updateGetAccessor(
<GetAccessorDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<GetAccessorDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<GetAccessorDeclaration>node).modifiers, visitor),
<PropertyName>visitNode(context, (<GetAccessorDeclaration>node).name, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<GetAccessorDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<GetAccessorDeclaration>node).type, visitor),
visitBlockInNewLexicalEnvironment(context, (<GetAccessorDeclaration>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<GetAccessorDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<GetAccessorDeclaration>node).modifiers, visitor),
<PropertyName>visitNode((<GetAccessorDeclaration>node).name, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<GetAccessorDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<GetAccessorDeclaration>node).type, visitor),
<Block>visitNewLexicalEnvironment((<GetAccessorDeclaration>node).body, visitor)));
case SyntaxKind.SetAccessor:
return write(factory.updateSetAccessor(
<SetAccessorDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<SetAccessorDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<SetAccessorDeclaration>node).modifiers, visitor),
<PropertyName>visitNode(context, (<SetAccessorDeclaration>node).name, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<SetAccessorDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<SetAccessorDeclaration>node).type, visitor),
visitBlockInNewLexicalEnvironment(context, (<SetAccessorDeclaration>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<SetAccessorDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<SetAccessorDeclaration>node).modifiers, visitor),
<PropertyName>visitNode((<SetAccessorDeclaration>node).name, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<SetAccessorDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<SetAccessorDeclaration>node).type, visitor),
<Block>visitNewLexicalEnvironment((<SetAccessorDeclaration>node).body, visitor)));
case SyntaxKind.CallSignature:
return write(factory.updateCallSignature(
<CallSignatureDeclaration>node,
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<CallSignatureDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<CallSignatureDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<CallSignatureDeclaration>node).type, visitor)));
<NodeArray<TypeParameterDeclaration>>visitNodes((<CallSignatureDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<CallSignatureDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<CallSignatureDeclaration>node).type, visitor)));
case SyntaxKind.ConstructSignature:
return write(factory.updateConstructSignature(
<ConstructSignatureDeclaration>node,
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<ConstructSignatureDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<ConstructSignatureDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<ConstructSignatureDeclaration>node).type, visitor)));
<NodeArray<TypeParameterDeclaration>>visitNodes((<ConstructSignatureDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<ConstructSignatureDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<ConstructSignatureDeclaration>node).type, visitor)));
case SyntaxKind.IndexSignature:
return write(factory.updateIndexSignature(
<IndexSignatureDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<IndexSignatureDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<IndexSignatureDeclaration>node).modifiers, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<IndexSignatureDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<IndexSignatureDeclaration>node).type, visitor)));
<NodeArray<Decorator>>visitNodes((<IndexSignatureDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<IndexSignatureDeclaration>node).modifiers, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<IndexSignatureDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<IndexSignatureDeclaration>node).type, visitor)));
case SyntaxKind.TypePredicate:
return write(factory.updateTypePredicate(
<TypePredicateNode>node,
<Identifier>visitNode(context, (<TypePredicateNode>node).parameterName, visitor),
<TypeNode>visitNode(context, (<TypePredicateNode>node).type, visitor)));
<Identifier>visitNode((<TypePredicateNode>node).parameterName, visitor),
<TypeNode>visitNode((<TypePredicateNode>node).type, visitor)));
case SyntaxKind.TypeReference:
return write(factory.updateTypeReference(
<TypeReferenceNode>node,
<EntityName>visitNode(context, (<TypeReferenceNode>node).typeName, visitor),
<NodeArray<TypeNode>>visitNodes(context, (<TypeReferenceNode>node).typeArguments, visitor)));
<EntityName>visitNode((<TypeReferenceNode>node).typeName, visitor),
<NodeArray<TypeNode>>visitNodes((<TypeReferenceNode>node).typeArguments, visitor)));
case SyntaxKind.FunctionType:
return write(factory.updateFunctionType(
<FunctionTypeNode>node,
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<FunctionTypeNode>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<FunctionTypeNode>node).parameters, visitor),
<TypeNode>visitNode(context, (<FunctionTypeNode>node).type, visitor)));
<NodeArray<TypeParameterDeclaration>>visitNodes((<FunctionTypeNode>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<FunctionTypeNode>node).parameters, visitor),
<TypeNode>visitNode((<FunctionTypeNode>node).type, visitor)));
case SyntaxKind.ConstructorType:
return write(factory.updateConstructorType(
<ConstructorTypeNode>node,
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<ConstructorTypeNode>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<ConstructorTypeNode>node).parameters, visitor),
<TypeNode>visitNode(context, (<ConstructorTypeNode>node).type, visitor)));
<NodeArray<TypeParameterDeclaration>>visitNodes((<ConstructorTypeNode>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<ConstructorTypeNode>node).parameters, visitor),
<TypeNode>visitNode((<ConstructorTypeNode>node).type, visitor)));
case SyntaxKind.TypeQuery:
return write(factory.updateTypeQuery(
<TypeQueryNode>node,
<EntityName>visitNode(context, (<TypeQueryNode>node).exprName, visitor)));
<EntityName>visitNode((<TypeQueryNode>node).exprName, visitor)));
case SyntaxKind.TypeLiteral:
return write(factory.updateTypeLiteral(
<TypeLiteralNode>node,
<NodeArray<TypeElement>>visitNodes(context, (<TypeLiteralNode>node).members, visitor)));
<NodeArray<TypeElement>>visitNodes((<TypeLiteralNode>node).members, visitor)));
case SyntaxKind.ArrayType:
return write(factory.updateArrayType(
<ArrayTypeNode>node,
<TypeNode>visitNode(context, (<ArrayTypeNode>node).elementType, visitor)));
<TypeNode>visitNode((<ArrayTypeNode>node).elementType, visitor)));
case SyntaxKind.TupleType:
return write(factory.updateTupleType(
<TupleTypeNode>node,
<NodeArray<TypeNode>>visitNodes(context, (<TupleTypeNode>node).elementTypes, visitor)));
<NodeArray<TypeNode>>visitNodes((<TupleTypeNode>node).elementTypes, visitor)));
case SyntaxKind.UnionType:
return write(factory.updateUnionType(
<UnionTypeNode>node,
<NodeArray<TypeNode>>visitNodes(context, (<UnionTypeNode>node).types, visitor)));
<NodeArray<TypeNode>>visitNodes((<UnionTypeNode>node).types, visitor)));
case SyntaxKind.IntersectionType:
return write(factory.updateIntersectionType(
<IntersectionTypeNode>node,
<NodeArray<TypeNode>>visitNodes(context, (<IntersectionTypeNode>node).types, visitor)));
<NodeArray<TypeNode>>visitNodes((<IntersectionTypeNode>node).types, visitor)));
case SyntaxKind.ParenthesizedType:
return write(factory.updateParenthesizedType(
<ParenthesizedTypeNode>node,
<TypeNode>visitNode(context, (<ParenthesizedTypeNode>node).type, visitor)));
<TypeNode>visitNode((<ParenthesizedTypeNode>node).type, visitor)));
case SyntaxKind.ObjectBindingPattern:
return write(factory.updateObjectBindingPattern(
<ObjectBindingPattern>node,
<NodeArray<BindingElement>>visitNodes(context, (<ObjectBindingPattern>node).elements, visitor)));
<NodeArray<BindingElement>>visitNodes((<ObjectBindingPattern>node).elements, visitor)));
case SyntaxKind.ArrayBindingPattern:
return write(factory.updateArrayBindingPattern(
<ArrayBindingPattern>node,
<NodeArray<BindingElement>>visitNodes(context, (<ArrayBindingPattern>node).elements, visitor)));
<NodeArray<BindingElement>>visitNodes((<ArrayBindingPattern>node).elements, visitor)));
case SyntaxKind.BindingElement:
return write(factory.updateBindingElement(
<BindingElement>node,
<NodeArray<Decorator>>visitNodes(context, (<BindingElement>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<BindingElement>node).modifiers, visitor),
<Identifier>visitNode(context, (<BindingElement>node).propertyName, visitor),
<BindingPattern | Identifier>visitNode(context, (<BindingElement>node).name, visitor),
<Expression>visitNode(context, (<BindingElement>node).initializer, visitor)));
<NodeArray<Decorator>>visitNodes((<BindingElement>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<BindingElement>node).modifiers, visitor),
<Identifier>visitNode((<BindingElement>node).propertyName, visitor),
<BindingPattern | Identifier>visitNode((<BindingElement>node).name, visitor),
<Expression>visitNode((<BindingElement>node).initializer, visitor)));
case SyntaxKind.ArrayLiteralExpression:
return write(factory.updateArrayLiteralExpression(
<ArrayLiteralExpression>node,
<NodeArray<Expression>>visitNodes(context, (<ArrayLiteralExpression>node).elements, visitor)));
<NodeArray<Expression>>visitNodes((<ArrayLiteralExpression>node).elements, visitor)));
case SyntaxKind.ObjectLiteralExpression:
return write(factory.updateObjectLiteralExpression(
<ObjectLiteralExpression>node,
<NodeArray<Decorator>>visitNodes(context, (<ObjectLiteralExpression>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ObjectLiteralExpression>node).modifiers, visitor),
<NodeArray<ObjectLiteralElement>>visitNodes(context, (<ObjectLiteralExpression>node).properties, visitor)));
<NodeArray<Decorator>>visitNodes((<ObjectLiteralExpression>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ObjectLiteralExpression>node).modifiers, visitor),
<NodeArray<ObjectLiteralElement>>visitNodes((<ObjectLiteralExpression>node).properties, visitor)));
case SyntaxKind.PropertyAccessExpression:
return write(factory.updatePropertyAccessExpression(
<PropertyAccessExpression>node,
<LeftHandSideExpression>visitNode(context, (<PropertyAccessExpression>node).expression, visitor),
<Identifier>visitNode(context, (<PropertyAccessExpression>node).name, visitor)));
<LeftHandSideExpression>visitNode((<PropertyAccessExpression>node).expression, visitor),
<Identifier>visitNode((<PropertyAccessExpression>node).name, visitor)));
case SyntaxKind.ElementAccessExpression:
return write(factory.updateElementAccessExpression(
<ElementAccessExpression>node,
<LeftHandSideExpression>visitNode(context, (<ElementAccessExpression>node).expression, visitor),
<Expression>visitNode(context, (<ElementAccessExpression>node).argumentExpression, visitor)));
<LeftHandSideExpression>visitNode((<ElementAccessExpression>node).expression, visitor),
<Expression>visitNode((<ElementAccessExpression>node).argumentExpression, visitor)));
case SyntaxKind.CallExpression:
return write(factory.updateCallExpression(
<CallExpression>node,
<LeftHandSideExpression>visitNode(context, (<CallExpression>node).expression, visitor),
<NodeArray<TypeNode>>visitNodes(context, (<CallExpression>node).typeArguments, visitor),
<NodeArray<Expression>>visitNodes(context, (<CallExpression>node).arguments, visitor)));
<LeftHandSideExpression>visitNode((<CallExpression>node).expression, visitor),
<NodeArray<TypeNode>>visitNodes((<CallExpression>node).typeArguments, visitor),
<NodeArray<Expression>>visitNodes((<CallExpression>node).arguments, visitor)));
case SyntaxKind.NewExpression:
return write(factory.updateNewExpression(
<NewExpression>node,
<LeftHandSideExpression>visitNode(context, (<NewExpression>node).expression, visitor),
<NodeArray<TypeNode>>visitNodes(context, (<NewExpression>node).typeArguments, visitor),
<NodeArray<Expression>>visitNodes(context, (<NewExpression>node).arguments, visitor)));
<LeftHandSideExpression>visitNode((<NewExpression>node).expression, visitor),
<NodeArray<TypeNode>>visitNodes((<NewExpression>node).typeArguments, visitor),
<NodeArray<Expression>>visitNodes((<NewExpression>node).arguments, visitor)));
case SyntaxKind.TaggedTemplateExpression:
return write(factory.updateTaggedTemplateExpression(
<TaggedTemplateExpression>node,
<LeftHandSideExpression>visitNode(context, (<TaggedTemplateExpression>node).tag, visitor),
<LiteralExpression | TemplateExpression>visitNode(context, (<TaggedTemplateExpression>node).template, visitor)));
<LeftHandSideExpression>visitNode((<TaggedTemplateExpression>node).tag, visitor),
<LiteralExpression | TemplateExpression>visitNode((<TaggedTemplateExpression>node).template, visitor)));
case SyntaxKind.TypeAssertionExpression:
return write(factory.updateTypeAssertionExpression(
<TypeAssertion>node,
<TypeNode>visitNode(context, (<TypeAssertion>node).type, visitor),
<UnaryExpression>visitNode(context, (<TypeAssertion>node).expression, visitor)));
<TypeNode>visitNode((<TypeAssertion>node).type, visitor),
<UnaryExpression>visitNode((<TypeAssertion>node).expression, visitor)));
case SyntaxKind.ParenthesizedExpression:
return write(factory.updateParenthesizedExpression(
<ParenthesizedExpression>node,
<Expression>visitNode(context, (<ParenthesizedExpression>node).expression, visitor)));
<Expression>visitNode((<ParenthesizedExpression>node).expression, visitor)));
case SyntaxKind.FunctionExpression:
return write(factory.updateFunctionExpression(
<FunctionExpression>node,
<NodeArray<Decorator>>visitNodes(context, (<FunctionExpression>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<FunctionExpression>node).modifiers, visitor),
<Identifier>visitNode(context, (<FunctionExpression>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<FunctionExpression>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<FunctionExpression>node).parameters, visitor),
<TypeNode>visitNode(context, (<FunctionExpression>node).type, visitor),
visitBlockOrExpressionInNewLexicalEnvironment(context, (<FunctionExpression>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<FunctionExpression>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<FunctionExpression>node).modifiers, visitor),
<Identifier>visitNode((<FunctionExpression>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<FunctionExpression>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<FunctionExpression>node).parameters, visitor),
<TypeNode>visitNode((<FunctionExpression>node).type, visitor),
<Block | Expression>visitNewLexicalEnvironment((<FunctionExpression>node).body, visitor)));
case SyntaxKind.ArrowFunction:
return write(factory.updateArrowFunction(
<ArrowFunction>node,
<NodeArray<Decorator>>visitNodes(context, (<ArrowFunction>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ArrowFunction>node).modifiers, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<ArrowFunction>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<ArrowFunction>node).parameters, visitor),
<TypeNode>visitNode(context, (<ArrowFunction>node).type, visitor),
visitBlockOrExpressionInNewLexicalEnvironment(context, (<ArrowFunction>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<ArrowFunction>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ArrowFunction>node).modifiers, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<ArrowFunction>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<ArrowFunction>node).parameters, visitor),
<TypeNode>visitNode((<ArrowFunction>node).type, visitor),
<Block | Expression>visitNewLexicalEnvironment((<ArrowFunction>node).body, visitor)));
case SyntaxKind.DeleteExpression:
return write(factory.updateDeleteExpression(
<DeleteExpression>node,
<UnaryExpression>visitNode(context, (<DeleteExpression>node).expression, visitor)));
<UnaryExpression>visitNode((<DeleteExpression>node).expression, visitor)));
case SyntaxKind.TypeOfExpression:
return write(factory.updateTypeOfExpression(
<TypeOfExpression>node,
<UnaryExpression>visitNode(context, (<TypeOfExpression>node).expression, visitor)));
<UnaryExpression>visitNode((<TypeOfExpression>node).expression, visitor)));
case SyntaxKind.VoidExpression:
return write(factory.updateVoidExpression(
<VoidExpression>node,
<UnaryExpression>visitNode(context, (<VoidExpression>node).expression, visitor)));
<UnaryExpression>visitNode((<VoidExpression>node).expression, visitor)));
case SyntaxKind.AwaitExpression:
return write(factory.updateAwaitExpression(
<AwaitExpression>node,
<UnaryExpression>visitNode(context, (<AwaitExpression>node).expression, visitor)));
<UnaryExpression>visitNode((<AwaitExpression>node).expression, visitor)));
case SyntaxKind.PrefixUnaryExpression:
return write(factory.updatePrefixUnaryExpression(
<PrefixUnaryExpression>node,
<UnaryExpression>visitNode(context, (<PrefixUnaryExpression>node).operand, visitor)));
<UnaryExpression>visitNode((<PrefixUnaryExpression>node).operand, visitor)));
case SyntaxKind.PostfixUnaryExpression:
return write(factory.updatePostfixUnaryExpression(
<PostfixUnaryExpression>node,
<LeftHandSideExpression>visitNode(context, (<PostfixUnaryExpression>node).operand, visitor)));
<LeftHandSideExpression>visitNode((<PostfixUnaryExpression>node).operand, visitor)));
case SyntaxKind.BinaryExpression:
return write(factory.updateBinaryExpression(
<BinaryExpression>node,
<Expression>visitNode(context, (<BinaryExpression>node).left, visitor),
<Expression>visitNode(context, (<BinaryExpression>node).right, visitor)));
<Expression>visitNode((<BinaryExpression>node).left, visitor),
<Expression>visitNode((<BinaryExpression>node).right, visitor)));
case SyntaxKind.ConditionalExpression:
return write(factory.updateConditionalExpression(
<ConditionalExpression>node,
<Expression>visitNode(context, (<ConditionalExpression>node).condition, visitor),
<Expression>visitNode(context, (<ConditionalExpression>node).whenTrue, visitor),
<Expression>visitNode(context, (<ConditionalExpression>node).whenFalse, visitor)));
<Expression>visitNode((<ConditionalExpression>node).condition, visitor),
<Expression>visitNode((<ConditionalExpression>node).whenTrue, visitor),
<Expression>visitNode((<ConditionalExpression>node).whenFalse, visitor)));
case SyntaxKind.TemplateExpression:
return write(factory.updateTemplateExpression(
<TemplateExpression>node,
<LiteralExpression>visitNode(context, (<TemplateExpression>node).head, visitor),
<NodeArray<TemplateSpan>>visitNodes(context, (<TemplateExpression>node).templateSpans, visitor)));
<LiteralExpression>visitNode((<TemplateExpression>node).head, visitor),
<NodeArray<TemplateSpan>>visitNodes((<TemplateExpression>node).templateSpans, visitor)));
case SyntaxKind.YieldExpression:
return write(factory.updateYieldExpression(
<YieldExpression>node,
<Expression>visitNode(context, (<YieldExpression>node).expression, visitor)));
<Expression>visitNode((<YieldExpression>node).expression, visitor)));
case SyntaxKind.SpreadElementExpression:
return write(factory.updateSpreadElementExpression(
<SpreadElementExpression>node,
<Expression>visitNode(context, (<SpreadElementExpression>node).expression, visitor)));
<Expression>visitNode((<SpreadElementExpression>node).expression, visitor)));
case SyntaxKind.ClassExpression:
return write(factory.updateClassExpression(
<ClassExpression>node,
<NodeArray<Decorator>>visitNodes(context, (<ClassExpression>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ClassExpression>node).modifiers, visitor),
<Identifier>visitNode(context, (<ClassExpression>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<ClassExpression>node).typeParameters, visitor),
<NodeArray<HeritageClause>>visitNodes(context, (<ClassExpression>node).heritageClauses, visitor),
<NodeArray<ClassElement>>visitNodes(context, (<ClassExpression>node).members, visitor)));
<NodeArray<Decorator>>visitNodes((<ClassExpression>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ClassExpression>node).modifiers, visitor),
<Identifier>visitNode((<ClassExpression>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<ClassExpression>node).typeParameters, visitor),
<NodeArray<HeritageClause>>visitNodes((<ClassExpression>node).heritageClauses, visitor),
<NodeArray<ClassElement>>visitNodes((<ClassExpression>node).members, visitor)));
case SyntaxKind.ExpressionWithTypeArguments:
return write(factory.updateExpressionWithTypeArguments(
<ExpressionWithTypeArguments>node,
<LeftHandSideExpression>visitNode(context, (<ExpressionWithTypeArguments>node).expression, visitor),
<NodeArray<TypeNode>>visitNodes(context, (<ExpressionWithTypeArguments>node).typeArguments, visitor)));
<LeftHandSideExpression>visitNode((<ExpressionWithTypeArguments>node).expression, visitor),
<NodeArray<TypeNode>>visitNodes((<ExpressionWithTypeArguments>node).typeArguments, visitor)));
case SyntaxKind.AsExpression:
return write(factory.updateAsExpression(
<AsExpression>node,
<Expression>visitNode(context, (<AsExpression>node).expression, visitor),
<TypeNode>visitNode(context, (<AsExpression>node).type, visitor)));
<Expression>visitNode((<AsExpression>node).expression, visitor),
<TypeNode>visitNode((<AsExpression>node).type, visitor)));
case SyntaxKind.TemplateSpan:
return write(factory.updateTemplateSpan(
<TemplateSpan>node,
<Expression>visitNode(context, (<TemplateSpan>node).expression, visitor),
<LiteralExpression>visitNode(context, (<TemplateSpan>node).literal, visitor)));
<Expression>visitNode((<TemplateSpan>node).expression, visitor),
<LiteralExpression>visitNode((<TemplateSpan>node).literal, visitor)));
case SyntaxKind.Block:
return write(factory.updateBlock(
<Block>node,
<NodeArray<Statement>>visitNodes(context, (<Block>node).statements, visitor)));
<NodeArray<Statement>>visitNodes((<Block>node).statements, visitor)));
case SyntaxKind.VariableStatement:
return write(factory.updateVariableStatement(
<VariableStatement>node,
<NodeArray<Decorator>>visitNodes(context, (<VariableStatement>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<VariableStatement>node).modifiers, visitor),
<VariableDeclarationList>visitNode(context, (<VariableStatement>node).declarationList, visitor)));
<NodeArray<Decorator>>visitNodes((<VariableStatement>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<VariableStatement>node).modifiers, visitor),
<VariableDeclarationList>visitNode((<VariableStatement>node).declarationList, visitor)));
case SyntaxKind.ExpressionStatement:
return write(factory.updateExpressionStatement(
<ExpressionStatement>node,
<Expression>visitNode(context, (<ExpressionStatement>node).expression, visitor)));
<Expression>visitNode((<ExpressionStatement>node).expression, visitor)));
case SyntaxKind.IfStatement:
return write(factory.updateIfStatement(
<IfStatement>node,
<Expression>visitNode(context, (<IfStatement>node).expression, visitor),
visitStatement(context, (<IfStatement>node).thenStatement, visitor),
visitStatement(context, (<IfStatement>node).elseStatement, visitor)));
<Expression>visitNode((<IfStatement>node).expression, visitor),
visitStatement((<IfStatement>node).thenStatement, visitor),
visitStatement((<IfStatement>node).elseStatement, visitor)));
case SyntaxKind.DoStatement:
return write(factory.updateDoStatement(
<DoStatement>node,
visitStatement(context, (<DoStatement>node).statement, visitor),
<Expression>visitNode(context, (<DoStatement>node).expression, visitor)));
visitStatement((<DoStatement>node).statement, visitor),
<Expression>visitNode((<DoStatement>node).expression, visitor)));
case SyntaxKind.WhileStatement:
return write(factory.updateWhileStatement(
<WhileStatement>node,
<Expression>visitNode(context, (<WhileStatement>node).expression, visitor),
visitStatement(context, (<WhileStatement>node).statement, visitor)));
<Expression>visitNode((<WhileStatement>node).expression, visitor),
visitStatement((<WhileStatement>node).statement, visitor)));
case SyntaxKind.ForStatement:
return write(factory.updateForStatement(
<ForStatement>node,
<Expression | VariableDeclarationList>visitNode(context, (<ForStatement>node).initializer, visitor),
<Expression>visitNode(context, (<ForStatement>node).condition, visitor),
<Expression>visitNode(context, (<ForStatement>node).incrementor, visitor),
visitStatement(context, (<ForStatement>node).statement, visitor)));
<Expression | VariableDeclarationList>visitNode((<ForStatement>node).initializer, visitor),
<Expression>visitNode((<ForStatement>node).condition, visitor),
<Expression>visitNode((<ForStatement>node).incrementor, visitor),
visitStatement((<ForStatement>node).statement, visitor)));
case SyntaxKind.ForInStatement:
return write(factory.updateForInStatement(
<ForInStatement>node,
<Expression | VariableDeclarationList>visitNode(context, (<ForInStatement>node).initializer, visitor),
<Expression>visitNode(context, (<ForInStatement>node).expression, visitor),
visitStatement(context, (<ForInStatement>node).statement, visitor)));
<Expression | VariableDeclarationList>visitNode((<ForInStatement>node).initializer, visitor),
<Expression>visitNode((<ForInStatement>node).expression, visitor),
visitStatement((<ForInStatement>node).statement, visitor)));
case SyntaxKind.ForOfStatement:
return write(factory.updateForOfStatement(
<ForOfStatement>node,
<Expression | VariableDeclarationList>visitNode(context, (<ForOfStatement>node).initializer, visitor),
<Expression>visitNode(context, (<ForOfStatement>node).expression, visitor),
visitStatement(context, (<ForOfStatement>node).statement, visitor)));
<Expression | VariableDeclarationList>visitNode((<ForOfStatement>node).initializer, visitor),
<Expression>visitNode((<ForOfStatement>node).expression, visitor),
visitStatement((<ForOfStatement>node).statement, visitor)));
case SyntaxKind.ContinueStatement:
return write(factory.updateContinueStatement(
<ContinueStatement>node,
<Identifier>visitNode(context, (<ContinueStatement>node).label, visitor)));
<Identifier>visitNode((<ContinueStatement>node).label, visitor)));
case SyntaxKind.BreakStatement:
return write(factory.updateBreakStatement(
<BreakStatement>node,
<Identifier>visitNode(context, (<BreakStatement>node).label, visitor)));
<Identifier>visitNode((<BreakStatement>node).label, visitor)));
case SyntaxKind.ReturnStatement:
return write(factory.updateReturnStatement(
<ReturnStatement>node,
<Expression>visitNode(context, (<ReturnStatement>node).expression, visitor)));
<Expression>visitNode((<ReturnStatement>node).expression, visitor)));
case SyntaxKind.WithStatement:
return write(factory.updateWithStatement(
<WithStatement>node,
<Expression>visitNode(context, (<WithStatement>node).expression, visitor),
visitStatement(context, (<WithStatement>node).statement, visitor)));
<Expression>visitNode((<WithStatement>node).expression, visitor),
visitStatement((<WithStatement>node).statement, visitor)));
case SyntaxKind.SwitchStatement:
return write(factory.updateSwitchStatement(
<SwitchStatement>node,
<Expression>visitNode(context, (<SwitchStatement>node).expression, visitor),
<CaseBlock>visitNode(context, (<SwitchStatement>node).caseBlock, visitor)));
<Expression>visitNode((<SwitchStatement>node).expression, visitor),
<CaseBlock>visitNode((<SwitchStatement>node).caseBlock, visitor)));
case SyntaxKind.LabeledStatement:
return write(factory.updateLabeledStatement(
<LabeledStatement>node,
<Identifier>visitNode(context, (<LabeledStatement>node).label, visitor),
visitStatement(context, (<LabeledStatement>node).statement, visitor)));
<Identifier>visitNode((<LabeledStatement>node).label, visitor),
visitStatement((<LabeledStatement>node).statement, visitor)));
case SyntaxKind.ThrowStatement:
return write(factory.updateThrowStatement(
<ThrowStatement>node,
<Expression>visitNode(context, (<ThrowStatement>node).expression, visitor)));
<Expression>visitNode((<ThrowStatement>node).expression, visitor)));
case SyntaxKind.TryStatement:
return write(factory.updateTryStatement(
<TryStatement>node,
<Block>visitNode(context, (<TryStatement>node).tryBlock, visitor),
<CatchClause>visitNode(context, (<TryStatement>node).catchClause, visitor),
<Block>visitNode(context, (<TryStatement>node).finallyBlock, visitor)));
<Block>visitNode((<TryStatement>node).tryBlock, visitor),
<CatchClause>visitNode((<TryStatement>node).catchClause, visitor),
<Block>visitNode((<TryStatement>node).finallyBlock, visitor)));
case SyntaxKind.VariableDeclaration:
return write(factory.updateVariableDeclaration(
<VariableDeclaration>node,
<BindingPattern | Identifier>visitNode(context, (<VariableDeclaration>node).name, visitor),
<TypeNode>visitNode(context, (<VariableDeclaration>node).type, visitor),
<Expression>visitNode(context, (<VariableDeclaration>node).initializer, visitor)));
<BindingPattern | Identifier>visitNode((<VariableDeclaration>node).name, visitor),
<TypeNode>visitNode((<VariableDeclaration>node).type, visitor),
<Expression>visitNode((<VariableDeclaration>node).initializer, visitor)));
case SyntaxKind.VariableDeclarationList:
return write(factory.updateVariableDeclarationList(
<VariableDeclarationList>node,
<NodeArray<VariableDeclaration>>visitNodes(context, (<VariableDeclarationList>node).declarations, visitor)));
<NodeArray<VariableDeclaration>>visitNodes((<VariableDeclarationList>node).declarations, visitor)));
case SyntaxKind.FunctionDeclaration:
return write(factory.updateFunctionDeclaration(
<FunctionDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<FunctionDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<FunctionDeclaration>node).modifiers, visitor),
<Identifier>visitNode(context, (<FunctionDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<FunctionDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes(context, (<FunctionDeclaration>node).parameters, visitor),
<TypeNode>visitNode(context, (<FunctionDeclaration>node).type, visitor),
visitBlockInNewLexicalEnvironment(context, (<FunctionDeclaration>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<FunctionDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<FunctionDeclaration>node).modifiers, visitor),
<Identifier>visitNode((<FunctionDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<FunctionDeclaration>node).typeParameters, visitor),
<NodeArray<ParameterDeclaration>>visitNodes((<FunctionDeclaration>node).parameters, visitor),
<TypeNode>visitNode((<FunctionDeclaration>node).type, visitor),
<Block>visitNewLexicalEnvironment((<FunctionDeclaration>node).body, visitor)));
case SyntaxKind.ClassDeclaration:
return write(factory.updateClassDeclaration(
<ClassDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ClassDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ClassDeclaration>node).modifiers, visitor),
<Identifier>visitNode(context, (<ClassDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<ClassDeclaration>node).typeParameters, visitor),
<NodeArray<HeritageClause>>visitNodes(context, (<ClassDeclaration>node).heritageClauses, visitor),
<NodeArray<ClassElement>>visitNodes(context, (<ClassDeclaration>node).members, visitor)));
<NodeArray<Decorator>>visitNodes((<ClassDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ClassDeclaration>node).modifiers, visitor),
<Identifier>visitNode((<ClassDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<ClassDeclaration>node).typeParameters, visitor),
<NodeArray<HeritageClause>>visitNodes((<ClassDeclaration>node).heritageClauses, visitor),
<NodeArray<ClassElement>>visitNodes((<ClassDeclaration>node).members, visitor)));
case SyntaxKind.InterfaceDeclaration:
return write(factory.updateInterfaceDeclaration(
<InterfaceDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<InterfaceDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<InterfaceDeclaration>node).modifiers, visitor),
<Identifier>visitNode(context, (<InterfaceDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<InterfaceDeclaration>node).typeParameters, visitor),
<NodeArray<HeritageClause>>visitNodes(context, (<InterfaceDeclaration>node).heritageClauses, visitor),
<NodeArray<TypeElement>>visitNodes(context, (<InterfaceDeclaration>node).members, visitor)));
<NodeArray<Decorator>>visitNodes((<InterfaceDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<InterfaceDeclaration>node).modifiers, visitor),
<Identifier>visitNode((<InterfaceDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<InterfaceDeclaration>node).typeParameters, visitor),
<NodeArray<HeritageClause>>visitNodes((<InterfaceDeclaration>node).heritageClauses, visitor),
<NodeArray<TypeElement>>visitNodes((<InterfaceDeclaration>node).members, visitor)));
case SyntaxKind.TypeAliasDeclaration:
return write(factory.updateTypeAliasDeclaration(
<TypeAliasDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<TypeAliasDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<TypeAliasDeclaration>node).modifiers, visitor),
<Identifier>visitNode(context, (<TypeAliasDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<TypeAliasDeclaration>node).typeParameters, visitor),
<TypeNode>visitNode(context, (<TypeAliasDeclaration>node).type, visitor)));
<NodeArray<Decorator>>visitNodes((<TypeAliasDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<TypeAliasDeclaration>node).modifiers, visitor),
<Identifier>visitNode((<TypeAliasDeclaration>node).name, visitor),
<NodeArray<TypeParameterDeclaration>>visitNodes((<TypeAliasDeclaration>node).typeParameters, visitor),
<TypeNode>visitNode((<TypeAliasDeclaration>node).type, visitor)));
case SyntaxKind.EnumDeclaration:
return write(factory.updateEnumDeclaration(
<EnumDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<EnumDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<EnumDeclaration>node).modifiers, visitor),
<Identifier>visitNode(context, (<EnumDeclaration>node).name, visitor),
<NodeArray<EnumMember>>visitNodes(context, (<EnumDeclaration>node).members, visitor)));
<NodeArray<Decorator>>visitNodes((<EnumDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<EnumDeclaration>node).modifiers, visitor),
<Identifier>visitNode((<EnumDeclaration>node).name, visitor),
<NodeArray<EnumMember>>visitNodes((<EnumDeclaration>node).members, visitor)));
case SyntaxKind.ModuleDeclaration:
return write(factory.updateModuleDeclaration(
<ModuleDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ModuleDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ModuleDeclaration>node).modifiers, visitor),
<Identifier | LiteralExpression>visitNode(context, (<ModuleDeclaration>node).name, visitor),
visitModuleBlockOrModuleDeclarationInNewLexicalEnvironment(context, (<ModuleDeclaration>node).body, visitor)));
<NodeArray<Decorator>>visitNodes((<ModuleDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ModuleDeclaration>node).modifiers, visitor),
<Identifier | LiteralExpression>visitNode((<ModuleDeclaration>node).name, visitor),
<ModuleBlock | ModuleDeclaration>visitNewLexicalEnvironment((<ModuleDeclaration>node).body, visitor)));
case SyntaxKind.ModuleBlock:
return write(factory.updateModuleBlock(
<ModuleBlock>node,
<NodeArray<Statement>>visitNodes(context, (<ModuleBlock>node).statements, visitor)));
<NodeArray<Statement>>visitNodes((<ModuleBlock>node).statements, visitor)));
case SyntaxKind.CaseBlock:
return write(factory.updateCaseBlock(
<CaseBlock>node,
<NodeArray<CaseOrDefaultClause>>visitNodes(context, (<CaseBlock>node).clauses, visitor)));
<NodeArray<CaseOrDefaultClause>>visitNodes((<CaseBlock>node).clauses, visitor)));
case SyntaxKind.ImportEqualsDeclaration:
return write(factory.updateImportEqualsDeclaration(
<ImportEqualsDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ImportEqualsDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ImportEqualsDeclaration>node).modifiers, visitor),
<Identifier>visitNode(context, (<ImportEqualsDeclaration>node).name, visitor),
<EntityName | ExternalModuleReference>visitNode(context, (<ImportEqualsDeclaration>node).moduleReference, visitor)));
<NodeArray<Decorator>>visitNodes((<ImportEqualsDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ImportEqualsDeclaration>node).modifiers, visitor),
<Identifier>visitNode((<ImportEqualsDeclaration>node).name, visitor),
<EntityName | ExternalModuleReference>visitNode((<ImportEqualsDeclaration>node).moduleReference, visitor)));
case SyntaxKind.ImportDeclaration:
return write(factory.updateImportDeclaration(
<ImportDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ImportDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ImportDeclaration>node).modifiers, visitor),
<ImportClause>visitNode(context, (<ImportDeclaration>node).importClause, visitor),
<Expression>visitNode(context, (<ImportDeclaration>node).moduleSpecifier, visitor)));
<NodeArray<Decorator>>visitNodes((<ImportDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ImportDeclaration>node).modifiers, visitor),
<ImportClause>visitNode((<ImportDeclaration>node).importClause, visitor),
<Expression>visitNode((<ImportDeclaration>node).moduleSpecifier, visitor)));
case SyntaxKind.ImportClause:
return write(factory.updateImportClause(
<ImportClause>node,
<Identifier>visitNode(context, (<ImportClause>node).name, visitor),
<NamedImports | NamespaceImport>visitNode(context, (<ImportClause>node).namedBindings, visitor)));
<Identifier>visitNode((<ImportClause>node).name, visitor),
<NamedImports | NamespaceImport>visitNode((<ImportClause>node).namedBindings, visitor)));
case SyntaxKind.NamespaceImport:
return write(factory.updateNamespaceImport(
<NamespaceImport>node,
<Identifier>visitNode(context, (<NamespaceImport>node).name, visitor)));
<Identifier>visitNode((<NamespaceImport>node).name, visitor)));
case SyntaxKind.NamedImports:
return write(factory.updateNamedImports(
<NamedImports>node,
<NodeArray<ImportOrExportSpecifier>>visitNodes(context, (<NamedImports>node).elements, visitor)));
<NodeArray<ImportOrExportSpecifier>>visitNodes((<NamedImports>node).elements, visitor)));
case SyntaxKind.ImportSpecifier:
return write(factory.updateImportSpecifier(
<ImportSpecifier>node,
<Identifier>visitNode(context, (<ImportSpecifier>node).propertyName, visitor),
<Identifier>visitNode(context, (<ImportSpecifier>node).name, visitor)));
<Identifier>visitNode((<ImportSpecifier>node).propertyName, visitor),
<Identifier>visitNode((<ImportSpecifier>node).name, visitor)));
case SyntaxKind.ExportAssignment:
return write(factory.updateExportAssignment(
<ExportAssignment>node,
<NodeArray<Decorator>>visitNodes(context, (<ExportAssignment>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ExportAssignment>node).modifiers, visitor),
<Expression>visitNode(context, (<ExportAssignment>node).expression, visitor)));
<NodeArray<Decorator>>visitNodes((<ExportAssignment>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ExportAssignment>node).modifiers, visitor),
<Expression>visitNode((<ExportAssignment>node).expression, visitor)));
case SyntaxKind.ExportDeclaration:
return write(factory.updateExportDeclaration(
<ExportDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<ExportDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<ExportDeclaration>node).modifiers, visitor),
<NamedExports>visitNode(context, (<ExportDeclaration>node).exportClause, visitor),
<Expression>visitNode(context, (<ExportDeclaration>node).moduleSpecifier, visitor)));
<NodeArray<Decorator>>visitNodes((<ExportDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<ExportDeclaration>node).modifiers, visitor),
<NamedExports>visitNode((<ExportDeclaration>node).exportClause, visitor),
<Expression>visitNode((<ExportDeclaration>node).moduleSpecifier, visitor)));
case SyntaxKind.NamedExports:
return write(factory.updateNamedExports(
<NamedExports>node,
<NodeArray<ImportOrExportSpecifier>>visitNodes(context, (<NamedExports>node).elements, visitor)));
<NodeArray<ImportOrExportSpecifier>>visitNodes((<NamedExports>node).elements, visitor)));
case SyntaxKind.ExportSpecifier:
return write(factory.updateExportSpecifier(
<ExportSpecifier>node,
<Identifier>visitNode(context, (<ExportSpecifier>node).propertyName, visitor),
<Identifier>visitNode(context, (<ExportSpecifier>node).name, visitor)));
<Identifier>visitNode((<ExportSpecifier>node).propertyName, visitor),
<Identifier>visitNode((<ExportSpecifier>node).name, visitor)));
case SyntaxKind.MissingDeclaration:
return write(factory.updateMissingDeclaration(
<MissingDeclaration>node,
<NodeArray<Decorator>>visitNodes(context, (<MissingDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes(context, (<MissingDeclaration>node).modifiers, visitor)));
<NodeArray<Decorator>>visitNodes((<MissingDeclaration>node).decorators, visitor),
<NodeArray<Modifier>>visitNodes((<MissingDeclaration>node).modifiers, visitor)));
case SyntaxKind.ExternalModuleReference:
return write(factory.updateExternalModuleReference(
<ExternalModuleReference>node,
<Expression>visitNode(context, (<ExternalModuleReference>node).expression, visitor)));
<Expression>visitNode((<ExternalModuleReference>node).expression, visitor)));
case SyntaxKind.JsxElement:
return write(factory.updateJsxElement(
<JsxElement>node,
<JsxOpeningElement>visitNode(context, (<JsxElement>node).openingElement, visitor),
<NodeArray<JsxChild>>visitNodes(context, (<JsxElement>node).children, visitor),
<JsxClosingElement>visitNode(context, (<JsxElement>node).closingElement, visitor)));
<JsxOpeningElement>visitNode((<JsxElement>node).openingElement, visitor),
<NodeArray<JsxChild>>visitNodes((<JsxElement>node).children, visitor),
<JsxClosingElement>visitNode((<JsxElement>node).closingElement, visitor)));
case SyntaxKind.JsxSelfClosingElement:
return write(factory.updateJsxSelfClosingElement(
<JsxSelfClosingElement>node,
<EntityName>visitNode(context, (<JsxSelfClosingElement>node).tagName, visitor),
<NodeArray<JsxAttribute | JsxSpreadAttribute>>visitNodes(context, (<JsxSelfClosingElement>node).attributes, visitor)));
<EntityName>visitNode((<JsxSelfClosingElement>node).tagName, visitor),
<NodeArray<JsxAttribute | JsxSpreadAttribute>>visitNodes((<JsxSelfClosingElement>node).attributes, visitor)));
case SyntaxKind.JsxOpeningElement:
return write(factory.updateJsxOpeningElement(
<JsxOpeningElement>node,
<EntityName>visitNode(context, (<JsxOpeningElement>node).tagName, visitor),
<NodeArray<JsxAttribute | JsxSpreadAttribute>>visitNodes(context, (<JsxOpeningElement>node).attributes, visitor)));
<EntityName>visitNode((<JsxOpeningElement>node).tagName, visitor),
<NodeArray<JsxAttribute | JsxSpreadAttribute>>visitNodes((<JsxOpeningElement>node).attributes, visitor)));
case SyntaxKind.JsxClosingElement:
return write(factory.updateJsxClosingElement(
<JsxClosingElement>node,
<EntityName>visitNode(context, (<JsxClosingElement>node).tagName, visitor)));
<EntityName>visitNode((<JsxClosingElement>node).tagName, visitor)));
case SyntaxKind.JsxAttribute:
return write(factory.updateJsxAttribute(
<JsxAttribute>node,
<Identifier>visitNode(context, (<JsxAttribute>node).name, visitor),
<Expression>visitNode(context, (<JsxAttribute>node).initializer, visitor)));
<Identifier>visitNode((<JsxAttribute>node).name, visitor),
<Expression>visitNode((<JsxAttribute>node).initializer, visitor)));
case SyntaxKind.JsxSpreadAttribute:
return write(factory.updateJsxSpreadAttribute(
<JsxSpreadAttribute>node,
<Expression>visitNode(context, (<JsxSpreadAttribute>node).expression, visitor)));
<Expression>visitNode((<JsxSpreadAttribute>node).expression, visitor)));
case SyntaxKind.JsxExpression:
return write(factory.updateJsxExpression(
<JsxExpression>node,
<Expression>visitNode(context, (<JsxExpression>node).expression, visitor)));
<Expression>visitNode((<JsxExpression>node).expression, visitor)));
case SyntaxKind.CaseClause:
return write(factory.updateCaseClause(
<CaseClause>node,
<Expression>visitNode(context, (<CaseClause>node).expression, visitor),
<NodeArray<Statement>>visitNodes(context, (<CaseClause>node).statements, visitor)));
<Expression>visitNode((<CaseClause>node).expression, visitor),
<NodeArray<Statement>>visitNodes((<CaseClause>node).statements, visitor)));
case SyntaxKind.DefaultClause:
return write(factory.updateDefaultClause(
<DefaultClause>node,
<NodeArray<Statement>>visitNodes(context, (<DefaultClause>node).statements, visitor)));
<NodeArray<Statement>>visitNodes((<DefaultClause>node).statements, visitor)));
case SyntaxKind.HeritageClause:
return write(factory.updateHeritageClause(
<HeritageClause>node,
<NodeArray<ExpressionWithTypeArguments>>visitNodes(context, (<HeritageClause>node).types, visitor)));
<NodeArray<ExpressionWithTypeArguments>>visitNodes((<HeritageClause>node).types, visitor)));
case SyntaxKind.CatchClause:
return write(factory.updateCatchClause(
<CatchClause>node,
<VariableDeclaration>visitNode(context, (<CatchClause>node).variableDeclaration, visitor),
<Block>visitNode(context, (<CatchClause>node).block, visitor)));
<VariableDeclaration>visitNode((<CatchClause>node).variableDeclaration, visitor),
<Block>visitNode((<CatchClause>node).block, visitor)));
case SyntaxKind.PropertyAssignment:
return write(factory.updatePropertyAssignment(
<PropertyAssignment>node,
<PropertyName>visitNode(context, (<PropertyAssignment>node).name, visitor),
<Expression>visitNode(context, (<PropertyAssignment>node).initializer, visitor)));
<PropertyName>visitNode((<PropertyAssignment>node).name, visitor),
<Expression>visitNode((<PropertyAssignment>node).initializer, visitor)));
case SyntaxKind.ShorthandPropertyAssignment:
return write(factory.updateShorthandPropertyAssignment(
<ShorthandPropertyAssignment>node,
<Identifier>visitNode(context, (<ShorthandPropertyAssignment>node).name, visitor)));
<Identifier>visitNode((<ShorthandPropertyAssignment>node).name, visitor)));
case SyntaxKind.EnumMember:
return write(factory.updateEnumMember(
<EnumMember>node,
<DeclarationName>visitNode(context, (<EnumMember>node).name, visitor),
<Expression>visitNode(context, (<EnumMember>node).initializer, visitor)));
<DeclarationName>visitNode((<EnumMember>node).name, visitor),
<Expression>visitNode((<EnumMember>node).initializer, visitor)));
case SyntaxKind.JSDocTypeExpression:
return write(factory.updateJSDocTypeExpression(
<JSDocTypeExpression>node,
<JSDocType>visitNode(context, (<JSDocTypeExpression>node).type, visitor)));
<JSDocType>visitNode((<JSDocTypeExpression>node).type, visitor)));
case SyntaxKind.JSDocArrayType:
return write(factory.updateJSDocArrayType(
<JSDocArrayType>node,
<JSDocType>visitNode(context, (<JSDocArrayType>node).elementType, visitor)));
<JSDocType>visitNode((<JSDocArrayType>node).elementType, visitor)));
case SyntaxKind.JSDocUnionType:
return write(factory.updateJSDocUnionType(
<JSDocUnionType>node,
<NodeArray<JSDocType>>visitNodes(context, (<JSDocUnionType>node).types, visitor)));
<NodeArray<JSDocType>>visitNodes((<JSDocUnionType>node).types, visitor)));
case SyntaxKind.JSDocTupleType:
return write(factory.updateJSDocTupleType(
<JSDocTupleType>node,
<NodeArray<JSDocType>>visitNodes(context, (<JSDocTupleType>node).types, visitor)));
<NodeArray<JSDocType>>visitNodes((<JSDocTupleType>node).types, visitor)));
case SyntaxKind.JSDocNullableType:
return write(factory.updateJSDocNullableType(
<JSDocNullableType>node,
<JSDocType>visitNode(context, (<JSDocNullableType>node).type, visitor)));
<JSDocType>visitNode((<JSDocNullableType>node).type, visitor)));
case SyntaxKind.JSDocNonNullableType:
return write(factory.updateJSDocNonNullableType(
<JSDocNonNullableType>node,
<JSDocType>visitNode(context, (<JSDocNonNullableType>node).type, visitor)));
<JSDocType>visitNode((<JSDocNonNullableType>node).type, visitor)));
case SyntaxKind.JSDocRecordType:
return write(factory.updateJSDocRecordType(
<JSDocRecordType>node,
<NodeArray<JSDocRecordMember>>visitNodes(context, (<JSDocRecordType>node).members, visitor)));
<NodeArray<JSDocRecordMember>>visitNodes((<JSDocRecordType>node).members, visitor)));
case SyntaxKind.JSDocRecordMember:
return write(factory.updateJSDocRecordMember(
<JSDocRecordMember>node,
<Identifier | LiteralExpression>visitNode(context, (<JSDocRecordMember>node).name, visitor),
<JSDocType>visitNode(context, (<JSDocRecordMember>node).type, visitor)));
<Identifier | LiteralExpression>visitNode((<JSDocRecordMember>node).name, visitor),
<JSDocType>visitNode((<JSDocRecordMember>node).type, visitor)));
case SyntaxKind.JSDocTypeReference:
return write(factory.updateJSDocTypeReference(
<JSDocTypeReference>node,
<EntityName>visitNode(context, (<JSDocTypeReference>node).name, visitor),
<NodeArray<JSDocType>>visitNodes(context, (<JSDocTypeReference>node).typeArguments, visitor)));
<EntityName>visitNode((<JSDocTypeReference>node).name, visitor),
<NodeArray<JSDocType>>visitNodes((<JSDocTypeReference>node).typeArguments, visitor)));
case SyntaxKind.JSDocOptionalType:
return write(factory.updateJSDocOptionalType(
<JSDocOptionalType>node,
<JSDocType>visitNode(context, (<JSDocOptionalType>node).type, visitor)));
<JSDocType>visitNode((<JSDocOptionalType>node).type, visitor)));
case SyntaxKind.JSDocFunctionType:
return write(factory.updateJSDocFunctionType(
<JSDocFunctionType>node,
<NodeArray<ParameterDeclaration>>visitNodes(context, (<JSDocFunctionType>node).parameters, visitor),
<JSDocType>visitNode(context, (<JSDocFunctionType>node).type, visitor)));
<NodeArray<ParameterDeclaration>>visitNodes((<JSDocFunctionType>node).parameters, visitor),
<JSDocType>visitNode((<JSDocFunctionType>node).type, visitor)));
case SyntaxKind.JSDocVariadicType:
return write(factory.updateJSDocVariadicType(
<JSDocVariadicType>node,
<JSDocType>visitNode(context, (<JSDocVariadicType>node).type, visitor)));
<JSDocType>visitNode((<JSDocVariadicType>node).type, visitor)));
case SyntaxKind.JSDocConstructorType:
return write(factory.updateJSDocConstructorType(
<JSDocConstructorType>node,
<JSDocType>visitNode(context, (<JSDocConstructorType>node).type, visitor)));
<JSDocType>visitNode((<JSDocConstructorType>node).type, visitor)));
case SyntaxKind.JSDocThisType:
return write(factory.updateJSDocThisType(
<JSDocThisType>node,
<JSDocType>visitNode(context, (<JSDocThisType>node).type, visitor)));
<JSDocType>visitNode((<JSDocThisType>node).type, visitor)));
case SyntaxKind.JSDocComment:
return write(factory.updateJSDocComment(
<JSDocComment>node,
<NodeArray<JSDocTag>>visitNodes(context, (<JSDocComment>node).tags, visitor)));
<NodeArray<JSDocTag>>visitNodes((<JSDocComment>node).tags, visitor)));
case SyntaxKind.JSDocTag:
return write(factory.updateJSDocTag(
<JSDocTag>node,
<Identifier>visitNode(context, (<JSDocTag>node).tagName, visitor)));
<Identifier>visitNode((<JSDocTag>node).tagName, visitor)));
case SyntaxKind.JSDocParameterTag:
return write(factory.updateJSDocParameterTag(
<JSDocParameterTag>node,
<Identifier>visitNode(context, (<JSDocParameterTag>node).preParameterName, visitor),
<JSDocTypeExpression>visitNode(context, (<JSDocParameterTag>node).typeExpression, visitor),
<Identifier>visitNode(context, (<JSDocParameterTag>node).postParameterName, visitor),
<Identifier>visitNode(context, (<JSDocParameterTag>node).tagName, visitor)));
<Identifier>visitNode((<JSDocParameterTag>node).preParameterName, visitor),
<JSDocTypeExpression>visitNode((<JSDocParameterTag>node).typeExpression, visitor),
<Identifier>visitNode((<JSDocParameterTag>node).postParameterName, visitor),
<Identifier>visitNode((<JSDocParameterTag>node).tagName, visitor)));
case SyntaxKind.JSDocReturnTag:
return write(factory.updateJSDocReturnTag(
<JSDocReturnTag>node,
<JSDocTypeExpression>visitNode(context, (<JSDocReturnTag>node).typeExpression, visitor),
<Identifier>visitNode(context, (<JSDocReturnTag>node).tagName, visitor)));
<JSDocTypeExpression>visitNode((<JSDocReturnTag>node).typeExpression, visitor),
<Identifier>visitNode((<JSDocReturnTag>node).tagName, visitor)));
case SyntaxKind.JSDocTypeTag:
return write(factory.updateJSDocTypeTag(
<JSDocTypeTag>node,
<JSDocTypeExpression>visitNode(context, (<JSDocTypeTag>node).typeExpression, visitor),
<Identifier>visitNode(context, (<JSDocTypeTag>node).tagName, visitor)));
<JSDocTypeExpression>visitNode((<JSDocTypeTag>node).typeExpression, visitor),
<Identifier>visitNode((<JSDocTypeTag>node).tagName, visitor)));
case SyntaxKind.JSDocTemplateTag:
return write(factory.updateJSDocTemplateTag(
<JSDocTemplateTag>node,
<NodeArray<TypeParameterDeclaration>>visitNodes(context, (<JSDocTemplateTag>node).typeParameters, visitor),
<Identifier>visitNode(context, (<JSDocTemplateTag>node).tagName, visitor)));
<NodeArray<TypeParameterDeclaration>>visitNodes((<JSDocTemplateTag>node).typeParameters, visitor),
<Identifier>visitNode((<JSDocTemplateTag>node).tagName, visitor)));
default:
return write(node);
}

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ namespace ts.transform {
export let transformTime = 0;
export type TransformationChain = (context: VisitorContext, statements: NodeArray<Statement>) => NodeArray<Statement>;
export type TransformationChain = (statements: NodeArray<Statement>) => NodeArray<Statement>;
export function getTransformationChain(options: CompilerOptions): TransformationChain {
if ((options.target || ScriptTarget.ES3) < ScriptTarget.ES6) {
@ -27,55 +27,47 @@ namespace ts.transform {
}
}
function runTransformation(chain: TransformationChain, context: VisitorContext, statements: NodeArray<Statement>) {
function runTransformation(chain: TransformationChain, statements: NodeArray<Statement>) {
let start = new Date().getTime();
context.pushLexicalEnvironment();
let transformed = chain(context, statements);
if (context.hasHoistedDeclarations()) {
transformed = factory.cloneNodeArray(transformed);
context.writeHoistedDeclarations(transformed);
}
context.popLexicalEnvironment();
let transformed = chain(statements);
transformTime += new Date().getTime() - start;
return transformed;
}
function createUnaryTransformationChain(only: TransformationChain) {
return function (context: VisitorContext, statements: NodeArray<Statement>) {
if (only) statements = runTransformation(only, context, statements);
return function (statements: NodeArray<Statement>) {
if (only) statements = runTransformation(only, statements);
return statements;
};
}
function createBinaryTransformationChain(first: TransformationChain, second: TransformationChain) {
return function (context: VisitorContext, statements: NodeArray<Statement>) {
if (first) statements = runTransformation(first, context, statements);
if (second) statements = runTransformation(second, context, statements);
return function (statements: NodeArray<Statement>) {
if (first) statements = runTransformation(first, statements);
if (second) statements = runTransformation(second, statements);
return statements;
};
}
function createTrinaryTransformationChain(first: TransformationChain, second: TransformationChain, third: TransformationChain) {
return function (context: VisitorContext, statements: NodeArray<Statement>) {
if (first) statements = runTransformation(first, context, statements);
if (second) statements = runTransformation(second, context, statements);
if (third) statements = runTransformation(third, context, statements);
return function (statements: NodeArray<Statement>) {
if (first) statements = runTransformation(first, statements);
if (second) statements = runTransformation(second, statements);
if (third) statements = runTransformation(third, statements);
return statements;
};
}
function createNaryTransformationChain(transformations: TransformationChain[]) {
return function (context: VisitorContext, statements: NodeArray<Statement>) {
return function (statements: NodeArray<Statement>) {
for (let transformation of transformations) {
if (transformation) statements = transformation(context, statements);
if (transformation) statements = transformation(statements);
}
return statements;
};
}
function identityTransformation(context: VisitorContext, statements: NodeArray<Statement>): NodeArray<Statement> {
function identityTransformation(statements: NodeArray<Statement>): NodeArray<Statement> {
return statements;
}
}

View file

@ -1,8 +1,8 @@
/// <reference path="../transform.generated.ts" />
/*@internal*/
namespace ts.transform {
export function toES5(context: VisitorContext, statements: NodeArray<Statement>) {
return visitNodes(context, statements, transformNode);
export function toES5(statements: NodeArray<Statement>) {
return visitNodes(statements, transformNode, /*newLexicalEnvironment*/ true);
}
/**
@ -22,7 +22,7 @@ namespace ts.transform {
* If no part of this node or its subtree requires transformation, the node
* is returned, unchanged.
*/
function transformNode(context: VisitorContext, node: Node, write: (node: Node) => void): void {
function transformNode(node: Node, write: (node: Node) => void): void {
if (!node) {
return;
}
@ -31,17 +31,18 @@ namespace ts.transform {
// !needsTransform(node, TransformFlags.ThisNodeNeedsTransformToES6),
// "Cannot transform node with post-ES6 syntax.");
if (needsTransform(node, TransformFlags.ThisNodeNeedsTransformToES5)) {
return transformNodeWorker(context, node, write);
if (node.transformFlags & TransformFlags.ThisNodeNeedsTransformToES5) {
transformNodeWorker(node, write);
}
else if (node.flags & NodeFlags.GeneratedSuper && isExpressionStatement(node)) {
return transformInitialSuperCall(context, node, write);
transformInitialSuperCall(node, write);
}
else if (needsTransform(node, TransformFlags.SubtreeNeedsTransformToES5)) {
return accept(context, node, transformNode, write);
else if (node.transformFlags & TransformFlags.SubtreeNeedsTransformToES5) {
accept(node, transformNode, write);
}
else {
return write(node);
}
return write(node);
}
/**
@ -49,23 +50,23 @@ namespace ts.transform {
* @param context Context information for the transform.
* @param node The node to transform.
*/
function transformNodeWorker(context: VisitorContext, node: Node, write: (node: Node) => void): void {
function transformNodeWorker(node: Node, write: (node: Node) => void): void {
switch (node.kind) {
case SyntaxKind.ClassDeclaration:
return transformClassDeclaration(context, <ClassDeclaration>node, write);
return transformClassDeclaration(<ClassDeclaration>node, write);
case SyntaxKind.ClassExpression:
return transformClassExpression(context, <ClassExpression>node, write);
return transformClassExpression(<ClassExpression>node, write);
case SyntaxKind.Parameter:
return transformParameter(context, <ParameterDeclaration>node, write);
return transformParameter(<ParameterDeclaration>node, write);
case SyntaxKind.FunctionDeclaration:
return transformFunctionDeclaration(context, <FunctionDeclaration>node, write);
return transformFunctionDeclaration(<FunctionDeclaration>node, write);
case SyntaxKind.ArrowFunction:
case SyntaxKind.FunctionExpression:
return transformFunctionExpression(context, <FunctionExpression>node, write);
return transformFunctionExpression(<FunctionExpression>node, write);
case SyntaxKind.BindingElement:
case SyntaxKind.ArrayBindingPattern:
@ -92,105 +93,88 @@ namespace ts.transform {
// TODO (rbuckton): ES6 syntax we're not yet transforming and are leaving for the emitter to handle.
default:
return accept(context, node, transformNode, write);
return accept(node, transformNode, write);
}
}
function transformClassDeclaration(context: VisitorContext, node: ClassDeclaration, write: (node: Statement) => void) {
let name = context.getDeclarationName(node);
let classInitExpr = transformClassLikeDeclaration(context, node, name);
function transformClassDeclaration(node: ClassDeclaration, write: (node: Statement) => void) {
let name = getDeclarationName(node);
let classInitExpr = transformClassLikeDeclaration(node, name);
let baseTypeNode = getClassExtendsHeritageClauseElement(node);
let varDecl = factory.createVariableDeclaration2(name, classInitExpr);
let varDecls = factory.createVariableDeclarationList([varDecl]);
let varStmt = factory.createVariableStatement2(varDecls, /*location*/ node);
return write(varStmt);
// return tag_statement`
// var ${name} = (function (${baseTypeNode && tag_id`_super`}) {
// ${baseTypeNode && tag_statement`__extends(${name}, _super);`}
// ${transformConstructor(context, node, baseTypeNode)}
// ${transformMemberFunctions(context, node)}
// return ${name};
// })(${baseTypeNode && tag_id`_super`});
// `;
}
function transformClassExpression(context: VisitorContext, node: ClassExpression, write: (node: LeftHandSideExpression) => void) {
let name = context.getDeclarationName(node);
return write(transformClassLikeDeclaration(context, node, name));
// let baseTypeNode = getClassExtendsHeritageClauseElement(node);
// return tag_lhs_expression`
// (function (${baseTypeNode && tag_id`_super`}) {
// ${baseTypeNode && tag_statement`__extends(${name}, _super);`}
// ${transformConstructor(context, node, baseTypeNode)}
// ${transformMemberFunctions(context, node)}
// return ${name};
// })(${baseTypeNode && tag_id`_super`});
// `;
function transformClassExpression(node: ClassExpression, write: (node: LeftHandSideExpression) => void) {
let name = getDeclarationName(node);
return write(transformClassLikeDeclaration(node, name));
}
function transformClassLikeDeclaration(context: VisitorContext, node: ClassLikeDeclaration, name: Identifier): LeftHandSideExpression {
function transformClassLikeDeclaration(node: ClassLikeDeclaration, name: Identifier): LeftHandSideExpression {
let baseTypeNode = getClassExtendsHeritageClauseElement(node);
let superExpr = baseTypeNode ? visitNode(context, baseTypeNode.expression, transformNode) : undefined;
let classBody = factory.createBlock([]);
emitNode(node, classBody.statements, transformClassBody);
let superExpr = baseTypeNode ? visitNode(baseTypeNode.expression, transformNode) : undefined;
let superName = baseTypeNode ? factory.createIdentifier("_super") : undefined;
let superParam = baseTypeNode ? factory.createParameter2(superName) : undefined;
let classBody = factory.createBlock([]);
if (baseTypeNode) {
let extendsExpr = factory.createExtendsHelperCall(name);
let extendsStmt = factory.createExpressionStatement(extendsExpr);
classBody.statements.push(extendsStmt);
}
transformConstructor(context, node, name, baseTypeNode, classBody.statements);
transformMemberFunctions(context, node, classBody.statements);
let returnStmt = factory.createReturnStatement(name);
classBody.statements.push(returnStmt);
let classDecl = factory.createFunctionExpression2(/*name*/ undefined, baseTypeNode ? [superParam] : [], classBody);
let parenExpr = factory.createParenthesizedExpression(classDecl);
let callExpr = factory.createCallExpression2(parenExpr, baseTypeNode ? [superExpr] : undefined);
return callExpr;
}
function transformConstructor(context: VisitorContext, node: ClassLikeDeclaration, name: Identifier, baseTypeNode: ExpressionWithTypeArguments, classStatements: Statement[]) {
context.pushLexicalEnvironment();
let constructor = getFirstConstructorWithBody(node);
let parameters: ParameterDeclaration[] = constructor ? visitNodes(context, constructor.parameters, transformNode) : [];
let body = factory.createBlock([]);
if (constructor) {
transformCaptureThisForNode(context, constructor, body.statements);
transformDefaultValueAssignments(context, constructor, body.statements);
transformRestParameter(context, constructor, body.statements);
function transformClassBody(node: ClassLikeDeclaration, write: (node: Statement) => void): void {
let name = getDeclarationName(node);
let baseTypeNode = getClassExtendsHeritageClauseElement(node);
emitExtendsCall(node, name, baseTypeNode, write);
emitConstructor(node, name, baseTypeNode, write);
emitMemberFunctions(node, write);
let statements = visitNodes(context, constructor.body.statements, transformNode);
body.statements.push(...statements);
let returnStmt = factory.createReturnStatement(name);
write(returnStmt);
}
function emitExtendsCall(node: ClassLikeDeclaration, name: Identifier, baseTypeNode: ExpressionWithTypeArguments, write: (node: Statement) => void): void {
if (!baseTypeNode) {
return;
}
let extendsExpr = factory.createExtendsHelperCall(name);
let extendsStmt = factory.createExpressionStatement(extendsExpr);
write(extendsStmt);
}
function emitConstructor(node: ClassLikeDeclaration, name: Identifier, baseTypeNode: ExpressionWithTypeArguments, write: (node: Statement) => void) {
let constructor = getFirstConstructorWithBody(node);
let parameters: ParameterDeclaration[] = constructor ? visitNodes(constructor.parameters, transformNode) : [];
let body = factory.createBlock([]);
if (constructor) {
emitNode(constructor, body.statements, transformConstructor, /*newLexicalEnvironment*/ true);
}
else if (baseTypeNode) {
let superCall = createDefaultSuperCall();
body.statements.push(superCall);
}
context.writeHoistedDeclarations(body.statements);
context.popLexicalEnvironment();
let constructorFunc = factory.createFunctionDeclaration2(name, parameters, body);
classStatements.push(constructorFunc);
// return tag_statement`
// function ${name}(${transformSignatureParameters(context, constructor)}) {
// ${transformCaptureThisForNode(context, constructor)}
// ${transformDefaultValueAssignments(context, constructor)}
// ${transformRestParameter(context, constructor)}
// ${visitNodeArrayOfStatement(context, constructor && constructor.body.statements, transformNode)}
// }
// `;
write(constructorFunc);
}
function transformParameter(context: VisitorContext, node: ParameterDeclaration, write: (node: ParameterDeclaration) => void) {
function transformConstructor(constructor: ConstructorDeclaration, write: (node: Statement) => void) {
emitCaptureThisForNode(constructor, write);
emitDefaultValueAssignments(constructor, write);
emitRestParameter(constructor, write);
pipeNodes(constructor.body.statements, write, transformNode);
}
function transformParameter(node: ParameterDeclaration, write: (node: ParameterDeclaration) => void) {
if (isBindingPattern(node.name)) {
write(factory.createParameter2(
context.getGeneratedNameForNode(node),
getGeneratedNameForNode(node),
/*initializer*/ undefined,
/*location*/ node
));
@ -208,8 +192,8 @@ namespace ts.transform {
}
}
function transformDefaultValueAssignments(context: VisitorContext, node: FunctionLikeDeclaration, statements: Statement[]) {
if (!needsTransform(node, TransformFlags.SubtreeContainsParameterInitializer | TransformFlags.SubtreeContainsParameterBindingPattern)) {
function emitDefaultValueAssignments(node: FunctionLikeDeclaration, write: (node: Statement) => void) {
if (!(node.transformFlags & (TransformFlags.SubtreeContainsParameterInitializer | TransformFlags.SubtreeContainsParameterBindingPattern))) {
return
}
@ -223,16 +207,16 @@ namespace ts.transform {
}
if (isBindingPattern(name)) {
transformDefaultValueAssignmentForBindingPattern(context, parameter, name, initializer, statements);
emitDefaultValueAssignmentForBindingPattern(parameter, name, initializer, write);
}
else if (initializer) {
transformDefaultValueAssignmentForInitializer(context, parameter, name, initializer, statements);
emitDefaultValueAssignmentForInitializer(parameter, name, initializer, write);
}
}
}
function transformDefaultValueAssignmentForBindingPattern(context: VisitorContext, parameter: ParameterDeclaration, name: BindingPattern, initializer: Expression, statements: Statement[]): void {
let tempName = context.getGeneratedNameForNode(parameter);
function emitDefaultValueAssignmentForBindingPattern(parameter: ParameterDeclaration, name: BindingPattern, initializer: Expression, write: (node: Statement) => void): void {
let tempName = getGeneratedNameForNode(parameter);
// In cases where a binding pattern is simply '[]' or '{}',
// we usually don't want to emit a var declaration; however, in the presence
@ -240,29 +224,26 @@ namespace ts.transform {
let hasBindingElements = name.elements.length > 0;
if (hasBindingElements) {
let varDecls = factory.createVariableDeclarationList([]);
transformBindingElement(context, parameter, tempName, varDecls.declarations, /*assignments*/ undefined);
transformBindingElement(parameter, tempName, varDecls.declarations, /*assignments*/ undefined);
let varStmt = factory.createVariableStatement2(varDecls);
factory.startOnNewLine(varStmt);
statements.push(varStmt);
write(varStmt);
}
else if (initializer) {
let initExpr = visitNode(context, initializer, transformNode);
let initExpr = visitNode(initializer, transformNode);
let assignExpr = factory.createAssignmentExpression(tempName, initExpr);
let assignStmt = factory.createExpressionStatement(assignExpr);
factory.startOnNewLine(assignStmt);
statements.push(assignStmt);
// return tag_statements`
// ${tempName} = ${visit(context, initializer, transformNode)};
// `;
write(assignStmt);
}
}
function transformBindingElement(context: VisitorContext, target: BindingElement, value: Expression, declarations: VariableDeclaration[], assignments: Expression[]): void {
function transformBindingElement(target: BindingElement, value: Expression, declarations: VariableDeclaration[], assignments: Expression[]): void {
if (target.initializer) {
// Combine value and initializer
let initializer = visitNode(context, target.initializer, transformNode);
value = value ? createDefaultValueCheck(context, value, initializer, declarations, assignments) : initializer;
let initializer = visitNode(target.initializer, transformNode);
value = value ? createDefaultValueCheck(value, initializer, declarations, assignments) : initializer;
}
else if (!value) {
// Use 'void 0' in absence of value and initializer
@ -275,22 +256,22 @@ namespace ts.transform {
if (elements.length !== 1) {
// For anything but a single element destructuring we need to generate a temporary
// to ensure value is evaluated exactly once.
value = ensureIdentifier(context, value, declarations, assignments);
value = ensureIdentifier(value, declarations, assignments);
}
for (let i = 0; i < elements.length; i++) {
let element = elements[i];
if (name.kind === SyntaxKind.ObjectBindingPattern) {
// Rewrite element to a declaration with an initializer that fetches property
let propName = element.propertyName || <Identifier>element.name;
transformBindingElement(context, element, factory.createPropertyOrElementAccessExpression(value, propName), declarations, assignments);
transformBindingElement(element, factory.createPropertyOrElementAccessExpression(value, propName), declarations, assignments);
}
else if (element.kind !== SyntaxKind.OmittedExpression) {
if (!element.dotDotDotToken) {
// Rewrite element to a declaration that accesses array element at index i
transformBindingElement(context, element, factory.createElementAccessExpression3(value, i), declarations, assignments);
transformBindingElement(element, factory.createElementAccessExpression3(value, i), declarations, assignments);
}
else if (i === elements.length - 1) {
transformBindingElement(context, element, factory.createSliceCall(value, i), declarations, assignments);
transformBindingElement(element, factory.createSliceCall(value, i), declarations, assignments);
}
}
}
@ -310,43 +291,38 @@ namespace ts.transform {
}
}
function ensureIdentifier(context: VisitorContext, value: Expression, declarations: VariableDeclaration[], assignments: Expression[]) {
function ensureIdentifier(value: Expression, declarations: VariableDeclaration[], assignments: Expression[]) {
if (isIdentifier(value)) {
return value;
}
else {
let tempVar = context.createTempVariable(/*loopVariable*/ false);
let tempVar = createTempVariable(/*loopVariable*/ false);
appendAssignment(tempVar, value, declarations, assignments);
return tempVar;
}
}
function createDefaultValueCheck(context: VisitorContext, value: Expression, defaultValue: Expression, declarations: VariableDeclaration[], assignments: Expression[]) {
value = ensureIdentifier(context, value, declarations, assignments);
function createDefaultValueCheck(value: Expression, defaultValue: Expression, declarations: VariableDeclaration[], assignments: Expression[]) {
value = ensureIdentifier(value, declarations, assignments);
let equalityExpr = factory.createStrictEqualityExpression(value, factory.createVoidZeroExpression());
let conditionalExpr = factory.createConditionalExpression2(equalityExpr, defaultValue, value);
return conditionalExpr;
}
function transformDefaultValueAssignmentForInitializer(context: VisitorContext, parameter: ParameterDeclaration, name: Identifier, initializer: Expression, statements: Statement[]): void {
function emitDefaultValueAssignmentForInitializer(parameter: ParameterDeclaration, name: Identifier, initializer: Expression, write: (node: Statement) => void): void {
name = factory.cloneNode(name);
let equalityExpr = factory.createStrictEqualityExpression(name, factory.createVoidZeroExpression());
let initExpr = visitNode(context, initializer, transformNode);
let initExpr = visitNode(initializer, transformNode);
let assignExpr = factory.createAssignmentExpression(name, initExpr);
let assignStmt = factory.createExpressionStatement(assignExpr);
let trueStmt = factory.createBlock([assignStmt]);
let ifStmt = factory.createIfStatement(equalityExpr, trueStmt);
factory.startOnNewLine(ifStmt);
statements.push(ifStmt);
// return tag_statement`
// if (${name} === void 0) {
// ${name} = ${visit(context, initializer, transformNode)};
// }
// `;
write(ifStmt);
}
function transformRestParameter(context: VisitorContext, node: FunctionLikeDeclaration, statements: Statement[]): void {
if (!needsTransform(node, TransformFlags.SubtreeContainsRestParameter)) {
function emitRestParameter(node: FunctionLikeDeclaration, write: (node: Statement) => void): void {
if (!(node.transformFlags & TransformFlags.SubtreeContainsRestParameter)) {
return;
}
@ -356,14 +332,14 @@ namespace ts.transform {
}
let restIndex = node.parameters.length - 1;
let _i = context.createTempVariable(/*loopVariable*/ true);
let name = <Identifier>context.getDeclarationName(restParam);
let _i = createTempVariable(/*loopVariable*/ true);
let name = <Identifier>getDeclarationName(restParam);
let arrayExpr = factory.createArrayLiteralExpression([]);
let paramVarDecl = factory.createVariableDeclaration2(name, arrayExpr);
let paramVarDecls = factory.createVariableDeclarationList([paramVarDecl]);
let paramVarStmt = factory.createVariableStatement2(paramVarDecls);
factory.startOnNewLine(paramVarStmt);
statements.push(paramVarStmt);
write(paramVarStmt);
let restIndexExpr = factory.createNumericLiteral2(restIndex);
let initializerVarDecl = factory.createVariableDeclaration2(_i, restIndexExpr);
@ -383,17 +359,11 @@ namespace ts.transform {
let forBody = factory.createBlock([assignStmt]);
let forStmt = factory.createForStatement(initializerVarDecls, conditionExpr, incrementerExpr, forBody);
factory.startOnNewLine(forStmt);
statements.push(forStmt);
// return tag_statements`
// var ${name} = [];
// for (var ${_i} = ${restIndex}; ${_i} < arguments.length; ${_i}++) {
// ${name}[${_i}${restIndex ? tag_part` - ${restIndex}` : undefined}] = arguments[${_i}];
// }
// `;
write(forStmt);
}
function transformCaptureThisForNode(context: VisitorContext, node: Node, statements: Statement[]): void {
if (isArrowFunction(node) || !needsTransform(node, TransformFlags.SubtreeCapturesLexicalThis)) {
function emitCaptureThisForNode(node: Node, write: (node: Statement) => void): void {
if (isArrowFunction(node) || !(node.transformFlags & TransformFlags.SubtreeCapturesLexicalThis)) {
return;
}
@ -403,62 +373,57 @@ namespace ts.transform {
let varDecls = factory.createVariableDeclarationList([varDecl]);
let varStmt = factory.createVariableStatement2(varDecls);
factory.startOnNewLine(varStmt);
statements.push(varStmt);
// return tag_statement`
// var _this = this;
// `;
write(varStmt);
}
function transformMemberFunctions(context: VisitorContext, node: ClassLikeDeclaration, statements: Statement[]): void {
function emitMemberFunctions(node: ClassLikeDeclaration, write: (node: Statement) => void): void {
for (let member of node.members) {
if (isSemicolonClassElement(member)) {
transformSemicolonClassElement(context, member, statements);
transformSemicolonClassElement(member, write);
}
else if (isMethodDeclaration(member)) {
transformMethodDeclaration(context, node, member, statements);
transformMethodDeclaration(node, member, write);
}
else if (isGetAccessor(member) || isSetAccessor(member)) {
let accessors = getAllAccessorDeclarations(node.members, member);
if (member === accessors.firstAccessor) {
transformAccessorDeclaration(context, node, member, accessors, statements);
transformAccessorDeclaration(node, accessors, write);
}
}
}
}
function transformSemicolonClassElement(context: VisitorContext, member: SemicolonClassElement, statements: Statement[]): void {
function transformSemicolonClassElement(member: SemicolonClassElement, write: (node: Statement) => void): void {
let stmt = factory.createEmptyStatement();
factory.startOnNewLine(stmt);
statements.push(stmt);
write(stmt);
}
function transformMethodDeclaration(context: VisitorContext, node: ClassLikeDeclaration, member: MethodDeclaration, classStatements: Statement[]): void {
let prefix = context.getClassMemberPrefix(node, member);
let propExpr = getMemberAccessForPropertyName(context, node, member);
let funcExpr = transformToFunctionLikeDeclaration(context, member, /*name*/ undefined, /*location*/ undefined, factory.createFunctionExpression2);
function transformMethodDeclaration(node: ClassLikeDeclaration, member: MethodDeclaration, write: (node: Statement) => void): void {
let prefix = getClassMemberPrefix(node, member);
let propExpr = getMemberAccessForPropertyName(node, member);
let funcExpr = rewriteFunctionExpression(member, /*name*/ undefined, /*location*/ undefined);
let assignExpr = factory.createAssignmentExpression(propExpr, funcExpr);
let assignStmt = factory.createExpressionStatement(assignExpr, /*location*/ member);
factory.startOnNewLine(assignStmt);
classStatements.push(assignStmt);
// return tag_statement`
// ${property} = ${transformToFunctionExpression(context, member)};
// `;
write(assignStmt);
}
function transformAccessorDeclaration(context: VisitorContext, node: ClassLikeDeclaration, member: AccessorDeclaration, accessors: AllAccessorDeclarations, classStatements: Statement[]): void {
let prefix = context.getClassMemberPrefix(node, member);
let name = getExpressionForPropertyName(context, member);
function transformAccessorDeclaration(node: ClassLikeDeclaration, accessors: AllAccessorDeclarations, write: (node: Statement) => void): void {
let firstAccessor = accessors.firstAccessor;
let prefix = getClassMemberPrefix(node, firstAccessor);
let name = getExpressionForPropertyName(firstAccessor);
let descriptorExpr = factory.createObjectLiteralExpression2();
if (accessors.getAccessor) {
let funcExpr = transformToFunctionLikeDeclaration(context, accessors.getAccessor, /*name*/ undefined, /*location*/ accessors.getAccessor, factory.createFunctionExpression2);
let funcExpr = rewriteFunctionExpression(accessors.getAccessor, /*name*/ undefined, /*location*/ accessors.getAccessor);
let getName = factory.createIdentifier("get");
let getProp = factory.createPropertyAssignment(getName, funcExpr);
factory.startOnNewLine(getProp);
descriptorExpr.properties.push(getProp);
}
if (accessors.setAccessor) {
let funcExpr = transformToFunctionLikeDeclaration(context, accessors.setAccessor, /*name*/ undefined, /*location*/ accessors.setAccessor, factory.createFunctionExpression2);
let funcExpr = rewriteFunctionExpression(accessors.setAccessor, /*name*/ undefined, /*location*/ accessors.setAccessor);
let setName = factory.createIdentifier("set");
let setProp = factory.createPropertyAssignment(setName, funcExpr);
factory.startOnNewLine(setProp);
@ -478,84 +443,81 @@ namespace ts.transform {
let definePropertyExpr = factory.createDefinePropertyCall(prefix, name, descriptorExpr);
let definePropertyStmt = factory.createExpressionStatement(definePropertyExpr);
classStatements.push(definePropertyStmt);
// return tag_statement`
// Object.defineProperty(${prefix}, ${name}, {
// ${accessors.getAccessor && tag_part`get: ${transformToFunctionExpression(context, accessors.getAccessor)}, `}
// ${accessors.setAccessor && tag_part`set: ${transformToFunctionExpression(context, accessors.setAccessor)}, `}
// enumerable: true,
// configurable: true
// });
// `;
write(definePropertyStmt);
}
function transformFunctionExpression(context: VisitorContext, node: FunctionExpression, write: (node: Expression) => void): void {
let func = transformToFunctionLikeDeclaration(context, node, node.name, /*location*/ node, factory.createFunctionExpression2);
write(func);
function transformFunctionExpression(node: FunctionExpression, write: (node: Expression) => void): void {
write(rewriteFunctionExpression(node, node.name, /*location*/ node));
}
function transformFunctionDeclaration(context: VisitorContext, node: FunctionDeclaration, write: (node: Statement) => void): void {
let func = transformToFunctionLikeDeclaration(context, node, node.name, /*location*/ node, factory.createFunctionDeclaration2);
write(func);
function rewriteFunctionExpression(node: FunctionLikeDeclaration, name: Identifier, location: TextRange): FunctionExpression {
let parameters = visitNodes(node.parameters, transformNode);
let body = factory.createBlock([], node.body);
emitNode(node, body.statements, transformFunctionBody, /*newLexicalEnvironment*/ true);
return factory.createFunctionExpression2(name, parameters, body, location);
}
function transformToFunctionLikeDeclaration<T extends FunctionLikeDeclaration>(context: VisitorContext, node: FunctionLikeDeclaration, name: Identifier, location: TextRange,
createFunctionLike: (name: DeclarationName, parameters: ParameterDeclaration[], body: Block, location: TextRange) => T): T {
function transformFunctionDeclaration(node: FunctionDeclaration, write: (node: Statement) => void): void {
let parameters = visitNodes(node.parameters, transformNode);
let body = factory.createBlock([], node.body);
emitNode(node, body.statements, transformFunctionBody, /*newLexicalEnvironment*/ true);
write(factory.createFunctionDeclaration2(node.name, parameters, body, /*location*/ node));
}
function transformToFunctionLikeDeclaration<T extends FunctionLikeDeclaration>(node: FunctionLikeDeclaration, name: Identifier, location: TextRange,
createfn: (name: DeclarationName, parameters: ParameterDeclaration[], body: Block, location: TextRange) => T): T {
context.pushLexicalEnvironment();
let parameters = visitNodes(context, node.parameters, transformNode);
let newBody = factory.createBlock([]);
transformCaptureThisForNode(context, node, newBody.statements);
transformDefaultValueAssignments(context, node, newBody.statements);
transformRestParameter(context, node, newBody.statements);
let parameters = visitNodes(node.parameters, transformNode);
let newBody = factory.createBlock([], /*location*/ isBlock(node.body) ? node.body : undefined);
emitNode(node, newBody.statements, transformFunctionBody, /*newLexicalEnvironment*/ true);
let originalBody = node.body;
if (isBlock(originalBody)) {
let statements = visitNodes(context, originalBody.statements, transformNode);
newBody.statements.push(...statements);
factory.setTextRange(newBody, originalBody);
}
else {
let expr = visitNode(context, originalBody, transformNode);
if (expr) {
let returnStmt = factory.createReturnStatement(expr);
newBody.statements.push(returnStmt);
if (!context.childNodeStartPositionIsOnSameLine(node, originalBody)) {
factory.startOnNewLine(returnStmt);
}
}
}
context.writeHoistedDeclarations(newBody.statements);
context.popLexicalEnvironment();
let func = createFunctionLike(name, parameters, newBody, location);
let func = createfn(name, parameters, newBody, location);
return func;
}
function getExpressionForPropertyName(context: VisitorContext, member: ClassElement): Expression {
function transformFunctionBody(node: FunctionLikeDeclaration, write: (node: Statement) => void) {
emitCaptureThisForNode(node, write);
emitDefaultValueAssignments(node, write);
emitRestParameter(node, write);
let body = node.body;
if (isBlock(body)) {
pipeNodes(body.statements, write, transformNode);
}
else {
let expr = visitNode(body, transformNode);
if (expr) {
let returnStmt = factory.createReturnStatement(expr);
if (!childNodeStartPositionIsOnSameLine(node, body)) {
factory.startOnNewLine(returnStmt);
}
write(returnStmt);
}
}
}
function getExpressionForPropertyName(member: ClassElement): Expression {
let memberName = <PropertyName>member.name;
if (isIdentifier(memberName)) {
return factory.createStringLiteral(memberName.text);
}
else if (isComputedPropertyName(memberName)) {
return visitNode(context, memberName.expression, transformNode);
return visitNode(memberName.expression, transformNode);
}
else {
return factory.cloneNode(memberName);
}
}
function getMemberAccessForPropertyName(context: VisitorContext, node: ClassLikeDeclaration, member: ClassElement): LeftHandSideExpression {
let target = context.getClassMemberPrefix(node, member);
function getMemberAccessForPropertyName(node: ClassLikeDeclaration, member: ClassElement): LeftHandSideExpression {
let target = getClassMemberPrefix(node, member);
let memberName = <PropertyName>member.name;
if (isIdentifier(memberName)) {
return factory.createPropertyAccessExpression2(target, factory.cloneNode(memberName));
}
else if (isComputedPropertyName(memberName)) {
let expression = visitNode(context, memberName.expression, transformNode);
let expression = visitNode(memberName.expression, transformNode);
return factory.createElementAccessExpression2(target, expression);
}
else {
@ -563,22 +525,19 @@ namespace ts.transform {
}
}
function transformThisKeyword(context: VisitorContext, node: LeftHandSideExpression): LeftHandSideExpression {
let container = getThisContainer(node, /*includeArrowFunctions*/ true, context.getAncestorOrSelfCallback, /*offset*/ 0);
function transformThisKeyword(node: LeftHandSideExpression): LeftHandSideExpression {
let container = getThisContainer(node, /*includeArrowFunctions*/ true, peekNode, /*offset*/ 0);
if (isArrowFunction(container)) {
let thisName = factory.createIdentifier("_this");
return thisName;
// return tag_id`_this`;
}
return node;
}
function transformInitialSuperCall(context: VisitorContext, node: ExpressionStatement, write: (node: Statement) => void) {
function transformInitialSuperCall(node: ExpressionStatement, write: (node: Statement) => void) {
let statement = createDefaultSuperCall();
return write(statement);
// return tag_statement`
// _super.apply(this, arguments);
// `;
}
function createDefaultSuperCall() {

File diff suppressed because it is too large Load diff

View file

@ -316,7 +316,6 @@ namespace ts {
bindTime = 0;
checkTime = 0;
emitTime = 0;
transform.aggregateTime = 0;
transform.transformTime = 0;
let program = createProgram(fileNames, compilerOptions, compilerHost);
@ -350,7 +349,6 @@ namespace ts {
reportTimeStatistic("Parse time", programTime);
reportTimeStatistic("Bind time", bindTime);
reportTimeStatistic("Check time", checkTime);
reportTimeStatistic("Pre-transform time", transform.aggregateTime);
reportTimeStatistic("Transform time", transform.transformTime);
reportTimeStatistic("Emit time", emitTime);
reportTimeStatistic("Total time", programTime + bindTime + checkTime + emitTime);

View file

@ -430,76 +430,45 @@ namespace ts {
// A fact that states that a node is TypeScript syntax
TypeScript = 1 << 1,
// A fact that states that this node or its subtree contains TypeScript
// syntax
ContainsTypeScript = 1 << 2,
ContainsTypeScriptPropertyDeclarationWithInitializer = 1 << 3,
ContainsTypeScriptClassSyntaxExtension = 1 << 4,
ContainsTypeScriptDecorator = 1 << 6,
ContainsTypeScriptClassSyntaxExtension = 1 << 3,
ContainsTypeScriptDecorator = 1 << 4,
ContainsTypeScriptModifier = 1 << 20,
// A fact that states that a node is ES6 syntax
ES6 = 1 << 7,
ES6 = 1 << 5,
ContainsES6 = 1 << 6,
ContainsES6Yield = 1 << 7,
ContainsES6ParameterBindingPattern = 1 << 8,
ContainsES6VariableBindingPattern = 1 << 9,
ContainsES6RestParameter = 1 << 10,
ContainsES6ParameterInitializer = 1 << 11,
ContainsES6SpreadElement = 1 << 12,
ContainsES6LetOrConst = 1 << 13,
ContainsES6ComputedPropertyName = 1 << 14,
// A fact that states that this node or its subtree contains ES6 syntax
ContainsES6 = 1 << 8,
ContainsCapturedThis = 1 << 15,
ContainsLexicalThis = 1 << 16,
ContainsHoistedDeclaration = 1 << 17,
ContainsCompletionStatement = 1 << 18,
ContainsES6Yield = 1 << 9,
// A fact that states that this node or its subtree contains an ES6 Binding Pattern
ContainsES6ParameterBindingPattern = 1 << 10,
ContainsES6VariableBindingPattern = 1 << 11,
// A fact that states that this node or its subtree contains an ES6 Rest Parameter
ContainsES6RestParameter = 1 << 12,
// A fact that states that this node or its subtree contains an ES6 Parameter Initializer
ContainsES6ParameterInitializer = 1 << 13,
ContainsES6SpreadElement = 1 << 14,
ContainsES6LetOrConst = 1 << 15,
ContainsES6ComputedPropertyName = 1 << 16,
// A fact that states that this node or its subtree contains a captured lexical `this` binding
ContainsCapturedThis = 1 << 17,
// A fact that states that this node or its subtree contains a lexical `this` binding
ContainsLexicalThis = 1 << 18,
ContainsHoistedDeclaration = 1 << 19,
ContainsCompletionStatement = 1 << 20,
// Template Transform Facts
ContainsTemplatePlaceholder = 1 << 21,
LexicalEnvironment = 1 << 19,
//
// Assertions
//
ThisNodeIsTypeScript = TypeScript | ContainsTypeScript,
ThisNodeIsTypeScriptModifier = ThisNodeIsTypeScript | ContainsTypeScriptModifier,
ThisNodeIsTypeScriptClassSyntaxExtension = ThisNodeIsTypeScript | ContainsTypeScriptClassSyntaxExtension,
ThisNodeIsTypeScriptDecorator = ThisNodeIsTypeScriptClassSyntaxExtension | ContainsTypeScriptDecorator,
// Asserts that this node is ES6, and any subtree that contains it contains ES6.
ThisNodeIsES6 = ES6 | ContainsES6,
ThisNodeIsES6Yield = ThisNodeIsES6 | ContainsES6Yield,
// Asserts that this node is ES6, and any subtree that contains it contains an
// ES6 binding pattern.
ThisNodeIsES6ParameterBindingPattern = ThisNodeIsES6 | ContainsES6ParameterBindingPattern,
ThisNodeIsES6VariableBindingPattern = ThisNodeIsES6 | ContainsES6VariableBindingPattern,
// Asserts that this node is ES6, and any subtree that contains it contains an
// ES6 rest parameter.
ThisNodeIsES6RestParameter = ThisNodeIsES6 | ContainsES6RestParameter,
// Asserts that this node is ES6, and any subtree that contains it contains an
// ES6 parameter initializer.
ThisNodeIsES6ParameterInitializer = ThisNodeIsES6 | ContainsES6ParameterInitializer,
ThisNodeIsES6SpreadElement = ThisNodeIsES6 | ContainsES6SpreadElement,
ThisNodeIsES6LetOrConst = ThisNodeIsES6 | ContainsES6LetOrConst,
@ -508,6 +477,7 @@ namespace ts {
ThisNodeIsThisKeyword = ContainsLexicalThis,
ThisNodeIsHoistedDeclaration = ContainsHoistedDeclaration,
ThisNodeIsCompletionStatement = ContainsCompletionStatement,
ThisNodeStartsNewLexicalEnvironment = LexicalEnvironment,
//
// Masks
@ -581,9 +551,6 @@ namespace ts {
ContainsES6RestParameter |
ContainsCapturedThis,
SubtreeContainsTemplatePlaceholder =
ContainsTemplatePlaceholder,
//
// Scope Exclusions
//
@ -591,6 +558,9 @@ namespace ts {
NodeExcludes =
ThisNodeIsTypeScriptMask |
ThisNodeIsES6Mask,
ParameterScopeExcludes =
ContainsTypeScriptModifier,
ArrowFunctionScopeExcludes =
ContainsES6Yield |
@ -655,7 +625,7 @@ namespace ts {
Failed = 2,
FailedAndReported = 3
}
// @factoryhidden("decorators", true)
// @factoryhidden("modifiers", true)
// @factoryhidden("parent", true)
@ -891,6 +861,7 @@ namespace ts {
* MethodDeclaration
* AccessorDeclaration
*/
// @
export interface FunctionLikeDeclaration extends SignatureDeclaration {
_functionLikeDeclarationBrand: any;
@ -899,7 +870,7 @@ namespace ts {
// @factoryparam
questionToken?: Node;
// @visitor("visitBlockOrExpressionInNewLexicalEnvironment")
// @newlexicalenvironment()
body?: Block | Expression;
}
@ -909,7 +880,7 @@ namespace ts {
export interface FunctionDeclaration extends FunctionLikeDeclaration, DeclarationStatement {
name?: Identifier;
// @visitor("visitBlockInNewLexicalEnvironment")
// @newlexicalenvironment()
body?: Block;
}
@ -936,6 +907,8 @@ namespace ts {
// @factoryorder("decorators", "modifiers", "asteriskToken", "name", "typeParameters", "parameters", "type", "body")
export interface MethodDeclaration extends FunctionLikeDeclaration, ClassElement, ObjectLiteralElement {
name: PropertyName;
// @newlexicalenvironment()
body?: Block;
}
@ -946,6 +919,7 @@ namespace ts {
// @factoryhidden("name")
// @factoryorder("decorators", "modifiers", "name", "parameters", "type", "body")
export interface ConstructorDeclaration extends FunctionLikeDeclaration, ClassElement {
// @newlexicalenvironment()
body?: Block;
}
@ -965,7 +939,8 @@ namespace ts {
export interface AccessorDeclaration extends FunctionLikeDeclaration, ClassElement, ObjectLiteralElement {
_accessorDeclarationBrand: any;
name: PropertyName;
// @visitor("visitBlockInNewLexicalEnvironment")
// @newlexicalenvironment()
body: Block;
}
@ -1171,7 +1146,7 @@ namespace ts {
export interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclaration {
name?: Identifier;
// @visitor("visitBlockOrExpressionInNewLexicalEnvironment")
// @newlexicalenvironment()
body: Block | Expression; // Required, whereas the member inherited from FunctionDeclaration is optional
}
@ -1568,7 +1543,7 @@ namespace ts {
export interface ModuleDeclaration extends DeclarationStatement {
name: Identifier | LiteralExpression;
// @visitor("visitModuleBlockOrModuleDeclarationInNewLexicalEnvironment")
// @newlexicalenvironment()
body: ModuleBlock | ModuleDeclaration;
}