Skip to content

Commit 1ee3f99

Browse files
Fix microsoft#9550: exclude 'this' type parameters from unusedParameters checks.
1 parent a039412 commit 1ee3f99

File tree

5 files changed

+300
-0
lines changed

5 files changed

+300
-0
lines changed

Diff for: src/compiler/checker.ts

+5
Original file line numberDiff line numberDiff line change
@@ -14563,6 +14563,7 @@ namespace ts {
1456314563
const parameter = <ParameterDeclaration>local.valueDeclaration;
1456414564
if (compilerOptions.noUnusedParameters &&
1456514565
!isParameterPropertyDeclaration(parameter) &&
14566+
!parameterIsThisKeyword(parameter) &&
1456614567
!parameterNameStartsWithUnderscore(parameter)) {
1456714568
error(local.valueDeclaration.name, Diagnostics._0_is_declared_but_never_used, local.name);
1456814569
}
@@ -14576,6 +14577,10 @@ namespace ts {
1457614577
}
1457714578
}
1457814579

14580+
function parameterIsThisKeyword(parameter: ParameterDeclaration) {
14581+
return parameter.name && (<Identifier>parameter.name).originalKeywordKind === SyntaxKind.ThisKeyword;
14582+
}
14583+
1457914584
function parameterNameStartsWithUnderscore(parameter: ParameterDeclaration) {
1458014585
return parameter.name && parameter.name.kind === SyntaxKind.Identifier && (<Identifier>parameter.name).text.charCodeAt(0) === CharacterCodes._;
1458114586
}

Diff for: tests/baselines/reference/unusedParametersThis.js

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//// [unusedParametersThis.ts]
2+
3+
class A {
4+
public a: number;
5+
6+
public method(this: this): number {
7+
return this.a;
8+
}
9+
10+
public method2(this: A): number {
11+
return this.a;
12+
}
13+
14+
public method3(this: this): number {
15+
var fn = () => this.a;
16+
return fn();
17+
}
18+
19+
public method4(this: A): number {
20+
var fn = () => this.a;
21+
return fn();
22+
}
23+
24+
static staticMethod(this: A): number {
25+
return this.a;
26+
}
27+
}
28+
29+
function f(this: A): number {
30+
return this.a
31+
}
32+
33+
var f2 = function f2(this: A): number {
34+
return this.a;
35+
};
36+
37+
//// [unusedParametersThis.js]
38+
var A = (function () {
39+
function A() {
40+
}
41+
A.prototype.method = function () {
42+
return this.a;
43+
};
44+
A.prototype.method2 = function () {
45+
return this.a;
46+
};
47+
A.prototype.method3 = function () {
48+
var _this = this;
49+
var fn = function () { return _this.a; };
50+
return fn();
51+
};
52+
A.prototype.method4 = function () {
53+
var _this = this;
54+
var fn = function () { return _this.a; };
55+
return fn();
56+
};
57+
A.staticMethod = function () {
58+
return this.a;
59+
};
60+
return A;
61+
}());
62+
function f() {
63+
return this.a;
64+
}
65+
var f2 = function f2() {
66+
return this.a;
67+
};
+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
=== tests/cases/compiler/unusedParametersThis.ts ===
2+
3+
class A {
4+
>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0))
5+
6+
public a: number;
7+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
8+
9+
public method(this: this): number {
10+
>method : Symbol(A.method, Decl(unusedParametersThis.ts, 2, 21))
11+
>this : Symbol(this, Decl(unusedParametersThis.ts, 4, 18))
12+
13+
return this.a;
14+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
15+
>this : Symbol(this, Decl(unusedParametersThis.ts, 4, 18))
16+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
17+
}
18+
19+
public method2(this: A): number {
20+
>method2 : Symbol(A.method2, Decl(unusedParametersThis.ts, 6, 5))
21+
>this : Symbol(this, Decl(unusedParametersThis.ts, 8, 19))
22+
>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0))
23+
24+
return this.a;
25+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
26+
>this : Symbol(this, Decl(unusedParametersThis.ts, 8, 19))
27+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
28+
}
29+
30+
public method3(this: this): number {
31+
>method3 : Symbol(A.method3, Decl(unusedParametersThis.ts, 10, 5))
32+
>this : Symbol(this, Decl(unusedParametersThis.ts, 12, 19))
33+
34+
var fn = () => this.a;
35+
>fn : Symbol(fn, Decl(unusedParametersThis.ts, 13, 11))
36+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
37+
>this : Symbol(this, Decl(unusedParametersThis.ts, 12, 19))
38+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
39+
40+
return fn();
41+
>fn : Symbol(fn, Decl(unusedParametersThis.ts, 13, 11))
42+
}
43+
44+
public method4(this: A): number {
45+
>method4 : Symbol(A.method4, Decl(unusedParametersThis.ts, 15, 5))
46+
>this : Symbol(this, Decl(unusedParametersThis.ts, 17, 19))
47+
>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0))
48+
49+
var fn = () => this.a;
50+
>fn : Symbol(fn, Decl(unusedParametersThis.ts, 18, 11))
51+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
52+
>this : Symbol(this, Decl(unusedParametersThis.ts, 17, 19))
53+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
54+
55+
return fn();
56+
>fn : Symbol(fn, Decl(unusedParametersThis.ts, 18, 11))
57+
}
58+
59+
static staticMethod(this: A): number {
60+
>staticMethod : Symbol(A.staticMethod, Decl(unusedParametersThis.ts, 20, 5))
61+
>this : Symbol(this, Decl(unusedParametersThis.ts, 22, 24))
62+
>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0))
63+
64+
return this.a;
65+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
66+
>this : Symbol(this, Decl(unusedParametersThis.ts, 22, 24))
67+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
68+
}
69+
}
70+
71+
function f(this: A): number {
72+
>f : Symbol(f, Decl(unusedParametersThis.ts, 25, 1))
73+
>this : Symbol(this, Decl(unusedParametersThis.ts, 27, 11))
74+
>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0))
75+
76+
return this.a
77+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
78+
>this : Symbol(this, Decl(unusedParametersThis.ts, 27, 11))
79+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
80+
}
81+
82+
var f2 = function f2(this: A): number {
83+
>f2 : Symbol(f2, Decl(unusedParametersThis.ts, 31, 3))
84+
>f2 : Symbol(f2, Decl(unusedParametersThis.ts, 31, 8))
85+
>this : Symbol(this, Decl(unusedParametersThis.ts, 31, 21))
86+
>A : Symbol(A, Decl(unusedParametersThis.ts, 0, 0))
87+
88+
return this.a;
89+
>this.a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
90+
>this : Symbol(this, Decl(unusedParametersThis.ts, 31, 21))
91+
>a : Symbol(A.a, Decl(unusedParametersThis.ts, 1, 9))
92+
93+
};

Diff for: tests/baselines/reference/unusedParametersThis.types

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
=== tests/cases/compiler/unusedParametersThis.ts ===
2+
3+
class A {
4+
>A : A
5+
6+
public a: number;
7+
>a : number
8+
9+
public method(this: this): number {
10+
>method : (this: this) => number
11+
>this : this
12+
13+
return this.a;
14+
>this.a : number
15+
>this : this
16+
>a : number
17+
}
18+
19+
public method2(this: A): number {
20+
>method2 : (this: A) => number
21+
>this : A
22+
>A : A
23+
24+
return this.a;
25+
>this.a : number
26+
>this : A
27+
>a : number
28+
}
29+
30+
public method3(this: this): number {
31+
>method3 : (this: this) => number
32+
>this : this
33+
34+
var fn = () => this.a;
35+
>fn : () => number
36+
>() => this.a : () => number
37+
>this.a : number
38+
>this : this
39+
>a : number
40+
41+
return fn();
42+
>fn() : number
43+
>fn : () => number
44+
}
45+
46+
public method4(this: A): number {
47+
>method4 : (this: A) => number
48+
>this : A
49+
>A : A
50+
51+
var fn = () => this.a;
52+
>fn : () => number
53+
>() => this.a : () => number
54+
>this.a : number
55+
>this : A
56+
>a : number
57+
58+
return fn();
59+
>fn() : number
60+
>fn : () => number
61+
}
62+
63+
static staticMethod(this: A): number {
64+
>staticMethod : (this: A) => number
65+
>this : A
66+
>A : A
67+
68+
return this.a;
69+
>this.a : number
70+
>this : A
71+
>a : number
72+
}
73+
}
74+
75+
function f(this: A): number {
76+
>f : (this: A) => number
77+
>this : A
78+
>A : A
79+
80+
return this.a
81+
>this.a : number
82+
>this : A
83+
>a : number
84+
}
85+
86+
var f2 = function f2(this: A): number {
87+
>f2 : (this: A) => number
88+
>function f2(this: A): number { return this.a;} : (this: A) => number
89+
>f2 : (this: A) => number
90+
>this : A
91+
>A : A
92+
93+
return this.a;
94+
>this.a : number
95+
>this : A
96+
>a : number
97+
98+
};

Diff for: tests/cases/compiler/unusedParametersThis.ts

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//@noImplicitThis:true
2+
//@noUnusedLocals:true
3+
//@noUnusedParameters:true
4+
5+
class A {
6+
public a: number;
7+
8+
public method(this: this): number {
9+
return this.a;
10+
}
11+
12+
public method2(this: A): number {
13+
return this.a;
14+
}
15+
16+
public method3(this: this): number {
17+
var fn = () => this.a;
18+
return fn();
19+
}
20+
21+
public method4(this: A): number {
22+
var fn = () => this.a;
23+
return fn();
24+
}
25+
26+
static staticMethod(this: A): number {
27+
return this.a;
28+
}
29+
}
30+
31+
function f(this: A): number {
32+
return this.a
33+
}
34+
35+
var f2 = function f2(this: A): number {
36+
return this.a;
37+
};

0 commit comments

Comments
 (0)