diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 88bf5f458f..14af23e95b 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -189,11 +189,11 @@ namespace ts { } export function createTrue() { - return createSynthesizedNode(SyntaxKind.TrueKeyword); + return createSynthesizedNode(SyntaxKind.TrueKeyword); } export function createFalse() { - return createSynthesizedNode(SyntaxKind.FalseKeyword); + return createSynthesizedNode(SyntaxKind.FalseKeyword); } // Names @@ -226,15 +226,6 @@ namespace ts { // Type Elements - export function createPropertySignature(name: PropertyName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression): PropertySignature { - const propertySignature = createSynthesizedNode(SyntaxKind.PropertySignature) as PropertySignature; - propertySignature.name = name; - propertySignature.questionToken = questionToken; - propertySignature.type = type; - propertySignature.initializer = initializer; - return propertySignature; - } - export function createConstructSignature() { throw new Error("not implemented."); } @@ -258,14 +249,26 @@ namespace ts { } // TODO: handle qualified names, ie EntityName's. - export function createTypeReferenceNode(typeName: string | Identifier, typeArguments?: NodeArray) { + export function createTypeReferenceNode(typeName: string | EntityName, typeArguments?: NodeArray) { const typeReference = createSynthesizedNode(SyntaxKind.TypeReference) as TypeReferenceNode; - typeReference.typeName = asName(typeName); + + typeReference.typeName = isQualifiedName(typeName) ? typeName : asName(typeName); typeReference.typeArguments = typeArguments; return typeReference; } - export function updateTypeReferenceNode(node: TypeReferenceNode, typeName: Identifier, typeArguments?: NodeArray) { + export function createArrayTypeNode(elementType: TypeNode): ArrayTypeNode { + const arrayTypeNode = createSynthesizedNode(SyntaxKind.ArrayType) as ArrayTypeNode; + arrayTypeNode.elementType = elementType; + return arrayTypeNode; + } + + export function updateArrayTypeNode(node: ArrayTypeNode, elementType: TypeNode): ArrayTypeNode { + return node.elementType !== elementType + ? updateNode(createArrayTypeNode(elementType), node) + : node; + } + export function updateTypeReferenceNode(node: TypeReferenceNode, typeName: EntityName, typeArguments?: NodeArray) { return node.typeName !== typeName || node.typeArguments !== typeArguments ? updateNode(createTypeReferenceNode(typeName, typeArguments), node) @@ -288,7 +291,7 @@ namespace ts { } export function createTypeLiteralNode(members: TypeElement[]) { - const typeLiteralNode = createSynthesizedNode(SyntaxKind.LiteralType) as TypeLiteralNode; + const typeLiteralNode = createSynthesizedNode(SyntaxKind.TypeLiteral) as TypeLiteralNode; typeLiteralNode.members = asNodeArray(members); return typeLiteralNode; } @@ -332,7 +335,24 @@ namespace ts { // Signature elements - /** Note, can also be used to construct index signatures. */ + export function createPropertySignature(name: PropertyName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression): PropertySignature { + const propertySignature = createSynthesizedNode(SyntaxKind.PropertySignature) as PropertySignature; + propertySignature.name = name; + propertySignature.questionToken = questionToken; + propertySignature.type = type; + propertySignature.initializer = initializer; + return propertySignature; + } + + export function updatePropertySignature(node: PropertySignature, name: PropertyName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression) { + return node.name !== name + || node.questionToken !== questionToken + || node.type !== type + || node.initializer !== initializer + ? updateNode(createPropertySignature(name, questionToken, type, initializer), node) + : node; + } + export function createSignature(kind: SyntaxKind, parameters: NodeArray, name?: PropertyName, typeParameters?: NodeArray, returnType?: TypeNode): SignatureDeclaration { const signature = createSynthesizedNode(kind) as SignatureDeclaration; signature.parameters = parameters; diff --git a/src/compiler/visitor.ts b/src/compiler/visitor.ts index d2991b7cf0..547178e3b7 100644 --- a/src/compiler/visitor.ts +++ b/src/compiler/visitor.ts @@ -279,7 +279,7 @@ namespace ts { return updateDecorator(node, visitNode((node).expression, visitor, isExpression)); - // Keyword Types + // Keyword Types and This case SyntaxKind.AnyKeyword: case SyntaxKind.NumberKeyword: @@ -292,6 +292,7 @@ namespace ts { case SyntaxKind.NullKeyword: case SyntaxKind.NeverKeyword: case SyntaxKind.NeverKeyword: + case SyntaxKind.ThisKeyword: return node; // Types @@ -300,8 +301,8 @@ namespace ts { throw new Error("reached unsupported type in visitor."); case SyntaxKind.TypeReference: return updateTypeReferenceNode(node - , visitNode((node).typeName as Identifier, visitor) - , nodesVisitor((node).typeArguments, visitor) + , visitNode((node).typeName, visitor, isEntityName) + , nodesVisitor((node).typeArguments, visitor, isTypeNode) ); case SyntaxKind.FunctionType: throw new Error("reached unsupported type in visitor."); @@ -310,9 +311,9 @@ namespace ts { case SyntaxKind.TypeQuery: throw new Error("reached unsupported type in visitor."); case SyntaxKind.TypeLiteral: - throw new Error("reached unsupported type in visitor."); + return updateTypeLiteralNode((node), nodesVisitor((node).members, visitor)); case SyntaxKind.ArrayType: - throw new Error("reached unsupported type in visitor."); + return updateArrayTypeNode(node, visitNode((node).elementType, visitor, isTypeNode)); case SyntaxKind.TupleType: throw new Error("reached unsupported type in visitor."); case SyntaxKind.UnionType: @@ -342,8 +343,14 @@ namespace ts { // Type members + case SyntaxKind.PropertySignature: + return updatePropertySignature((node) + , visitNode((node).name, visitor, isPropertyName) + , visitNode((node).questionToken, visitor, isToken) + , visitNode((node).type, visitor, isTypeNode)); + case SyntaxKind.IndexSignature: - updateIndexSignatureDeclaration(node + return updateIndexSignatureDeclaration(node , nodesVisitor((node).parameters, visitor, isParameter) , visitNode((node).type, visitor, isTypeNode) , nodesVisitor((node).decorators, visitor, isDecorator)