From 67f55aabd7d330a792c08d84563d29db87c4788a Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Mon, 22 Feb 2021 18:30:17 -0500 Subject: [PATCH] Extend the `MetaProperty` check to work for `new.target` too --- src/compiler/checker.ts | 6 ++-- .../baselines/reference/newTargetNarrowing.js | 21 ++++++++++++ .../reference/newTargetNarrowing.symbols | 24 +++++++++++++ .../reference/newTargetNarrowing.types | 34 +++++++++++++++++++ .../es6/newTarget/newTargetNarrowing.ts | 12 +++++++ 5 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/newTargetNarrowing.js create mode 100644 tests/baselines/reference/newTargetNarrowing.symbols create mode 100644 tests/baselines/reference/newTargetNarrowing.types create mode 100644 tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 8bcd277cd1e..2237fe2cda0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21322,10 +21322,8 @@ namespace ts { switch (source.kind) { case SyntaxKind.MetaProperty: return target.kind === SyntaxKind.MetaProperty - && (source as MetaProperty).keywordToken === SyntaxKind.ImportKeyword - && (target as MetaProperty).keywordToken === SyntaxKind.ImportKeyword - && (source as MetaProperty).name.escapedText === "meta" - && (target as MetaProperty).name.escapedText === "meta"; + && (source as MetaProperty).keywordToken === (target as MetaProperty).keywordToken + && (source as MetaProperty).name.escapedText === (target as MetaProperty).name.escapedText; case SyntaxKind.Identifier: case SyntaxKind.PrivateIdentifier: return target.kind === SyntaxKind.Identifier && getResolvedSymbol(source) === getResolvedSymbol(target) || diff --git a/tests/baselines/reference/newTargetNarrowing.js b/tests/baselines/reference/newTargetNarrowing.js new file mode 100644 index 00000000000..357955aa906 --- /dev/null +++ b/tests/baselines/reference/newTargetNarrowing.js @@ -0,0 +1,21 @@ +//// [newTargetNarrowing.ts] +function foo(x: true) { } + +function f() { + if (new.target.marked === true) { + foo(new.target.marked); + } +} + +f.marked = true; + + +//// [newTargetNarrowing.js] +"use strict"; +function foo(x) { } +function f() { + if (new.target.marked === true) { + foo(new.target.marked); + } +} +f.marked = true; diff --git a/tests/baselines/reference/newTargetNarrowing.symbols b/tests/baselines/reference/newTargetNarrowing.symbols new file mode 100644 index 00000000000..ed180bbc059 --- /dev/null +++ b/tests/baselines/reference/newTargetNarrowing.symbols @@ -0,0 +1,24 @@ +=== tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts === +function foo(x: true) { } +>foo : Symbol(foo, Decl(newTargetNarrowing.ts, 0, 0)) +>x : Symbol(x, Decl(newTargetNarrowing.ts, 0, 13)) + +function f() { +>f : Symbol(f, Decl(newTargetNarrowing.ts, 0, 25), Decl(newTargetNarrowing.ts, 6, 1)) + + if (new.target.marked === true) { +>new.target.marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1)) +>marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1)) + + foo(new.target.marked); +>foo : Symbol(foo, Decl(newTargetNarrowing.ts, 0, 0)) +>new.target.marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1)) +>marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1)) + } +} + +f.marked = true; +>f.marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1)) +>f : Symbol(f, Decl(newTargetNarrowing.ts, 0, 25), Decl(newTargetNarrowing.ts, 6, 1)) +>marked : Symbol(f.marked, Decl(newTargetNarrowing.ts, 6, 1)) + diff --git a/tests/baselines/reference/newTargetNarrowing.types b/tests/baselines/reference/newTargetNarrowing.types new file mode 100644 index 00000000000..df118a4982d --- /dev/null +++ b/tests/baselines/reference/newTargetNarrowing.types @@ -0,0 +1,34 @@ +=== tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts === +function foo(x: true) { } +>foo : (x: true) => void +>x : true +>true : true + +function f() { +>f : typeof f + + if (new.target.marked === true) { +>new.target.marked === true : boolean +>new.target.marked : boolean +>new.target : typeof f +>target : any +>marked : boolean +>true : true + + foo(new.target.marked); +>foo(new.target.marked) : void +>foo : (x: true) => void +>new.target.marked : true +>new.target : typeof f +>target : any +>marked : true + } +} + +f.marked = true; +>f.marked = true : true +>f.marked : boolean +>f : typeof f +>marked : boolean +>true : true + diff --git a/tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts b/tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts new file mode 100644 index 00000000000..b17ada373e3 --- /dev/null +++ b/tests/cases/conformance/es6/newTarget/newTargetNarrowing.ts @@ -0,0 +1,12 @@ +// @target: es6 +// @strict: true + +function foo(x: true) { } + +function f() { + if (new.target.marked === true) { + foo(new.target.marked); + } +} + +f.marked = true;