fix(46615): remove useless assertion. change error suggestion for rest params (#46628)

This commit is contained in:
Oleksandr T 2021-11-03 23:11:39 +02:00 committed by GitHub
parent d53630fac3
commit ff75b8a180
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 75 additions and 46 deletions

View file

@ -21221,9 +21221,10 @@ namespace ts {
(isCallSignatureDeclaration(param.parent) || isMethodSignature(param.parent) || isFunctionTypeNode(param.parent)) && (isCallSignatureDeclaration(param.parent) || isMethodSignature(param.parent) || isFunctionTypeNode(param.parent)) &&
param.parent.parameters.indexOf(param) > -1 && param.parent.parameters.indexOf(param) > -1 &&
(resolveName(param, param.name.escapedText, SymbolFlags.Type, undefined, param.name.escapedText, /*isUse*/ true) || (resolveName(param, param.name.escapedText, SymbolFlags.Type, undefined, param.name.escapedText, /*isUse*/ true) ||
param.name.originalKeywordKind && isTypeNodeKind(param.name.originalKeywordKind))) { param.name.originalKeywordKind && isTypeNodeKind(param.name.originalKeywordKind))) {
const newName = "arg" + param.parent.parameters.indexOf(param); const newName = "arg" + param.parent.parameters.indexOf(param);
errorOrSuggestion(noImplicitAny, declaration, Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1, newName, declarationNameToString(param.name)); const typeName = declarationNameToString(param.name) + (param.dotDotDotToken ? "[]" : "");
errorOrSuggestion(noImplicitAny, declaration, Diagnostics.Parameter_has_a_name_but_no_type_Did_you_mean_0_Colon_1, newName, typeName);
return; return;
} }
diagnostic = (declaration as ParameterDeclaration).dotDotDotToken ? diagnostic = (declaration as ParameterDeclaration).dotDotDotToken ?

View file

@ -14,24 +14,24 @@ namespace ts.codefix {
function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: SourceFile, pos: number) { function makeChange(changeTracker: textChanges.ChangeTracker, sourceFile: SourceFile, pos: number) {
const token = getTokenAtPosition(sourceFile, pos); const token = getTokenAtPosition(sourceFile, pos);
if (!isIdentifier(token)) {
return Debug.fail("add-name-to-nameless-parameter operates on identifiers, but got a " + Debug.formatSyntaxKind(token.kind));
}
const param = token.parent; const param = token.parent;
if (!isParameter(param)) { if (!isParameter(param)) {
return Debug.fail("Tried to add a parameter name to a non-parameter: " + Debug.formatSyntaxKind(token.kind)); return Debug.fail("Tried to add a parameter name to a non-parameter: " + Debug.formatSyntaxKind(token.kind));
} }
const i = param.parent.parameters.indexOf(param); const i = param.parent.parameters.indexOf(param);
Debug.assert(!param.type, "Tried to add a parameter name to a parameter that already had one."); Debug.assert(!param.type, "Tried to add a parameter name to a parameter that already had one.");
Debug.assert(i > -1, "Parameter not found in parent parameter list."); Debug.assert(i > -1, "Parameter not found in parent parameter list.");
const typeNode = factory.createTypeReferenceNode(param.name as Identifier, /*typeArguments*/ undefined);
const replacement = factory.createParameterDeclaration( const replacement = factory.createParameterDeclaration(
/*decorators*/ undefined, /*decorators*/ undefined,
param.modifiers, param.modifiers,
param.dotDotDotToken, param.dotDotDotToken,
"arg" + i, "arg" + i,
param.questionToken, param.questionToken,
factory.createTypeReferenceNode(token, /*typeArguments*/ undefined), param.dotDotDotToken ? factory.createArrayTypeNode(typeNode) : typeNode,
param.initializer); param.initializer);
changeTracker.replaceNode(sourceFile, token, replacement); changeTracker.replaceNode(sourceFile, param, replacement);
} }
} }

View file

@ -1,26 +1,30 @@
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(2,17): error TS7051: Parameter has a name but no type. Did you mean 'arg0: string'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(2,20): error TS7051: Parameter has a name but no type. Did you mean 'arg0: string[]'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(2,25): error TS7051: Parameter has a name but no type. Did you mean 'arg1: C'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(3,17): error TS7051: Parameter has a name but no type. Did you mean 'arg0: string'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(3,19): error TS7051: Parameter has a name but no type. Did you mean 'arg0: C'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(3,25): error TS7051: Parameter has a name but no type. Did you mean 'arg1: C'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(3,22): error TS7051: Parameter has a name but no type. Did you mean 'arg1: number'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(4,19): error TS7051: Parameter has a name but no type. Did you mean 'arg0: C'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(4,20): error TS7051: Parameter has a name but no type. Did you mean 'arg0: boolean'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(4,22): error TS7051: Parameter has a name but no type. Did you mean 'arg1: number'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(4,29): error TS7051: Parameter has a name but no type. Did you mean 'arg1: C'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(5,20): error TS7051: Parameter has a name but no type. Did you mean 'arg0: boolean'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(4,32): error TS7051: Parameter has a name but no type. Did you mean 'arg2: object'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(5,29): error TS7051: Parameter has a name but no type. Did you mean 'arg1: C'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(4,40): error TS7051: Parameter has a name but no type. Did you mean 'arg3: undefined'? tests/cases/compiler/noImplicitAnyNamelessParameter.ts(5,32): error TS7051: Parameter has a name but no type. Did you mean 'arg2: object'?
tests/cases/compiler/noImplicitAnyNamelessParameter.ts(5,40): error TS7051: Parameter has a name but no type. Did you mean 'arg3: undefined'?
==== tests/cases/compiler/noImplicitAnyNamelessParameter.ts (8 errors) ==== ==== tests/cases/compiler/noImplicitAnyNamelessParameter.ts (9 errors) ====
class C { } class C { }
declare var x: (string, C) => void; declare var a: { m(...string): void }
~~~~~~~~~
!!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: string[]'?
declare var b: (string, C) => void;
~~~~~~ ~~~~~~
!!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: string'? !!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: string'?
~ ~
!!! error TS7051: Parameter has a name but no type. Did you mean 'arg1: C'? !!! error TS7051: Parameter has a name but no type. Did you mean 'arg1: C'?
declare var y: { (C, number): void }; declare var c: { (C, number): void };
~ ~
!!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: C'? !!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: C'?
~~~~~~ ~~~~~~
!!! error TS7051: Parameter has a name but no type. Did you mean 'arg1: number'? !!! error TS7051: Parameter has a name but no type. Did you mean 'arg1: number'?
declare var z: { m(boolean, C, object, undefined): void } declare var d: { m(boolean, C, object, undefined): void }
~~~~~~~ ~~~~~~~
!!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: boolean'? !!! error TS7051: Parameter has a name but no type. Did you mean 'arg0: boolean'?
~ ~

View file

@ -1,8 +1,9 @@
//// [noImplicitAnyNamelessParameter.ts] //// [noImplicitAnyNamelessParameter.ts]
class C { } class C { }
declare var x: (string, C) => void; declare var a: { m(...string): void }
declare var y: { (C, number): void }; declare var b: (string, C) => void;
declare var z: { m(boolean, C, object, undefined): void } declare var c: { (C, number): void };
declare var d: { m(boolean, C, object, undefined): void }
// note: null and void do not parse correctly without a preceding parameter name // note: null and void do not parse correctly without a preceding parameter name

View file

@ -2,23 +2,28 @@
class C { } class C { }
>C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 0, 0)) >C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 0, 0))
declare var x: (string, C) => void; declare var a: { m(...string): void }
>x : Symbol(x, Decl(noImplicitAnyNamelessParameter.ts, 1, 11)) >a : Symbol(a, Decl(noImplicitAnyNamelessParameter.ts, 1, 11))
>string : Symbol(string, Decl(noImplicitAnyNamelessParameter.ts, 1, 16)) >m : Symbol(m, Decl(noImplicitAnyNamelessParameter.ts, 1, 16))
>C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 1, 23)) >string : Symbol(string, Decl(noImplicitAnyNamelessParameter.ts, 1, 19))
declare var y: { (C, number): void }; declare var b: (string, C) => void;
>y : Symbol(y, Decl(noImplicitAnyNamelessParameter.ts, 2, 11)) >b : Symbol(b, Decl(noImplicitAnyNamelessParameter.ts, 2, 11))
>C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 2, 18)) >string : Symbol(string, Decl(noImplicitAnyNamelessParameter.ts, 2, 16))
>number : Symbol(number, Decl(noImplicitAnyNamelessParameter.ts, 2, 20)) >C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 2, 23))
declare var z: { m(boolean, C, object, undefined): void } declare var c: { (C, number): void };
>z : Symbol(z, Decl(noImplicitAnyNamelessParameter.ts, 3, 11)) >c : Symbol(c, Decl(noImplicitAnyNamelessParameter.ts, 3, 11))
>m : Symbol(m, Decl(noImplicitAnyNamelessParameter.ts, 3, 16)) >C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 3, 18))
>boolean : Symbol(boolean, Decl(noImplicitAnyNamelessParameter.ts, 3, 19)) >number : Symbol(number, Decl(noImplicitAnyNamelessParameter.ts, 3, 20))
>C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 3, 27))
>object : Symbol(object, Decl(noImplicitAnyNamelessParameter.ts, 3, 30)) declare var d: { m(boolean, C, object, undefined): void }
>undefined : Symbol(undefined, Decl(noImplicitAnyNamelessParameter.ts, 3, 38)) >d : Symbol(d, Decl(noImplicitAnyNamelessParameter.ts, 4, 11))
>m : Symbol(m, Decl(noImplicitAnyNamelessParameter.ts, 4, 16))
>boolean : Symbol(boolean, Decl(noImplicitAnyNamelessParameter.ts, 4, 19))
>C : Symbol(C, Decl(noImplicitAnyNamelessParameter.ts, 4, 27))
>object : Symbol(object, Decl(noImplicitAnyNamelessParameter.ts, 4, 30))
>undefined : Symbol(undefined, Decl(noImplicitAnyNamelessParameter.ts, 4, 38))
// note: null and void do not parse correctly without a preceding parameter name // note: null and void do not parse correctly without a preceding parameter name

View file

@ -2,18 +2,23 @@
class C { } class C { }
>C : C >C : C
declare var x: (string, C) => void; declare var a: { m(...string): void }
>x : (string: any, C: any) => void >a : { m(...string: any[]): void; }
>m : (...string: any[]) => void
>string : any[]
declare var b: (string, C) => void;
>b : (string: any, C: any) => void
>string : any >string : any
>C : any >C : any
declare var y: { (C, number): void }; declare var c: { (C, number): void };
>y : (C: any, number: any) => void >c : (C: any, number: any) => void
>C : any >C : any
>number : any >number : any
declare var z: { m(boolean, C, object, undefined): void } declare var d: { m(boolean, C, object, undefined): void }
>z : { m(boolean: any, C: any, object: any, undefined: any): void; } >d : { m(boolean: any, C: any, object: any, undefined: any): void; }
>m : (boolean: any, C: any, object: any, undefined: any) => void >m : (boolean: any, C: any, object: any, undefined: any) => void
>boolean : any >boolean : any
>C : any >C : any

View file

@ -1,6 +1,7 @@
// @noImplicitAny: true // @noImplicitAny: true
class C { } class C { }
declare var x: (string, C) => void; declare var a: { m(...string): void }
declare var y: { (C, number): void }; declare var b: (string, C) => void;
declare var z: { m(boolean, C, object, undefined): void } declare var c: { (C, number): void };
declare var d: { m(boolean, C, object, undefined): void }
// note: null and void do not parse correctly without a preceding parameter name // note: null and void do not parse correctly without a preceding parameter name

View file

@ -0,0 +1,6 @@
/// <reference path='fourslash.ts' />
// @noImplicitAny: true
////type Rest = ([|...number|]) => void;
verify.rangeAfterCodeFix("...arg0: number[]");

View file

@ -0,0 +1,6 @@
/// <reference path='fourslash.ts' />
// @noImplicitAny: true
////type Rest = ([|public string|]) => void;
verify.rangeAfterCodeFix("public arg0: string");