Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 54024cf

Browse files
committed
Support for auto-accessor fields
1 parent 7e91485 commit 54024cf

File tree

150 files changed

+4462
-833
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

150 files changed

+4462
-833
lines changed

scripts/eslint/rules/debug-assert.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export = createRule({
4242
context.report({ messageId: "secondArgumentDebugAssertError", node: message1Node });
4343
}
4444

45-
if (argsLen < 3) {
45+
if (argsLen < 3 || argsLen > 3) {
4646
return;
4747
}
4848

src/compiler/binder.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -2744,7 +2744,10 @@ namespace ts {
27442744
}
27452745

27462746
function bindPropertyWorker(node: PropertyDeclaration | PropertySignature) {
2747-
return bindPropertyOrMethodOrAccessor(node, SymbolFlags.Property | (node.questionToken ? SymbolFlags.Optional : SymbolFlags.None), SymbolFlags.PropertyExcludes);
2747+
const isAutoAccessor = isAutoAccessorPropertyDeclaration(node);
2748+
const includes = isAutoAccessor ? SymbolFlags.Accessor : SymbolFlags.Property;
2749+
const excludes = isAutoAccessor ? SymbolFlags.AccessorExcludes : SymbolFlags.PropertyExcludes;
2750+
return bindPropertyOrMethodOrAccessor(node, includes | (node.questionToken ? SymbolFlags.Optional : SymbolFlags.None), excludes);
27482751
}
27492752

27502753
function bindAnonymousTypeWorker(node: TypeLiteralNode | MappedTypeNode | JSDocTypeLiteral) {

src/compiler/checker.ts

+67-15
Original file line numberDiff line numberDiff line change
@@ -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)) {

src/compiler/diagnosticMessages.json

+8
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,10 @@
899899
"category": "Error",
900900
"code": 1274
901901
},
902+
"'accessor' modifier can only appear on a property declaration.": {
903+
"category": "Error",
904+
"code": 1275
905+
},
902906

903907
"'with' statements are not allowed in an async function block.": {
904908
"category": "Error",
@@ -7421,5 +7425,9 @@
74217425
"'{0}' is automatically exported here.": {
74227426
"category": "Message",
74237427
"code": 18044
7428+
},
7429+
"Properties with the 'accessor' modifier are only available when targeting ECMAScript 2015 and higher.": {
7430+
"category": "Error",
7431+
"code": 18045
74247432
}
74257433
}

0 commit comments

Comments
 (0)