Skip to content

Commit e307295

Browse files
committed
Resolve function-this in parameter initialisers when explicitly provided
1 parent 0c64b0c commit e307295

5 files changed

Lines changed: 99 additions & 1 deletion

File tree

src/compiler/checker.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8392,7 +8392,10 @@ namespace ts {
83928392
if (needToCaptureLexicalThis) {
83938393
captureLexicalThis(node, container);
83948394
}
8395-
if (isFunctionLike(container) && !isInParameterInitializerBeforeContainingFunction(node)) {
8395+
if (isFunctionLike(container) &&
8396+
(!isInParameterInitializerBeforeContainingFunction(node) || getFunctionLikeThisParameter(container))) {
8397+
// Note: a parameter initializer should refer to class-this unless function-this is explicitly annotated.
8398+
83968399
// If this is a function in a JS file, it might be a class method. Check if it's the RHS
83978400
// of a x.prototype.y = function [name]() { .... }
83988401
if (container.kind === SyntaxKind.FunctionExpression &&
@@ -18473,6 +18476,14 @@ namespace ts {
1847318476
}
1847418477
}
1847518478

18479+
function getFunctionLikeThisParameter(func: FunctionLikeDeclaration) {
18480+
if (func.parameters.length &&
18481+
func.parameters[0].name.kind === SyntaxKind.Identifier &&
18482+
(<Identifier>func.parameters[0].name).originalKeywordKind === SyntaxKind.ThisKeyword) {
18483+
return func.parameters[0];
18484+
}
18485+
}
18486+
1847618487
function checkGrammarForNonSymbolComputedProperty(node: DeclarationName, message: DiagnosticMessage) {
1847718488
if (isDynamicName(node)) {
1847818489
return grammarErrorOnNode(node, message);

tests/baselines/reference/inferParameterWithMethodCallInitializer.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ class Example {
1010
return a;
1111
}
1212
}
13+
function weird(this: Example, a = this.getNumber()) {
14+
return a;
15+
}
16+
class Weird {
17+
doSomething(this: Example, a = this.getNumber()) {
18+
return a;
19+
}
20+
}
1321

1422

1523
//// [inferParameterWithMethodCallInitializer.js]
@@ -28,3 +36,16 @@ var Example = (function () {
2836
};
2937
return Example;
3038
}());
39+
function weird(a) {
40+
if (a === void 0) { a = this.getNumber(); }
41+
return a;
42+
}
43+
var Weird = (function () {
44+
function Weird() {
45+
}
46+
Weird.prototype.doSomething = function (a) {
47+
if (a === void 0) { a = this.getNumber(); }
48+
return a;
49+
};
50+
return Weird;
51+
}());

tests/baselines/reference/inferParameterWithMethodCallInitializer.symbols

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,32 @@ class Example {
2424
>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 7, 16))
2525
}
2626
}
27+
function weird(this: Example, a = this.getNumber()) {
28+
>weird : Symbol(weird, Decl(inferParameterWithMethodCallInitializer.ts, 10, 1))
29+
>this : Symbol(this, Decl(inferParameterWithMethodCallInitializer.ts, 11, 15))
30+
>Example : Symbol(Example, Decl(inferParameterWithMethodCallInitializer.ts, 2, 1))
31+
>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 11, 29))
32+
>this.getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15))
33+
>this : Symbol(Example, Decl(inferParameterWithMethodCallInitializer.ts, 2, 1))
34+
>getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15))
35+
36+
return a;
37+
>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 11, 29))
38+
}
39+
class Weird {
40+
>Weird : Symbol(Weird, Decl(inferParameterWithMethodCallInitializer.ts, 13, 1))
41+
42+
doSomething(this: Example, a = this.getNumber()) {
43+
>doSomething : Symbol(Weird.doSomething, Decl(inferParameterWithMethodCallInitializer.ts, 14, 13))
44+
>this : Symbol(this, Decl(inferParameterWithMethodCallInitializer.ts, 15, 16))
45+
>Example : Symbol(Example, Decl(inferParameterWithMethodCallInitializer.ts, 2, 1))
46+
>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 15, 30))
47+
>this.getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15))
48+
>this : Symbol(Example, Decl(inferParameterWithMethodCallInitializer.ts, 2, 1))
49+
>getNumber : Symbol(Example.getNumber, Decl(inferParameterWithMethodCallInitializer.ts, 3, 15))
50+
51+
return a;
52+
>a : Symbol(a, Decl(inferParameterWithMethodCallInitializer.ts, 15, 30))
53+
}
54+
}
2755

tests/baselines/reference/inferParameterWithMethodCallInitializer.types

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,34 @@ class Example {
2727
>a : number
2828
}
2929
}
30+
function weird(this: Example, a = this.getNumber()) {
31+
>weird : (this: Example, a?: number) => number
32+
>this : Example
33+
>Example : Example
34+
>a : number
35+
>this.getNumber() : number
36+
>this.getNumber : () => number
37+
>this : Example
38+
>getNumber : () => number
39+
40+
return a;
41+
>a : number
42+
}
43+
class Weird {
44+
>Weird : Weird
45+
46+
doSomething(this: Example, a = this.getNumber()) {
47+
>doSomething : (this: Example, a?: number) => number
48+
>this : Example
49+
>Example : Example
50+
>a : number
51+
>this.getNumber() : number
52+
>this.getNumber : () => number
53+
>this : Example
54+
>getNumber : () => number
55+
56+
return a;
57+
>a : number
58+
}
59+
}
3060

tests/cases/compiler/inferParameterWithMethodCallInitializer.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,11 @@ class Example {
1010
return a;
1111
}
1212
}
13+
function weird(this: Example, a = this.getNumber()) {
14+
return a;
15+
}
16+
class Weird {
17+
doSomething(this: Example, a = this.getNumber()) {
18+
return a;
19+
}
20+
}

0 commit comments

Comments
 (0)