Skip to content

Commit d4cee66

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Support default values in primary constructor parameters
This adds support for default values in primary constructor parameters. The code handling default values is refactored to ensure consistent handling of the default values, since these need to be part of the outline in some but not all cases. The default values not included in the outline are computed during the full compilation. Part of #61700 Change-Id: Ief1a516e06d1321a5b0c94b58bf33ec3837befa4 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/459422 Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
1 parent 270bc08 commit d4cee66

File tree

41 files changed

+1141
-299
lines changed

Some content is hidden

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

41 files changed

+1141
-299
lines changed

pkg/front_end/lib/src/builder/formal_parameter_builder.dart

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@ import '../source/fragment_factory.dart';
2727
import '../source/source_constructor_builder.dart';
2828
import '../source/source_factory_builder.dart';
2929
import '../source/source_library_builder.dart';
30+
import '../source/source_member_builder.dart';
3031
import '../source/source_property_builder.dart';
3132
import 'builder.dart';
32-
import 'constructor_builder.dart';
3333
import 'declaration_builders.dart';
34-
import 'member_builder.dart';
3534
import 'omitted_type_builder.dart';
3635
import 'property_builder.dart';
3736
import 'type_builder.dart';
@@ -87,7 +86,7 @@ class FormalParameterBuilder extends NamedBuilderImpl
8786
///
8887
/// This is stored until outlines have been built through
8988
/// [buildOutlineExpressions].
90-
Token? initializerToken;
89+
Token? _initializerToken;
9190

9291
bool initializerWasInferred = false;
9392

@@ -111,9 +110,11 @@ class FormalParameterBuilder extends NamedBuilderImpl
111110
this.fileOffset, {
112111
required this.fileUri,
113112
this.isExtensionThis = false,
113+
Token? initializerToken,
114114
required this.hasImmediatelyDeclaredInitializer,
115115
this.isWildcard = false,
116-
}) : this.hasDeclaredInitializer = hasImmediatelyDeclaredInitializer {
116+
}) : this.hasDeclaredInitializer = hasImmediatelyDeclaredInitializer,
117+
this._initializerToken = initializerToken {
117118
type.registerInferredTypeListener(this);
118119
}
119120

@@ -207,6 +208,7 @@ class FormalParameterBuilder extends NamedBuilderImpl
207208
fileOffset,
208209
fileUri: fileUri,
209210
isExtensionThis: isExtensionThis,
211+
initializerToken: _takeInitializerToken(),
210212
hasImmediatelyDeclaredInitializer: hasImmediatelyDeclaredInitializer,
211213
)..variable = variable;
212214
}
@@ -259,8 +261,8 @@ class FormalParameterBuilder extends NamedBuilderImpl
259261
}
260262
}
261263

262-
static bool needsDefaultValuesBuiltAsOutlineExpressions(
263-
MemberBuilder memberBuilder,
264+
static bool _needsDefaultValuesBuiltAsOutlineExpressions(
265+
SourceMemberBuilder memberBuilder,
264266
) {
265267
// For modular compilation we need to include default values for optional
266268
// and named parameters in several cases:
@@ -271,26 +273,41 @@ class FormalParameterBuilder extends NamedBuilderImpl
271273
// in mixin applications, and
272274
// * for factories, to uphold the invariant that optional parameters always
273275
// have default values, even during modular compilation.
274-
if (memberBuilder is ConstructorBuilder) {
276+
if (memberBuilder is SourceConstructorBuilder) {
275277
return true;
276278
} else if (memberBuilder is SourceFactoryBuilder) {
277279
return true;
278280
} else {
279-
// Coverage-ignore-block(suite): Not run.
280281
return memberBuilder.isClassInstanceMember;
281282
}
282283
}
283284

285+
/// Returns the [_initializerToken] field and clears it.
286+
///
287+
/// This is used to transfer ownership of the token to the receiver. Tokens
288+
/// need to be cleared during the outline phase to avoid holding the token
289+
/// stream in memory.
290+
Token? _takeInitializerToken() {
291+
Token? initializerToken = _initializerToken;
292+
_initializerToken = null;
293+
return initializerToken;
294+
}
295+
284296
/// Builds the default value from this [initializerToken] if this is a
285297
/// formal parameter on a const constructor or instance method.
286-
void buildOutlineExpressions(
287-
SourceLibraryBuilder libraryBuilder,
288-
DeclarationBuilder? declarationBuilder, {
298+
void buildOutlineExpressions({
299+
required SourceLibraryBuilder libraryBuilder,
300+
required DeclarationBuilder? declarationBuilder,
301+
required SourceMemberBuilder memberBuilder,
289302
required ExtensionScope extensionScope,
290303
required LookupScope scope,
291-
required bool buildDefaultValue,
292304
}) {
293-
if (buildDefaultValue) {
305+
// For const constructors we need to include default parameter values
306+
// into the outline. For all other formals we need to call
307+
// buildOutlineExpressions to clear initializerToken to prevent
308+
// consuming too much memory.
309+
Token? initializerToken = _takeInitializerToken();
310+
if (_needsDefaultValuesBuiltAsOutlineExpressions(memberBuilder)) {
294311
if (initializerToken != null) {
295312
BodyBuilderContext bodyBuilderContext = new ParameterBodyBuilderContext(
296313
libraryBuilder,
@@ -305,7 +322,7 @@ class FormalParameterBuilder extends NamedBuilderImpl
305322
extensionScope: extensionScope,
306323
scope: scope,
307324
fileUri: fileUri,
308-
initializerToken: initializerToken!,
325+
initializerToken: initializerToken,
309326
declaredType: variable!.type,
310327
hasDeclaredInitializer: hasDeclaredInitializer,
311328
);
@@ -319,7 +336,6 @@ class FormalParameterBuilder extends NamedBuilderImpl
319336
variable!.initializer = new NullLiteral()..parent = variable;
320337
}
321338
}
322-
initializerToken = null;
323339
}
324340

325341
@override

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ mixin _ConstructorDeclarationMixin
614614
void _buildTypeParametersAndFormalsForOutlineExpressions({
615615
required SourceLibraryBuilder libraryBuilder,
616616
required DeclarationBuilder declarationBuilder,
617+
required SourceConstructorBuilder constructorBuilder,
617618
required BodyBuilderContext bodyBuilderContext,
618619
required ClassHierarchy classHierarchy,
619620
});
@@ -644,6 +645,7 @@ mixin _ConstructorDeclarationMixin
644645
_buildTypeParametersAndFormalsForOutlineExpressions(
645646
libraryBuilder: libraryBuilder,
646647
declarationBuilder: declarationBuilder,
648+
constructorBuilder: constructorBuilder,
647649
bodyBuilderContext: bodyBuilderContext,
648650
classHierarchy: classHierarchy,
649651
);
@@ -795,6 +797,7 @@ mixin _RegularConstructorDeclarationMixin
795797
void _buildTypeParametersAndFormals({
796798
required SourceLibraryBuilder libraryBuilder,
797799
required DeclarationBuilder declarationBuilder,
800+
required SourceConstructorBuilder constructorBuilder,
798801
required BodyBuilderContext bodyBuilderContext,
799802
required ClassHierarchy classHierarchy,
800803
required ExtensionScope extensionScope,
@@ -811,17 +814,13 @@ mixin _RegularConstructorDeclarationMixin
811814
}
812815

813816
if (formals != null) {
814-
// For const constructors we need to include default parameter values
815-
// into the outline. For all other formals we need to call
816-
// buildOutlineExpressions to clear initializerToken to prevent
817-
// consuming too much memory.
818817
for (FormalParameterBuilder formal in formals!) {
819818
formal.buildOutlineExpressions(
820-
libraryBuilder,
821-
declarationBuilder,
819+
libraryBuilder: libraryBuilder,
820+
declarationBuilder: declarationBuilder,
821+
memberBuilder: constructorBuilder,
822822
extensionScope: extensionScope,
823823
scope: typeParameterScope,
824-
buildDefaultValue: true,
825824
);
826825
}
827826
}
@@ -1008,12 +1007,14 @@ class RegularConstructorDeclaration
10081007
void _buildTypeParametersAndFormalsForOutlineExpressions({
10091008
required SourceLibraryBuilder libraryBuilder,
10101009
required DeclarationBuilder declarationBuilder,
1010+
required SourceConstructorBuilder constructorBuilder,
10111011
required BodyBuilderContext bodyBuilderContext,
10121012
required ClassHierarchy classHierarchy,
10131013
}) {
10141014
_buildTypeParametersAndFormals(
10151015
libraryBuilder: libraryBuilder,
10161016
declarationBuilder: declarationBuilder,
1017+
constructorBuilder: constructorBuilder,
10171018
bodyBuilderContext: bodyBuilderContext,
10181019
classHierarchy: classHierarchy,
10191020
extensionScope: _fragment.enclosingCompilationUnit.extensionScope,
@@ -1155,12 +1156,14 @@ class DefaultEnumConstructorDeclaration
11551156
void _buildTypeParametersAndFormalsForOutlineExpressions({
11561157
required SourceLibraryBuilder libraryBuilder,
11571158
required DeclarationBuilder declarationBuilder,
1159+
required SourceConstructorBuilder constructorBuilder,
11581160
required BodyBuilderContext bodyBuilderContext,
11591161
required ClassHierarchy classHierarchy,
11601162
}) {
11611163
_buildTypeParametersAndFormals(
11621164
libraryBuilder: libraryBuilder,
11631165
declarationBuilder: declarationBuilder,
1166+
constructorBuilder: constructorBuilder,
11641167
bodyBuilderContext: bodyBuilderContext,
11651168
classHierarchy: classHierarchy,
11661169
extensionScope: _extensionScope,
@@ -1243,6 +1246,7 @@ class PrimaryConstructorDeclaration
12431246
void _buildTypeParametersAndFormals({
12441247
required SourceLibraryBuilder libraryBuilder,
12451248
required DeclarationBuilder declarationBuilder,
1249+
required SourceConstructorBuilder constructorBuilder,
12461250
required BodyBuilderContext bodyBuilderContext,
12471251
required ClassHierarchy classHierarchy,
12481252
required ExtensionScope extensionScope,
@@ -1265,11 +1269,11 @@ class PrimaryConstructorDeclaration
12651269
// consuming too much memory.
12661270
for (FormalParameterBuilder formal in formals!) {
12671271
formal.buildOutlineExpressions(
1268-
libraryBuilder,
1269-
declarationBuilder,
1272+
libraryBuilder: libraryBuilder,
1273+
declarationBuilder: declarationBuilder,
1274+
memberBuilder: constructorBuilder,
12701275
extensionScope: extensionScope,
12711276
scope: typeParameterScope,
1272-
buildDefaultValue: true,
12731277
);
12741278
}
12751279
}
@@ -1371,12 +1375,14 @@ class PrimaryConstructorDeclaration
13711375
void _buildTypeParametersAndFormalsForOutlineExpressions({
13721376
required SourceLibraryBuilder libraryBuilder,
13731377
required DeclarationBuilder declarationBuilder,
1378+
required SourceConstructorBuilder constructorBuilder,
13741379
required BodyBuilderContext bodyBuilderContext,
13751380
required ClassHierarchy classHierarchy,
13761381
}) {
13771382
_buildTypeParametersAndFormals(
13781383
libraryBuilder: libraryBuilder,
13791384
declarationBuilder: declarationBuilder,
1385+
constructorBuilder: constructorBuilder,
13801386
bodyBuilderContext: bodyBuilderContext,
13811387
classHierarchy: classHierarchy,
13821388
extensionScope: _fragment.enclosingCompilationUnit.extensionScope,

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@ class EnumElementDeclaration
183183
required SourcePropertyBuilder propertyBuilder,
184184
required Annotatable annotatable,
185185
required Uri annotatableFileUri,
186-
required bool isClassInstanceMember,
187186
}) {}
188187

189188
@override

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

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -232,19 +232,13 @@ class FactoryDeclarationImpl
232232
}
233233

234234
if (_fragment.formals != null) {
235-
// For const constructors we need to include default parameter values
236-
// into the outline. For all other formals we need to call
237-
// buildOutlineExpressions to clear initializerToken to prevent
238-
// consuming too much memory.
239235
for (FormalParameterBuilder formal in _fragment.formals!) {
240236
formal.buildOutlineExpressions(
241-
libraryBuilder,
242-
factoryBuilder.declarationBuilder,
237+
libraryBuilder: libraryBuilder,
238+
declarationBuilder: factoryBuilder.declarationBuilder,
239+
memberBuilder: factoryBuilder,
243240
extensionScope: _fragment.enclosingCompilationUnit.extensionScope,
244241
scope: _fragment.typeParameterScope,
245-
buildDefaultValue:
246-
FormalParameterBuilder // force line break
247-
.needsDefaultValuesBuiltAsOutlineExpressions(factoryBuilder),
248242
);
249243
}
250244
}

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,6 @@ class RegularFieldDeclaration
696696
required SourcePropertyBuilder propertyBuilder,
697697
required Annotatable annotatable,
698698
required Uri annotatableFileUri,
699-
required bool isClassInstanceMember,
700699
}) {}
701700

702701
@override
@@ -716,7 +715,6 @@ class RegularFieldDeclaration
716715
required SourcePropertyBuilder propertyBuilder,
717716
required Annotatable annotatable,
718717
required Uri annotatableFileUri,
719-
required bool isClassInstanceMember,
720718
}) {}
721719

722720
@override

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ abstract class GetterDeclaration {
5050
required SourcePropertyBuilder propertyBuilder,
5151
required Annotatable annotatable,
5252
required Uri annotatableFileUri,
53-
required bool isClassInstanceMember,
5453
});
5554

5655
void buildGetterOutlineNode({
@@ -166,16 +165,15 @@ class RegularGetterDeclaration
166165
required SourcePropertyBuilder propertyBuilder,
167166
required Annotatable annotatable,
168167
required Uri annotatableFileUri,
169-
required bool isClassInstanceMember,
170168
}) {
171169
_encoding.buildOutlineExpressions(
172170
classHierarchy: classHierarchy,
173171
libraryBuilder: libraryBuilder,
174172
declarationBuilder: declarationBuilder,
173+
propertyBuilder: propertyBuilder,
175174
bodyBuilderContext: createBodyBuilderContext(propertyBuilder),
176175
annotatable: annotatable,
177176
annotatableFileUri: annotatableFileUri,
178-
isClassInstanceMember: isClassInstanceMember,
179177
);
180178
}
181179

pkg/front_end/lib/src/fragment/getter/encoding.dart

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,10 @@ sealed class GetterEncoding implements InferredTypeListener {
135135
required ClassHierarchy classHierarchy,
136136
required SourceLibraryBuilder libraryBuilder,
137137
required DeclarationBuilder? declarationBuilder,
138+
required SourcePropertyBuilder propertyBuilder,
138139
required BodyBuilderContext bodyBuilderContext,
139140
required Annotatable annotatable,
140141
required Uri annotatableFileUri,
141-
required bool isClassInstanceMember,
142142
});
143143

144144
void buildOutlineNode({
@@ -236,10 +236,10 @@ mixin _DirectGetterEncodingMixin implements GetterEncoding {
236236
required ClassHierarchy classHierarchy,
237237
required SourceLibraryBuilder libraryBuilder,
238238
required DeclarationBuilder? declarationBuilder,
239+
required SourcePropertyBuilder propertyBuilder,
239240
required BodyBuilderContext bodyBuilderContext,
240241
required Annotatable annotatable,
241242
required Uri annotatableFileUri,
242-
required bool isClassInstanceMember,
243243
}) {
244244
buildMetadataForOutlineExpressions(
245245
libraryBuilder: libraryBuilder,
@@ -260,13 +260,12 @@ mixin _DirectGetterEncodingMixin implements GetterEncoding {
260260
// Coverage-ignore(suite): Not run.
261261
?.builders,
262262
);
263-
buildFormalsForOutlineExpressions(
264-
libraryBuilder,
265-
declarationBuilder,
266-
_fragment.declaredFormals,
263+
_fragment.declaredFormals.buildOutlineExpressions(
264+
libraryBuilder: libraryBuilder,
265+
declarationBuilder: declarationBuilder,
266+
memberBuilder: propertyBuilder,
267267
extensionScope: _fragment.enclosingCompilationUnit.extensionScope,
268268
scope: _fragment.typeParameterScope,
269-
isClassInstanceMember: isClassInstanceMember,
270269
);
271270
}
272271

@@ -511,10 +510,10 @@ mixin _ExtensionInstanceGetterEncodingMixin implements GetterEncoding {
511510
required ClassHierarchy classHierarchy,
512511
required SourceLibraryBuilder libraryBuilder,
513512
required DeclarationBuilder? declarationBuilder,
513+
required SourcePropertyBuilder propertyBuilder,
514514
required BodyBuilderContext bodyBuilderContext,
515515
required Annotatable annotatable,
516516
required Uri annotatableFileUri,
517-
required bool isClassInstanceMember,
518517
}) {
519518
buildMetadataForOutlineExpressions(
520519
libraryBuilder: libraryBuilder,
@@ -536,13 +535,12 @@ mixin _ExtensionInstanceGetterEncodingMixin implements GetterEncoding {
536535
// Coverage-ignore(suite): Not run.
537536
?.builders,
538537
);
539-
buildFormalsForOutlineExpressions(
540-
libraryBuilder,
541-
declarationBuilder,
542-
_fragment.declaredFormals,
538+
_fragment.declaredFormals.buildOutlineExpressions(
539+
libraryBuilder: libraryBuilder,
540+
declarationBuilder: declarationBuilder,
541+
memberBuilder: propertyBuilder,
543542
extensionScope: _fragment.enclosingCompilationUnit.extensionScope,
544543
scope: _fragment.typeParameterScope,
545-
isClassInstanceMember: isClassInstanceMember,
546544
);
547545

548546
buildTypeParametersForOutlineExpressions(
@@ -551,13 +549,12 @@ mixin _ExtensionInstanceGetterEncodingMixin implements GetterEncoding {
551549
bodyBuilderContext,
552550
_clonedDeclarationTypeParameters,
553551
);
554-
buildFormalForOutlineExpressions(
555-
libraryBuilder,
556-
declarationBuilder,
557-
_thisFormal,
552+
_thisFormal.buildOutlineExpressions(
553+
libraryBuilder: libraryBuilder,
554+
declarationBuilder: declarationBuilder,
555+
memberBuilder: propertyBuilder,
558556
extensionScope: _fragment.enclosingCompilationUnit.extensionScope,
559557
scope: _fragment.typeParameterScope,
560-
isClassInstanceMember: isClassInstanceMember,
561558
);
562559
}
563560

0 commit comments

Comments
 (0)