diff --git a/src/compiler/factory.ts b/src/compiler/factory.ts index 5c7486debe3..80e2fea7668 100644 --- a/src/compiler/factory.ts +++ b/src/compiler/factory.ts @@ -368,6 +368,18 @@ namespace ts { : node; } + export function createParenthesizedType(type: TypeNode) { + const node = createSynthesizedNode(SyntaxKind.ParenthesizedType); + node.type = type; + return node; + } + + export function updateParenthesizedType(node: ParenthesizedTypeNode, type: TypeNode) { + return node.type !== type + ? updateNode(createParenthesizedType(type), node) + : node; + } + export function createTypeLiteralNode(members: TypeElement[]) { const typeLiteralNode = createSynthesizedNode(SyntaxKind.TypeLiteral) as TypeLiteralNode; typeLiteralNode.members = createNodeArray(members); diff --git a/src/compiler/visitor.ts b/src/compiler/visitor.ts index 7850155ed25..54cea3168e1 100644 --- a/src/compiler/visitor.ts +++ b/src/compiler/visitor.ts @@ -242,31 +242,31 @@ namespace ts { case SyntaxKind.FunctionType: return updateFunctionTypeNode(node, nodesVisitor((node).typeParameters, visitor, isTypeParameter), - visitParameterList((node).parameters, visitor, context, nodesVisitor), + nodesVisitor((node).parameters, visitor, isParameterDeclaration), visitNode((node).type, visitor, isTypeNode)); case SyntaxKind.ConstructorType: return updateConstructorTypeNode(node, nodesVisitor((node).typeParameters, visitor, isTypeParameter), - visitParameterList((node).parameters, visitor, context, nodesVisitor), + nodesVisitor((node).parameters, visitor, isParameterDeclaration), visitNode((node).type, visitor, isTypeNode)); case SyntaxKind.CallSignature: return updateCallSignatureDeclaration(node, nodesVisitor((node).typeParameters, visitor, isTypeParameter), - visitParameterList((node).parameters, visitor, context, nodesVisitor), + nodesVisitor((node).parameters, visitor, isParameterDeclaration), visitNode((node).type, visitor, isTypeNode)); case SyntaxKind.ConstructSignature: return updateConstructSignatureDeclaration(node, nodesVisitor((node).typeParameters, visitor, isTypeParameter), - visitParameterList((node).parameters, visitor, context, nodesVisitor), + nodesVisitor((node).parameters, visitor, isParameterDeclaration), visitNode((node).type, visitor, isTypeNode)); case SyntaxKind.MethodSignature: return updateMethodSignature(node, nodesVisitor((node).typeParameters, visitor, isTypeParameter), - visitParameterList((node).parameters, visitor, context, nodesVisitor), + nodesVisitor((node).parameters, visitor, isParameterDeclaration), visitNode((node).type, visitor, isTypeNode), visitNode((node).name, visitor, isPropertyName), visitNode((node).questionToken, tokenVisitor, isToken)); @@ -275,7 +275,7 @@ namespace ts { return updateIndexSignatureDeclaration(node, nodesVisitor((node).decorators, visitor, isDecorator), nodesVisitor((node).modifiers, visitor, isModifier), - visitParameterList((node).parameters, visitor, context, nodesVisitor), + nodesVisitor((node).parameters, visitor, isParameterDeclaration), visitNode((node).type, visitor, isTypeNode)); case SyntaxKind.Parameter: @@ -322,7 +322,8 @@ namespace ts { nodesVisitor((node).types, visitor, isTypeNode)); case SyntaxKind.ParenthesizedType: - throw Debug.fail("not implemented."); + return updateParenthesizedType(node, + visitNode((node).type, visitor, isTypeNode)); case SyntaxKind.TypeOperator: return updateTypeOperatorNode(node, visitNode((node).type, visitor, isTypeNode)); diff --git a/src/harness/unittests/transform.ts b/src/harness/unittests/transform.ts index ae2caf4f23b..7c9d60f7bc4 100644 --- a/src/harness/unittests/transform.ts +++ b/src/harness/unittests/transform.ts @@ -39,5 +39,12 @@ namespace ts { return file => file; } ]); + + // https://github.com/Microsoft/TypeScript/issues/15192 + transformsCorrectly("types", `let a: () => void`, [ + context => file => visitNode(file, function visitor(node: Node): VisitResult { + return visitEachChild(node, visitor, context); + }) + ]); }); } diff --git a/tests/baselines/reference/transformApi/transformsCorrectly.types.js b/tests/baselines/reference/transformApi/transformsCorrectly.types.js new file mode 100644 index 00000000000..1f7b2f53ec1 --- /dev/null +++ b/tests/baselines/reference/transformApi/transformsCorrectly.types.js @@ -0,0 +1 @@ +let a: () => void;