From d797b4ab7692a995662ddb11ffa7b6b83004fb13 Mon Sep 17 00:00:00 2001 From: Nathan Shively-Sanders Date: Thu, 28 Sep 2017 11:40:56 -0700 Subject: [PATCH] Correctly transform jsdoc parameter types And give a better name for rest params --- src/compiler/emitter.ts | 4 ++-- src/services/refactors/annotateWithTypeFromJSDoc.ts | 7 +++++-- tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts | 9 +++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 61f9773c7a0..808e8aeaf81 100755 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -578,10 +578,10 @@ namespace ts { return emitLiteralType(node); case SyntaxKind.JSDocAllType: write("*"); - break; + return; case SyntaxKind.JSDocUnknownType: write("?"); - break; + return; case SyntaxKind.JSDocNullableType: return emitJSDocNullableType(node as JSDocNullableType); case SyntaxKind.JSDocNonNullableType: diff --git a/src/services/refactors/annotateWithTypeFromJSDoc.ts b/src/services/refactors/annotateWithTypeFromJSDoc.ts index dde367f0ac9..3111c0d3ed9 100644 --- a/src/services/refactors/annotateWithTypeFromJSDoc.ts +++ b/src/services/refactors/annotateWithTypeFromJSDoc.ts @@ -189,8 +189,11 @@ namespace ts.refactor.annotateWithTypeFromJSDoc { } function visitJSDocParameter(node: ParameterDeclaration) { - const name = node.name || "arg" + node.parent.parameters.indexOf(node); - return createParameter(node.decorators, node.modifiers, node.dotDotDotToken, name, node.questionToken, node.type, node.initializer); + const index = node.parent.parameters.indexOf(node); + const isRest = node.type.kind === SyntaxKind.JSDocVariadicType && index === node.parent.parameters.length - 1; + const name = node.name || (isRest ? "rest" : "arg" + index); + const dotdotdot = isRest ? createToken(SyntaxKind.DotDotDotToken) : node.dotDotDotToken; + return createParameter(node.decorators, node.modifiers, dotdotdot, name, node.questionToken, visitNode(node.type, transformJSDocType), node.initializer); } function visitJSDocTypeReference(node: TypeReferenceNode) { diff --git a/tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts b/tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts new file mode 100644 index 00000000000..2f5ab2bcc72 --- /dev/null +++ b/tests/cases/fourslash/annotateWithTypeFromJSDoc16.ts @@ -0,0 +1,9 @@ +/// +// @strict: true +/////** @type {function(*, ...number, ...boolean): void} */ +////var /*1*/x; + +verify.applicableRefactorAvailableAtMarker('1'); +verify.fileAfterApplyingRefactorAtMarker('1', +`/** @type {function(*, ...number, ...boolean): void} */ +var x: (arg0: any, arg1: number[], ...rest: boolean[]) => void;`, 'Annotate with type from JSDoc', 'annotate');