diff --git a/src/services/codefixes/fixJSDocTypes.ts b/src/services/codefixes/fixJSDocTypes.ts index 27c0edac628..8d5cd562497 100644 --- a/src/services/codefixes/fixJSDocTypes.ts +++ b/src/services/codefixes/fixJSDocTypes.ts @@ -8,11 +8,27 @@ namespace ts.codefix { function getActionsForJSDocTypes(context: CodeFixContext): CodeAction[] | undefined { const sourceFile = context.sourceFile; const node = getTokenAtPosition(sourceFile, context.span.start, /*includeJsDocComment*/ false); + + // NOTE: Some locations are not handled yet: + // MappedTypeNode.typeParameters and SignatureDeclaration.typeParameters, as well as CallExpression.typeArguments const decl = ts.findAncestor(node, - n => n.kind === SyntaxKind.VariableDeclaration || + n => + n.kind === SyntaxKind.AsExpression || + n.kind === SyntaxKind.CallSignature || + n.kind === SyntaxKind.ConstructSignature || + n.kind === SyntaxKind.FunctionDeclaration || + n.kind === SyntaxKind.GetAccessor || + n.kind === SyntaxKind.IndexSignature || + n.kind === SyntaxKind.MappedType || + n.kind === SyntaxKind.MethodDeclaration || + n.kind === SyntaxKind.MethodSignature || n.kind === SyntaxKind.Parameter || n.kind === SyntaxKind.PropertyDeclaration || - n.kind === SyntaxKind.PropertyAssignment); + n.kind === SyntaxKind.PropertySignature || + n.kind === SyntaxKind.SetAccessor || + n.kind === SyntaxKind.TypeAliasDeclaration || + n.kind === SyntaxKind.TypeAssertionExpression || + n.kind === SyntaxKind.VariableDeclaration); if (!decl) return; const checker = context.program.getTypeChecker(); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax14.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax14.ts new file mode 100644 index 00000000000..69478fc3abc --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax14.ts @@ -0,0 +1,5 @@ +// @strict: true +/// +//// var x = 12 as [|number?|]; + +verify.rangeAfterCodeFix("number | null", /*includeWhiteSpace*/ false, /*errorCode*/ 8020, 0); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax15.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax15.ts new file mode 100644 index 00000000000..9482830c19d --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax15.ts @@ -0,0 +1,5 @@ +/// +//// var f = <[|function(number?): number|]>(x => x); + +// note: without --strict, number? --> number, not number | null +verify.rangeAfterCodeFix("(arg0: number) => number", /*includeWhiteSpace*/ false, /*errorCode*/ 8020, 0); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax16.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax16.ts new file mode 100644 index 00000000000..111aec1dce7 --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax16.ts @@ -0,0 +1,4 @@ +/// +//// var f: { [K in keyof number]: [|*|] }; + +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax17.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax17.ts new file mode 100644 index 00000000000..6a3ce2ed3df --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax17.ts @@ -0,0 +1,3 @@ +/// +//// declare function index(ix: number): [|*|]; +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax18.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax18.ts new file mode 100644 index 00000000000..30a3815516a --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax18.ts @@ -0,0 +1,3 @@ +/// +//// var index: { (ix: number): [|?|] }; +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax19.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax19.ts new file mode 100644 index 00000000000..e6344881227 --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax19.ts @@ -0,0 +1,3 @@ +/// +//// var index: { new (ix: number): [|?|] }; +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax20.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax20.ts new file mode 100644 index 00000000000..dc153730841 --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax20.ts @@ -0,0 +1,3 @@ +/// +//// var index = { get p(): [|*|] { return 12 } }; +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax21.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax21.ts new file mode 100644 index 00000000000..442414e4577 --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax21.ts @@ -0,0 +1,3 @@ +/// +//// var index = { set p(x: [|*|]) { } }; +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax22.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax22.ts new file mode 100644 index 00000000000..c575f1ca7ce --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax22.ts @@ -0,0 +1,3 @@ +/// +//// var index: { [s: string]: [|*|] }; +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax23.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax23.ts new file mode 100644 index 00000000000..7ab70e18ee7 --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax23.ts @@ -0,0 +1,6 @@ +/// +////class C { +//// m(): [|*|] { +//// } +////} +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax24.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax24.ts new file mode 100644 index 00000000000..7ea2d1f6faf --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax24.ts @@ -0,0 +1,5 @@ +/// +////declare class C { +//// m(): [|*|]; +////} +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax25.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax25.ts new file mode 100644 index 00000000000..6486a70417e --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax25.ts @@ -0,0 +1,5 @@ +/// +////declare class C { +//// p: [|*|]; +////} +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax26.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax26.ts new file mode 100644 index 00000000000..dc31f1dfffd --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax26.ts @@ -0,0 +1,5 @@ +/// +////class C { +//// p: [|*|] = 12; +////} +verify.rangeAfterCodeFix("any"); diff --git a/tests/cases/fourslash/codeFixChangeJSDocSyntax27.ts b/tests/cases/fourslash/codeFixChangeJSDocSyntax27.ts new file mode 100644 index 00000000000..255976c7767 --- /dev/null +++ b/tests/cases/fourslash/codeFixChangeJSDocSyntax27.ts @@ -0,0 +1,4 @@ +// @strict: true +/// +////type T = [|...number?|]; +verify.rangeAfterCodeFix("(number | null)[]");