Skip to content

Commit 090b7cb

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Support declaring parameters in primary constructors
This adds support for declaring parameters in primary constructors on classes and enums. Default values are currently not supported. Part of #61700 Change-Id: Ibe8983e8e10fb7948510304c8bbcb4184372b6c8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/458920 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 9efed28 commit 090b7cb

File tree

37 files changed

+1403
-282
lines changed

37 files changed

+1403
-282
lines changed

pkg/front_end/lib/src/base/modifiers.dart

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ const int _declaresConstConstructorMask = _initializingFormalMask << 1;
5757
/// super-parameter initializers.
5858
const int _superInitializingFormalMask = _declaresConstConstructorMask << 1;
5959

60+
/// Not a modifier, used by formal parameters to track if they are declaring
61+
/// parameters.
62+
const int _declaringParameterMask = _superInitializingFormalMask << 1;
63+
6064
/// Extension type that encodes a set of modifiers as a bit mask.
6165
extension type const Modifiers(int _mask) implements Object {
6266
/// The empty set of modifiers.
@@ -477,6 +481,23 @@ extension type const Modifiers(int _mask) implements Object {
477481
bool get isSuperInitializingFormal =>
478482
(_mask & _superInitializingFormalMask) != 0;
479483

484+
/// The set of modifiers containing only the synthetic modifier used to denote
485+
/// that a parameter is a declaring parameter.
486+
///
487+
/// ```
488+
/// DartDocTest(
489+
/// Modifiers.DeclaringParameter.isDeclaringParameter, true)
490+
/// DartDocTest(Modifiers.DeclaringParameter.isEmpty, false)
491+
/// DartDocTest(Modifiers.DeclaringParameter.isAbstract, false)
492+
/// ```
493+
static const Modifiers DeclaringParameter = const Modifiers(
494+
_declaringParameterMask,
495+
);
496+
497+
/// Returns `true` if the set of modifiers contains the synthetic modifier
498+
/// used to denote that a parameter is a declaring parameter.
499+
bool get isDeclaringParameter => (_mask & _declaringParameterMask) != 0;
500+
480501
/// Returns `true` if this set of modifiers contains any syntactic modifiers.
481502
///
482503
/// If [ignoreRequired] is `true`, `required` is ignored. If
@@ -531,7 +552,8 @@ extension type const Modifiers(int _mask) implements Object {
531552
_initializingFormalMask |
532553
_declaresConstConstructorMask |
533554
_namedMixinApplicationMask |
534-
_superInitializingFormalMask);
555+
_superInitializingFormalMask |
556+
_declaringParameterMask);
535557
if (ignoreRequired) {
536558
mask &= ~_requiredMask;
537559
}

pkg/front_end/lib/src/fragment/constructor/declaration.dart

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,9 +1291,7 @@ class PrimaryConstructorDeclaration
12911291
returnType.registerInferredTypeListener(this);
12921292
if (formals != null) {
12931293
for (FormalParameterBuilder formal in formals!) {
1294-
if (formal.isInitializingFormal ||
1295-
// Coverage-ignore(suite): Not run.
1296-
formal.isSuperInitializingFormal) {
1294+
if (formal.isInitializingFormal || formal.isSuperInitializingFormal) {
12971295
formal.type.registerInferable(inferable);
12981296
}
12991297
}

pkg/front_end/lib/src/fragment/declaration.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,9 @@ abstract class DeclarationFragmentImpl implements DeclarationFragment {
5454

5555
UriOffsetLength get uriOffset;
5656

57-
void addPrimaryConstructorField(PrimaryConstructorFieldFragment fragment) {
58-
throw new UnsupportedError(
59-
"Unexpected primary constructor field in $this.",
60-
);
61-
}
57+
void registerPrimaryConstructorField(
58+
PrimaryConstructorFieldFragment fragment,
59+
) {}
6260

6361
void addEnumElement(EnumElementFragment fragment) {
6462
throw new UnsupportedError("Unexpected enum element in $this.");

pkg/front_end/lib/src/fragment/extension_type.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ class ExtensionTypeFragment extends DeclarationFragmentImpl
6262
DeclarationFragmentKind.extensionTypeDeclaration;
6363

6464
@override
65-
void addPrimaryConstructorField(PrimaryConstructorFieldFragment fragment) {
65+
void registerPrimaryConstructorField(
66+
PrimaryConstructorFieldFragment fragment,
67+
) {
6668
primaryConstructorFields.add(fragment);
6769
}
6870

pkg/front_end/lib/src/fragment/field/class_member.dart

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,24 @@ part of '../fragment.dart';
66

77
class _FieldClassMember implements ClassMember {
88
final SourcePropertyBuilder _builder;
9-
final FieldFragment _fragment;
9+
10+
@override
11+
final UriOffsetLength uriOffset;
12+
13+
@override
14+
final bool isStatic;
1015

1116
@override
1217
final bool forSetter;
1318

1419
Covariance? _covariance;
1520

16-
_FieldClassMember(this._builder, this._fragment, {required this.forSetter});
17-
18-
@override
19-
UriOffsetLength get uriOffset => _fragment.uriOffset;
21+
_FieldClassMember(
22+
this._builder, {
23+
required this.uriOffset,
24+
required this.isStatic,
25+
required this.forSetter,
26+
});
2027

2128
@override
2229
DeclarationBuilder get declarationBuilder => _builder.declarationBuilder!;
@@ -99,11 +106,8 @@ class _FieldClassMember implements ClassMember {
99106
ClassMember get interfaceMember => this;
100107

101108
@override
102-
// TODO(johnniwinther): This should not be determined by the builder. A
103-
// property can have a non-abstract getter and an abstract setter or the
104-
// reverse. With augmentations, abstract introductory declarations might even
105-
// be implemented by augmentations.
106-
bool get isAbstract => _fragment.modifiers.isAbstract;
109+
bool get isAbstract =>
110+
forSetter ? _builder.hasAbstractSetter : _builder.hasAbstractGetter;
107111

108112
@override
109113
bool get isDuplicate => _builder.isDuplicate;
@@ -134,9 +138,6 @@ class _FieldClassMember implements ClassMember {
134138
@override
135139
bool get isSourceDeclaration => true;
136140

137-
@override
138-
bool get isStatic => _fragment.modifiers.isStatic;
139-
140141
@override
141142
bool get isSynthesized => false;
142143

0 commit comments

Comments
 (0)