Skip to content

Commit 4a59b63

Browse files
authored
Error for abstract property with initialiser (microsoft#43615)
* Error for abstract property with initialiser * remove stray LF * update baselines
1 parent 5ca7983 commit 4a59b63

9 files changed

+68
-4
lines changed

src/compiler/checker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33344,6 +33344,10 @@ namespace ts {
3334433344
if (isPrivateIdentifier(node.name) && hasStaticModifier(node) && node.initializer && languageVersion === ScriptTarget.ESNext && !compilerOptions.useDefineForClassFields) {
3334533345
error(node.initializer, Diagnostics.Static_fields_with_private_names_can_t_have_initializers_when_the_useDefineForClassFields_flag_is_not_specified_with_a_target_of_esnext_Consider_adding_the_useDefineForClassFields_flag);
3334633346
}
33347+
// property signatures already report "initializer not allowed in ambient context" elsewhere
33348+
if (hasSyntacticModifier(node, ModifierFlags.Abstract) && node.kind === SyntaxKind.PropertyDeclaration && node.initializer) {
33349+
error(node, Diagnostics.Property_0_cannot_have_an_initializer_because_it_is_marked_abstract, declarationNameToString(node.name));
33350+
}
3334733351
}
3334833352

3334933353
function checkPropertySignature(node: PropertySignature) {
@@ -33360,8 +33364,7 @@ namespace ts {
3336033364
// Grammar checking for modifiers is done inside the function checkGrammarFunctionLikeDeclaration
3336133365
checkFunctionOrMethodDeclaration(node);
3336233366

33363-
// Abstract methods cannot have an implementation.
33364-
// Extra checks are to avoid reporting multiple errors relating to the "abstractness" of the node.
33367+
// method signatures already report "implementation not allowed in ambient context" elsewhere
3336533368
if (hasSyntacticModifier(node, ModifierFlags.Abstract) && node.kind === SyntaxKind.MethodDeclaration && node.body) {
3336633369
error(node, Diagnostics.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract, declarationNameToString(node.name));
3336733370
}

src/compiler/diagnosticMessages.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,10 @@
887887
"category": "Error",
888888
"code": 1266
889889
},
890+
"Property '{0}' cannot have an initializer because it is marked abstract.": {
891+
"category": "Error",
892+
"code": 1267
893+
},
890894

891895
"'with' statements are not allowed in an async function block.": {
892896
"category": "Error",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts(2,14): error TS1267: Property 'prop' cannot have an initializer because it is marked abstract.
2+
3+
4+
==== tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts (1 errors) ====
5+
abstract class C {
6+
abstract prop = 1
7+
~~~~
8+
!!! error TS1267: Property 'prop' cannot have an initializer because it is marked abstract.
9+
}
10+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [abstractPropertyInitializer.ts]
2+
abstract class C {
3+
abstract prop = 1
4+
}
5+
6+
7+
//// [abstractPropertyInitializer.js]
8+
"use strict";
9+
var C = /** @class */ (function () {
10+
function C() {
11+
}
12+
return C;
13+
}());
14+
15+
16+
//// [abstractPropertyInitializer.d.ts]
17+
declare abstract class C {
18+
abstract prop: number;
19+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
=== tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts ===
2+
abstract class C {
3+
>C : Symbol(C, Decl(abstractPropertyInitializer.ts, 0, 0))
4+
5+
abstract prop = 1
6+
>prop : Symbol(C.prop, Decl(abstractPropertyInitializer.ts, 0, 18))
7+
}
8+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/classes/propertyMemberDeclarations/abstractPropertyInitializer.ts ===
2+
abstract class C {
3+
>C : C
4+
5+
abstract prop = 1
6+
>prop : number
7+
>1 : 1
8+
}
9+

tests/baselines/reference/accessorsOverrideProperty7.errors.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty7.ts(2,14): error TS1267: Property 'p' cannot have an initializer because it is marked abstract.
12
tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty7.ts(5,9): error TS2611: 'p' is defined as a property in class 'A', but is overridden here in 'B' as an accessor.
23

34

4-
==== tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty7.ts (1 errors) ====
5+
==== tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty7.ts (2 errors) ====
56
abstract class A {
67
abstract p = 'yep'
8+
~
9+
!!! error TS1267: Property 'p' cannot have an initializer because it is marked abstract.
710
}
811
class B extends A {
912
get p() { return 'oh no' } // error

tests/baselines/reference/privateNamesIncompatibleModifiers.errors.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,11 @@ tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleMod
2121
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(27,5): error TS1042: 'async' modifier cannot be used here.
2222
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(28,5): error TS1042: 'async' modifier cannot be used here.
2323
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(32,5): error TS18019: 'abstract' modifier cannot be used with a private identifier.
24+
tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(32,14): error TS1267: Property '#quux' cannot have an initializer because it is marked abstract.
2425

2526

2627
!!! error TS2318: Cannot find global type 'AsyncIterableIterator'.
27-
==== tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts (22 errors) ====
28+
==== tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts (23 errors) ====
2829
class A {
2930
public #foo = 3; // Error
3031
~~~~~~
@@ -101,5 +102,7 @@ tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleMod
101102
abstract #quux = 3; // Error
102103
~~~~~~~~
103104
!!! error TS18019: 'abstract' modifier cannot be used with a private identifier.
105+
~~~~~
106+
!!! error TS1267: Property '#quux' cannot have an initializer because it is marked abstract.
104107
}
105108

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// @strict: true
2+
// @declaration: true
3+
abstract class C {
4+
abstract prop = 1
5+
}

0 commit comments

Comments
 (0)