@@ -9658,21 +9658,25 @@ namespace ts {
9658
9658
return type;
9659
9659
}
9660
9660
9661
- function getAnnotatedAccessorTypeNode(accessor: AccessorDeclaration | undefined): TypeNode | undefined {
9661
+ function getAnnotatedAccessorTypeNode(accessor: AccessorDeclaration | PropertyDeclaration | undefined): TypeNode | undefined {
9662
9662
if (accessor) {
9663
- if (accessor.kind === SyntaxKind.GetAccessor) {
9664
- const getterTypeAnnotation = getEffectiveReturnTypeNode(accessor);
9665
- return getterTypeAnnotation;
9666
- }
9667
- else {
9668
- const setterTypeAnnotation = getEffectiveSetAccessorTypeAnnotationNode(accessor);
9669
- return setterTypeAnnotation;
9663
+ switch (accessor.kind) {
9664
+ case SyntaxKind.GetAccessor:
9665
+ const getterTypeAnnotation = getEffectiveReturnTypeNode(accessor);
9666
+ return getterTypeAnnotation;
9667
+ case SyntaxKind.SetAccessor:
9668
+ const setterTypeAnnotation = getEffectiveSetAccessorTypeAnnotationNode(accessor);
9669
+ return setterTypeAnnotation;
9670
+ case SyntaxKind.PropertyDeclaration:
9671
+ Debug.assert(hasAccessorModifier(accessor));
9672
+ const accessorTypeAnnotation = getEffectiveTypeAnnotationNode(accessor);
9673
+ return accessorTypeAnnotation;
9670
9674
}
9671
9675
}
9672
9676
return undefined;
9673
9677
}
9674
9678
9675
- function getAnnotatedAccessorType(accessor: AccessorDeclaration | undefined): Type | undefined {
9679
+ function getAnnotatedAccessorType(accessor: AccessorDeclaration | PropertyDeclaration | undefined): Type | undefined {
9676
9680
const node = getAnnotatedAccessorTypeNode(accessor);
9677
9681
return node && getTypeFromTypeNode(node);
9678
9682
}
@@ -9694,19 +9698,26 @@ namespace ts {
9694
9698
}
9695
9699
const getter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.GetAccessor);
9696
9700
const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor);
9701
+ const accessor = tryCast(getDeclarationOfKind<PropertyDeclaration>(symbol, SyntaxKind.PropertyDeclaration), isAutoAccessorPropertyDeclaration);
9702
+
9697
9703
// We try to resolve a getter type annotation, a setter type annotation, or a getter function
9698
9704
// body return type inference, in that order.
9699
9705
let type = getter && isInJSFile(getter) && getTypeForDeclarationFromJSDocComment(getter) ||
9700
9706
getAnnotatedAccessorType(getter) ||
9701
9707
getAnnotatedAccessorType(setter) ||
9702
- getter && getter.body && getReturnTypeFromBody(getter);
9708
+ getAnnotatedAccessorType(accessor) ||
9709
+ getter && getter.body && getReturnTypeFromBody(getter) ||
9710
+ accessor && accessor.initializer && getWidenedTypeForVariableLikeDeclaration(accessor, /*includeOptionality*/ true);
9703
9711
if (!type) {
9704
9712
if (setter && !isPrivateWithinAmbient(setter)) {
9705
9713
errorOrSuggestion(noImplicitAny, setter, Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, symbolToString(symbol));
9706
9714
}
9707
9715
else if (getter && !isPrivateWithinAmbient(getter)) {
9708
9716
errorOrSuggestion(noImplicitAny, getter, Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, symbolToString(symbol));
9709
9717
}
9718
+ else if (accessor && !isPrivateWithinAmbient(accessor)) {
9719
+ errorOrSuggestion(noImplicitAny, accessor, Diagnostics.Member_0_implicitly_has_an_1_type, symbolToString(symbol), "any");
9720
+ }
9710
9721
type = anyType;
9711
9722
}
9712
9723
if (!popTypeResolution()) {
@@ -9716,6 +9727,9 @@ namespace ts {
9716
9727
else if (getAnnotatedAccessorTypeNode(setter)) {
9717
9728
error(setter, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
9718
9729
}
9730
+ else if (getAnnotatedAccessorTypeNode(accessor)) {
9731
+ error(setter, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
9732
+ }
9719
9733
else if (getter && noImplicitAny) {
9720
9734
error(getter, Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
9721
9735
}
@@ -9732,7 +9746,9 @@ namespace ts {
9732
9746
if (!pushTypeResolution(symbol, TypeSystemPropertyName.WriteType)) {
9733
9747
return errorType;
9734
9748
}
9735
- const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor);
9749
+
9750
+ const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor)
9751
+ ?? tryCast(getDeclarationOfKind<PropertyDeclaration>(symbol, SyntaxKind.PropertyDeclaration), isAutoAccessorPropertyDeclaration);
9736
9752
let writeType = getAnnotatedAccessorType(setter);
9737
9753
if (!popTypeResolution()) {
9738
9754
if (getAnnotatedAccessorTypeNode(setter)) {
@@ -10890,8 +10906,10 @@ namespace ts {
10890
10906
const members = getMembersOfDeclaration(decl);
10891
10907
if (members) {
10892
10908
for (const member of members) {
10893
- if (isStatic === hasStaticModifier(member) && hasLateBindableName(member)) {
10894
- lateBindMember(symbol, earlySymbols, lateSymbols, member);
10909
+ if (isStatic === hasStaticModifier(member)) {
10910
+ if (hasLateBindableName(member)) {
10911
+ lateBindMember(symbol, earlySymbols, lateSymbols, member);
10912
+ }
10895
10913
}
10896
10914
}
10897
10915
}
@@ -10905,8 +10923,10 @@ namespace ts {
10905
10923
|| isBinaryExpression(member) && isPossiblyAliasedThisProperty(member, assignmentKind)
10906
10924
|| assignmentKind === AssignmentDeclarationKind.ObjectDefinePrototypeProperty
10907
10925
|| assignmentKind === AssignmentDeclarationKind.Prototype; // A straight `Prototype` assignment probably can never have a computed name
10908
- if (isStatic === !isInstanceMember && hasLateBindableName(member)) {
10909
- lateBindMember(symbol, earlySymbols, lateSymbols, member);
10926
+ if (isStatic === !isInstanceMember) {
10927
+ if (hasLateBindableName(member)) {
10928
+ lateBindMember(symbol, earlySymbols, lateSymbols, member);
10929
+ }
10910
10930
}
10911
10931
}
10912
10932
}
@@ -43572,6 +43592,9 @@ namespace ts {
43572
43592
else if (flags & ModifierFlags.Readonly) {
43573
43593
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
43574
43594
}
43595
+ else if (flags & ModifierFlags.Accessor) {
43596
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "accessor");
43597
+ }
43575
43598
else if (flags & ModifierFlags.Async) {
43576
43599
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
43577
43600
}
@@ -43593,6 +43616,9 @@ namespace ts {
43593
43616
else if (flags & ModifierFlags.Static) {
43594
43617
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
43595
43618
}
43619
+ else if (flags & ModifierFlags.Accessor) {
43620
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "accessor");
43621
+ }
43596
43622
else if (flags & ModifierFlags.Readonly) {
43597
43623
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly");
43598
43624
}
@@ -43626,6 +43652,9 @@ namespace ts {
43626
43652
else if (flags & ModifierFlags.Async) {
43627
43653
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "async");
43628
43654
}
43655
+ else if (flags & ModifierFlags.Accessor) {
43656
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "accessor");
43657
+ }
43629
43658
else if (node.parent.kind === SyntaxKind.ModuleBlock || node.parent.kind === SyntaxKind.SourceFile) {
43630
43659
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static");
43631
43660
}
@@ -43642,6 +43671,23 @@ namespace ts {
43642
43671
lastStatic = modifier;
43643
43672
break;
43644
43673
43674
+ case SyntaxKind.AccessorKeyword:
43675
+ if (flags & ModifierFlags.Accessor) {
43676
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "accessor");
43677
+ }
43678
+ else if (flags & ModifierFlags.Readonly) {
43679
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "readonly");
43680
+ }
43681
+ else if (flags & ModifierFlags.Ambient) {
43682
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "declare");
43683
+ }
43684
+ else if (node.kind !== SyntaxKind.PropertyDeclaration) {
43685
+ return grammarErrorOnNode(modifier, Diagnostics.accessor_modifier_can_only_appear_on_a_property_declaration);
43686
+ }
43687
+
43688
+ flags |= ModifierFlags.Accessor;
43689
+ break;
43690
+
43645
43691
case SyntaxKind.ReadonlyKeyword:
43646
43692
if (flags & ModifierFlags.Readonly) {
43647
43693
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "readonly");
@@ -43738,6 +43784,9 @@ namespace ts {
43738
43784
if (flags & ModifierFlags.Override) {
43739
43785
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
43740
43786
}
43787
+ if (flags & ModifierFlags.Accessor) {
43788
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "accessor");
43789
+ }
43741
43790
}
43742
43791
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
43743
43792
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
@@ -44939,6 +44988,9 @@ namespace ts {
44939
44988
if (languageVersion < ScriptTarget.ES2015 && isPrivateIdentifier(node.name)) {
44940
44989
return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
44941
44990
}
44991
+ if (languageVersion < ScriptTarget.ES2015 && hasAccessorModifier(node)) {
44992
+ return grammarErrorOnNode(node.name, Diagnostics.Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher);
44993
+ }
44942
44994
}
44943
44995
else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) {
44944
44996
if (checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) {
0 commit comments