From 3cd17316282efa0cd87c5dbaa5755b700614b626 Mon Sep 17 00:00:00 2001 From: Arthur Ozga Date: Tue, 29 Nov 2016 15:59:28 -0600 Subject: [PATCH 1/2] abstract accessors can't have implementations --- src/compiler/checker.ts | 3 +++ src/compiler/diagnosticMessages.json | 4 +++ .../classAbstractAccessor.errors.txt | 22 +++++++++++++++ .../reference/classAbstractAccessor.js | 27 +++++++++++++++++++ .../classAbstractAccessor.ts | 6 +++++ 5 files changed, 62 insertions(+) create mode 100644 tests/baselines/reference/classAbstractAccessor.errors.txt create mode 100644 tests/baselines/reference/classAbstractAccessor.js create mode 100644 tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 527735a3b0f4a..53b3bdea3ce2f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -21239,6 +21239,9 @@ namespace ts { else if (accessor.body === undefined && !(getModifierFlags(accessor) & ModifierFlags.Abstract)) { return grammarErrorAtPos(getSourceFileOfNode(accessor), accessor.end - 1, ";".length, Diagnostics._0_expected, "{"); } + else if (accessor.body && getModifierFlags(accessor) & ModifierFlags.Abstract) { + return grammarErrorOnNode(accessor, Diagnostics.An_abstract_accessor_cannot_have_an_implementation); + } else if (accessor.typeParameters) { return grammarErrorOnNode(accessor.name, Diagnostics.An_accessor_cannot_have_type_parameters); } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 5a22d7d40d5a4..8f3b9beb888ad 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -851,6 +851,10 @@ "category": "Error", "code": 1317 }, + "An abstract accessor cannot have an implementation.": { + "category": "Error", + "code": 1318 + }, "Duplicate identifier '{0}'.": { "category": "Error", "code": 2300 diff --git a/tests/baselines/reference/classAbstractAccessor.errors.txt b/tests/baselines/reference/classAbstractAccessor.errors.txt new file mode 100644 index 0000000000000..178a2445ccece --- /dev/null +++ b/tests/baselines/reference/classAbstractAccessor.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(2,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(3,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(4,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(5,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + + +==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts (4 errors) ==== + abstract class A { + abstract get a(); + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + abstract get aa() { return 1; } // error + ~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + abstract set b(x: string); + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + abstract set bb(x: string) {} // error + ~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + } + \ No newline at end of file diff --git a/tests/baselines/reference/classAbstractAccessor.js b/tests/baselines/reference/classAbstractAccessor.js new file mode 100644 index 0000000000000..d953a4ac0c22e --- /dev/null +++ b/tests/baselines/reference/classAbstractAccessor.js @@ -0,0 +1,27 @@ +//// [classAbstractAccessor.ts] +abstract class A { + abstract get a(); + abstract get aa() { return 1; } // error + abstract set b(x: string); + abstract set bb(x: string) {} // error +} + + +//// [classAbstractAccessor.js] +var A = (function () { + function A() { + } + Object.defineProperty(A.prototype, "aa", { + get: function () { return 1; } // error + , + enumerable: true, + configurable: true + }); + Object.defineProperty(A.prototype, "bb", { + set: function (x) { } // error + , + enumerable: true, + configurable: true + }); + return A; +}()); diff --git a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts new file mode 100644 index 0000000000000..64d087f361ff5 --- /dev/null +++ b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts @@ -0,0 +1,6 @@ +abstract class A { + abstract get a(); + abstract get aa() { return 1; } // error + abstract set b(x: string); + abstract set bb(x: string) {} // error +} From 4b0697ff9d368225aae2d3c743de5e33566037d4 Mon Sep 17 00:00:00 2001 From: Arthur Ozga Date: Tue, 29 Nov 2016 16:04:56 -0600 Subject: [PATCH 2/2] fix test --- .../reference/classAbstractAccessor.errors.txt | 17 ++++++----------- .../reference/classAbstractAccessor.js | 1 + .../classAbstractAccessor.ts | 2 ++ 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/tests/baselines/reference/classAbstractAccessor.errors.txt b/tests/baselines/reference/classAbstractAccessor.errors.txt index 178a2445ccece..b43cfa9d7f13e 100644 --- a/tests/baselines/reference/classAbstractAccessor.errors.txt +++ b/tests/baselines/reference/classAbstractAccessor.errors.txt @@ -1,22 +1,17 @@ -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(2,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(3,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(4,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(5,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(4,17): error TS1318: An abstract accessor cannot have an implementation. +tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts(6,17): error TS1318: An abstract accessor cannot have an implementation. -==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts (4 errors) ==== +==== tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts (2 errors) ==== + abstract class A { abstract get a(); - ~ -!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. abstract get aa() { return 1; } // error ~~ -!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +!!! error TS1318: An abstract accessor cannot have an implementation. abstract set b(x: string); - ~ -!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. abstract set bb(x: string) {} // error ~~ -!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +!!! error TS1318: An abstract accessor cannot have an implementation. } \ No newline at end of file diff --git a/tests/baselines/reference/classAbstractAccessor.js b/tests/baselines/reference/classAbstractAccessor.js index d953a4ac0c22e..a1edf0cb88d6f 100644 --- a/tests/baselines/reference/classAbstractAccessor.js +++ b/tests/baselines/reference/classAbstractAccessor.js @@ -1,4 +1,5 @@ //// [classAbstractAccessor.ts] + abstract class A { abstract get a(); abstract get aa() { return 1; } // error diff --git a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts index 64d087f361ff5..2c59b6f93ccdf 100644 --- a/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts +++ b/tests/cases/conformance/classes/classDeclarations/classAbstractKeyword/classAbstractAccessor.ts @@ -1,3 +1,5 @@ +// @target: es5 + abstract class A { abstract get a(); abstract get aa() { return 1; } // error