@@ -9676,21 +9676,25 @@ namespace ts {
9676
9676
return type;
9677
9677
}
9678
9678
9679
- function getAnnotatedAccessorTypeNode(accessor: AccessorDeclaration | undefined): TypeNode | undefined {
9679
+ function getAnnotatedAccessorTypeNode(accessor: AccessorDeclaration | PropertyDeclaration | undefined): TypeNode | undefined {
9680
9680
if (accessor) {
9681
- if (accessor.kind === SyntaxKind.GetAccessor) {
9682
- const getterTypeAnnotation = getEffectiveReturnTypeNode(accessor);
9683
- return getterTypeAnnotation;
9684
- }
9685
- else {
9686
- const setterTypeAnnotation = getEffectiveSetAccessorTypeAnnotationNode(accessor);
9687
- return setterTypeAnnotation;
9681
+ switch (accessor.kind) {
9682
+ case SyntaxKind.GetAccessor:
9683
+ const getterTypeAnnotation = getEffectiveReturnTypeNode(accessor);
9684
+ return getterTypeAnnotation;
9685
+ case SyntaxKind.SetAccessor:
9686
+ const setterTypeAnnotation = getEffectiveSetAccessorTypeAnnotationNode(accessor);
9687
+ return setterTypeAnnotation;
9688
+ case SyntaxKind.PropertyDeclaration:
9689
+ Debug.assert(hasAccessorModifier(accessor));
9690
+ const accessorTypeAnnotation = getEffectiveTypeAnnotationNode(accessor);
9691
+ return accessorTypeAnnotation;
9688
9692
}
9689
9693
}
9690
9694
return undefined;
9691
9695
}
9692
9696
9693
- function getAnnotatedAccessorType(accessor: AccessorDeclaration | undefined): Type | undefined {
9697
+ function getAnnotatedAccessorType(accessor: AccessorDeclaration | PropertyDeclaration | undefined): Type | undefined {
9694
9698
const node = getAnnotatedAccessorTypeNode(accessor);
9695
9699
return node && getTypeFromTypeNode(node);
9696
9700
}
@@ -9712,19 +9716,26 @@ namespace ts {
9712
9716
}
9713
9717
const getter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.GetAccessor);
9714
9718
const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor);
9719
+ const accessor = tryCast(getDeclarationOfKind<PropertyDeclaration>(symbol, SyntaxKind.PropertyDeclaration), isAutoAccessorPropertyDeclaration);
9720
+
9715
9721
// We try to resolve a getter type annotation, a setter type annotation, or a getter function
9716
9722
// body return type inference, in that order.
9717
9723
let type = getter && isInJSFile(getter) && getTypeForDeclarationFromJSDocComment(getter) ||
9718
9724
getAnnotatedAccessorType(getter) ||
9719
9725
getAnnotatedAccessorType(setter) ||
9720
- getter && getter.body && getReturnTypeFromBody(getter);
9726
+ getAnnotatedAccessorType(accessor) ||
9727
+ getter && getter.body && getReturnTypeFromBody(getter) ||
9728
+ accessor && accessor.initializer && getWidenedTypeForVariableLikeDeclaration(accessor, /*includeOptionality*/ true);
9721
9729
if (!type) {
9722
9730
if (setter && !isPrivateWithinAmbient(setter)) {
9723
9731
errorOrSuggestion(noImplicitAny, setter, Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, symbolToString(symbol));
9724
9732
}
9725
9733
else if (getter && !isPrivateWithinAmbient(getter)) {
9726
9734
errorOrSuggestion(noImplicitAny, getter, Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, symbolToString(symbol));
9727
9735
}
9736
+ else if (accessor && !isPrivateWithinAmbient(accessor)) {
9737
+ errorOrSuggestion(noImplicitAny, accessor, Diagnostics.Member_0_implicitly_has_an_1_type, symbolToString(symbol), "any");
9738
+ }
9728
9739
type = anyType;
9729
9740
}
9730
9741
if (!popTypeResolution()) {
@@ -9734,6 +9745,9 @@ namespace ts {
9734
9745
else if (getAnnotatedAccessorTypeNode(setter)) {
9735
9746
error(setter, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
9736
9747
}
9748
+ else if (getAnnotatedAccessorTypeNode(accessor)) {
9749
+ error(setter, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
9750
+ }
9737
9751
else if (getter && noImplicitAny) {
9738
9752
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));
9739
9753
}
@@ -9750,7 +9764,9 @@ namespace ts {
9750
9764
if (!pushTypeResolution(symbol, TypeSystemPropertyName.WriteType)) {
9751
9765
return errorType;
9752
9766
}
9753
- const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor);
9767
+
9768
+ const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor)
9769
+ ?? tryCast(getDeclarationOfKind<PropertyDeclaration>(symbol, SyntaxKind.PropertyDeclaration), isAutoAccessorPropertyDeclaration);
9754
9770
let writeType = getAnnotatedAccessorType(setter);
9755
9771
if (!popTypeResolution()) {
9756
9772
if (getAnnotatedAccessorTypeNode(setter)) {
@@ -10908,8 +10924,10 @@ namespace ts {
10908
10924
const members = getMembersOfDeclaration(decl);
10909
10925
if (members) {
10910
10926
for (const member of members) {
10911
- if (isStatic === hasStaticModifier(member) && hasLateBindableName(member)) {
10912
- lateBindMember(symbol, earlySymbols, lateSymbols, member);
10927
+ if (isStatic === hasStaticModifier(member)) {
10928
+ if (hasLateBindableName(member)) {
10929
+ lateBindMember(symbol, earlySymbols, lateSymbols, member);
10930
+ }
10913
10931
}
10914
10932
}
10915
10933
}
@@ -10923,8 +10941,10 @@ namespace ts {
10923
10941
|| isBinaryExpression(member) && isPossiblyAliasedThisProperty(member, assignmentKind)
10924
10942
|| assignmentKind === AssignmentDeclarationKind.ObjectDefinePrototypeProperty
10925
10943
|| assignmentKind === AssignmentDeclarationKind.Prototype; // A straight `Prototype` assignment probably can never have a computed name
10926
- if (isStatic === !isInstanceMember && hasLateBindableName(member)) {
10927
- lateBindMember(symbol, earlySymbols, lateSymbols, member);
10944
+ if (isStatic === !isInstanceMember) {
10945
+ if (hasLateBindableName(member)) {
10946
+ lateBindMember(symbol, earlySymbols, lateSymbols, member);
10947
+ }
10928
10948
}
10929
10949
}
10930
10950
}
@@ -43736,6 +43756,9 @@ namespace ts {
43736
43756
else if (flags & ModifierFlags.Readonly) {
43737
43757
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
43738
43758
}
43759
+ else if (flags & ModifierFlags.Accessor) {
43760
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "accessor");
43761
+ }
43739
43762
else if (flags & ModifierFlags.Async) {
43740
43763
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
43741
43764
}
@@ -43757,6 +43780,9 @@ namespace ts {
43757
43780
else if (flags & ModifierFlags.Static) {
43758
43781
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
43759
43782
}
43783
+ else if (flags & ModifierFlags.Accessor) {
43784
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "accessor");
43785
+ }
43760
43786
else if (flags & ModifierFlags.Readonly) {
43761
43787
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly");
43762
43788
}
@@ -43790,6 +43816,9 @@ namespace ts {
43790
43816
else if (flags & ModifierFlags.Async) {
43791
43817
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "async");
43792
43818
}
43819
+ else if (flags & ModifierFlags.Accessor) {
43820
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "accessor");
43821
+ }
43793
43822
else if (node.parent.kind === SyntaxKind.ModuleBlock || node.parent.kind === SyntaxKind.SourceFile) {
43794
43823
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static");
43795
43824
}
@@ -43806,6 +43835,23 @@ namespace ts {
43806
43835
lastStatic = modifier;
43807
43836
break;
43808
43837
43838
+ case SyntaxKind.AccessorKeyword:
43839
+ if (flags & ModifierFlags.Accessor) {
43840
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "accessor");
43841
+ }
43842
+ else if (flags & ModifierFlags.Readonly) {
43843
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "readonly");
43844
+ }
43845
+ else if (flags & ModifierFlags.Ambient) {
43846
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "accessor", "declare");
43847
+ }
43848
+ else if (node.kind !== SyntaxKind.PropertyDeclaration) {
43849
+ return grammarErrorOnNode(modifier, Diagnostics.accessor_modifier_can_only_appear_on_a_property_declaration);
43850
+ }
43851
+
43852
+ flags |= ModifierFlags.Accessor;
43853
+ break;
43854
+
43809
43855
case SyntaxKind.ReadonlyKeyword:
43810
43856
if (flags & ModifierFlags.Readonly) {
43811
43857
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "readonly");
@@ -43902,6 +43948,9 @@ namespace ts {
43902
43948
if (flags & ModifierFlags.Override) {
43903
43949
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
43904
43950
}
43951
+ if (flags & ModifierFlags.Accessor) {
43952
+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "accessor");
43953
+ }
43905
43954
}
43906
43955
if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
43907
43956
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
@@ -45103,6 +45152,9 @@ namespace ts {
45103
45152
if (languageVersion < ScriptTarget.ES2015 && isPrivateIdentifier(node.name)) {
45104
45153
return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
45105
45154
}
45155
+ if (languageVersion < ScriptTarget.ES2015 && hasAccessorModifier(node)) {
45156
+ return grammarErrorOnNode(node.name, Diagnostics.Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher);
45157
+ }
45106
45158
}
45107
45159
else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) {
45108
45160
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