From 4f7fe4a1de6277b2bdc6d164513c0a6cbdeae0cd Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Thu, 3 Jun 2021 16:35:21 -0700 Subject: [PATCH] Cherry-pick PR #44290 into release-4.3 (#44425) Component commits: f3bf29a71c fix(44273): preserves 'override' modifier in JavaScript output Co-authored-by: Oleksandr T --- src/compiler/transformers/ts.ts | 1 + .../reference/override16(target=es2015).js | 19 ++++++++ .../override16(target=es2015).symbols | 16 +++++++ .../reference/override16(target=es2015).types | 17 +++++++ .../reference/override16(target=esnext).js | 17 +++++++ .../override16(target=esnext).symbols | 16 +++++++ .../reference/override16(target=esnext).types | 17 +++++++ tests/baselines/reference/override16.js | 17 +++++++ tests/baselines/reference/override16.symbols | 16 +++++++ tests/baselines/reference/override16.types | 17 +++++++ .../reference/override17(target=es2015).js | 45 +++++++++++++++++++ .../override17(target=es2015).symbols | 40 +++++++++++++++++ .../reference/override17(target=es2015).types | 44 ++++++++++++++++++ .../reference/override17(target=esnext).js | 45 +++++++++++++++++++ .../override17(target=esnext).symbols | 40 +++++++++++++++++ .../reference/override17(target=esnext).types | 44 ++++++++++++++++++ .../reference/override18(target=es2015).js | 32 +++++++++++++ .../override18(target=es2015).symbols | 16 +++++++ .../reference/override18(target=es2015).types | 17 +++++++ .../reference/override18(target=esnext).js | 17 +++++++ .../override18(target=esnext).symbols | 16 +++++++ .../reference/override18(target=esnext).types | 17 +++++++ .../cases/conformance/override/override16.ts | 10 +++++ .../cases/conformance/override/override17.ts | 27 +++++++++++ .../cases/conformance/override/override18.ts | 11 +++++ 25 files changed, 574 insertions(+) create mode 100644 tests/baselines/reference/override16(target=es2015).js create mode 100644 tests/baselines/reference/override16(target=es2015).symbols create mode 100644 tests/baselines/reference/override16(target=es2015).types create mode 100644 tests/baselines/reference/override16(target=esnext).js create mode 100644 tests/baselines/reference/override16(target=esnext).symbols create mode 100644 tests/baselines/reference/override16(target=esnext).types create mode 100644 tests/baselines/reference/override16.js create mode 100644 tests/baselines/reference/override16.symbols create mode 100644 tests/baselines/reference/override16.types create mode 100644 tests/baselines/reference/override17(target=es2015).js create mode 100644 tests/baselines/reference/override17(target=es2015).symbols create mode 100644 tests/baselines/reference/override17(target=es2015).types create mode 100644 tests/baselines/reference/override17(target=esnext).js create mode 100644 tests/baselines/reference/override17(target=esnext).symbols create mode 100644 tests/baselines/reference/override17(target=esnext).types create mode 100644 tests/baselines/reference/override18(target=es2015).js create mode 100644 tests/baselines/reference/override18(target=es2015).symbols create mode 100644 tests/baselines/reference/override18(target=es2015).types create mode 100644 tests/baselines/reference/override18(target=esnext).js create mode 100644 tests/baselines/reference/override18(target=esnext).symbols create mode 100644 tests/baselines/reference/override18(target=esnext).types create mode 100644 tests/cases/conformance/override/override16.ts create mode 100644 tests/cases/conformance/override/override17.ts create mode 100644 tests/cases/conformance/override/override18.ts diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 0d24f332c15bd..4be9876203669 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -368,6 +368,7 @@ namespace ts { case SyntaxKind.PrivateKeyword: case SyntaxKind.ProtectedKeyword: case SyntaxKind.AbstractKeyword: + case SyntaxKind.OverrideKeyword: case SyntaxKind.ConstKeyword: case SyntaxKind.DeclareKeyword: case SyntaxKind.ReadonlyKeyword: diff --git a/tests/baselines/reference/override16(target=es2015).js b/tests/baselines/reference/override16(target=es2015).js new file mode 100644 index 0000000000000..1cd40ba69bb39 --- /dev/null +++ b/tests/baselines/reference/override16(target=es2015).js @@ -0,0 +1,19 @@ +//// [override16.ts] +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +} + + +//// [override16.js] +class A { +} +class B extends A { + constructor() { + super(...arguments); + this.foo = "string"; + } +} diff --git a/tests/baselines/reference/override16(target=es2015).symbols b/tests/baselines/reference/override16(target=es2015).symbols new file mode 100644 index 0000000000000..d07d776e938cb --- /dev/null +++ b/tests/baselines/reference/override16(target=es2015).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/override/override16.ts === +class A { +>A : Symbol(A, Decl(override16.ts, 0, 0)) + + foo?: string; +>foo : Symbol(A.foo, Decl(override16.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(override16.ts, 2, 1)) +>A : Symbol(A, Decl(override16.ts, 0, 0)) + + override foo = "string"; +>foo : Symbol(B.foo, Decl(override16.ts, 4, 19)) +} + diff --git a/tests/baselines/reference/override16(target=es2015).types b/tests/baselines/reference/override16(target=es2015).types new file mode 100644 index 0000000000000..565b7f9613d98 --- /dev/null +++ b/tests/baselines/reference/override16(target=es2015).types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/override/override16.ts === +class A { +>A : A + + foo?: string; +>foo : string +} + +class B extends A { +>B : B +>A : A + + override foo = "string"; +>foo : string +>"string" : "string" +} + diff --git a/tests/baselines/reference/override16(target=esnext).js b/tests/baselines/reference/override16(target=esnext).js new file mode 100644 index 0000000000000..6935dccb34bec --- /dev/null +++ b/tests/baselines/reference/override16(target=esnext).js @@ -0,0 +1,17 @@ +//// [override16.ts] +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +} + + +//// [override16.js] +class A { + foo; +} +class B extends A { + foo = "string"; +} diff --git a/tests/baselines/reference/override16(target=esnext).symbols b/tests/baselines/reference/override16(target=esnext).symbols new file mode 100644 index 0000000000000..d07d776e938cb --- /dev/null +++ b/tests/baselines/reference/override16(target=esnext).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/override/override16.ts === +class A { +>A : Symbol(A, Decl(override16.ts, 0, 0)) + + foo?: string; +>foo : Symbol(A.foo, Decl(override16.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(override16.ts, 2, 1)) +>A : Symbol(A, Decl(override16.ts, 0, 0)) + + override foo = "string"; +>foo : Symbol(B.foo, Decl(override16.ts, 4, 19)) +} + diff --git a/tests/baselines/reference/override16(target=esnext).types b/tests/baselines/reference/override16(target=esnext).types new file mode 100644 index 0000000000000..565b7f9613d98 --- /dev/null +++ b/tests/baselines/reference/override16(target=esnext).types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/override/override16.ts === +class A { +>A : A + + foo?: string; +>foo : string +} + +class B extends A { +>B : B +>A : A + + override foo = "string"; +>foo : string +>"string" : "string" +} + diff --git a/tests/baselines/reference/override16.js b/tests/baselines/reference/override16.js new file mode 100644 index 0000000000000..6935dccb34bec --- /dev/null +++ b/tests/baselines/reference/override16.js @@ -0,0 +1,17 @@ +//// [override16.ts] +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +} + + +//// [override16.js] +class A { + foo; +} +class B extends A { + foo = "string"; +} diff --git a/tests/baselines/reference/override16.symbols b/tests/baselines/reference/override16.symbols new file mode 100644 index 0000000000000..d07d776e938cb --- /dev/null +++ b/tests/baselines/reference/override16.symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/override/override16.ts === +class A { +>A : Symbol(A, Decl(override16.ts, 0, 0)) + + foo?: string; +>foo : Symbol(A.foo, Decl(override16.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(override16.ts, 2, 1)) +>A : Symbol(A, Decl(override16.ts, 0, 0)) + + override foo = "string"; +>foo : Symbol(B.foo, Decl(override16.ts, 4, 19)) +} + diff --git a/tests/baselines/reference/override16.types b/tests/baselines/reference/override16.types new file mode 100644 index 0000000000000..565b7f9613d98 --- /dev/null +++ b/tests/baselines/reference/override16.types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/override/override16.ts === +class A { +>A : A + + foo?: string; +>foo : string +} + +class B extends A { +>B : B +>A : A + + override foo = "string"; +>foo : string +>"string" : "string" +} + diff --git a/tests/baselines/reference/override17(target=es2015).js b/tests/baselines/reference/override17(target=es2015).js new file mode 100644 index 0000000000000..8f9f5b0ac7982 --- /dev/null +++ b/tests/baselines/reference/override17(target=es2015).js @@ -0,0 +1,45 @@ +//// [override17.ts] +class A { + public m1(): number { + return 0; + } + + public m2(): number { + return 0; + } + + public m3(): void {} +} + +class B extends A { + override m1() { + return 10; + } + + override m2(): number { + return 30; + } + + override m3(): void {} +} + + +//// [override17.js] +class A { + m1() { + return 0; + } + m2() { + return 0; + } + m3() { } +} +class B extends A { + m1() { + return 10; + } + m2() { + return 30; + } + m3() { } +} diff --git a/tests/baselines/reference/override17(target=es2015).symbols b/tests/baselines/reference/override17(target=es2015).symbols new file mode 100644 index 0000000000000..13d9a6e6382aa --- /dev/null +++ b/tests/baselines/reference/override17(target=es2015).symbols @@ -0,0 +1,40 @@ +=== tests/cases/conformance/override/override17.ts === +class A { +>A : Symbol(A, Decl(override17.ts, 0, 0)) + + public m1(): number { +>m1 : Symbol(A.m1, Decl(override17.ts, 0, 9)) + + return 0; + } + + public m2(): number { +>m2 : Symbol(A.m2, Decl(override17.ts, 3, 5)) + + return 0; + } + + public m3(): void {} +>m3 : Symbol(A.m3, Decl(override17.ts, 7, 5)) +} + +class B extends A { +>B : Symbol(B, Decl(override17.ts, 10, 1)) +>A : Symbol(A, Decl(override17.ts, 0, 0)) + + override m1() { +>m1 : Symbol(B.m1, Decl(override17.ts, 12, 19)) + + return 10; + } + + override m2(): number { +>m2 : Symbol(B.m2, Decl(override17.ts, 15, 5)) + + return 30; + } + + override m3(): void {} +>m3 : Symbol(B.m3, Decl(override17.ts, 19, 5)) +} + diff --git a/tests/baselines/reference/override17(target=es2015).types b/tests/baselines/reference/override17(target=es2015).types new file mode 100644 index 0000000000000..66ae416da9f85 --- /dev/null +++ b/tests/baselines/reference/override17(target=es2015).types @@ -0,0 +1,44 @@ +=== tests/cases/conformance/override/override17.ts === +class A { +>A : A + + public m1(): number { +>m1 : () => number + + return 0; +>0 : 0 + } + + public m2(): number { +>m2 : () => number + + return 0; +>0 : 0 + } + + public m3(): void {} +>m3 : () => void +} + +class B extends A { +>B : B +>A : A + + override m1() { +>m1 : () => number + + return 10; +>10 : 10 + } + + override m2(): number { +>m2 : () => number + + return 30; +>30 : 30 + } + + override m3(): void {} +>m3 : () => void +} + diff --git a/tests/baselines/reference/override17(target=esnext).js b/tests/baselines/reference/override17(target=esnext).js new file mode 100644 index 0000000000000..8f9f5b0ac7982 --- /dev/null +++ b/tests/baselines/reference/override17(target=esnext).js @@ -0,0 +1,45 @@ +//// [override17.ts] +class A { + public m1(): number { + return 0; + } + + public m2(): number { + return 0; + } + + public m3(): void {} +} + +class B extends A { + override m1() { + return 10; + } + + override m2(): number { + return 30; + } + + override m3(): void {} +} + + +//// [override17.js] +class A { + m1() { + return 0; + } + m2() { + return 0; + } + m3() { } +} +class B extends A { + m1() { + return 10; + } + m2() { + return 30; + } + m3() { } +} diff --git a/tests/baselines/reference/override17(target=esnext).symbols b/tests/baselines/reference/override17(target=esnext).symbols new file mode 100644 index 0000000000000..13d9a6e6382aa --- /dev/null +++ b/tests/baselines/reference/override17(target=esnext).symbols @@ -0,0 +1,40 @@ +=== tests/cases/conformance/override/override17.ts === +class A { +>A : Symbol(A, Decl(override17.ts, 0, 0)) + + public m1(): number { +>m1 : Symbol(A.m1, Decl(override17.ts, 0, 9)) + + return 0; + } + + public m2(): number { +>m2 : Symbol(A.m2, Decl(override17.ts, 3, 5)) + + return 0; + } + + public m3(): void {} +>m3 : Symbol(A.m3, Decl(override17.ts, 7, 5)) +} + +class B extends A { +>B : Symbol(B, Decl(override17.ts, 10, 1)) +>A : Symbol(A, Decl(override17.ts, 0, 0)) + + override m1() { +>m1 : Symbol(B.m1, Decl(override17.ts, 12, 19)) + + return 10; + } + + override m2(): number { +>m2 : Symbol(B.m2, Decl(override17.ts, 15, 5)) + + return 30; + } + + override m3(): void {} +>m3 : Symbol(B.m3, Decl(override17.ts, 19, 5)) +} + diff --git a/tests/baselines/reference/override17(target=esnext).types b/tests/baselines/reference/override17(target=esnext).types new file mode 100644 index 0000000000000..66ae416da9f85 --- /dev/null +++ b/tests/baselines/reference/override17(target=esnext).types @@ -0,0 +1,44 @@ +=== tests/cases/conformance/override/override17.ts === +class A { +>A : A + + public m1(): number { +>m1 : () => number + + return 0; +>0 : 0 + } + + public m2(): number { +>m2 : () => number + + return 0; +>0 : 0 + } + + public m3(): void {} +>m3 : () => void +} + +class B extends A { +>B : B +>A : A + + override m1() { +>m1 : () => number + + return 10; +>10 : 10 + } + + override m2(): number { +>m2 : () => number + + return 30; +>30 : 30 + } + + override m3(): void {} +>m3 : () => void +} + diff --git a/tests/baselines/reference/override18(target=es2015).js b/tests/baselines/reference/override18(target=es2015).js new file mode 100644 index 0000000000000..12d862bcfc954 --- /dev/null +++ b/tests/baselines/reference/override18(target=es2015).js @@ -0,0 +1,32 @@ +//// [override18.ts] +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +} + + +//// [override18.js] +class A { + constructor() { + Object.defineProperty(this, "foo", { + enumerable: true, + configurable: true, + writable: true, + value: void 0 + }); + } +} +class B extends A { + constructor() { + super(...arguments); + Object.defineProperty(this, "foo", { + enumerable: true, + configurable: true, + writable: true, + value: "string" + }); + } +} diff --git a/tests/baselines/reference/override18(target=es2015).symbols b/tests/baselines/reference/override18(target=es2015).symbols new file mode 100644 index 0000000000000..c41c766ebcc5d --- /dev/null +++ b/tests/baselines/reference/override18(target=es2015).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/override/override18.ts === +class A { +>A : Symbol(A, Decl(override18.ts, 0, 0)) + + foo?: string; +>foo : Symbol(A.foo, Decl(override18.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(override18.ts, 2, 1)) +>A : Symbol(A, Decl(override18.ts, 0, 0)) + + override foo = "string"; +>foo : Symbol(B.foo, Decl(override18.ts, 4, 19)) +} + diff --git a/tests/baselines/reference/override18(target=es2015).types b/tests/baselines/reference/override18(target=es2015).types new file mode 100644 index 0000000000000..ff1e2320ec6b3 --- /dev/null +++ b/tests/baselines/reference/override18(target=es2015).types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/override/override18.ts === +class A { +>A : A + + foo?: string; +>foo : string +} + +class B extends A { +>B : B +>A : A + + override foo = "string"; +>foo : string +>"string" : "string" +} + diff --git a/tests/baselines/reference/override18(target=esnext).js b/tests/baselines/reference/override18(target=esnext).js new file mode 100644 index 0000000000000..660b2f1f0ea73 --- /dev/null +++ b/tests/baselines/reference/override18(target=esnext).js @@ -0,0 +1,17 @@ +//// [override18.ts] +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +} + + +//// [override18.js] +class A { + foo; +} +class B extends A { + foo = "string"; +} diff --git a/tests/baselines/reference/override18(target=esnext).symbols b/tests/baselines/reference/override18(target=esnext).symbols new file mode 100644 index 0000000000000..c41c766ebcc5d --- /dev/null +++ b/tests/baselines/reference/override18(target=esnext).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/override/override18.ts === +class A { +>A : Symbol(A, Decl(override18.ts, 0, 0)) + + foo?: string; +>foo : Symbol(A.foo, Decl(override18.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(override18.ts, 2, 1)) +>A : Symbol(A, Decl(override18.ts, 0, 0)) + + override foo = "string"; +>foo : Symbol(B.foo, Decl(override18.ts, 4, 19)) +} + diff --git a/tests/baselines/reference/override18(target=esnext).types b/tests/baselines/reference/override18(target=esnext).types new file mode 100644 index 0000000000000..ff1e2320ec6b3 --- /dev/null +++ b/tests/baselines/reference/override18(target=esnext).types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/override/override18.ts === +class A { +>A : A + + foo?: string; +>foo : string +} + +class B extends A { +>B : B +>A : A + + override foo = "string"; +>foo : string +>"string" : "string" +} + diff --git a/tests/cases/conformance/override/override16.ts b/tests/cases/conformance/override/override16.ts new file mode 100644 index 0000000000000..4468edfdc4251 --- /dev/null +++ b/tests/cases/conformance/override/override16.ts @@ -0,0 +1,10 @@ +// @target: esnext,es2015 +// @noImplicitOverride: true + +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +} diff --git a/tests/cases/conformance/override/override17.ts b/tests/cases/conformance/override/override17.ts new file mode 100644 index 0000000000000..edabe9816d05b --- /dev/null +++ b/tests/cases/conformance/override/override17.ts @@ -0,0 +1,27 @@ +// @noImplicitOverride: true +// @useDefineForClassFields: true +// @target: es2015,esnext + +class A { + public m1(): number { + return 0; + } + + public m2(): number { + return 0; + } + + public m3(): void {} +} + +class B extends A { + override m1() { + return 10; + } + + override m2(): number { + return 30; + } + + override m3(): void {} +} diff --git a/tests/cases/conformance/override/override18.ts b/tests/cases/conformance/override/override18.ts new file mode 100644 index 0000000000000..2527449e7499b --- /dev/null +++ b/tests/cases/conformance/override/override18.ts @@ -0,0 +1,11 @@ +// @target: esnext,es2015 +// @noImplicitOverride: true +// @useDefineForClassFields: true + +class A { + foo?: string; +} + +class B extends A { + override foo = "string"; +}