Skip to content

Commit 67f55aa

Browse files
committed
Extend the MetaProperty check to work for new.target too
1 parent d495957 commit 67f55aa

File tree

5 files changed

+93
-4
lines changed

5 files changed

+93
-4
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21322,10 +21322,8 @@ namespace ts {
2132221322
switch (source.kind) {
2132321323
case SyntaxKind.MetaProperty:
2132421324
return target.kind === SyntaxKind.MetaProperty
21325-
&& (source as MetaProperty).keywordToken === SyntaxKind.ImportKeyword
21326-
&& (target as MetaProperty).keywordToken === SyntaxKind.ImportKeyword
21327-
&& (source as MetaProperty).name.escapedText === "meta"
21328-
&& (target as MetaProperty).name.escapedText === "meta";
21325+
&& (source as MetaProperty).keywordToken === (target as MetaProperty).keywordToken
21326+
&& (source as MetaProperty).name.escapedText === (target as MetaProperty).name.escapedText;
2132921327
case SyntaxKind.Identifier:
2133021328
case SyntaxKind.PrivateIdentifier:
2133121329
return target.kind === SyntaxKind.Identifier && getResolvedSymbol(<Identifier>source) === getResolvedSymbol(<Identifier>target) ||
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [newTargetNarrowing.ts]
2+
function foo(x: true) { }
3+
4+
function f() {
5+
if (new.target.marked === true) {
6+
foo(new.target.marked);
7+
}
8+
}
9+
10+
f.marked = true;
11+
12+
13+
//// [newTargetNarrowing.js]
14+
"use strict";
15+
function foo(x) { }
16+
function f() {
17+
if (new.target.marked === true) {
18+
foo(new.target.marked);
19+
}
20+
}
21+
f.marked = true;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
=== tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts ===
2+
function foo(x: true) { }
3+
>foo : Symbol(foo, Decl(newTargetNarrowing.ts, 0, 0))
4+
>x : Symbol(x, Decl(newTargetNarrowing.ts, 0, 13))
5+
6+
function f() {
7+
>f : Symbol(f, Decl(newTargetNarrowing.ts, 0, 25), Decl(newTargetNarrowing.ts, 6, 1))
8+
9+
if (new.target.marked === true) {
10+
>new.target.marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1))
11+
>marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1))
12+
13+
foo(new.target.marked);
14+
>foo : Symbol(foo, Decl(newTargetNarrowing.ts, 0, 0))
15+
>new.target.marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1))
16+
>marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1))
17+
}
18+
}
19+
20+
f.marked = true;
21+
>f.marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1))
22+
>f : Symbol(f, Decl(newTargetNarrowing.ts, 0, 25), Decl(newTargetNarrowing.ts, 6, 1))
23+
>marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1))
24+
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
=== tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts ===
2+
function foo(x: true) { }
3+
>foo : (x: true) => void
4+
>x : true
5+
>true : true
6+
7+
function f() {
8+
>f : typeof f
9+
10+
if (new.target.marked === true) {
11+
>new.target.marked === true : boolean
12+
>new.target.marked : boolean
13+
>new.target : typeof f
14+
>target : any
15+
>marked : boolean
16+
>true : true
17+
18+
foo(new.target.marked);
19+
>foo(new.target.marked) : void
20+
>foo : (x: true) => void
21+
>new.target.marked : true
22+
>new.target : typeof f
23+
>target : any
24+
>marked : true
25+
}
26+
}
27+
28+
f.marked = true;
29+
>f.marked = true : true
30+
>f.marked : boolean
31+
>f : typeof f
32+
>marked : boolean
33+
>true : true
34+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// @target: es6
2+
// @strict: true
3+
4+
function foo(x: true) { }
5+
6+
function f() {
7+
if (new.target.marked === true) {
8+
foo(new.target.marked);
9+
}
10+
}
11+
12+
f.marked = true;

0 commit comments

Comments
 (0)