@@ -9676,21 +9676,25 @@ namespace ts {
96769676 return type;
96779677 }
96789678
9679- function getAnnotatedAccessorTypeNode(accessor: AccessorDeclaration | undefined): TypeNode | undefined {
9679+ function getAnnotatedAccessorTypeNode(accessor: AccessorDeclaration | PropertyDeclaration | undefined): TypeNode | undefined {
96809680 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;
96889692 }
96899693 }
96909694 return undefined;
96919695 }
96929696
9693- function getAnnotatedAccessorType(accessor: AccessorDeclaration | undefined): Type | undefined {
9697+ function getAnnotatedAccessorType(accessor: AccessorDeclaration | PropertyDeclaration | undefined): Type | undefined {
96949698 const node = getAnnotatedAccessorTypeNode(accessor);
96959699 return node && getTypeFromTypeNode(node);
96969700 }
@@ -9712,19 +9716,26 @@ namespace ts {
97129716 }
97139717 const getter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.GetAccessor);
97149718 const setter = getDeclarationOfKind<AccessorDeclaration>(symbol, SyntaxKind.SetAccessor);
9719+ const accessor = tryCast(getDeclarationOfKind<PropertyDeclaration>(symbol, SyntaxKind.PropertyDeclaration), isAutoAccessorPropertyDeclaration);
9720+
97159721 // We try to resolve a getter type annotation, a setter type annotation, or a getter function
97169722 // body return type inference, in that order.
97179723 let type = getter && isInJSFile(getter) && getTypeForDeclarationFromJSDocComment(getter) ||
97189724 getAnnotatedAccessorType(getter) ||
97199725 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);
97219729 if (!type) {
97229730 if (setter && !isPrivateWithinAmbient(setter)) {
97239731 errorOrSuggestion(noImplicitAny, setter, Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, symbolToString(symbol));
97249732 }
97259733 else if (getter && !isPrivateWithinAmbient(getter)) {
97269734 errorOrSuggestion(noImplicitAny, getter, Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, symbolToString(symbol));
97279735 }
9736+ else if (accessor && !isPrivateWithinAmbient(accessor)) {
9737+ errorOrSuggestion(noImplicitAny, accessor, Diagnostics.Member_0_implicitly_has_an_1_type, symbolToString(symbol), "any");
9738+ }
97289739 type = anyType;
97299740 }
97309741 if (!popTypeResolution()) {
@@ -9734,6 +9745,9 @@ namespace ts {
97349745 else if (getAnnotatedAccessorTypeNode(setter)) {
97359746 error(setter, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
97369747 }
9748+ else if (getAnnotatedAccessorTypeNode(accessor)) {
9749+ error(setter, Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
9750+ }
97379751 else if (getter && noImplicitAny) {
97389752 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));
97399753 }
@@ -9750,7 +9764,9 @@ namespace ts {
97509764 if (!pushTypeResolution(symbol, TypeSystemPropertyName.WriteType)) {
97519765 return errorType;
97529766 }
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);
97549770 let writeType = getAnnotatedAccessorType(setter);
97559771 if (!popTypeResolution()) {
97569772 if (getAnnotatedAccessorTypeNode(setter)) {
@@ -10908,8 +10924,10 @@ namespace ts {
1090810924 const members = getMembersOfDeclaration(decl);
1090910925 if (members) {
1091010926 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+ }
1091310931 }
1091410932 }
1091510933 }
@@ -10923,8 +10941,10 @@ namespace ts {
1092310941 || isBinaryExpression(member) && isPossiblyAliasedThisProperty(member, assignmentKind)
1092410942 || assignmentKind === AssignmentDeclarationKind.ObjectDefinePrototypeProperty
1092510943 || 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+ }
1092810948 }
1092910949 }
1093010950 }
@@ -43736,6 +43756,9 @@ namespace ts {
4373643756 else if (flags & ModifierFlags.Readonly) {
4373743757 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "readonly");
4373843758 }
43759+ else if (flags & ModifierFlags.Accessor) {
43760+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "accessor");
43761+ }
4373943762 else if (flags & ModifierFlags.Async) {
4374043763 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "override", "async");
4374143764 }
@@ -43757,6 +43780,9 @@ namespace ts {
4375743780 else if (flags & ModifierFlags.Static) {
4375843781 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
4375943782 }
43783+ else if (flags & ModifierFlags.Accessor) {
43784+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "accessor");
43785+ }
4376043786 else if (flags & ModifierFlags.Readonly) {
4376143787 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly");
4376243788 }
@@ -43790,6 +43816,9 @@ namespace ts {
4379043816 else if (flags & ModifierFlags.Async) {
4379143817 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "async");
4379243818 }
43819+ else if (flags & ModifierFlags.Accessor) {
43820+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "static", "accessor");
43821+ }
4379343822 else if (node.parent.kind === SyntaxKind.ModuleBlock || node.parent.kind === SyntaxKind.SourceFile) {
4379443823 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static");
4379543824 }
@@ -43806,6 +43835,23 @@ namespace ts {
4380643835 lastStatic = modifier;
4380743836 break;
4380843837
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+
4380943855 case SyntaxKind.ReadonlyKeyword:
4381043856 if (flags & ModifierFlags.Readonly) {
4381143857 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "readonly");
@@ -43902,6 +43948,9 @@ namespace ts {
4390243948 if (flags & ModifierFlags.Override) {
4390343949 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "override");
4390443950 }
43951+ if (flags & ModifierFlags.Accessor) {
43952+ return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, "abstract", "accessor");
43953+ }
4390543954 }
4390643955 if (isNamedDeclaration(node) && node.name.kind === SyntaxKind.PrivateIdentifier) {
4390743956 return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "abstract");
@@ -45103,6 +45152,9 @@ namespace ts {
4510345152 if (languageVersion < ScriptTarget.ES2015 && isPrivateIdentifier(node.name)) {
4510445153 return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
4510545154 }
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+ }
4510645158 }
4510745159 else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) {
4510845160 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