diff --git a/scripts/processTypes.ts b/scripts/processTypes.ts index 28c2a166cf2..139406524fc 100644 --- a/scripts/processTypes.ts +++ b/scripts/processTypes.ts @@ -545,6 +545,7 @@ function generateFactory(outputFile: string) { writer.writeLine(); writer.increaseIndent(); writeCreateAndUpdateFunctions(); + writeCloneFunction(); writer.decreaseIndent(); writer.write(`}`); writer.writeLine(); @@ -581,31 +582,21 @@ function generateFactory(outputFile: string) { writer.write(`export function create${syntaxNode.kindName}(`); - let first = true; for (let member of syntaxNode.members) { - if (!first) { - writer.write(`, `); - - - } - else { - first = false; - } - let type = member.isNodeArray ? `Array<${member.elementTypeName}>` : member.isModifiersArray ? `Array` : member.typeName; - writer.write(`${member.paramName}?: ${type}`); + writer.write(`${member.paramName}?: ${type}, `); } - writer.write(`): ${syntaxNode.typeName} {`); + writer.write(`location?: TextRange, flags?: NodeFlags): ${syntaxNode.typeName} {`); writer.writeLine(); writer.increaseIndent(); if (syntaxNode.members.length) { - writer.write(`let node = createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName});`); + writer.write(`let node = createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName}, location, flags);`); writer.writeLine(); if (syntaxNode.members.length > 1) { writer.write(`if (arguments.length) {`); @@ -637,7 +628,7 @@ function generateFactory(outputFile: string) { writer.writeLine(); } else { - writer.write(`return createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName});`); + writer.write(`return createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindName}, location, flags);`); writer.writeLine(); } @@ -734,6 +725,58 @@ function generateFactory(outputFile: string) { writer.writeLine(); } + function writeCloneFunction() { + writer.write(`export function cloneNode(node: TNode): TNode;`); + writer.writeLine(); + + writer.write(`export function cloneNode(node: Node): Node {`); + writer.writeLine(); + writer.increaseIndent(); + + writer.write(`if (!node) {`); + writer.writeLine(); + writer.increaseIndent(); + + writer.write(`return node;`); + writer.writeLine(); + + writer.decreaseIndent(); + writer.write(`}`); + writer.writeLine(); + + writer.write(`switch (node.kind) {`); + writer.writeLine(); + writer.increaseIndent(); + + for (let syntaxNode of syntax) { + if (!syntaxNode.options.create) { + continue; + } + + writer.write(`case SyntaxKind.${syntaxNode.kindName}:`); + writer.writeLine(); + writer.increaseIndent(); + + writer.write(`return factory.create${syntaxNode.kindName}(`); + for (let member of syntaxNode.members) { + writer.write(`(<${syntaxNode.typeName}>node).${member.propertyName}, `); + } + + writer.write(`/*location*/ undefined, node.flags);`); + writer.writeLine(); + + writer.decreaseIndent(); + } + + writer.decreaseIndent(); + writer.write(`}`); + writer.writeLine(); + + writer.decreaseIndent(); + writer.write(`}`); + writer.writeLine(); + } + function writeUpdateFunction(syntaxNode: SyntaxNode) { if (!syntaxNode.options.update || !hasChildNodes(syntaxNode)) { return; diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index eba8bde4767..31a994fab07 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -330,8 +330,6 @@ namespace ts { return writeTextOfNode(currentSourceFile, type); case SyntaxKind.ExpressionWithTypeArguments: return emitExpressionWithTypeArguments(type); - case SyntaxKind.TypePredicate: - return emitTypePredicate(type); case SyntaxKind.TypeReference: return emitTypeReference(type); case SyntaxKind.TypeQuery: @@ -393,12 +391,6 @@ namespace ts { } } - function emitTypePredicate(type: TypePredicateNode) { - writeTextOfNode(currentSourceFile, type.parameterName); - write(" is "); - emitType(type.type); - } - function emitTypeReference(type: TypeReferenceNode) { emitEntityName(type.typeName); if (type.typeArguments) { diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 1435061cfb5..fce95c59ae8 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -3045,31 +3045,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi return expr; } - function createDefaultValueCheck(value: Expression, defaultValue: Expression): Expression { - // The value expression will be evaluated twice, so for anything but a simple identifier - // we need to generate a temporary variable - value = ensureIdentifier(value); - // Return the expression 'value === void 0 ? defaultValue : value' - return factory.createConditionalExpression2( - factory.createBinaryExpression2( - value, - SyntaxKind.EqualsEqualsEqualsToken, - factory.createVoidZeroExpression() - ), - defaultValue, - value - ); - } - - function createPropertyAccessForDestructuringProperty(object: Expression, propName: Identifier | LiteralExpression): Expression { - // We create a synthetic copy of the identifier in order to avoid the rewriting that might - // otherwise occur when the identifier is emitted. - return factory.createPropertyOrElementAccessExpression( - factory.parenthesizeForAccess(object), - factory.cloneIdentifierOrLiteralExpression(propName) - ); - } - function emitObjectLiteralAssignment(target: ObjectLiteralExpression, value: Expression) { let properties = target.properties; if (properties.length !== 1) { @@ -3108,7 +3083,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi function emitDestructuringAssignment(target: Expression, value: Expression) { if (target.kind === SyntaxKind.BinaryExpression && (target).operatorToken.kind === SyntaxKind.EqualsToken) { - value = createDefaultValueCheck(value, (target).right); + value = factory.createDefaultValueCheck(value, (target).right, ensureIdentifier); target = (target).left; } if (target.kind === SyntaxKind.ObjectLiteralExpression) { @@ -3145,7 +3120,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi function emitBindingElement(target: BindingElement, value: Expression) { if (target.initializer) { // Combine value and initializer - value = value ? createDefaultValueCheck(value, target.initializer) : target.initializer; + value = value ? factory.createDefaultValueCheck(value, target.initializer, ensureIdentifier) : target.initializer; } else if (!value) { // Use 'void 0' in absence of value and initializer @@ -6601,4 +6576,4 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } } } -} +} diff --git a/src/compiler/factory.generated.ts b/src/compiler/factory.generated.ts index 980b8a0c395..d4dba4a8b9d 100644 --- a/src/compiler/factory.generated.ts +++ b/src/compiler/factory.generated.ts @@ -3,51 +3,51 @@ /// namespace ts { export namespace factory { - export function createNumericLiteral(text?: string): LiteralExpression { - let node = createNode(SyntaxKind.NumericLiteral); + export function createNumericLiteral(text?: string, location?: TextRange, flags?: NodeFlags): LiteralExpression { + let node = createNode(SyntaxKind.NumericLiteral, location, flags); node.text = text; return node; } - export function createStringLiteral(text?: string): StringLiteral { - let node = createNode(SyntaxKind.StringLiteral); + export function createStringLiteral(text?: string, location?: TextRange, flags?: NodeFlags): StringLiteral { + let node = createNode(SyntaxKind.StringLiteral, location, flags); node.text = text; return node; } - export function createRegularExpressionLiteral(text?: string): LiteralExpression { - let node = createNode(SyntaxKind.RegularExpressionLiteral); + export function createRegularExpressionLiteral(text?: string, location?: TextRange, flags?: NodeFlags): LiteralExpression { + let node = createNode(SyntaxKind.RegularExpressionLiteral, location, flags); node.text = text; return node; } - export function createNoSubstitutionTemplateLiteral(text?: string): LiteralExpression { - let node = createNode(SyntaxKind.NoSubstitutionTemplateLiteral); + export function createNoSubstitutionTemplateLiteral(text?: string, location?: TextRange, flags?: NodeFlags): LiteralExpression { + let node = createNode(SyntaxKind.NoSubstitutionTemplateLiteral, location, flags); node.text = text; return node; } - export function createTemplateHead(text?: string): LiteralExpression { - let node = createNode(SyntaxKind.TemplateHead); + export function createTemplateHead(text?: string, location?: TextRange, flags?: NodeFlags): LiteralExpression { + let node = createNode(SyntaxKind.TemplateHead, location, flags); node.text = text; return node; } - export function createTemplateMiddle(text?: string): LiteralExpression { - let node = createNode(SyntaxKind.TemplateMiddle); + export function createTemplateMiddle(text?: string, location?: TextRange, flags?: NodeFlags): LiteralExpression { + let node = createNode(SyntaxKind.TemplateMiddle, location, flags); node.text = text; return node; } - export function createTemplateTail(text?: string): LiteralExpression { - let node = createNode(SyntaxKind.TemplateTail); + export function createTemplateTail(text?: string, location?: TextRange, flags?: NodeFlags): LiteralExpression { + let node = createNode(SyntaxKind.TemplateTail, location, flags); node.text = text; return node; } - export function createIdentifier(text?: string, originalKeywordKind?: SyntaxKind): Identifier { - let node = createNode(SyntaxKind.Identifier); + export function createIdentifier(text?: string, originalKeywordKind?: SyntaxKind, location?: TextRange, flags?: NodeFlags): Identifier { + let node = createNode(SyntaxKind.Identifier, location, flags); if (arguments.length) { node.text = text; node.originalKeywordKind = originalKeywordKind; } return node; } - export function createQualifiedName(left?: EntityName, right?: Identifier): QualifiedName { - let node = createNode(SyntaxKind.QualifiedName); + export function createQualifiedName(left?: EntityName, right?: Identifier, location?: TextRange, flags?: NodeFlags): QualifiedName { + let node = createNode(SyntaxKind.QualifiedName, location, flags); if (arguments.length) { node.left = left; node.right = right; @@ -61,8 +61,8 @@ namespace ts { } return node; } - export function createComputedPropertyName(expression?: Expression): ComputedPropertyName { - let node = createNode(SyntaxKind.ComputedPropertyName); + export function createComputedPropertyName(expression?: Expression, location?: TextRange, flags?: NodeFlags): ComputedPropertyName { + let node = createNode(SyntaxKind.ComputedPropertyName, location, flags); node.expression = expression; return node; } @@ -73,8 +73,9 @@ namespace ts { } return node; } - export function createTypeParameter(name?: Identifier, constraint?: TypeNode, expression?: Expression): TypeParameterDeclaration { - let node = createNode(SyntaxKind.TypeParameter); + export function createTypeParameter(name?: Identifier, constraint?: TypeNode, expression?: Expression, + location?: TextRange, flags?: NodeFlags): TypeParameterDeclaration { + let node = createNode(SyntaxKind.TypeParameter, location, flags); if (arguments.length) { node.name = name; node.constraint = constraint; @@ -91,8 +92,9 @@ namespace ts { return node; } export function createParameter(decorators?: Array, modifiers?: Array, dotDotDotToken?: Node, - name?: BindingPattern | Identifier, questionToken?: Node, type?: TypeNode, initializer?: Expression): ParameterDeclaration { - let node = createNode(SyntaxKind.Parameter); + name?: BindingPattern | Identifier, questionToken?: Node, type?: TypeNode, initializer?: Expression, + location?: TextRange, flags?: NodeFlags): ParameterDeclaration { + let node = createNode(SyntaxKind.Parameter, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -113,8 +115,8 @@ namespace ts { } return node; } - export function createDecorator(expression?: LeftHandSideExpression): Decorator { - let node = createNode(SyntaxKind.Decorator); + export function createDecorator(expression?: LeftHandSideExpression, location?: TextRange, flags?: NodeFlags): Decorator { + let node = createNode(SyntaxKind.Decorator, location, flags); node.expression = expression; return node; } @@ -126,8 +128,8 @@ namespace ts { return node; } export function createPropertySignature(decorators?: Array, modifiers?: Array, name?: DeclarationName, questionToken?: Node, - type?: TypeNode): PropertySignature { - let node = createNode(SyntaxKind.PropertySignature); + type?: TypeNode, location?: TextRange, flags?: NodeFlags): PropertySignature { + let node = createNode(SyntaxKind.PropertySignature, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -146,8 +148,8 @@ namespace ts { return node; } export function createPropertyDeclaration(decorators?: Array, modifiers?: Array, name?: DeclarationName, - questionToken?: Node, type?: TypeNode, initializer?: Expression): PropertyDeclaration { - let node = createNode(SyntaxKind.PropertyDeclaration); + questionToken?: Node, type?: TypeNode, initializer?: Expression, location?: TextRange, flags?: NodeFlags): PropertyDeclaration { + let node = createNode(SyntaxKind.PropertyDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -168,8 +170,9 @@ namespace ts { return node; } export function createMethodSignature(decorators?: Array, modifiers?: Array, name?: DeclarationName, questionToken?: Node, - typeParameters?: Array, parameters?: Array, type?: TypeNode): MethodSignature { - let node = createNode(SyntaxKind.MethodSignature); + typeParameters?: Array, parameters?: Array, type?: TypeNode, + location?: TextRange, flags?: NodeFlags): MethodSignature { + let node = createNode(SyntaxKind.MethodSignature, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -191,9 +194,9 @@ namespace ts { return node; } export function createMethodDeclaration(decorators?: Array, modifiers?: Array, name?: DeclarationName, - typeParameters?: Array, parameters?: Array, type?: TypeNode, body?: Block - ): MethodDeclaration { - let node = createNode(SyntaxKind.MethodDeclaration); + typeParameters?: Array, parameters?: Array, type?: TypeNode, body?: Block, + location?: TextRange, flags?: NodeFlags): MethodDeclaration { + let node = createNode(SyntaxKind.MethodDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -216,8 +219,8 @@ namespace ts { return node; } export function createConstructor(decorators?: Array, modifiers?: Array, parameters?: Array, - type?: TypeNode, body?: Block): ConstructorDeclaration { - let node = createNode(SyntaxKind.Constructor); + type?: TypeNode, body?: Block, location?: TextRange, flags?: NodeFlags): ConstructorDeclaration { + let node = createNode(SyntaxKind.Constructor, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -237,8 +240,9 @@ namespace ts { return node; } export function createGetAccessor(decorators?: Array, modifiers?: Array, name?: DeclarationName, - parameters?: Array, type?: TypeNode, body?: Block): GetAccessorDeclaration { - let node = createNode(SyntaxKind.GetAccessor); + parameters?: Array, type?: TypeNode, body?: Block, + location?: TextRange, flags?: NodeFlags): GetAccessorDeclaration { + let node = createNode(SyntaxKind.GetAccessor, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -259,8 +263,9 @@ namespace ts { return node; } export function createSetAccessor(decorators?: Array, modifiers?: Array, name?: DeclarationName, - parameters?: Array, type?: TypeNode, body?: Block): SetAccessorDeclaration { - let node = createNode(SyntaxKind.SetAccessor); + parameters?: Array, type?: TypeNode, body?: Block, + location?: TextRange, flags?: NodeFlags): SetAccessorDeclaration { + let node = createNode(SyntaxKind.SetAccessor, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -281,8 +286,8 @@ namespace ts { return node; } export function createCallSignature(typeParameters?: Array, parameters?: Array, - type?: TypeNode): CallSignatureDeclaration { - let node = createNode(SyntaxKind.CallSignature); + type?: TypeNode, location?: TextRange, flags?: NodeFlags): CallSignatureDeclaration { + let node = createNode(SyntaxKind.CallSignature, location, flags); if (arguments.length) { node.typeParameters = typeParameters && createNodeArray(typeParameters) node.parameters = parameters && createNodeArray(parameters) @@ -299,8 +304,8 @@ namespace ts { return node; } export function createConstructSignature(typeParameters?: Array, parameters?: Array, - type?: TypeNode): ConstructSignatureDeclaration { - let node = createNode(SyntaxKind.ConstructSignature); + type?: TypeNode, location?: TextRange, flags?: NodeFlags): ConstructSignatureDeclaration { + let node = createNode(SyntaxKind.ConstructSignature, location, flags); if (arguments.length) { node.typeParameters = typeParameters && createNodeArray(typeParameters) node.parameters = parameters && createNodeArray(parameters) @@ -317,8 +322,8 @@ namespace ts { return node; } export function createIndexSignature(decorators?: Array, modifiers?: Array, parameters?: Array, - type?: TypeNode): IndexSignatureDeclaration { - let node = createNode(SyntaxKind.IndexSignature); + type?: TypeNode, location?: TextRange, flags?: NodeFlags): IndexSignatureDeclaration { + let node = createNode(SyntaxKind.IndexSignature, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -335,8 +340,9 @@ namespace ts { } return node; } - export function createTypePredicate(parameterName?: Identifier, type?: TypeNode): TypePredicateNode { - let node = createNode(SyntaxKind.TypePredicate); + export function createTypePredicate(parameterName?: Identifier, type?: TypeNode, + location?: TextRange, flags?: NodeFlags): TypePredicateNode { + let node = createNode(SyntaxKind.TypePredicate, location, flags); if (arguments.length) { node.parameterName = parameterName; node.type = type; @@ -350,8 +356,9 @@ namespace ts { } return node; } - export function createTypeReference(typeName?: EntityName, typeArguments?: Array): TypeReferenceNode { - let node = createNode(SyntaxKind.TypeReference); + export function createTypeReference(typeName?: EntityName, typeArguments?: Array, + location?: TextRange, flags?: NodeFlags): TypeReferenceNode { + let node = createNode(SyntaxKind.TypeReference, location, flags); if (arguments.length) { node.typeName = typeName; node.typeArguments = typeArguments && createNodeArray(typeArguments) @@ -366,8 +373,8 @@ namespace ts { return node; } export function createFunctionType(typeParameters?: Array, parameters?: Array, - type?: TypeNode): FunctionTypeNode { - let node = createNode(SyntaxKind.FunctionType); + type?: TypeNode, location?: TextRange, flags?: NodeFlags): FunctionTypeNode { + let node = createNode(SyntaxKind.FunctionType, location, flags); if (arguments.length) { node.typeParameters = typeParameters && createNodeArray(typeParameters) node.parameters = parameters && createNodeArray(parameters) @@ -384,8 +391,8 @@ namespace ts { return node; } export function createConstructorType(typeParameters?: Array, parameters?: Array, - type?: TypeNode): ConstructorTypeNode { - let node = createNode(SyntaxKind.ConstructorType); + type?: TypeNode, location?: TextRange, flags?: NodeFlags): ConstructorTypeNode { + let node = createNode(SyntaxKind.ConstructorType, location, flags); if (arguments.length) { node.typeParameters = typeParameters && createNodeArray(typeParameters) node.parameters = parameters && createNodeArray(parameters) @@ -401,8 +408,8 @@ namespace ts { } return node; } - export function createTypeQuery(exprName?: EntityName): TypeQueryNode { - let node = createNode(SyntaxKind.TypeQuery); + export function createTypeQuery(exprName?: EntityName, location?: TextRange, flags?: NodeFlags): TypeQueryNode { + let node = createNode(SyntaxKind.TypeQuery, location, flags); node.exprName = exprName; return node; } @@ -413,8 +420,8 @@ namespace ts { } return node; } - export function createTypeLiteral(members?: Array): TypeLiteralNode { - let node = createNode(SyntaxKind.TypeLiteral); + export function createTypeLiteral(members?: Array, location?: TextRange, flags?: NodeFlags): TypeLiteralNode { + let node = createNode(SyntaxKind.TypeLiteral, location, flags); node.members = members && createNodeArray(members) return node; } @@ -425,8 +432,8 @@ namespace ts { } return node; } - export function createArrayType(elementType?: TypeNode): ArrayTypeNode { - let node = createNode(SyntaxKind.ArrayType); + export function createArrayType(elementType?: TypeNode, location?: TextRange, flags?: NodeFlags): ArrayTypeNode { + let node = createNode(SyntaxKind.ArrayType, location, flags); node.elementType = elementType; return node; } @@ -437,8 +444,8 @@ namespace ts { } return node; } - export function createTupleType(elementTypes?: Array): TupleTypeNode { - let node = createNode(SyntaxKind.TupleType); + export function createTupleType(elementTypes?: Array, location?: TextRange, flags?: NodeFlags): TupleTypeNode { + let node = createNode(SyntaxKind.TupleType, location, flags); node.elementTypes = elementTypes && createNodeArray(elementTypes) return node; } @@ -449,8 +456,8 @@ namespace ts { } return node; } - export function createUnionType(types?: Array): UnionTypeNode { - let node = createNode(SyntaxKind.UnionType); + export function createUnionType(types?: Array, location?: TextRange, flags?: NodeFlags): UnionTypeNode { + let node = createNode(SyntaxKind.UnionType, location, flags); node.types = types && createNodeArray(types) return node; } @@ -461,8 +468,8 @@ namespace ts { } return node; } - export function createIntersectionType(types?: Array): IntersectionTypeNode { - let node = createNode(SyntaxKind.IntersectionType); + export function createIntersectionType(types?: Array, location?: TextRange, flags?: NodeFlags): IntersectionTypeNode { + let node = createNode(SyntaxKind.IntersectionType, location, flags); node.types = types && createNodeArray(types) return node; } @@ -473,8 +480,8 @@ namespace ts { } return node; } - export function createParenthesizedType(type?: TypeNode): ParenthesizedTypeNode { - let node = createNode(SyntaxKind.ParenthesizedType); + export function createParenthesizedType(type?: TypeNode, location?: TextRange, flags?: NodeFlags): ParenthesizedTypeNode { + let node = createNode(SyntaxKind.ParenthesizedType, location, flags); node.type = type; return node; } @@ -485,8 +492,8 @@ namespace ts { } return node; } - export function createObjectBindingPattern(elements?: Array): ObjectBindingPattern { - let node = createNode(SyntaxKind.ObjectBindingPattern); + export function createObjectBindingPattern(elements?: Array, location?: TextRange, flags?: NodeFlags): ObjectBindingPattern { + let node = createNode(SyntaxKind.ObjectBindingPattern, location, flags); node.elements = elements && createNodeArray(elements) return node; } @@ -497,8 +504,8 @@ namespace ts { } return node; } - export function createArrayBindingPattern(elements?: Array): ArrayBindingPattern { - let node = createNode(SyntaxKind.ArrayBindingPattern); + export function createArrayBindingPattern(elements?: Array, location?: TextRange, flags?: NodeFlags): ArrayBindingPattern { + let node = createNode(SyntaxKind.ArrayBindingPattern, location, flags); node.elements = elements && createNodeArray(elements) return node; } @@ -509,9 +516,10 @@ namespace ts { } return node; } - export function createBindingElement(decorators?: Array, modifiers?: Array, propertyName?: Identifier, dotDotDotToken?: Node - , name?: BindingPattern | Identifier, initializer?: Expression): BindingElement { - let node = createNode(SyntaxKind.BindingElement); + export function createBindingElement(decorators?: Array, modifiers?: Array, propertyName?: Identifier, + dotDotDotToken?: Node, name?: BindingPattern | Identifier, initializer?: Expression, + location?: TextRange, flags?: NodeFlags): BindingElement { + let node = createNode(SyntaxKind.BindingElement, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -531,8 +539,8 @@ namespace ts { } return node; } - export function createArrayLiteralExpression(elements?: Array): ArrayLiteralExpression { - let node = createNode(SyntaxKind.ArrayLiteralExpression); + export function createArrayLiteralExpression(elements?: Array, location?: TextRange, flags?: NodeFlags): ArrayLiteralExpression { + let node = createNode(SyntaxKind.ArrayLiteralExpression, location, flags); node.elements = elements && createNodeArray(elements) return node; } @@ -544,8 +552,8 @@ namespace ts { return node; } export function createObjectLiteralExpression(decorators?: Array, modifiers?: Array, - properties?: Array): ObjectLiteralExpression { - let node = createNode(SyntaxKind.ObjectLiteralExpression); + properties?: Array, location?: TextRange, flags?: NodeFlags): ObjectLiteralExpression { + let node = createNode(SyntaxKind.ObjectLiteralExpression, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -561,9 +569,9 @@ namespace ts { } return node; } - export function createPropertyAccessExpression(expression?: LeftHandSideExpression, dotToken?: Node, name?: Identifier - ): PropertyAccessExpression { - let node = createNode(SyntaxKind.PropertyAccessExpression); + export function createPropertyAccessExpression(expression?: LeftHandSideExpression, dotToken?: Node, name?: Identifier, + location?: TextRange, flags?: NodeFlags): PropertyAccessExpression { + let node = createNode(SyntaxKind.PropertyAccessExpression, location, flags); if (arguments.length) { node.expression = expression; node.dotToken = dotToken; @@ -579,9 +587,9 @@ namespace ts { } return node; } - export function createElementAccessExpression(expression?: LeftHandSideExpression, argumentExpression?: Expression - ): ElementAccessExpression { - let node = createNode(SyntaxKind.ElementAccessExpression); + export function createElementAccessExpression(expression?: LeftHandSideExpression, argumentExpression?: Expression, + location?: TextRange, flags?: NodeFlags): ElementAccessExpression { + let node = createNode(SyntaxKind.ElementAccessExpression, location, flags); if (arguments.length) { node.expression = expression; node.argumentExpression = argumentExpression; @@ -596,9 +604,9 @@ namespace ts { } return node; } - export function createCallExpression(expression?: LeftHandSideExpression, typeArguments?: Array, _arguments?: Array - ): CallExpression { - let node = createNode(SyntaxKind.CallExpression); + export function createCallExpression(expression?: LeftHandSideExpression, typeArguments?: Array, _arguments?: Array, + location?: TextRange, flags?: NodeFlags): CallExpression { + let node = createNode(SyntaxKind.CallExpression, location, flags); if (arguments.length) { node.expression = expression; node.typeArguments = typeArguments && createNodeArray(typeArguments) @@ -614,9 +622,9 @@ namespace ts { } return node; } - export function createNewExpression(expression?: LeftHandSideExpression, typeArguments?: Array, _arguments?: Array - ): NewExpression { - let node = createNode(SyntaxKind.NewExpression); + export function createNewExpression(expression?: LeftHandSideExpression, typeArguments?: Array, _arguments?: Array, + location?: TextRange, flags?: NodeFlags): NewExpression { + let node = createNode(SyntaxKind.NewExpression, location, flags); if (arguments.length) { node.expression = expression; node.typeArguments = typeArguments && createNodeArray(typeArguments) @@ -632,9 +640,9 @@ namespace ts { } return node; } - export function createTaggedTemplateExpression(tag?: LeftHandSideExpression, template?: LiteralExpression | TemplateExpression - ): TaggedTemplateExpression { - let node = createNode(SyntaxKind.TaggedTemplateExpression); + export function createTaggedTemplateExpression(tag?: LeftHandSideExpression, template?: LiteralExpression | TemplateExpression, + location?: TextRange, flags?: NodeFlags): TaggedTemplateExpression { + let node = createNode(SyntaxKind.TaggedTemplateExpression, location, flags); if (arguments.length) { node.tag = tag; node.template = template; @@ -649,8 +657,9 @@ namespace ts { } return node; } - export function createTypeAssertionExpression(type?: TypeNode, expression?: UnaryExpression): TypeAssertion { - let node = createNode(SyntaxKind.TypeAssertionExpression); + export function createTypeAssertionExpression(type?: TypeNode, expression?: UnaryExpression, + location?: TextRange, flags?: NodeFlags): TypeAssertion { + let node = createNode(SyntaxKind.TypeAssertionExpression, location, flags); if (arguments.length) { node.type = type; node.expression = expression; @@ -664,8 +673,8 @@ namespace ts { } return node; } - export function createParenthesizedExpression(expression?: Expression): ParenthesizedExpression { - let node = createNode(SyntaxKind.ParenthesizedExpression); + export function createParenthesizedExpression(expression?: Expression, location?: TextRange, flags?: NodeFlags): ParenthesizedExpression { + let node = createNode(SyntaxKind.ParenthesizedExpression, location, flags); node.expression = expression; return node; } @@ -677,9 +686,9 @@ namespace ts { return node; } export function createFunctionExpression(decorators?: Array, modifiers?: Array, asteriskToken?: Node, name?: Identifier, - typeParameters?: Array, parameters?: Array, type?: TypeNode, body?: Block | Expression - ): FunctionExpression { - let node = createNode(SyntaxKind.FunctionExpression); + typeParameters?: Array, parameters?: Array, type?: TypeNode, body?: Block | Expression, + location?: TextRange, flags?: NodeFlags): FunctionExpression { + let node = createNode(SyntaxKind.FunctionExpression, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -703,8 +712,9 @@ namespace ts { return node; } export function createArrowFunction(decorators?: Array, modifiers?: Array, typeParameters?: Array, - parameters?: Array, type?: TypeNode, equalsGreaterThanToken?: Node, body?: Block | Expression): ArrowFunction { - let node = createNode(SyntaxKind.ArrowFunction); + parameters?: Array, type?: TypeNode, equalsGreaterThanToken?: Node, body?: Block | Expression, + location?: TextRange, flags?: NodeFlags): ArrowFunction { + let node = createNode(SyntaxKind.ArrowFunction, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -726,8 +736,8 @@ namespace ts { } return node; } - export function createDeleteExpression(expression?: UnaryExpression): DeleteExpression { - let node = createNode(SyntaxKind.DeleteExpression); + export function createDeleteExpression(expression?: UnaryExpression, location?: TextRange, flags?: NodeFlags): DeleteExpression { + let node = createNode(SyntaxKind.DeleteExpression, location, flags); node.expression = expression; return node; } @@ -738,8 +748,8 @@ namespace ts { } return node; } - export function createTypeOfExpression(expression?: UnaryExpression): TypeOfExpression { - let node = createNode(SyntaxKind.TypeOfExpression); + export function createTypeOfExpression(expression?: UnaryExpression, location?: TextRange, flags?: NodeFlags): TypeOfExpression { + let node = createNode(SyntaxKind.TypeOfExpression, location, flags); node.expression = expression; return node; } @@ -750,8 +760,8 @@ namespace ts { } return node; } - export function createVoidExpression(expression?: UnaryExpression): VoidExpression { - let node = createNode(SyntaxKind.VoidExpression); + export function createVoidExpression(expression?: UnaryExpression, location?: TextRange, flags?: NodeFlags): VoidExpression { + let node = createNode(SyntaxKind.VoidExpression, location, flags); node.expression = expression; return node; } @@ -762,8 +772,8 @@ namespace ts { } return node; } - export function createAwaitExpression(expression?: UnaryExpression): AwaitExpression { - let node = createNode(SyntaxKind.AwaitExpression); + export function createAwaitExpression(expression?: UnaryExpression, location?: TextRange, flags?: NodeFlags): AwaitExpression { + let node = createNode(SyntaxKind.AwaitExpression, location, flags); node.expression = expression; return node; } @@ -774,8 +784,9 @@ namespace ts { } return node; } - export function createPrefixUnaryExpression(operator?: SyntaxKind, operand?: UnaryExpression): PrefixUnaryExpression { - let node = createNode(SyntaxKind.PrefixUnaryExpression); + export function createPrefixUnaryExpression(operator?: SyntaxKind, operand?: UnaryExpression, + location?: TextRange, flags?: NodeFlags): PrefixUnaryExpression { + let node = createNode(SyntaxKind.PrefixUnaryExpression, location, flags); if (arguments.length) { node.operator = operator; node.operand = operand; @@ -789,8 +800,9 @@ namespace ts { } return node; } - export function createPostfixUnaryExpression(operand?: LeftHandSideExpression, operator?: SyntaxKind): PostfixUnaryExpression { - let node = createNode(SyntaxKind.PostfixUnaryExpression); + export function createPostfixUnaryExpression(operand?: LeftHandSideExpression, operator?: SyntaxKind, + location?: TextRange, flags?: NodeFlags): PostfixUnaryExpression { + let node = createNode(SyntaxKind.PostfixUnaryExpression, location, flags); if (arguments.length) { node.operand = operand; node.operator = operator; @@ -804,8 +816,9 @@ namespace ts { } return node; } - export function createBinaryExpression(left?: Expression, operatorToken?: Node, right?: Expression): BinaryExpression { - let node = createNode(SyntaxKind.BinaryExpression); + export function createBinaryExpression(left?: Expression, operatorToken?: Node, right?: Expression, + location?: TextRange, flags?: NodeFlags): BinaryExpression { + let node = createNode(SyntaxKind.BinaryExpression, location, flags); if (arguments.length) { node.left = left; node.operatorToken = operatorToken; @@ -821,8 +834,8 @@ namespace ts { return node; } export function createConditionalExpression(condition?: Expression, questionToken?: Node, whenTrue?: Expression, colonToken?: Node, - whenFalse?: Expression): ConditionalExpression { - let node = createNode(SyntaxKind.ConditionalExpression); + whenFalse?: Expression, location?: TextRange, flags?: NodeFlags): ConditionalExpression { + let node = createNode(SyntaxKind.ConditionalExpression, location, flags); if (arguments.length) { node.condition = condition; node.questionToken = questionToken; @@ -840,8 +853,9 @@ namespace ts { } return node; } - export function createTemplateExpression(head?: LiteralExpression, templateSpans?: Array): TemplateExpression { - let node = createNode(SyntaxKind.TemplateExpression); + export function createTemplateExpression(head?: LiteralExpression, templateSpans?: Array, + location?: TextRange, flags?: NodeFlags): TemplateExpression { + let node = createNode(SyntaxKind.TemplateExpression, location, flags); if (arguments.length) { node.head = head; node.templateSpans = templateSpans && createNodeArray(templateSpans) @@ -856,8 +870,9 @@ namespace ts { } return node; } - export function createYieldExpression(asteriskToken?: Node, expression?: Expression): YieldExpression { - let node = createNode(SyntaxKind.YieldExpression); + export function createYieldExpression(asteriskToken?: Node, expression?: Expression, + location?: TextRange, flags?: NodeFlags): YieldExpression { + let node = createNode(SyntaxKind.YieldExpression, location, flags); if (arguments.length) { node.asteriskToken = asteriskToken; node.expression = expression; @@ -871,8 +886,8 @@ namespace ts { } return node; } - export function createSpreadElementExpression(expression?: Expression): SpreadElementExpression { - let node = createNode(SyntaxKind.SpreadElementExpression); + export function createSpreadElementExpression(expression?: Expression, location?: TextRange, flags?: NodeFlags): SpreadElementExpression { + let node = createNode(SyntaxKind.SpreadElementExpression, location, flags); node.expression = expression; return node; } @@ -884,9 +899,9 @@ namespace ts { return node; } export function createClassExpression(decorators?: Array, modifiers?: Array, name?: Identifier, - typeParameters?: Array, heritageClauses?: Array, members?: Array - ): ClassExpression { - let node = createNode(SyntaxKind.ClassExpression); + typeParameters?: Array, heritageClauses?: Array, members?: Array, + location?: TextRange, flags?: NodeFlags): ClassExpression { + let node = createNode(SyntaxKind.ClassExpression, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -907,12 +922,12 @@ namespace ts { } return node; } - export function createOmittedExpression(): Expression { - return createNode(SyntaxKind.OmittedExpression); + export function createOmittedExpression(location?: TextRange, flags?: NodeFlags): Expression { + return createNode(SyntaxKind.OmittedExpression, location, flags); } - export function createExpressionWithTypeArguments(expression?: LeftHandSideExpression, typeArguments?: Array - ): ExpressionWithTypeArguments { - let node = createNode(SyntaxKind.ExpressionWithTypeArguments); + export function createExpressionWithTypeArguments(expression?: LeftHandSideExpression, typeArguments?: Array, + location?: TextRange, flags?: NodeFlags): ExpressionWithTypeArguments { + let node = createNode(SyntaxKind.ExpressionWithTypeArguments, location, flags); if (arguments.length) { node.expression = expression; node.typeArguments = typeArguments && createNodeArray(typeArguments) @@ -927,8 +942,8 @@ namespace ts { } return node; } - export function createAsExpression(expression?: Expression, type?: TypeNode): AsExpression { - let node = createNode(SyntaxKind.AsExpression); + export function createAsExpression(expression?: Expression, type?: TypeNode, location?: TextRange, flags?: NodeFlags): AsExpression { + let node = createNode(SyntaxKind.AsExpression, location, flags); if (arguments.length) { node.expression = expression; node.type = type; @@ -942,8 +957,9 @@ namespace ts { } return node; } - export function createTemplateSpan(expression?: Expression, literal?: LiteralExpression): TemplateSpan { - let node = createNode(SyntaxKind.TemplateSpan); + export function createTemplateSpan(expression?: Expression, literal?: LiteralExpression, + location?: TextRange, flags?: NodeFlags): TemplateSpan { + let node = createNode(SyntaxKind.TemplateSpan, location, flags); if (arguments.length) { node.expression = expression; node.literal = literal; @@ -957,11 +973,11 @@ namespace ts { } return node; } - export function createSemicolonClassElement(): SemicolonClassElement { - return createNode(SyntaxKind.SemicolonClassElement); + export function createSemicolonClassElement(location?: TextRange, flags?: NodeFlags): SemicolonClassElement { + return createNode(SyntaxKind.SemicolonClassElement, location, flags); } - export function createBlock(statements?: Array): Block { - let node = createNode(SyntaxKind.Block); + export function createBlock(statements?: Array, location?: TextRange, flags?: NodeFlags): Block { + let node = createNode(SyntaxKind.Block, location, flags); node.statements = statements && createNodeArray(statements) return node; } @@ -972,8 +988,9 @@ namespace ts { } return node; } - export function createVariableStatement(declarationList?: VariableDeclarationList): VariableStatement { - let node = createNode(SyntaxKind.VariableStatement); + export function createVariableStatement(declarationList?: VariableDeclarationList, + location?: TextRange, flags?: NodeFlags): VariableStatement { + let node = createNode(SyntaxKind.VariableStatement, location, flags); node.declarationList = declarationList; return node; } @@ -984,11 +1001,11 @@ namespace ts { } return node; } - export function createEmptyStatement(): EmptyStatement { - return createNode(SyntaxKind.EmptyStatement); + export function createEmptyStatement(location?: TextRange, flags?: NodeFlags): EmptyStatement { + return createNode(SyntaxKind.EmptyStatement, location, flags); } - export function createExpressionStatement(expression?: Expression): ExpressionStatement { - let node = createNode(SyntaxKind.ExpressionStatement); + export function createExpressionStatement(expression?: Expression, location?: TextRange, flags?: NodeFlags): ExpressionStatement { + let node = createNode(SyntaxKind.ExpressionStatement, location, flags); node.expression = expression; return node; } @@ -999,8 +1016,9 @@ namespace ts { } return node; } - export function createIfStatement(expression?: Expression, thenStatement?: Statement, elseStatement?: Statement): IfStatement { - let node = createNode(SyntaxKind.IfStatement); + export function createIfStatement(expression?: Expression, thenStatement?: Statement, elseStatement?: Statement, + location?: TextRange, flags?: NodeFlags): IfStatement { + let node = createNode(SyntaxKind.IfStatement, location, flags); if (arguments.length) { node.expression = expression; node.thenStatement = thenStatement; @@ -1016,8 +1034,8 @@ namespace ts { } return node; } - export function createDoStatement(statement?: Statement, expression?: Expression): DoStatement { - let node = createNode(SyntaxKind.DoStatement); + export function createDoStatement(statement?: Statement, expression?: Expression, location?: TextRange, flags?: NodeFlags): DoStatement { + let node = createNode(SyntaxKind.DoStatement, location, flags); if (arguments.length) { node.statement = statement; node.expression = expression; @@ -1031,8 +1049,9 @@ namespace ts { } return node; } - export function createWhileStatement(expression?: Expression, statement?: Statement): WhileStatement { - let node = createNode(SyntaxKind.WhileStatement); + export function createWhileStatement(expression?: Expression, statement?: Statement, + location?: TextRange, flags?: NodeFlags): WhileStatement { + let node = createNode(SyntaxKind.WhileStatement, location, flags); if (arguments.length) { node.expression = expression; node.statement = statement; @@ -1047,8 +1066,8 @@ namespace ts { return node; } export function createForStatement(initializer?: Expression | VariableDeclarationList, condition?: Expression, incrementor?: Expression, - statement?: Statement): ForStatement { - let node = createNode(SyntaxKind.ForStatement); + statement?: Statement, location?: TextRange, flags?: NodeFlags): ForStatement { + let node = createNode(SyntaxKind.ForStatement, location, flags); if (arguments.length) { node.initializer = initializer; node.condition = condition; @@ -1066,9 +1085,9 @@ namespace ts { } return node; } - export function createForInStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement - ): ForInStatement { - let node = createNode(SyntaxKind.ForInStatement); + export function createForInStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement, + location?: TextRange, flags?: NodeFlags): ForInStatement { + let node = createNode(SyntaxKind.ForInStatement, location, flags); if (arguments.length) { node.initializer = initializer; node.expression = expression; @@ -1084,9 +1103,9 @@ namespace ts { } return node; } - export function createForOfStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement - ): ForOfStatement { - let node = createNode(SyntaxKind.ForOfStatement); + export function createForOfStatement(initializer?: Expression | VariableDeclarationList, expression?: Expression, statement?: Statement, + location?: TextRange, flags?: NodeFlags): ForOfStatement { + let node = createNode(SyntaxKind.ForOfStatement, location, flags); if (arguments.length) { node.initializer = initializer; node.expression = expression; @@ -1102,8 +1121,8 @@ namespace ts { } return node; } - export function createContinueStatement(label?: Identifier): ContinueStatement { - let node = createNode(SyntaxKind.ContinueStatement); + export function createContinueStatement(label?: Identifier, location?: TextRange, flags?: NodeFlags): ContinueStatement { + let node = createNode(SyntaxKind.ContinueStatement, location, flags); node.label = label; return node; } @@ -1114,8 +1133,8 @@ namespace ts { } return node; } - export function createBreakStatement(label?: Identifier): BreakStatement { - let node = createNode(SyntaxKind.BreakStatement); + export function createBreakStatement(label?: Identifier, location?: TextRange, flags?: NodeFlags): BreakStatement { + let node = createNode(SyntaxKind.BreakStatement, location, flags); node.label = label; return node; } @@ -1126,8 +1145,8 @@ namespace ts { } return node; } - export function createReturnStatement(expression?: Expression): ReturnStatement { - let node = createNode(SyntaxKind.ReturnStatement); + export function createReturnStatement(expression?: Expression, location?: TextRange, flags?: NodeFlags): ReturnStatement { + let node = createNode(SyntaxKind.ReturnStatement, location, flags); node.expression = expression; return node; } @@ -1138,8 +1157,8 @@ namespace ts { } return node; } - export function createWithStatement(expression?: Expression, statement?: Statement): WithStatement { - let node = createNode(SyntaxKind.WithStatement); + export function createWithStatement(expression?: Expression, statement?: Statement, location?: TextRange, flags?: NodeFlags): WithStatement { + let node = createNode(SyntaxKind.WithStatement, location, flags); if (arguments.length) { node.expression = expression; node.statement = statement; @@ -1153,8 +1172,9 @@ namespace ts { } return node; } - export function createSwitchStatement(expression?: Expression, caseBlock?: CaseBlock): SwitchStatement { - let node = createNode(SyntaxKind.SwitchStatement); + export function createSwitchStatement(expression?: Expression, caseBlock?: CaseBlock, + location?: TextRange, flags?: NodeFlags): SwitchStatement { + let node = createNode(SyntaxKind.SwitchStatement, location, flags); if (arguments.length) { node.expression = expression; node.caseBlock = caseBlock; @@ -1168,8 +1188,9 @@ namespace ts { } return node; } - export function createLabeledStatement(label?: Identifier, statement?: Statement): LabeledStatement { - let node = createNode(SyntaxKind.LabeledStatement); + export function createLabeledStatement(label?: Identifier, statement?: Statement, + location?: TextRange, flags?: NodeFlags): LabeledStatement { + let node = createNode(SyntaxKind.LabeledStatement, location, flags); if (arguments.length) { node.label = label; node.statement = statement; @@ -1183,8 +1204,8 @@ namespace ts { } return node; } - export function createThrowStatement(expression?: Expression): ThrowStatement { - let node = createNode(SyntaxKind.ThrowStatement); + export function createThrowStatement(expression?: Expression, location?: TextRange, flags?: NodeFlags): ThrowStatement { + let node = createNode(SyntaxKind.ThrowStatement, location, flags); node.expression = expression; return node; } @@ -1195,8 +1216,9 @@ namespace ts { } return node; } - export function createTryStatement(tryBlock?: Block, catchClause?: CatchClause, finallyBlock?: Block): TryStatement { - let node = createNode(SyntaxKind.TryStatement); + export function createTryStatement(tryBlock?: Block, catchClause?: CatchClause, finallyBlock?: Block, + location?: TextRange, flags?: NodeFlags): TryStatement { + let node = createNode(SyntaxKind.TryStatement, location, flags); if (arguments.length) { node.tryBlock = tryBlock; node.catchClause = catchClause; @@ -1211,12 +1233,12 @@ namespace ts { } return node; } - export function createDebuggerStatement(): DebuggerStatement { - return createNode(SyntaxKind.DebuggerStatement); + export function createDebuggerStatement(location?: TextRange, flags?: NodeFlags): DebuggerStatement { + return createNode(SyntaxKind.DebuggerStatement, location, flags); } export function createVariableDeclaration(decorators?: Array, modifiers?: Array, name?: BindingPattern | Identifier, - type?: TypeNode, initializer?: Expression): VariableDeclaration { - let node = createNode(SyntaxKind.VariableDeclaration); + type?: TypeNode, initializer?: Expression, location?: TextRange, flags?: NodeFlags): VariableDeclaration { + let node = createNode(SyntaxKind.VariableDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1235,8 +1257,9 @@ namespace ts { } return node; } - export function createVariableDeclarationList(declarations?: Array): VariableDeclarationList { - let node = createNode(SyntaxKind.VariableDeclarationList); + export function createVariableDeclarationList(declarations?: Array, + location?: TextRange, flags?: NodeFlags): VariableDeclarationList { + let node = createNode(SyntaxKind.VariableDeclarationList, location, flags); node.declarations = declarations && createNodeArray(declarations) return node; } @@ -1249,9 +1272,9 @@ namespace ts { return node; } export function createFunctionDeclaration(decorators?: Array, modifiers?: Array, asteriskToken?: Node, name?: Identifier, - typeParameters?: Array, parameters?: Array, type?: TypeNode, body?: Block - ): FunctionDeclaration { - let node = createNode(SyntaxKind.FunctionDeclaration); + typeParameters?: Array, parameters?: Array, type?: TypeNode, body?: Block, + location?: TextRange, flags?: NodeFlags): FunctionDeclaration { + let node = createNode(SyntaxKind.FunctionDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1275,9 +1298,9 @@ namespace ts { return node; } export function createClassDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier, - typeParameters?: Array, heritageClauses?: Array, members?: Array - ): ClassDeclaration { - let node = createNode(SyntaxKind.ClassDeclaration); + typeParameters?: Array, heritageClauses?: Array, members?: Array, + location?: TextRange, flags?: NodeFlags): ClassDeclaration { + let node = createNode(SyntaxKind.ClassDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1299,9 +1322,9 @@ namespace ts { return node; } export function createInterfaceDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier, - typeParameters?: Array, heritageClauses?: Array, members?: Array - ): InterfaceDeclaration { - let node = createNode(SyntaxKind.InterfaceDeclaration); + typeParameters?: Array, heritageClauses?: Array, members?: Array, + location?: TextRange, flags?: NodeFlags): InterfaceDeclaration { + let node = createNode(SyntaxKind.InterfaceDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1323,8 +1346,8 @@ namespace ts { return node; } export function createTypeAliasDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier, - typeParameters?: Array, type?: TypeNode): TypeAliasDeclaration { - let node = createNode(SyntaxKind.TypeAliasDeclaration); + typeParameters?: Array, type?: TypeNode, location?: TextRange, flags?: NodeFlags): TypeAliasDeclaration { + let node = createNode(SyntaxKind.TypeAliasDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1343,9 +1366,9 @@ namespace ts { } return node; } - export function createEnumDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier, members?: Array - ): EnumDeclaration { - let node = createNode(SyntaxKind.EnumDeclaration); + export function createEnumDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier, members?: Array, + location?: TextRange, flags?: NodeFlags): EnumDeclaration { + let node = createNode(SyntaxKind.EnumDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1363,8 +1386,8 @@ namespace ts { return node; } export function createModuleDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier | LiteralExpression, - body?: ModuleBlock | ModuleDeclaration): ModuleDeclaration { - let node = createNode(SyntaxKind.ModuleDeclaration); + body?: ModuleBlock | ModuleDeclaration, location?: TextRange, flags?: NodeFlags): ModuleDeclaration { + let node = createNode(SyntaxKind.ModuleDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1381,8 +1404,8 @@ namespace ts { } return node; } - export function createModuleBlock(statements?: Array): ModuleBlock { - let node = createNode(SyntaxKind.ModuleBlock); + export function createModuleBlock(statements?: Array, location?: TextRange, flags?: NodeFlags): ModuleBlock { + let node = createNode(SyntaxKind.ModuleBlock, location, flags); node.statements = statements && createNodeArray(statements) return node; } @@ -1393,8 +1416,8 @@ namespace ts { } return node; } - export function createCaseBlock(clauses?: Array): CaseBlock { - let node = createNode(SyntaxKind.CaseBlock); + export function createCaseBlock(clauses?: Array, location?: TextRange, flags?: NodeFlags): CaseBlock { + let node = createNode(SyntaxKind.CaseBlock, location, flags); node.clauses = clauses && createNodeArray(clauses) return node; } @@ -1406,8 +1429,8 @@ namespace ts { return node; } export function createImportEqualsDeclaration(decorators?: Array, modifiers?: Array, name?: Identifier, - moduleReference?: EntityName | ExternalModuleReference): ImportEqualsDeclaration { - let node = createNode(SyntaxKind.ImportEqualsDeclaration); + moduleReference?: EntityName | ExternalModuleReference, location?: TextRange, flags?: NodeFlags): ImportEqualsDeclaration { + let node = createNode(SyntaxKind.ImportEqualsDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1425,8 +1448,8 @@ namespace ts { return node; } export function createImportDeclaration(decorators?: Array, modifiers?: Array, importClause?: ImportClause, - moduleSpecifier?: Expression): ImportDeclaration { - let node = createNode(SyntaxKind.ImportDeclaration); + moduleSpecifier?: Expression, location?: TextRange, flags?: NodeFlags): ImportDeclaration { + let node = createNode(SyntaxKind.ImportDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1444,8 +1467,9 @@ namespace ts { } return node; } - export function createImportClause(name?: Identifier, namedBindings?: NamedImports | NamespaceImport): ImportClause { - let node = createNode(SyntaxKind.ImportClause); + export function createImportClause(name?: Identifier, namedBindings?: NamedImports | NamespaceImport, + location?: TextRange, flags?: NodeFlags): ImportClause { + let node = createNode(SyntaxKind.ImportClause, location, flags); if (arguments.length) { node.name = name; node.namedBindings = namedBindings; @@ -1459,8 +1483,8 @@ namespace ts { } return node; } - export function createNamespaceImport(name?: Identifier): NamespaceImport { - let node = createNode(SyntaxKind.NamespaceImport); + export function createNamespaceImport(name?: Identifier, location?: TextRange, flags?: NodeFlags): NamespaceImport { + let node = createNode(SyntaxKind.NamespaceImport, location, flags); node.name = name; return node; } @@ -1471,8 +1495,8 @@ namespace ts { } return node; } - export function createNamedImports(elements?: Array): NamedImports { - let node = createNode(SyntaxKind.NamedImports); + export function createNamedImports(elements?: Array, location?: TextRange, flags?: NodeFlags): NamedImports { + let node = createNode(SyntaxKind.NamedImports, location, flags); node.elements = elements && createNodeArray(elements) return node; } @@ -1483,8 +1507,9 @@ namespace ts { } return node; } - export function createImportSpecifier(propertyName?: Identifier, name?: Identifier): ImportSpecifier { - let node = createNode(SyntaxKind.ImportSpecifier); + export function createImportSpecifier(propertyName?: Identifier, name?: Identifier, + location?: TextRange, flags?: NodeFlags): ImportSpecifier { + let node = createNode(SyntaxKind.ImportSpecifier, location, flags); if (arguments.length) { node.propertyName = propertyName; node.name = name; @@ -1498,8 +1523,9 @@ namespace ts { } return node; } - export function createExportAssignment(decorators?: Array, modifiers?: Array, expression?: Expression): ExportAssignment { - let node = createNode(SyntaxKind.ExportAssignment); + export function createExportAssignment(decorators?: Array, modifiers?: Array, expression?: Expression, + location?: TextRange, flags?: NodeFlags): ExportAssignment { + let node = createNode(SyntaxKind.ExportAssignment, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1516,8 +1542,8 @@ namespace ts { return node; } export function createExportDeclaration(decorators?: Array, modifiers?: Array, exportClause?: NamedExports, - moduleSpecifier?: Expression): ExportDeclaration { - let node = createNode(SyntaxKind.ExportDeclaration); + moduleSpecifier?: Expression, location?: TextRange, flags?: NodeFlags): ExportDeclaration { + let node = createNode(SyntaxKind.ExportDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1535,8 +1561,8 @@ namespace ts { } return node; } - export function createNamedExports(elements?: Array): NamedExports { - let node = createNode(SyntaxKind.NamedExports); + export function createNamedExports(elements?: Array, location?: TextRange, flags?: NodeFlags): NamedExports { + let node = createNode(SyntaxKind.NamedExports, location, flags); node.elements = elements && createNodeArray(elements) return node; } @@ -1547,8 +1573,9 @@ namespace ts { } return node; } - export function createExportSpecifier(propertyName?: Identifier, name?: Identifier): ExportSpecifier { - let node = createNode(SyntaxKind.ExportSpecifier); + export function createExportSpecifier(propertyName?: Identifier, name?: Identifier, + location?: TextRange, flags?: NodeFlags): ExportSpecifier { + let node = createNode(SyntaxKind.ExportSpecifier, location, flags); if (arguments.length) { node.propertyName = propertyName; node.name = name; @@ -1562,8 +1589,9 @@ namespace ts { } return node; } - export function createMissingDeclaration(decorators?: Array, modifiers?: Array): MissingDeclaration { - let node = createNode(SyntaxKind.MissingDeclaration); + export function createMissingDeclaration(decorators?: Array, modifiers?: Array, + location?: TextRange, flags?: NodeFlags): MissingDeclaration { + let node = createNode(SyntaxKind.MissingDeclaration, location, flags); if (arguments.length) { node.decorators = decorators && createNodeArray(decorators) setModifiers(node, modifiers); @@ -1578,8 +1606,8 @@ namespace ts { } return node; } - export function createExternalModuleReference(expression?: Expression): ExternalModuleReference { - let node = createNode(SyntaxKind.ExternalModuleReference); + export function createExternalModuleReference(expression?: Expression, location?: TextRange, flags?: NodeFlags): ExternalModuleReference { + let node = createNode(SyntaxKind.ExternalModuleReference, location, flags); node.expression = expression; return node; } @@ -1590,9 +1618,9 @@ namespace ts { } return node; } - export function createJsxElement(openingElement?: JsxOpeningElement, children?: Array, closingElement?: JsxClosingElement - ): JsxElement { - let node = createNode(SyntaxKind.JsxElement); + export function createJsxElement(openingElement?: JsxOpeningElement, children?: Array, closingElement?: JsxClosingElement, + location?: TextRange, flags?: NodeFlags): JsxElement { + let node = createNode(SyntaxKind.JsxElement, location, flags); if (arguments.length) { node.openingElement = openingElement; node.children = children && createNodeArray(children) @@ -1608,9 +1636,9 @@ namespace ts { } return node; } - export function createJsxSelfClosingElement(tagName?: EntityName, attributes?: Array - ): JsxSelfClosingElement { - let node = createNode(SyntaxKind.JsxSelfClosingElement); + export function createJsxSelfClosingElement(tagName?: EntityName, attributes?: Array, + location?: TextRange, flags?: NodeFlags): JsxSelfClosingElement { + let node = createNode(SyntaxKind.JsxSelfClosingElement, location, flags); if (arguments.length) { node.tagName = tagName; node.attributes = attributes && createNodeArray(attributes) @@ -1625,8 +1653,9 @@ namespace ts { } return node; } - export function createJsxOpeningElement(tagName?: EntityName, attributes?: Array): JsxOpeningElement { - let node = createNode(SyntaxKind.JsxOpeningElement); + export function createJsxOpeningElement(tagName?: EntityName, attributes?: Array, + location?: TextRange, flags?: NodeFlags): JsxOpeningElement { + let node = createNode(SyntaxKind.JsxOpeningElement, location, flags); if (arguments.length) { node.tagName = tagName; node.attributes = attributes && createNodeArray(attributes) @@ -1641,11 +1670,11 @@ namespace ts { } return node; } - export function createJsxText(): JsxText { - return createNode(SyntaxKind.JsxText); + export function createJsxText(location?: TextRange, flags?: NodeFlags): JsxText { + return createNode(SyntaxKind.JsxText, location, flags); } - export function createJsxClosingElement(tagName?: EntityName): JsxClosingElement { - let node = createNode(SyntaxKind.JsxClosingElement); + export function createJsxClosingElement(tagName?: EntityName, location?: TextRange, flags?: NodeFlags): JsxClosingElement { + let node = createNode(SyntaxKind.JsxClosingElement, location, flags); node.tagName = tagName; return node; } @@ -1656,8 +1685,8 @@ namespace ts { } return node; } - export function createJsxAttribute(name?: Identifier, initializer?: Expression): JsxAttribute { - let node = createNode(SyntaxKind.JsxAttribute); + export function createJsxAttribute(name?: Identifier, initializer?: Expression, location?: TextRange, flags?: NodeFlags): JsxAttribute { + let node = createNode(SyntaxKind.JsxAttribute, location, flags); if (arguments.length) { node.name = name; node.initializer = initializer; @@ -1671,8 +1700,8 @@ namespace ts { } return node; } - export function createJsxSpreadAttribute(expression?: Expression): JsxSpreadAttribute { - let node = createNode(SyntaxKind.JsxSpreadAttribute); + export function createJsxSpreadAttribute(expression?: Expression, location?: TextRange, flags?: NodeFlags): JsxSpreadAttribute { + let node = createNode(SyntaxKind.JsxSpreadAttribute, location, flags); node.expression = expression; return node; } @@ -1683,8 +1712,8 @@ namespace ts { } return node; } - export function createJsxExpression(expression?: Expression): JsxExpression { - let node = createNode(SyntaxKind.JsxExpression); + export function createJsxExpression(expression?: Expression, location?: TextRange, flags?: NodeFlags): JsxExpression { + let node = createNode(SyntaxKind.JsxExpression, location, flags); node.expression = expression; return node; } @@ -1695,8 +1724,9 @@ namespace ts { } return node; } - export function createCaseClause(expression?: Expression, statements?: Array): CaseClause { - let node = createNode(SyntaxKind.CaseClause); + export function createCaseClause(expression?: Expression, statements?: Array, + location?: TextRange, flags?: NodeFlags): CaseClause { + let node = createNode(SyntaxKind.CaseClause, location, flags); if (arguments.length) { node.expression = expression; node.statements = statements && createNodeArray(statements) @@ -1710,8 +1740,8 @@ namespace ts { } return node; } - export function createDefaultClause(statements?: Array): DefaultClause { - let node = createNode(SyntaxKind.DefaultClause); + export function createDefaultClause(statements?: Array, location?: TextRange, flags?: NodeFlags): DefaultClause { + let node = createNode(SyntaxKind.DefaultClause, location, flags); node.statements = statements && createNodeArray(statements) return node; } @@ -1722,8 +1752,8 @@ namespace ts { } return node; } - export function createHeritageClause(types?: Array): HeritageClause { - let node = createNode(SyntaxKind.HeritageClause); + export function createHeritageClause(types?: Array, location?: TextRange, flags?: NodeFlags): HeritageClause { + let node = createNode(SyntaxKind.HeritageClause, location, flags); node.types = types && createNodeArray(types) return node; } @@ -1734,8 +1764,9 @@ namespace ts { } return node; } - export function createCatchClause(variableDeclaration?: VariableDeclaration, block?: Block): CatchClause { - let node = createNode(SyntaxKind.CatchClause); + export function createCatchClause(variableDeclaration?: VariableDeclaration, block?: Block, + location?: TextRange, flags?: NodeFlags): CatchClause { + let node = createNode(SyntaxKind.CatchClause, location, flags); if (arguments.length) { node.variableDeclaration = variableDeclaration; node.block = block; @@ -1749,8 +1780,9 @@ namespace ts { } return node; } - export function createPropertyAssignment(name?: DeclarationName, questionToken?: Node, initializer?: Expression): PropertyAssignment { - let node = createNode(SyntaxKind.PropertyAssignment); + export function createPropertyAssignment(name?: DeclarationName, questionToken?: Node, initializer?: Expression, + location?: TextRange, flags?: NodeFlags): PropertyAssignment { + let node = createNode(SyntaxKind.PropertyAssignment, location, flags); if (arguments.length) { node.name = name; node.questionToken = questionToken; @@ -1765,8 +1797,9 @@ namespace ts { } return node; } - export function createShorthandPropertyAssignment(name?: Identifier, questionToken?: Node): ShorthandPropertyAssignment { - let node = createNode(SyntaxKind.ShorthandPropertyAssignment); + export function createShorthandPropertyAssignment(name?: Identifier, questionToken?: Node, + location?: TextRange, flags?: NodeFlags): ShorthandPropertyAssignment { + let node = createNode(SyntaxKind.ShorthandPropertyAssignment, location, flags); if (arguments.length) { node.name = name; node.questionToken = questionToken; @@ -1780,8 +1813,8 @@ namespace ts { } return node; } - export function createEnumMember(name?: DeclarationName, initializer?: Expression): EnumMember { - let node = createNode(SyntaxKind.EnumMember); + export function createEnumMember(name?: DeclarationName, initializer?: Expression, location?: TextRange, flags?: NodeFlags): EnumMember { + let node = createNode(SyntaxKind.EnumMember, location, flags); if (arguments.length) { node.name = name; node.initializer = initializer; @@ -1795,8 +1828,8 @@ namespace ts { } return node; } - export function createJSDocTypeExpression(type?: JSDocType): JSDocTypeExpression { - let node = createNode(SyntaxKind.JSDocTypeExpression); + export function createJSDocTypeExpression(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocTypeExpression { + let node = createNode(SyntaxKind.JSDocTypeExpression, location, flags); node.type = type; return node; } @@ -1807,14 +1840,14 @@ namespace ts { } return node; } - export function createJSDocAllType(): JSDocAllType { - return createNode(SyntaxKind.JSDocAllType); + export function createJSDocAllType(location?: TextRange, flags?: NodeFlags): JSDocAllType { + return createNode(SyntaxKind.JSDocAllType, location, flags); } - export function createJSDocUnknownType(): JSDocUnknownType { - return createNode(SyntaxKind.JSDocUnknownType); + export function createJSDocUnknownType(location?: TextRange, flags?: NodeFlags): JSDocUnknownType { + return createNode(SyntaxKind.JSDocUnknownType, location, flags); } - export function createJSDocArrayType(elementType?: JSDocType): JSDocArrayType { - let node = createNode(SyntaxKind.JSDocArrayType); + export function createJSDocArrayType(elementType?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocArrayType { + let node = createNode(SyntaxKind.JSDocArrayType, location, flags); node.elementType = elementType; return node; } @@ -1825,8 +1858,8 @@ namespace ts { } return node; } - export function createJSDocUnionType(types?: Array): JSDocUnionType { - let node = createNode(SyntaxKind.JSDocUnionType); + export function createJSDocUnionType(types?: Array, location?: TextRange, flags?: NodeFlags): JSDocUnionType { + let node = createNode(SyntaxKind.JSDocUnionType, location, flags); node.types = types && createNodeArray(types) return node; } @@ -1837,8 +1870,8 @@ namespace ts { } return node; } - export function createJSDocTupleType(types?: Array): JSDocTupleType { - let node = createNode(SyntaxKind.JSDocTupleType); + export function createJSDocTupleType(types?: Array, location?: TextRange, flags?: NodeFlags): JSDocTupleType { + let node = createNode(SyntaxKind.JSDocTupleType, location, flags); node.types = types && createNodeArray(types) return node; } @@ -1849,8 +1882,8 @@ namespace ts { } return node; } - export function createJSDocNullableType(type?: JSDocType): JSDocNullableType { - let node = createNode(SyntaxKind.JSDocNullableType); + export function createJSDocNullableType(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocNullableType { + let node = createNode(SyntaxKind.JSDocNullableType, location, flags); node.type = type; return node; } @@ -1861,8 +1894,8 @@ namespace ts { } return node; } - export function createJSDocNonNullableType(type?: JSDocType): JSDocNonNullableType { - let node = createNode(SyntaxKind.JSDocNonNullableType); + export function createJSDocNonNullableType(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocNonNullableType { + let node = createNode(SyntaxKind.JSDocNonNullableType, location, flags); node.type = type; return node; } @@ -1873,8 +1906,8 @@ namespace ts { } return node; } - export function createJSDocRecordType(members?: Array): JSDocRecordType { - let node = createNode(SyntaxKind.JSDocRecordType); + export function createJSDocRecordType(members?: Array, location?: TextRange, flags?: NodeFlags): JSDocRecordType { + let node = createNode(SyntaxKind.JSDocRecordType, location, flags); node.members = members && createNodeArray(members) return node; } @@ -1885,8 +1918,9 @@ namespace ts { } return node; } - export function createJSDocRecordMember(name?: Identifier | LiteralExpression, type?: JSDocType): JSDocRecordMember { - let node = createNode(SyntaxKind.JSDocRecordMember); + export function createJSDocRecordMember(name?: Identifier | LiteralExpression, type?: JSDocType, + location?: TextRange, flags?: NodeFlags): JSDocRecordMember { + let node = createNode(SyntaxKind.JSDocRecordMember, location, flags); if (arguments.length) { node.name = name; node.type = type; @@ -1900,8 +1934,9 @@ namespace ts { } return node; } - export function createJSDocTypeReference(name?: EntityName, typeArguments?: Array): JSDocTypeReference { - let node = createNode(SyntaxKind.JSDocTypeReference); + export function createJSDocTypeReference(name?: EntityName, typeArguments?: Array, + location?: TextRange, flags?: NodeFlags): JSDocTypeReference { + let node = createNode(SyntaxKind.JSDocTypeReference, location, flags); if (arguments.length) { node.name = name; node.typeArguments = typeArguments && createNodeArray(typeArguments) @@ -1915,8 +1950,8 @@ namespace ts { } return node; } - export function createJSDocOptionalType(type?: JSDocType): JSDocOptionalType { - let node = createNode(SyntaxKind.JSDocOptionalType); + export function createJSDocOptionalType(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocOptionalType { + let node = createNode(SyntaxKind.JSDocOptionalType, location, flags); node.type = type; return node; } @@ -1927,8 +1962,9 @@ namespace ts { } return node; } - export function createJSDocFunctionType(parameters?: Array, type?: JSDocType): JSDocFunctionType { - let node = createNode(SyntaxKind.JSDocFunctionType); + export function createJSDocFunctionType(parameters?: Array, type?: JSDocType, + location?: TextRange, flags?: NodeFlags): JSDocFunctionType { + let node = createNode(SyntaxKind.JSDocFunctionType, location, flags); if (arguments.length) { node.parameters = parameters && createNodeArray(parameters) node.type = type; @@ -1943,8 +1979,8 @@ namespace ts { } return node; } - export function createJSDocVariadicType(type?: JSDocType): JSDocVariadicType { - let node = createNode(SyntaxKind.JSDocVariadicType); + export function createJSDocVariadicType(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocVariadicType { + let node = createNode(SyntaxKind.JSDocVariadicType, location, flags); node.type = type; return node; } @@ -1955,8 +1991,8 @@ namespace ts { } return node; } - export function createJSDocConstructorType(type?: JSDocType): JSDocConstructorType { - let node = createNode(SyntaxKind.JSDocConstructorType); + export function createJSDocConstructorType(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocConstructorType { + let node = createNode(SyntaxKind.JSDocConstructorType, location, flags); node.type = type; return node; } @@ -1967,8 +2003,8 @@ namespace ts { } return node; } - export function createJSDocThisType(type?: JSDocType): JSDocThisType { - let node = createNode(SyntaxKind.JSDocThisType); + export function createJSDocThisType(type?: JSDocType, location?: TextRange, flags?: NodeFlags): JSDocThisType { + let node = createNode(SyntaxKind.JSDocThisType, location, flags); node.type = type; return node; } @@ -1979,8 +2015,8 @@ namespace ts { } return node; } - export function createJSDocComment(tags?: Array): JSDocComment { - let node = createNode(SyntaxKind.JSDocComment); + export function createJSDocComment(tags?: Array, location?: TextRange, flags?: NodeFlags): JSDocComment { + let node = createNode(SyntaxKind.JSDocComment, location, flags); node.tags = tags && createNodeArray(tags) return node; } @@ -1991,8 +2027,8 @@ namespace ts { } return node; } - export function createJSDocTag(atToken?: Node, tagName?: Identifier): JSDocTag { - let node = createNode(SyntaxKind.JSDocTag); + export function createJSDocTag(atToken?: Node, tagName?: Identifier, location?: TextRange, flags?: NodeFlags): JSDocTag { + let node = createNode(SyntaxKind.JSDocTag, location, flags); if (arguments.length) { node.atToken = atToken; node.tagName = tagName; @@ -2007,8 +2043,8 @@ namespace ts { return node; } export function createJSDocParameterTag(preParameterName?: Identifier, typeExpression?: JSDocTypeExpression, postParameterName?: Identifier, - atToken?: Node, tagName?: Identifier): JSDocParameterTag { - let node = createNode(SyntaxKind.JSDocParameterTag); + atToken?: Node, tagName?: Identifier, location?: TextRange, flags?: NodeFlags): JSDocParameterTag { + let node = createNode(SyntaxKind.JSDocParameterTag, location, flags); if (arguments.length) { node.preParameterName = preParameterName; node.typeExpression = typeExpression; @@ -2027,8 +2063,9 @@ namespace ts { } return node; } - export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, atToken?: Node, tagName?: Identifier): JSDocReturnTag { - let node = createNode(SyntaxKind.JSDocReturnTag); + export function createJSDocReturnTag(typeExpression?: JSDocTypeExpression, atToken?: Node, tagName?: Identifier, + location?: TextRange, flags?: NodeFlags): JSDocReturnTag { + let node = createNode(SyntaxKind.JSDocReturnTag, location, flags); if (arguments.length) { node.typeExpression = typeExpression; node.atToken = atToken; @@ -2043,8 +2080,9 @@ namespace ts { } return node; } - export function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, atToken?: Node, tagName?: Identifier): JSDocTypeTag { - let node = createNode(SyntaxKind.JSDocTypeTag); + export function createJSDocTypeTag(typeExpression?: JSDocTypeExpression, atToken?: Node, tagName?: Identifier, + location?: TextRange, flags?: NodeFlags): JSDocTypeTag { + let node = createNode(SyntaxKind.JSDocTypeTag, location, flags); if (arguments.length) { node.typeExpression = typeExpression; node.atToken = atToken; @@ -2059,9 +2097,9 @@ namespace ts { } return node; } - export function createJSDocTemplateTag(typeParameters?: Array, atToken?: Node, tagName?: Identifier - ): JSDocTemplateTag { - let node = createNode(SyntaxKind.JSDocTemplateTag); + export function createJSDocTemplateTag(typeParameters?: Array, atToken?: Node, tagName?: Identifier, + location?: TextRange, flags?: NodeFlags): JSDocTemplateTag { + let node = createNode(SyntaxKind.JSDocTemplateTag, location, flags); if (arguments.length) { node.typeParameters = typeParameters && createNodeArray(typeParameters) node.atToken = atToken; @@ -2077,6 +2115,400 @@ namespace ts { } return node; } + export function cloneNode(node: TNode): TNode; + export function cloneNode(node: Node): Node { + if (!node) { + return node; + } + switch (node.kind) { + case SyntaxKind.NumericLiteral: + return factory.createNumericLiteral((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.StringLiteral: + return factory.createStringLiteral((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.RegularExpressionLiteral: + return factory.createRegularExpressionLiteral((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.NoSubstitutionTemplateLiteral: + return factory.createNoSubstitutionTemplateLiteral((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.TemplateHead: + return factory.createTemplateHead((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.TemplateMiddle: + return factory.createTemplateMiddle((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.TemplateTail: + return factory.createTemplateTail((node).text, /*location*/ undefined, node.flags); + case SyntaxKind.Identifier: + return factory.createIdentifier((node).text, (node).originalKeywordKind, + /*location*/ undefined, node.flags); + case SyntaxKind.QualifiedName: + return factory.createQualifiedName((node).left, (node).right, /*location*/ undefined, node.flags); + case SyntaxKind.ComputedPropertyName: + return factory.createComputedPropertyName((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.TypeParameter: + return factory.createTypeParameter((node).name, (node).constraint, + (node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.Parameter: + return factory.createParameter((node).decorators, (node).modifiers, + (node).dotDotDotToken, (node).name, (node).questionToken, + (node).type, (node).initializer, /*location*/ undefined, node.flags); + case SyntaxKind.Decorator: + return factory.createDecorator((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.PropertySignature: + return factory.createPropertySignature((node).decorators, (node).modifiers, + (node).name, (node).questionToken, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.PropertyDeclaration: + return factory.createPropertyDeclaration((node).decorators, (node).modifiers, + (node).name, (node).questionToken, (node).type, + (node).initializer, /*location*/ undefined, node.flags); + case SyntaxKind.MethodSignature: + return factory.createMethodSignature((node).decorators, (node).modifiers, + (node).name, (node).questionToken, (node).typeParameters, + (node).parameters, (node).type, /*location*/ undefined, node.flags); + case SyntaxKind.MethodDeclaration: + return factory.createMethodDeclaration((node).decorators, (node).modifiers, + (node).name, (node).typeParameters, (node).parameters, + (node).type, (node).body, /*location*/ undefined, node.flags); + case SyntaxKind.Constructor: + return factory.createConstructor((node).decorators, (node).modifiers, + (node).parameters, (node).type, (node).body, + /*location*/ undefined, node.flags); + case SyntaxKind.GetAccessor: + return factory.createGetAccessor((node).decorators, (node).modifiers, + (node).name, (node).parameters, (node).type, + (node).body, /*location*/ undefined, node.flags); + case SyntaxKind.SetAccessor: + return factory.createSetAccessor((node).decorators, (node).modifiers, + (node).name, (node).parameters, (node).type, + (node).body, /*location*/ undefined, node.flags); + case SyntaxKind.CallSignature: + return factory.createCallSignature((node).typeParameters, (node).parameters, + (node).type, /*location*/ undefined, node.flags); + case SyntaxKind.ConstructSignature: + return factory.createConstructSignature((node).typeParameters, + (node).parameters, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.IndexSignature: + return factory.createIndexSignature((node).decorators, (node).modifiers, + (node).parameters, (node).type, /*location*/ undefined, node.flags); + case SyntaxKind.TypePredicate: + return factory.createTypePredicate((node).parameterName, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.TypeReference: + return factory.createTypeReference((node).typeName, (node).typeArguments, + /*location*/ undefined, node.flags); + case SyntaxKind.FunctionType: + return factory.createFunctionType((node).typeParameters, (node).parameters, + (node).type, /*location*/ undefined, node.flags); + case SyntaxKind.ConstructorType: + return factory.createConstructorType((node).typeParameters, (node).parameters, + (node).type, /*location*/ undefined, node.flags); + case SyntaxKind.TypeQuery: + return factory.createTypeQuery((node).exprName, /*location*/ undefined, node.flags); + case SyntaxKind.TypeLiteral: + return factory.createTypeLiteral((node).members, /*location*/ undefined, node.flags); + case SyntaxKind.ArrayType: + return factory.createArrayType((node).elementType, /*location*/ undefined, node.flags); + case SyntaxKind.TupleType: + return factory.createTupleType((node).elementTypes, /*location*/ undefined, node.flags); + case SyntaxKind.UnionType: + return factory.createUnionType((node).types, /*location*/ undefined, node.flags); + case SyntaxKind.IntersectionType: + return factory.createIntersectionType((node).types, /*location*/ undefined, node.flags); + case SyntaxKind.ParenthesizedType: + return factory.createParenthesizedType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.ObjectBindingPattern: + return factory.createObjectBindingPattern((node).elements, /*location*/ undefined, node.flags); + case SyntaxKind.ArrayBindingPattern: + return factory.createArrayBindingPattern((node).elements, /*location*/ undefined, node.flags); + case SyntaxKind.BindingElement: + return factory.createBindingElement((node).decorators, (node).modifiers, + (node).propertyName, (node).dotDotDotToken, (node).name, + (node).initializer, /*location*/ undefined, node.flags); + case SyntaxKind.ArrayLiteralExpression: + return factory.createArrayLiteralExpression((node).elements, /*location*/ undefined, node.flags); + case SyntaxKind.ObjectLiteralExpression: + return factory.createObjectLiteralExpression((node).decorators, + (node).modifiers, (node).properties, /*location*/ undefined, node.flags); + case SyntaxKind.PropertyAccessExpression: + return factory.createPropertyAccessExpression((node).expression, + (node).dotToken, (node).name, /*location*/ undefined, node.flags); + case SyntaxKind.ElementAccessExpression: + return factory.createElementAccessExpression((node).expression, + (node).argumentExpression, /*location*/ undefined, node.flags); + case SyntaxKind.CallExpression: + return factory.createCallExpression((node).expression, (node).typeArguments, + (node).arguments, /*location*/ undefined, node.flags); + case SyntaxKind.NewExpression: + return factory.createNewExpression((node).expression, (node).typeArguments, + (node).arguments, /*location*/ undefined, node.flags); + case SyntaxKind.TaggedTemplateExpression: + return factory.createTaggedTemplateExpression((node).tag, (node).template, + /*location*/ undefined, node.flags); + case SyntaxKind.TypeAssertionExpression: + return factory.createTypeAssertionExpression((node).type, (node).expression, + /*location*/ undefined, node.flags); + case SyntaxKind.ParenthesizedExpression: + return factory.createParenthesizedExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.FunctionExpression: + return factory.createFunctionExpression((node).decorators, (node).modifiers, + (node).asteriskToken, (node).name, (node).typeParameters, + (node).parameters, (node).type, (node).body, + /*location*/ undefined, node.flags); + case SyntaxKind.ArrowFunction: + return factory.createArrowFunction((node).decorators, (node).modifiers, + (node).typeParameters, (node).parameters, (node).type, + (node).equalsGreaterThanToken, (node).body, /*location*/ undefined, node.flags); + case SyntaxKind.DeleteExpression: + return factory.createDeleteExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.TypeOfExpression: + return factory.createTypeOfExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.VoidExpression: + return factory.createVoidExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.AwaitExpression: + return factory.createAwaitExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.PrefixUnaryExpression: + return factory.createPrefixUnaryExpression((node).operator, (node).operand, + /*location*/ undefined, node.flags); + case SyntaxKind.PostfixUnaryExpression: + return factory.createPostfixUnaryExpression((node).operand, (node).operator, + /*location*/ undefined, node.flags); + case SyntaxKind.BinaryExpression: + return factory.createBinaryExpression((node).left, (node).operatorToken, + (node).right, /*location*/ undefined, node.flags); + case SyntaxKind.ConditionalExpression: + return factory.createConditionalExpression((node).condition, (node).questionToken, + (node).whenTrue, (node).colonToken, (node).whenFalse, + /*location*/ undefined, node.flags); + case SyntaxKind.TemplateExpression: + return factory.createTemplateExpression((node).head, (node).templateSpans, + /*location*/ undefined, node.flags); + case SyntaxKind.YieldExpression: + return factory.createYieldExpression((node).asteriskToken, (node).expression, + /*location*/ undefined, node.flags); + case SyntaxKind.SpreadElementExpression: + return factory.createSpreadElementExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.ClassExpression: + return factory.createClassExpression((node).decorators, (node).modifiers, + (node).name, (node).typeParameters, (node).heritageClauses, + (node).members, /*location*/ undefined, node.flags); + case SyntaxKind.OmittedExpression: + return factory.createOmittedExpression(/*location*/ undefined, node.flags); + case SyntaxKind.ExpressionWithTypeArguments: + return factory.createExpressionWithTypeArguments((node).expression, + (node).typeArguments, /*location*/ undefined, node.flags); + case SyntaxKind.AsExpression: + return factory.createAsExpression((node).expression, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.TemplateSpan: + return factory.createTemplateSpan((node).expression, (node).literal, + /*location*/ undefined, node.flags); + case SyntaxKind.SemicolonClassElement: + return factory.createSemicolonClassElement(/*location*/ undefined, node.flags); + case SyntaxKind.Block: + return factory.createBlock((node).statements, /*location*/ undefined, node.flags); + case SyntaxKind.VariableStatement: + return factory.createVariableStatement((node).declarationList, /*location*/ undefined, node.flags); + case SyntaxKind.EmptyStatement: + return factory.createEmptyStatement(/*location*/ undefined, node.flags); + case SyntaxKind.ExpressionStatement: + return factory.createExpressionStatement((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.IfStatement: + return factory.createIfStatement((node).expression, (node).thenStatement, + (node).elseStatement, /*location*/ undefined, node.flags); + case SyntaxKind.DoStatement: + return factory.createDoStatement((node).statement, (node).expression, + /*location*/ undefined, node.flags); + case SyntaxKind.WhileStatement: + return factory.createWhileStatement((node).expression, (node).statement, + /*location*/ undefined, node.flags); + case SyntaxKind.ForStatement: + return factory.createForStatement((node).initializer, (node).condition, + (node).incrementor, (node).statement, /*location*/ undefined, node.flags); + case SyntaxKind.ForInStatement: + return factory.createForInStatement((node).initializer, (node).expression, + (node).statement, /*location*/ undefined, node.flags); + case SyntaxKind.ForOfStatement: + return factory.createForOfStatement((node).initializer, (node).expression, + (node).statement, /*location*/ undefined, node.flags); + case SyntaxKind.ContinueStatement: + return factory.createContinueStatement((node).label, /*location*/ undefined, node.flags); + case SyntaxKind.BreakStatement: + return factory.createBreakStatement((node).label, /*location*/ undefined, node.flags); + case SyntaxKind.ReturnStatement: + return factory.createReturnStatement((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.WithStatement: + return factory.createWithStatement((node).expression, (node).statement, + /*location*/ undefined, node.flags); + case SyntaxKind.SwitchStatement: + return factory.createSwitchStatement((node).expression, (node).caseBlock, + /*location*/ undefined, node.flags); + case SyntaxKind.LabeledStatement: + return factory.createLabeledStatement((node).label, (node).statement, + /*location*/ undefined, node.flags); + case SyntaxKind.ThrowStatement: + return factory.createThrowStatement((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.TryStatement: + return factory.createTryStatement((node).tryBlock, (node).catchClause, + (node).finallyBlock, /*location*/ undefined, node.flags); + case SyntaxKind.DebuggerStatement: + return factory.createDebuggerStatement(/*location*/ undefined, node.flags); + case SyntaxKind.VariableDeclaration: + return factory.createVariableDeclaration((node).decorators, (node).modifiers, + (node).name, (node).type, (node).initializer, + /*location*/ undefined, node.flags); + case SyntaxKind.VariableDeclarationList: + return factory.createVariableDeclarationList((node).declarations, /*location*/ undefined, node.flags); + case SyntaxKind.FunctionDeclaration: + return factory.createFunctionDeclaration((node).decorators, (node).modifiers, + (node).asteriskToken, (node).name, (node).typeParameters, + (node).parameters, (node).type, (node).body, + /*location*/ undefined, node.flags); + case SyntaxKind.ClassDeclaration: + return factory.createClassDeclaration((node).decorators, (node).modifiers, + (node).name, (node).typeParameters, (node).heritageClauses, + (node).members, /*location*/ undefined, node.flags); + case SyntaxKind.InterfaceDeclaration: + return factory.createInterfaceDeclaration((node).decorators, (node).modifiers, + (node).name, (node).typeParameters, (node).heritageClauses, + (node).members, /*location*/ undefined, node.flags); + case SyntaxKind.TypeAliasDeclaration: + return factory.createTypeAliasDeclaration((node).decorators, (node).modifiers, + (node).name, (node).typeParameters, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.EnumDeclaration: + return factory.createEnumDeclaration((node).decorators, (node).modifiers, + (node).name, (node).members, /*location*/ undefined, node.flags); + case SyntaxKind.ModuleDeclaration: + return factory.createModuleDeclaration((node).decorators, (node).modifiers, + (node).name, (node).body, /*location*/ undefined, node.flags); + case SyntaxKind.ModuleBlock: + return factory.createModuleBlock((node).statements, /*location*/ undefined, node.flags); + case SyntaxKind.CaseBlock: + return factory.createCaseBlock((node).clauses, /*location*/ undefined, node.flags); + case SyntaxKind.ImportEqualsDeclaration: + return factory.createImportEqualsDeclaration((node).decorators, + (node).modifiers, (node).name, + (node).moduleReference, /*location*/ undefined, node.flags); + case SyntaxKind.ImportDeclaration: + return factory.createImportDeclaration((node).decorators, (node).modifiers, + (node).importClause, (node).moduleSpecifier, /*location*/ undefined, node.flags); + case SyntaxKind.ImportClause: + return factory.createImportClause((node).name, (node).namedBindings, + /*location*/ undefined, node.flags); + case SyntaxKind.NamespaceImport: + return factory.createNamespaceImport((node).name, /*location*/ undefined, node.flags); + case SyntaxKind.NamedImports: + return factory.createNamedImports((node).elements, /*location*/ undefined, node.flags); + case SyntaxKind.ImportSpecifier: + return factory.createImportSpecifier((node).propertyName, (node).name, + /*location*/ undefined, node.flags); + case SyntaxKind.ExportAssignment: + return factory.createExportAssignment((node).decorators, (node).modifiers, + (node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.ExportDeclaration: + return factory.createExportDeclaration((node).decorators, (node).modifiers, + (node).exportClause, (node).moduleSpecifier, /*location*/ undefined, node.flags); + case SyntaxKind.NamedExports: + return factory.createNamedExports((node).elements, /*location*/ undefined, node.flags); + case SyntaxKind.ExportSpecifier: + return factory.createExportSpecifier((node).propertyName, (node).name, + /*location*/ undefined, node.flags); + case SyntaxKind.MissingDeclaration: + return factory.createMissingDeclaration((node).decorators, (node).modifiers, + /*location*/ undefined, node.flags); + case SyntaxKind.ExternalModuleReference: + return factory.createExternalModuleReference((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.JsxElement: + return factory.createJsxElement((node).openingElement, (node).children, + (node).closingElement, /*location*/ undefined, node.flags); + case SyntaxKind.JsxSelfClosingElement: + return factory.createJsxSelfClosingElement((node).tagName, (node).attributes, + /*location*/ undefined, node.flags); + case SyntaxKind.JsxOpeningElement: + return factory.createJsxOpeningElement((node).tagName, (node).attributes, + /*location*/ undefined, node.flags); + case SyntaxKind.JsxText: + return factory.createJsxText(/*location*/ undefined, node.flags); + case SyntaxKind.JsxClosingElement: + return factory.createJsxClosingElement((node).tagName, /*location*/ undefined, node.flags); + case SyntaxKind.JsxAttribute: + return factory.createJsxAttribute((node).name, (node).initializer, + /*location*/ undefined, node.flags); + case SyntaxKind.JsxSpreadAttribute: + return factory.createJsxSpreadAttribute((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.JsxExpression: + return factory.createJsxExpression((node).expression, /*location*/ undefined, node.flags); + case SyntaxKind.CaseClause: + return factory.createCaseClause((node).expression, (node).statements, + /*location*/ undefined, node.flags); + case SyntaxKind.DefaultClause: + return factory.createDefaultClause((node).statements, /*location*/ undefined, node.flags); + case SyntaxKind.HeritageClause: + return factory.createHeritageClause((node).types, /*location*/ undefined, node.flags); + case SyntaxKind.CatchClause: + return factory.createCatchClause((node).variableDeclaration, (node).block, + /*location*/ undefined, node.flags); + case SyntaxKind.PropertyAssignment: + return factory.createPropertyAssignment((node).name, (node).questionToken, + (node).initializer, /*location*/ undefined, node.flags); + case SyntaxKind.ShorthandPropertyAssignment: + return factory.createShorthandPropertyAssignment((node).name, + (node).questionToken, /*location*/ undefined, node.flags); + case SyntaxKind.EnumMember: + return factory.createEnumMember((node).name, (node).initializer, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocTypeExpression: + return factory.createJSDocTypeExpression((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocAllType: + return factory.createJSDocAllType(/*location*/ undefined, node.flags); + case SyntaxKind.JSDocUnknownType: + return factory.createJSDocUnknownType(/*location*/ undefined, node.flags); + case SyntaxKind.JSDocArrayType: + return factory.createJSDocArrayType((node).elementType, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocUnionType: + return factory.createJSDocUnionType((node).types, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocTupleType: + return factory.createJSDocTupleType((node).types, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocNullableType: + return factory.createJSDocNullableType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocNonNullableType: + return factory.createJSDocNonNullableType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocRecordType: + return factory.createJSDocRecordType((node).members, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocRecordMember: + return factory.createJSDocRecordMember((node).name, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.JSDocTypeReference: + return factory.createJSDocTypeReference((node).name, (node).typeArguments, + /*location*/ undefined, node.flags); + case SyntaxKind.JSDocOptionalType: + return factory.createJSDocOptionalType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocFunctionType: + return factory.createJSDocFunctionType((node).parameters, (node).type, + /*location*/ undefined, node.flags); + case SyntaxKind.JSDocVariadicType: + return factory.createJSDocVariadicType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocConstructorType: + return factory.createJSDocConstructorType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocThisType: + return factory.createJSDocThisType((node).type, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocComment: + return factory.createJSDocComment((node).tags, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocTag: + return factory.createJSDocTag((node).atToken, (node).tagName, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocParameterTag: + return factory.createJSDocParameterTag((node).preParameterName, (node).typeExpression, + (node).postParameterName, (node).atToken, (node).tagName, + /*location*/ undefined, node.flags); + case SyntaxKind.JSDocReturnTag: + return factory.createJSDocReturnTag((node).typeExpression, (node).atToken, + (node).tagName, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocTypeTag: + return factory.createJSDocTypeTag((node).typeExpression, (node).atToken, + (node).tagName, /*location*/ undefined, node.flags); + case SyntaxKind.JSDocTemplateTag: + return factory.createJSDocTemplateTag((node).typeParameters, (node).atToken, + (node).tagName, /*location*/ undefined, node.flags); + } + } } export function isNumericLiteral(node: Node): node is LiteralExpression { return node && node.kind === SyntaxKind.NumericLiteral; diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 0abdefebe9b..b98a1230a2d 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -13,6 +13,15 @@ namespace ts { // @internal export namespace factory { + export function setNodeFlags(node: T, flags: NodeFlags): T { + if (!node || flags === undefined) { + return node; + } + + node.flags = flags; + return node; + } + export function setTextRange(node: T, range: TextRange): T { if (!node || !range) { return node; @@ -23,7 +32,7 @@ namespace ts { return node; } - export function setModifiers(node: TNode, modifiers: Node[]): TNode { + export function setModifiers(node: T, modifiers: Node[]): T { if (modifiers) { node.modifiers = createModifiersArray(modifiers); node.flags |= node.modifiers.flags; @@ -43,18 +52,17 @@ namespace ts { } newNode.flags = flags; - newNode.pos = oldNode.pos; - newNode.end = oldNode.end; newNode.parent = oldNode.parent; - return newNode; + newNode.original = oldNode; + return setTextRange(newNode, oldNode); } - export function createNode(kind: SyntaxKind, location?: TextRange): T { - return setTextRange(new (getNodeConstructor(kind))(), location); + export function createNode(kind: SyntaxKind, location?: TextRange, flags?: NodeFlags): T { + return setNodeFlags(setTextRange(new (getNodeConstructor(kind))(), location), flags); } - export function createNodeArray(elements?: TNode[], location?: TextRange) { - let nodes = >(elements || []); + export function createNodeArray(elements?: T[], location?: TextRange) { + let nodes = >(elements || []); if (nodes.pos === undefined) { nodes.pos = -1; nodes.end = -1; @@ -148,21 +156,10 @@ namespace ts { export function createVoidZeroExpression(): VoidExpression { return factory.createVoidExpression(factory.createNumericLiteral2(0)); } - - export function cloneIdentifier(node: Identifier) { - return factory.createIdentifier( - node.text); - } - - export function cloneIdentifierOrLiteralExpression(node: Identifier | LiteralExpression) { - let newNode = factory.createNode(node.kind); - newNode.text = node.text; - return newNode; - } - + export function createPropertyOrElementAccessExpression(expression: Expression, propName: Identifier | LiteralExpression): LeftHandSideExpression { if (!nodeIsSynthesized(propName)) { - propName = cloneIdentifierOrLiteralExpression(propName); + propName = cloneNode(propName); } if (propName.kind !== SyntaxKind.Identifier) { @@ -197,5 +194,22 @@ namespace ts { ] ); } + + export function createDefaultValueCheck(value: Expression, defaultValue: Expression, ensureIdentifier: (value: Expression) => Expression): Expression { + // The value expression will be evaluated twice, so for anything but a simple identifier + // we need to generate a temporary variable + value = ensureIdentifier(value); + + // === void 0 ? : + return factory.createConditionalExpression2( + factory.createBinaryExpression2( + value, + SyntaxKind.EqualsEqualsEqualsToken, + factory.createVoidZeroExpression() + ), + defaultValue, + value + ); + } } } \ No newline at end of file diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 0067b4b06d1..b7b1c3c0b5d 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -453,6 +453,7 @@ namespace ts { // @factoryhidden("decorators", true) // @factoryhidden("modifiers", true) // @factoryhidden("parent", true) + // @factoryhidden("original", true) // @factoryhidden("jsDocComment", true) // @factoryhidden("nextContainer", true) // @factoryorder("decorators", "modifiers") @@ -467,7 +468,8 @@ namespace ts { decorators?: NodeArray; // Array of decorators (in document order) modifiers?: ModifiersArray; // Array of modifiers /* @internal */ id?: number; // Unique id (used to look up NodeLinks) - parent?: Node; // Parent node (initialized by binding + parent?: Node; // Parent node (initialized by binding) + /* @internal */ original?: Node; // The original node if this is an updated node. /* @internal */ jsDocComment?: JSDocComment; // JSDoc for the node, if it has any. Only for .js files. /* @internal */ symbol?: Symbol; // Symbol declared by node (initialized by binding) /* @internal */ locals?: SymbolTable; // Locals associated with node (initialized by binding) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index c70f5e0c445..89a694719e4 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -380,6 +380,15 @@ namespace ts { return node.kind === SyntaxKind.ExpressionStatement && (node).expression.kind === SyntaxKind.StringLiteral; } + /** Gets the original node for a node that was updated via one of the factory.updateX functions */ + export function getOriginalNode(node: Node) { + while (node.original) { + node = node.original; + } + + return node; + } + export function getLeadingCommentRangesOfNode(node: Node, sourceFileOfNode: SourceFile) { // If parameter/type parameter, the prev token trailing comments are part of this node too if (node.kind === SyntaxKind.Parameter || node.kind === SyntaxKind.TypeParameter) {