Generate transform.generated.ts from processTypes script

This commit is contained in:
Ron Buckton 2015-07-07 16:23:21 -07:00
parent 66d3060210
commit a665ef0384
8 changed files with 2042 additions and 595 deletions

View File

@ -41,6 +41,8 @@ var compilerSources = [
"utilities.ts",
"binder.ts",
"checker.ts",
"transform.ts",
"transform.generated.ts",
"declarationEmitter.ts",
"emitter.ts",
"program.ts",
@ -60,6 +62,8 @@ var servicesSources = [
"utilities.ts",
"binder.ts",
"checker.ts",
"transform.ts",
"transform.generated.ts",
"declarationEmitter.ts",
"emitter.ts",
"program.ts",
@ -357,6 +361,7 @@ var processTypesJs = path.join(scriptsDirectory, "processTypes.js");
var processTypesTs = path.join(scriptsDirectory, "processTypes.ts");
var typesTs = path.join(compilerDirectory, "types.ts");
var factoryGeneratedTs = path.join(compilerDirectory, "factory.generated.ts");
var transformGeneratedTs = path.join(compilerDirectory, "transform.generated.ts");
file(processTypesTs);
@ -384,8 +389,10 @@ file(factoryGeneratedTs, [processTypesJs, typesTs], function() {
ex.run();
}, { async: true });
file(transformGeneratedTs, [factoryGeneratedTs]);
desc("Generates a TypeScript file that contains factory methods to create each Syntax Node.")
task("generate-factory", [factoryGeneratedTs]);
task("generate-factory", [factoryGeneratedTs, transformGeneratedTs]);
// Local target to build the compiler and services
var tscFile = path.join(builtLocalDirectory, compilerFilename);

File diff suppressed because it is too large Load Diff

View File

@ -91,7 +91,7 @@ namespace ts {
return node;
}
export function createParameter(decorators?: Array<Decorator>, modifiers?: Array<Node>, dotDotDotToken?: Node,
name?: Identifier | BindingPattern, questionToken?: Node, type?: TypeNode, initializer?: Expression): ParameterDeclaration {
name?: BindingPattern | Identifier, questionToken?: Node, type?: TypeNode, initializer?: Expression): ParameterDeclaration {
let node = createNode<ParameterDeclaration>(SyntaxKind.Parameter);
if (arguments.length) {
node.decorators = decorators && createNodeArray(decorators)
@ -105,7 +105,7 @@ namespace ts {
return node;
}
export function updateParameter(node: ParameterDeclaration, decorators: Array<Decorator>, modifiers: Array<Node>,
name: Identifier | BindingPattern, type: TypeNode, initializer: Expression): ParameterDeclaration {
name: BindingPattern | Identifier, type: TypeNode, initializer: Expression): ParameterDeclaration {
if (decorators !== node.decorators || modifiers !== node.modifiers || name !== node.name || type !== node.type ||
initializer !== node.initializer) {
let newNode = createParameter(decorators, modifiers, node.dotDotDotToken, name, node.questionToken, type, initializer);
@ -510,7 +510,7 @@ namespace ts {
return node;
}
export function createBindingElement(decorators?: Array<Decorator>, modifiers?: Array<Node>, propertyName?: Identifier,
dotDotDotToken?: Node, name?: Identifier | BindingPattern, initializer?: Expression): BindingElement {
dotDotDotToken?: Node, name?: BindingPattern | Identifier, initializer?: Expression): BindingElement {
let node = createNode<BindingElement>(SyntaxKind.BindingElement);
if (arguments.length) {
node.decorators = decorators && createNodeArray(decorators)
@ -523,7 +523,7 @@ namespace ts {
return node;
}
export function updateBindingElement(node: BindingElement, decorators: Array<Decorator>, modifiers: Array<Node>, propertyName: Identifier,
name: Identifier | BindingPattern, initializer: Expression): BindingElement {
name: BindingPattern | Identifier, initializer: Expression): BindingElement {
if (decorators !== node.decorators || modifiers !== node.modifiers || propertyName !== node.propertyName || name !== node.name ||
initializer !== node.initializer) {
let newNode = createBindingElement(decorators, modifiers, propertyName, node.dotDotDotToken, name, initializer);
@ -984,8 +984,8 @@ namespace ts {
}
return node;
}
export function createEmptyStatement(): Statement {
return createNode<Statement>(SyntaxKind.EmptyStatement);
export function createEmptyStatement(): EmptyStatement {
return createNode<EmptyStatement>(SyntaxKind.EmptyStatement);
}
export function createExpressionStatement(expression?: Expression): ExpressionStatement {
let node = createNode<ExpressionStatement>(SyntaxKind.ExpressionStatement);
@ -1046,7 +1046,7 @@ namespace ts {
}
return node;
}
export function createForStatement(initializer?: VariableDeclarationList | Expression, condition?: Expression, incrementor?: Expression,
export function createForStatement(initializer?: Expression | VariableDeclarationList, condition?: Expression, incrementor?: Expression,
statement?: Statement): ForStatement {
let node = createNode<ForStatement>(SyntaxKind.ForStatement);
if (arguments.length) {
@ -1057,7 +1057,7 @@ namespace ts {
}
return node;
}
export function updateForStatement(node: ForStatement, initializer: VariableDeclarationList | Expression, condition: Expression,
export function updateForStatement(node: ForStatement, initializer: Expression | VariableDeclarationList, condition: Expression,
incrementor: Expression, statement: Statement): ForStatement {
if (initializer !== node.initializer || condition !== node.condition || incrementor !== node.incrementor || statement !== node.statement) {
let newNode = createForStatement(initializer, condition, incrementor, statement);
@ -1065,7 +1065,7 @@ namespace ts {
}
return node;
}
export function createForInStatement(initializer?: VariableDeclarationList | Expression, expression?: Expression, statement?: Statement
export function createForInStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement
): ForInStatement {
let node = createNode<ForInStatement>(SyntaxKind.ForInStatement);
if (arguments.length) {
@ -1075,7 +1075,7 @@ namespace ts {
}
return node;
}
export function updateForInStatement(node: ForInStatement, initializer: VariableDeclarationList | Expression, expression: Expression,
export function updateForInStatement(node: ForInStatement, initializer: Expression | VariableDeclarationList, expression: Expression,
statement: Statement): ForInStatement {
if (initializer !== node.initializer || expression !== node.expression || statement !== node.statement) {
let newNode = createForInStatement(initializer, expression, statement);
@ -1083,7 +1083,7 @@ namespace ts {
}
return node;
}
export function createForOfStatement(initializer?: VariableDeclarationList | Expression, expression?: Expression, statement?: Statement
export function createForOfStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement
): ForOfStatement {
let node = createNode<ForOfStatement>(SyntaxKind.ForOfStatement);
if (arguments.length) {
@ -1093,7 +1093,7 @@ namespace ts {
}
return node;
}
export function updateForOfStatement(node: ForOfStatement, initializer: VariableDeclarationList | Expression, expression: Expression,
export function updateForOfStatement(node: ForOfStatement, initializer: Expression | VariableDeclarationList, expression: Expression,
statement: Statement): ForOfStatement {
if (initializer !== node.initializer || expression !== node.expression || statement !== node.statement) {
let newNode = createForOfStatement(initializer, expression, statement);
@ -1210,10 +1210,10 @@ namespace ts {
}
return node;
}
export function createDebuggerStatement(): Statement {
return createNode<Statement>(SyntaxKind.DebuggerStatement);
export function createDebuggerStatement(): DebuggerStatement {
return createNode<DebuggerStatement>(SyntaxKind.DebuggerStatement);
}
export function createVariableDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: Identifier | BindingPattern,
export function createVariableDeclaration(decorators?: Array<Decorator>, modifiers?: Array<Node>, name?: BindingPattern | Identifier,
type?: TypeNode, initializer?: Expression): VariableDeclaration {
let node = createNode<VariableDeclaration>(SyntaxKind.VariableDeclaration);
if (arguments.length) {
@ -1226,7 +1226,7 @@ namespace ts {
return node;
}
export function updateVariableDeclaration(node: VariableDeclaration, decorators: Array<Decorator>, modifiers: Array<Node>,
name: Identifier | BindingPattern, type: TypeNode, initializer: Expression): VariableDeclaration {
name: BindingPattern | Identifier, type: TypeNode, initializer: Expression): VariableDeclaration {
if (decorators !== node.decorators || modifiers !== node.modifiers || name !== node.name || type !== node.type ||
initializer !== node.initializer) {
let newNode = createVariableDeclaration(decorators, modifiers, name, type, initializer);
@ -1443,7 +1443,7 @@ namespace ts {
}
return node;
}
export function createImportClause(name?: Identifier, namedBindings?: NamespaceImport | NamedImports): ImportClause {
export function createImportClause(name?: Identifier, namedBindings?: NamedImports | NamespaceImport): ImportClause {
let node = createNode<ImportClause>(SyntaxKind.ImportClause);
if (arguments.length) {
node.name = name;
@ -1451,7 +1451,7 @@ namespace ts {
}
return node;
}
export function updateImportClause(node: ImportClause, name: Identifier, namedBindings: NamespaceImport | NamedImports): ImportClause {
export function updateImportClause(node: ImportClause, name: Identifier, namedBindings: NamedImports | NamespaceImport): ImportClause {
if (name !== node.name || namedBindings !== node.namedBindings) {
let newNode = createImportClause(name, namedBindings);
return updateFrom(node, newNode);
@ -2101,6 +2101,21 @@ namespace ts {
export function isIdentifier(node: Node): node is Identifier {
return node && node.kind === SyntaxKind.Identifier;
}
export function isFalseKeyword(node: Node): node is LeftHandSideExpression {
return node && node.kind === SyntaxKind.FalseKeyword;
}
export function isNullKeyword(node: Node): node is LeftHandSideExpression {
return node && node.kind === SyntaxKind.NullKeyword;
}
export function isSuperKeyword(node: Node): node is LeftHandSideExpression {
return node && node.kind === SyntaxKind.SuperKeyword;
}
export function isThisKeyword(node: Node): node is LeftHandSideExpression {
return node && node.kind === SyntaxKind.ThisKeyword;
}
export function isTrueKeyword(node: Node): node is LeftHandSideExpression {
return node && node.kind === SyntaxKind.TrueKeyword;
}
export function isQualifiedName(node: Node): node is QualifiedName {
return node && node.kind === SyntaxKind.QualifiedName;
}
@ -2278,7 +2293,7 @@ namespace ts {
export function isVariableStatement(node: Node): node is VariableStatement {
return node && node.kind === SyntaxKind.VariableStatement;
}
export function isEmptyStatement(node: Node): node is Statement {
export function isEmptyStatement(node: Node): node is EmptyStatement {
return node && node.kind === SyntaxKind.EmptyStatement;
}
export function isExpressionStatement(node: Node): node is ExpressionStatement {
@ -2326,7 +2341,7 @@ namespace ts {
export function isTryStatement(node: Node): node is TryStatement {
return node && node.kind === SyntaxKind.TryStatement;
}
export function isDebuggerStatement(node: Node): node is Statement {
export function isDebuggerStatement(node: Node): node is DebuggerStatement {
return node && node.kind === SyntaxKind.DebuggerStatement;
}
export function isVariableDeclaration(node: Node): node is VariableDeclaration {
@ -2506,4 +2521,338 @@ namespace ts {
export function isJSDocTemplateTag(node: Node): node is JSDocTemplateTag {
return node && node.kind === SyntaxKind.JSDocTemplateTag;
}
export function isEntityName(node: Node): node is EntityName {
if (node) {
switch (node.kind) {
case SyntaxKind.Identifier:
case SyntaxKind.QualifiedName:
return true;
}
}
return false;
}
export function isBindingPatternOrIdentifier(node: Node): node is BindingPattern | Identifier {
if (node) {
switch (node.kind) {
case SyntaxKind.ObjectBindingPattern:
case SyntaxKind.ArrayBindingPattern:
case SyntaxKind.Identifier:
return true;
}
}
return false;
}
export function isUnaryExpression(node: Node): node is UnaryExpression {
if (node) {
switch (node.kind) {
case SyntaxKind.Identifier:
case SyntaxKind.StringLiteral:
case SyntaxKind.PrefixUnaryExpression:
case SyntaxKind.PostfixUnaryExpression:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
case SyntaxKind.NullKeyword:
case SyntaxKind.ThisKeyword:
case SyntaxKind.SuperKeyword:
case SyntaxKind.DeleteExpression:
case SyntaxKind.TypeOfExpression:
case SyntaxKind.VoidExpression:
case SyntaxKind.AwaitExpression:
case SyntaxKind.FunctionExpression:
case SyntaxKind.NumericLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.TemplateHead:
case SyntaxKind.TemplateMiddle:
case SyntaxKind.TemplateTail:
case SyntaxKind.TemplateExpression:
case SyntaxKind.ParenthesizedExpression:
case SyntaxKind.ArrayLiteralExpression:
case SyntaxKind.ObjectLiteralExpression:
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
case SyntaxKind.CallExpression:
case SyntaxKind.NewExpression:
case SyntaxKind.TaggedTemplateExpression:
case SyntaxKind.TypeAssertionExpression:
case SyntaxKind.JsxElement:
case SyntaxKind.JsxSelfClosingElement:
case SyntaxKind.ClassExpression:
return true;
}
}
return false;
}
export function isBlockOrExpression(node: Node): node is Block | Expression {
if (node) {
switch (node.kind) {
case SyntaxKind.Block:
case SyntaxKind.Identifier:
case SyntaxKind.StringLiteral:
case SyntaxKind.OmittedExpression:
case SyntaxKind.PrefixUnaryExpression:
case SyntaxKind.PostfixUnaryExpression:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
case SyntaxKind.NullKeyword:
case SyntaxKind.ThisKeyword:
case SyntaxKind.SuperKeyword:
case SyntaxKind.DeleteExpression:
case SyntaxKind.TypeOfExpression:
case SyntaxKind.VoidExpression:
case SyntaxKind.AwaitExpression:
case SyntaxKind.YieldExpression:
case SyntaxKind.BinaryExpression:
case SyntaxKind.ConditionalExpression:
case SyntaxKind.FunctionExpression:
case SyntaxKind.ArrowFunction:
case SyntaxKind.NumericLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.TemplateHead:
case SyntaxKind.TemplateMiddle:
case SyntaxKind.TemplateTail:
case SyntaxKind.TemplateExpression:
case SyntaxKind.ParenthesizedExpression:
case SyntaxKind.ArrayLiteralExpression:
case SyntaxKind.SpreadElementExpression:
case SyntaxKind.ObjectLiteralExpression:
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
case SyntaxKind.CallExpression:
case SyntaxKind.NewExpression:
case SyntaxKind.TaggedTemplateExpression:
case SyntaxKind.AsExpression:
case SyntaxKind.TypeAssertionExpression:
case SyntaxKind.JsxElement:
case SyntaxKind.JsxOpeningElement:
case SyntaxKind.JsxSelfClosingElement:
case SyntaxKind.JsxExpression:
case SyntaxKind.ClassExpression:
return true;
}
}
return false;
}
export function isLiteralExpression(node: Node): node is LiteralExpression {
if (node) {
switch (node.kind) {
case SyntaxKind.StringLiteral:
case SyntaxKind.NumericLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.TemplateHead:
case SyntaxKind.TemplateMiddle:
case SyntaxKind.TemplateTail:
return true;
}
}
return false;
}
export function isObjectLiteralElement(node: Node): node is ObjectLiteralElement {
if (node) {
switch (node.kind) {
case SyntaxKind.PropertyAssignment:
case SyntaxKind.ShorthandPropertyAssignment:
case SyntaxKind.MethodDeclaration:
case SyntaxKind.GetAccessor:
case SyntaxKind.SetAccessor:
return true;
}
}
return false;
}
export function isLiteralExpressionOrTemplateExpression(node: Node): node is LiteralExpression | TemplateExpression {
if (node) {
switch (node.kind) {
case SyntaxKind.StringLiteral:
case SyntaxKind.NumericLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.TemplateHead:
case SyntaxKind.TemplateMiddle:
case SyntaxKind.TemplateTail:
case SyntaxKind.TemplateExpression:
return true;
}
}
return false;
}
export function isJsxChild(node: Node): node is JsxChild {
if (node) {
switch (node.kind) {
case SyntaxKind.JsxText:
case SyntaxKind.JsxExpression:
case SyntaxKind.JsxElement:
case SyntaxKind.JsxSelfClosingElement:
return true;
}
}
return false;
}
export function isJsxAttributeOrJsxSpreadAttribute(node: Node): node is JsxAttribute | JsxSpreadAttribute {
if (node) {
switch (node.kind) {
case SyntaxKind.JsxAttribute:
case SyntaxKind.JsxSpreadAttribute:
return true;
}
}
return false;
}
export function isExpressionOrVariableDeclarationList(node: Node): node is Expression | VariableDeclarationList {
if (node) {
switch (node.kind) {
case SyntaxKind.Identifier:
case SyntaxKind.StringLiteral:
case SyntaxKind.OmittedExpression:
case SyntaxKind.PrefixUnaryExpression:
case SyntaxKind.PostfixUnaryExpression:
case SyntaxKind.TrueKeyword:
case SyntaxKind.FalseKeyword:
case SyntaxKind.NullKeyword:
case SyntaxKind.ThisKeyword:
case SyntaxKind.SuperKeyword:
case SyntaxKind.DeleteExpression:
case SyntaxKind.TypeOfExpression:
case SyntaxKind.VoidExpression:
case SyntaxKind.AwaitExpression:
case SyntaxKind.YieldExpression:
case SyntaxKind.BinaryExpression:
case SyntaxKind.ConditionalExpression:
case SyntaxKind.FunctionExpression:
case SyntaxKind.ArrowFunction:
case SyntaxKind.NumericLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.TemplateHead:
case SyntaxKind.TemplateMiddle:
case SyntaxKind.TemplateTail:
case SyntaxKind.TemplateExpression:
case SyntaxKind.ParenthesizedExpression:
case SyntaxKind.ArrayLiteralExpression:
case SyntaxKind.SpreadElementExpression:
case SyntaxKind.ObjectLiteralExpression:
case SyntaxKind.PropertyAccessExpression:
case SyntaxKind.ElementAccessExpression:
case SyntaxKind.CallExpression:
case SyntaxKind.NewExpression:
case SyntaxKind.TaggedTemplateExpression:
case SyntaxKind.AsExpression:
case SyntaxKind.TypeAssertionExpression:
case SyntaxKind.JsxElement:
case SyntaxKind.JsxOpeningElement:
case SyntaxKind.JsxSelfClosingElement:
case SyntaxKind.JsxExpression:
case SyntaxKind.ClassExpression:
case SyntaxKind.VariableDeclarationList:
return true;
}
}
return false;
}
export function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause {
if (node) {
switch (node.kind) {
case SyntaxKind.CaseClause:
case SyntaxKind.DefaultClause:
return true;
}
}
return false;
}
export function isClassElement(node: Node): node is ClassElement {
if (node) {
switch (node.kind) {
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.MethodDeclaration:
case SyntaxKind.Constructor:
case SyntaxKind.SemicolonClassElement:
case SyntaxKind.GetAccessor:
case SyntaxKind.SetAccessor:
case SyntaxKind.IndexSignature:
return true;
}
}
return false;
}
export function isIdentifierOrLiteralExpression(node: Node): node is Identifier | LiteralExpression {
if (node) {
switch (node.kind) {
case SyntaxKind.Identifier:
case SyntaxKind.StringLiteral:
case SyntaxKind.NumericLiteral:
case SyntaxKind.RegularExpressionLiteral:
case SyntaxKind.NoSubstitutionTemplateLiteral:
case SyntaxKind.TemplateHead:
case SyntaxKind.TemplateMiddle:
case SyntaxKind.TemplateTail:
return true;
}
}
return false;
}
export function isModuleBlockOrModuleDeclaration(node: Node): node is ModuleBlock | ModuleDeclaration {
if (node) {
switch (node.kind) {
case SyntaxKind.ModuleBlock:
case SyntaxKind.ModuleDeclaration:
return true;
}
}
return false;
}
export function isEntityNameOrExternalModuleReference(node: Node): node is EntityName | ExternalModuleReference {
if (node) {
switch (node.kind) {
case SyntaxKind.Identifier:
case SyntaxKind.QualifiedName:
case SyntaxKind.ExternalModuleReference:
return true;
}
}
return false;
}
export function isNamedImportsOrNamespaceImport(node: Node): node is NamedImports | NamespaceImport {
if (node) {
switch (node.kind) {
case SyntaxKind.NamedImports:
case SyntaxKind.NamespaceImport:
return true;
}
}
return false;
}
export function isImportOrExportSpecifier(node: Node): node is ImportOrExportSpecifier {
if (node) {
switch (node.kind) {
case SyntaxKind.ImportSpecifier:
case SyntaxKind.ExportSpecifier:
return true;
}
}
return false;
}
export function isJSDocType(node: Node): node is JSDocType {
if (node) {
switch (node.kind) {
case SyntaxKind.JSDocAllType:
case SyntaxKind.JSDocUnknownType:
case SyntaxKind.JSDocArrayType:
case SyntaxKind.JSDocUnionType:
case SyntaxKind.JSDocTupleType:
case SyntaxKind.JSDocNonNullableType:
case SyntaxKind.JSDocNullableType:
case SyntaxKind.JSDocRecordType:
case SyntaxKind.JSDocTypeReference:
case SyntaxKind.JSDocOptionalType:
case SyntaxKind.JSDocFunctionType:
case SyntaxKind.JSDocVariadicType:
case SyntaxKind.JSDocConstructorType:
case SyntaxKind.JSDocThisType:
return true;
}
}
return false;
}
}

View File

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

124
src/compiler/transform.ts Normal file
View File

@ -0,0 +1,124 @@
/// <reference path="factory.ts" />
/// <reference path="transform.generated.ts" />
/* @internal */
namespace ts.transform {
export interface TransformerCacheControl<TNode extends Node> {
shouldCachePreviousNodes(node: TNode): boolean;
cacheNode(node: TNode): TNode;
}
export class Transformer {
private resolver: TransformResolver;
constructor(resolver: TransformResolver) {
this.resolver = resolver;
}
public shouldTransformNode(node: Node): boolean {
return false;
}
public shouldVisitChildrenOfNode(node: Node): boolean {
return false;
}
public transformNode<TNode extends Node>(node: TNode): TNode {
if (this.shouldVisitChildrenOfNode(node)) {
return visitChildren(node, this);
}
return node;
}
}
export function visit<TNode extends Node>(node: TNode, transformer: Transformer): TNode {
if (!node || !transformer) {
return node;
}
let transformed: TNode;
if (transformer.shouldTransformNode(node)) {
transformed = transformer.transformNode(node);
}
else if (transformer.shouldVisitChildrenOfNode(node)) {
transformed = visitChildren(node, transformer);
}
if (transformed && transformed !== node) {
aggregateTransformFlags(transformed);
}
return transformed;
}
export function visitNodes<TNode extends Node>(nodes: NodeArray<TNode>, transformer: Transformer, cache?: TransformerCacheControl<TNode>, removeMissingNodes?: boolean): NodeArray<TNode> {
if (!nodes || !transformer) {
return nodes;
}
let updatedNodes: TNode[];
let updatedOffset = 0;
let cacheOffset = 0;
for (var i = 0; i < nodes.length; i++) {
let updatedIndex = i - updatedOffset;
let node = nodes[i];
if (cache && cache.shouldCachePreviousNodes(node)) {
if (!updatedNodes) {
updatedNodes = nodes.slice(0, i);
}
while (cacheOffset < updatedIndex) {
updatedNodes[cacheOffset] = cache.cacheNode(updatedNodes[cacheOffset]);
cacheOffset++;
}
cacheOffset = updatedIndex;
}
let updatedNode = visit(node, transformer);
if ((updatedNodes || updatedNode !== node || (!updatedNode && removeMissingNodes))) {
if (!updatedNodes) {
updatedNodes = nodes.slice(0, i);
}
if (!updatedNode && removeMissingNodes) {
updatedOffset++;
}
else {
updatedNodes[i - updatedOffset] = updatedNode;
}
}
}
if (updatedNodes) {
return factory.setTextRange(
factory.createNodeArray(updatedNodes),
nodes
);
}
return nodes;
}
let transformFlags: TransformFlags;
function aggregateChildTransformFlags(child: Node) {
let saveTransformFlags = transformFlags;
aggregateTransformFlags(child);
transformFlags = saveTransformFlags | (transformFlags & ~TransformFlags.ThisNodeFlags);
}
export function aggregateTransformFlags(node: Node) {
transformFlags = node.transformFlags;
if (transformFlags === undefined) {
forEachChild(node, aggregateChildTransformFlags);
// TODO(rbuckton): Aggregate transform flags for each node type
switch (node.kind) {
}
node.transformFlags = transformFlags;
}
}
}

View File

@ -18,6 +18,8 @@
"utilities.ts",
"binder.ts",
"checker.ts",
"transform.ts",
"transform.generated.ts",
"emitter.ts",
"program.ts",
"commandLineParser.ts",

View File

@ -418,6 +418,19 @@ namespace ts {
// Used to know if we've computed data from children and cached it in this node.
HasAggregatedChildData = 1 << 7
}
/* @internal */
export const enum TransformFlags {
ThisNodeFlags = 0
}
/* @internal */
export interface TransformResolver {
getGeneratedNameForNode(node: Node): string;
makeTempVariableName(loopVariable: boolean): string;
makeUniqueName(baseName: string): string;
getEmitResolver(): EmitResolver;
}
export const enum JsxFlags {
None = 0,
@ -443,12 +456,14 @@ namespace ts {
// @factoryhidden("jsDocComment", true)
// @factoryhidden("nextContainer", true)
// @factoryorder("decorators", "modifiers")
// @nofactorynodetest
export interface Node extends TextRange {
kind: SyntaxKind;
flags: NodeFlags;
// Specific context the parser was in when this node was created. Normally undefined.
// Only set when the parser was in some interesting context (like async/yield).
/* @internal */ parserContextFlags?: ParserContextFlags;
/* @internal */ transformFlags?: TransformFlags;
decorators?: NodeArray<Decorator>; // Array of decorators (in document order)
modifiers?: ModifiersArray; // Array of modifiers
/* @internal */ id?: number; // Unique id (used to look up NodeLinks)
@ -485,10 +500,12 @@ namespace ts {
export type EntityName = Identifier | QualifiedName;
// @nofactorynodetest
export type DeclarationName = Identifier | LiteralExpression | ComputedPropertyName | BindingPattern;
// @factoryhidden("decorators", false)
// @factoryhidden("modifiers", false)
// @nofactorynodetest
export interface Declaration extends Node {
_declarationBrand: any;
name?: DeclarationName;
@ -569,7 +586,7 @@ namespace ts {
}
// @kind(SyntaxKind.PropertySignature)
export interface PropertySignature extends Declaration, ClassElement {
export interface PropertySignature extends Declaration {
name: DeclarationName; // Declared property name
// @factoryparam
questionToken?: Node; // Present on optional property
@ -578,7 +595,8 @@ namespace ts {
// @kind(SyntaxKind.PropertyDeclaration)
// @factoryorder("decorators", "modifiers", "name", "questionToken", "type", "initializer")
export interface PropertyDeclaration extends PropertySignature {
export interface PropertyDeclaration extends PropertySignature, ClassElement {
name: DeclarationName; // Declared property name
initializer?: Expression; // Optional initializer
}
@ -664,7 +682,7 @@ namespace ts {
// @factoryhidden("asteriskToken", true)
// @factoryhidden("body", true)
// @factoryorder("decorators", "modifiers", "asteriskToken", "name", "questionToken", "typeParameters", "parameters", "type")
export interface MethodSignature extends FunctionLikeDeclaration, ClassElement, ObjectLiteralElement {
export interface MethodSignature extends FunctionLikeDeclaration {
}
// Note that a MethodDeclaration is considered both a ClassElement and an ObjectLiteralElement.
@ -680,7 +698,7 @@ namespace ts {
// @factoryhidden("questionToken", true)
// @factoryhidden("body", false)
// @factoryorder("decorators", "modifiers", "asteriskToken", "name", "typeParameters", "parameters", "type", "body")
export interface MethodDeclaration extends MethodSignature {
export interface MethodDeclaration extends MethodSignature, ClassElement, ObjectLiteralElement {
body?: Block;
}
@ -733,6 +751,7 @@ namespace ts {
_indexSignatureDeclarationBrand: any;
}
// @nofactorynodetest
export interface TypeNode extends Node {
_typeNodeBrand: any;
}
@ -818,6 +837,7 @@ namespace ts {
// checker actually thinks you have something of the right type. Note: the brands are
// never actually given values. At runtime they have zero cost.
// @kind(SyntaxKind.OmittedExpression)
// @nofactorynodetest
export interface Expression extends Node {
_expressionBrand: any;
contextualType?: Type; // Used to temporarily assign a contextual type during overload resolution
@ -845,6 +865,12 @@ namespace ts {
_postfixExpressionBrand: any;
}
// @kind(SyntaxKind.TrueKeyword, { create: false })
// @kind(SyntaxKind.FalseKeyword, { create: false })
// @kind(SyntaxKind.NullKeyword, { create: false })
// @kind(SyntaxKind.ThisKeyword, { create: false })
// @kind(SyntaxKind.SuperKeyword, { create: false })
// @nofactorynodetest
export interface LeftHandSideExpression extends PostfixExpression {
_leftHandSideExpressionBrand: any;
}
@ -1081,11 +1107,16 @@ namespace ts {
export type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement;
// @kind(SyntaxKind.EmptyStatement)
// @kind(SyntaxKind.DebuggerStatement);
// @nofactorynodetest
export interface Statement extends Node {
_statementBrand: any;
}
// @kind(SyntaxKind.EmptyStatement)
export type EmptyStatement = Statement;
// @kind(SyntaxKind.DebuggerStatement)
export type DebuggerStatement = Statement;
// @kind(SyntaxKind.MissingDeclaration)
// @factoryhidden("name", true)
@ -1471,7 +1502,7 @@ namespace ts {
// @factoryhidden("initializer", true)
// @factoryhidden("decorators", true)
// @factoryhidden("modifiers", true)
export interface JSDocRecordMember extends PropertyDeclaration {
export interface JSDocRecordMember extends PropertySignature {
name: Identifier | LiteralExpression,
type?: JSDocType
}

View File

@ -1100,7 +1100,7 @@ namespace ts {
return false;
}
export function isDeclaration(node: Node): boolean {
export function isDeclaration(node: Node): node is Declaration {
switch (node.kind) {
case SyntaxKind.ArrowFunction:
case SyntaxKind.BindingElement:
@ -1135,7 +1135,7 @@ namespace ts {
return false;
}
export function isStatement(n: Node): boolean {
export function isStatement(n: Node): n is Statement {
switch (n.kind) {
case SyntaxKind.BreakStatement:
case SyntaxKind.ContinueStatement:
@ -1162,21 +1162,6 @@ namespace ts {
}
}
export function isClassElement(n: Node): boolean {
switch (n.kind) {
case SyntaxKind.Constructor:
case SyntaxKind.PropertyDeclaration:
case SyntaxKind.MethodDeclaration:
case SyntaxKind.GetAccessor:
case SyntaxKind.SetAccessor:
case SyntaxKind.MethodSignature:
case SyntaxKind.IndexSignature:
return true;
default:
return false;
}
}
// True if the given identifier, string literal, or number literal is the name of a declaration node
export function isDeclarationName(name: Node): boolean {
if (name.kind !== SyntaxKind.Identifier && name.kind !== SyntaxKind.StringLiteral && name.kind !== SyntaxKind.NumericLiteral) {
@ -1896,7 +1881,7 @@ namespace ts {
return 0;
}
export function isLeftHandSideExpression(expr: Expression): boolean {
export function isLeftHandSideExpression(expr: Node): boolean {
if (expr) {
switch (expr.kind) {
case SyntaxKind.PropertyAccessExpression: