Skip to content

Commit d858849

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Split TypeParameterBuilder into Source/Dill variants
This is done in preparation for handling patching of type parameters through fragments instead of builders. Change-Id: Idfefdcae199ccc051d2b821ea4e63e0db7a1d72e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/417461 Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 69b32f9 commit d858849

35 files changed

+639
-355
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ import 'package:kernel/class_hierarchy.dart';
77
import 'package:kernel/src/bounds_checks.dart';
88
import 'package:kernel/src/unaliasing.dart';
99

10-
import '../base/loader.dart';
1110
import '../base/messages.dart';
1211
import '../base/name_space.dart';
1312
import '../base/problems.dart' show internalProblem, unexpected, unhandled;
1413
import '../base/scope.dart';
1514
import '../base/uris.dart';
1615
import '../codes/cfe_codes.dart';
17-
import '../kernel/body_builder_context.dart';
1816
import '../source/source_library_builder.dart';
1917
import '../type_inference/type_schema.dart' show UnknownType;
2018
import '../util/helpers.dart';
@@ -23,7 +21,6 @@ import 'builder_mixins.dart';
2321
import 'formal_parameter_builder.dart';
2422
import 'library_builder.dart';
2523
import 'member_builder.dart';
26-
import 'metadata_builder.dart';
2724
import 'name_iterator.dart';
2825
import 'named_type_builder.dart';
2926
import 'nullability_builder.dart';

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import '../kernel/implicit_field_type.dart';
2020
import '../kernel/type_algorithms.dart';
2121
import '../source/source_library_builder.dart';
2222
import '../source/source_loader.dart';
23+
import '../source/source_type_parameter_builder.dart';
2324
import 'declaration_builders.dart';
2425
import 'formal_parameter_builder.dart';
2526
import 'inferable_type_builder.dart';
@@ -315,8 +316,8 @@ abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
315316
if (bound != null) {
316317
newTypeParameters ??= typeParameters.toList();
317318
StructuralParameterBuilder newTypeParameterBuilder =
318-
newTypeParameters[i] = new StructuralParameterBuilder(
319-
variable.name, variable.fileOffset, variable.fileUri,
319+
newTypeParameters[i] = new SourceStructuralParameterBuilder(
320+
new SyntheticStructuralParameterDeclaration(variable),
320321
bound: bound);
321322
unboundTypeParameters.add(newTypeParameterBuilder);
322323
if (functionTypeUpperSubstitution == null) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class SynthesizedTypeBuilder extends FixedTypeBuilder {
6565
Map<TypeParameter, DartType> map = {};
6666
for (MapEntry<NominalParameterBuilder, TypeBuilder> entry
6767
in _substitutionMap.entries) {
68-
map[entry.key.actualParameter] =
68+
map[entry.key.parameter] =
6969
entry.value.build(libraryBuilder, typeUse, hierarchy: hierarchy);
7070
}
7171
return _substitution = Substitution.fromMap(map);

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

Lines changed: 16 additions & 181 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,13 @@ enum TypeParameterKind {
2424

2525
sealed class TypeParameterBuilder extends TypeDeclarationBuilderImpl
2626
implements TypeDeclarationBuilder {
27-
@override
28-
final int fileOffset;
29-
30-
@override
31-
final String name;
32-
33-
TypeBuilder? bound;
27+
abstract TypeBuilder? bound;
3428

35-
TypeBuilder? defaultType;
29+
abstract TypeBuilder? defaultType;
3630

37-
TypeParameterBuilder? get actualOrigin;
31+
bool get isWildcard;
3832

39-
final TypeParameterKind kind;
40-
41-
final bool isWildcard;
42-
43-
@override
44-
final Uri? fileUri;
45-
46-
final List<MetadataBuilder>? metadata;
47-
48-
TypeParameterBuilder(this.name, this.fileOffset, this.fileUri,
49-
{this.bound,
50-
this.defaultType,
51-
required this.kind,
52-
Variance? variableVariance,
53-
this.metadata,
54-
this.isWildcard = false});
33+
TypeParameterKind get kind;
5534

5635
@override
5736
// Coverage-ignore(suite): Not run.
@@ -74,9 +53,6 @@ sealed class TypeParameterBuilder extends TypeDeclarationBuilderImpl
7453
return sb.toString();
7554
}
7655

77-
// Coverage-ignore(suite): Not run.
78-
TypeParameterBuilder get origin => actualOrigin ?? this;
79-
8056
Variance get variance;
8157

8258
void set variance(Variance value);
@@ -192,88 +168,20 @@ sealed class TypeParameterBuilder extends TypeDeclarationBuilderImpl
192168
}
193169
}
194170

195-
class NominalParameterBuilder extends TypeParameterBuilder {
171+
abstract class NominalParameterBuilder extends TypeParameterBuilder {
196172
/// Sentinel value used to indicate that the variable has no name. This is
197173
/// used for error recovery.
198174
static const String noNameSentinel = 'no name sentinel';
199175

200-
final TypeParameter actualParameter;
201-
202-
@override
203-
NominalParameterBuilder? actualOrigin;
204-
205-
/// [NominalParameterBuilder] overrides ==/hashCode in terms of
206-
/// [actualParameter] making it vulnerable to use in sets and maps. This
207-
/// fields tracks the first access to [hashCode] when asserts are enabled, to
208-
/// signal if the [hashCode] is used before updates to [actualParameter].
209-
StackTrace? _hasHashCode;
210-
211-
NominalParameterBuilder(String name, int charOffset, Uri? fileUri,
212-
{TypeBuilder? bound,
213-
required TypeParameterKind kind,
214-
Variance? variableVariance,
215-
List<MetadataBuilder>? metadata,
216-
super.isWildcard = false})
217-
: actualParameter =
218-
new TypeParameter(name == noNameSentinel ? null : name, null)
219-
..fileOffset = charOffset
220-
..variance = variableVariance,
221-
_varianceCalculationValue = new VarianceCalculationValue.fromVariance(
222-
variableVariance ?? Variance.covariant),
223-
super(name, charOffset, fileUri,
224-
bound: bound,
225-
kind: kind,
226-
variableVariance: variableVariance,
227-
metadata: metadata);
228-
229-
/// Restores a [NominalParameterBuilder] from kernel
230-
///
231-
/// The [loader] parameter is supposed to be passed by the clients and be not
232-
/// null. It is needed to restore [bound] and [defaultType] of the type
233-
/// variable from dill. The null value of this parameter is used only once in
234-
/// [TypeBuilderComputer] to break the infinite loop of recovering type
235-
/// variables of some recursive declarations, like the declaration of `A` in
236-
/// the example below.
237-
///
238-
/// class A<X extends A<X>> {}
239-
NominalParameterBuilder.fromKernel(TypeParameter parameter,
240-
{required Loader? loader, super.isWildcard = false})
241-
: actualParameter = parameter,
242-
// TODO(johnniwinther): Do we need to support synthesized type
243-
// parameters from kernel?
244-
_varianceCalculationValue =
245-
new VarianceCalculationValue.fromVariance(parameter.variance),
246-
super(parameter.name ?? "", parameter.fileOffset, null,
247-
kind: TypeParameterKind.fromKernel,
248-
bound: loader?.computeTypeBuilder(parameter.bound),
249-
defaultType: loader?.computeTypeBuilder(parameter.defaultType)) {
250-
_nullabilityFromParameterBound = parameter.computeNullabilityFromBound();
176+
NominalParameterBuilder(
177+
{Variance? variableVariance, Nullability? nullability})
178+
: _varianceCalculationValue = new VarianceCalculationValue.fromVariance(
179+
variableVariance ?? Variance.covariant) {
180+
_nullabilityFromParameterBound = nullability;
251181
}
252182

253-
@override
254-
NominalParameterBuilder get origin => actualOrigin ?? this;
255-
256183
/// The [TypeParameter] built by this builder.
257-
TypeParameter get parameter => origin.actualParameter;
258-
259-
@override
260-
// Coverage-ignore(suite): Not run.
261-
void addAugmentation(covariant NominalParameterBuilder augmentation) {
262-
assert(
263-
_hasHashCode == null,
264-
"Cannot apply augmentation since to $this since hashCode has already "
265-
"been computed from $actualParameter @\n$_hasHashCode");
266-
augmentation.actualOrigin = this;
267-
}
268-
269-
@override
270-
void applyAugmentation(covariant NominalParameterBuilder augmentation) {
271-
assert(
272-
_hasHashCode == null,
273-
"Cannot apply augmentation since to $this since hashCode has already "
274-
"been computed from $actualParameter @\n$_hasHashCode");
275-
augmentation.actualOrigin = this;
276-
}
184+
TypeParameter get parameter;
277185

278186
VarianceCalculationValue? _varianceCalculationValue;
279187

@@ -326,20 +234,6 @@ class NominalParameterBuilder extends TypeParameterBuilder {
326234
parameter.defaultType = defaultType;
327235
}
328236

329-
@override
330-
bool operator ==(Object other) {
331-
return other is NominalParameterBuilder && parameter == other.parameter;
332-
}
333-
334-
@override
335-
int get hashCode {
336-
assert(() {
337-
_hasHashCode ??= StackTrace.current;
338-
return true;
339-
}());
340-
return parameter.hashCode;
341-
}
342-
343237
@override
344238
TypeParameterType buildAliasedTypeWithBuiltArguments(
345239
LibraryBuilder library,
@@ -394,15 +288,6 @@ class NominalParameterBuilder extends TypeParameterBuilder {
394288
return type;
395289
}
396290

397-
void buildOutlineExpressions(
398-
SourceLibraryBuilder libraryBuilder,
399-
BodyBuilderContext bodyBuilderContext,
400-
ClassHierarchy classHierarchy,
401-
LookupScope scope) {
402-
MetadataBuilder.buildAnnotations(parameter, metadata, bodyBuilderContext,
403-
libraryBuilder, fileUri!, scope);
404-
}
405-
406291
@override
407292
void finish(SourceLibraryBuilder library, ClassBuilder object,
408293
TypeBuilder dynamicType) {
@@ -432,14 +317,6 @@ class NominalParameterBuilder extends TypeParameterBuilder {
432317
: dynamicType.build(library, TypeUse.typeParameterDefaultType));
433318
}
434319
}
435-
436-
static List<TypeParameter>? typeParametersFromBuilders(
437-
List<NominalParameterBuilder>? builders) {
438-
if (builders == null) return null;
439-
return new List<TypeParameter>.generate(
440-
builders.length, (int i) => builders[i].parameter,
441-
growable: true);
442-
}
443320
}
444321

445322
List<TypeParameterBuilder> sortAllTypeParametersTopologically(
@@ -557,41 +434,17 @@ void _sortAllTypeParametersTopologicallyFromRoot(TypeBuilder root,
557434
}
558435
}
559436

560-
class StructuralParameterBuilder extends TypeParameterBuilder {
437+
abstract class StructuralParameterBuilder extends TypeParameterBuilder {
561438
/// Sentinel value used to indicate that the variable has no name. This is
562439
/// used for error recovery.
563440
static const String noNameSentinel = 'no name sentinel';
564441

565-
final StructuralParameter actualParameter;
566-
567-
@override
568-
StructuralParameterBuilder? actualOrigin;
569-
570-
StructuralParameterBuilder(String name, int charOffset, Uri? fileUri,
571-
{TypeBuilder? bound,
572-
Variance? parameterVariance,
573-
List<MetadataBuilder>? metadata,
574-
super.isWildcard = false})
575-
: actualParameter =
576-
new StructuralParameter(name == noNameSentinel ? null : name, null)
577-
..fileOffset = charOffset
578-
..variance = parameterVariance,
579-
super(name, charOffset, fileUri,
580-
bound: bound,
581-
kind: TypeParameterKind.function,
582-
variableVariance: parameterVariance,
583-
metadata: metadata);
584-
585-
StructuralParameterBuilder.fromKernel(StructuralParameter parameter,
586-
{super.isWildcard = false})
587-
: actualParameter = parameter,
588-
// TODO(johnniwinther): Do we need to support synthesized type
589-
// parameters from kernel?
590-
super(parameter.name ?? "", parameter.fileOffset, null,
591-
kind: TypeParameterKind.fromKernel) {
592-
_nullabilityFromParameterBound = parameter.computeNullabilityFromBound();
442+
StructuralParameterBuilder({Nullability? nullability}) {
443+
_nullabilityFromParameterBound = nullability;
593444
}
594445

446+
StructuralParameter get parameter;
447+
595448
@override
596449
bool get isTypeParameter => true;
597450

@@ -638,12 +491,6 @@ class StructuralParameterBuilder extends TypeParameterBuilder {
638491
@override
639492
int get hashCode => parameter.hashCode;
640493

641-
@override
642-
StructuralParameterBuilder get origin => actualOrigin ?? this;
643-
644-
/// The [StructuralParameter] built by this builder.
645-
StructuralParameter get parameter => origin.actualParameter;
646-
647494
@override
648495
DartType buildAliasedType(
649496
LibraryBuilder library,
@@ -729,18 +576,6 @@ class StructuralParameterBuilder extends TypeParameterBuilder {
729576
: dynamicType.build(library, TypeUse.typeParameterDefaultType));
730577
}
731578
}
732-
733-
@override
734-
// Coverage-ignore(suite): Not run.
735-
void addAugmentation(covariant StructuralParameterBuilder augmentation) {
736-
augmentation.actualOrigin = this;
737-
}
738-
739-
@override
740-
// Coverage-ignore(suite): Not run.
741-
void applyAugmentation(covariant StructuralParameterBuilder augmentation) {
742-
augmentation.actualOrigin = this;
743-
}
744579
}
745580

746581
/// This enum is used internally for dependency analysis of potentially cyclic

pkg/front_end/lib/src/dill/dill_class_builder.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import '../builder/name_iterator.dart';
1515
import '../builder/type_builder.dart';
1616
import 'dill_library_builder.dart' show DillLibraryBuilder;
1717
import 'dill_member_builder.dart';
18+
import 'dill_type_parameter_builder.dart';
1819

1920
mixin DillClassMemberAccessMixin implements ClassMemberAccess {
2021
DeclarationNameSpace get nameSpace;
@@ -240,11 +241,11 @@ TypeBuilder? computeTypeBuilder(
240241
: library.loader.computeTypeBuilder(supertype.asInterfaceType);
241242
}
242243

243-
List<NominalParameterBuilder>? computeTypeParameterBuilders(
244+
List<DillNominalParameterBuilder>? computeTypeParameterBuilders(
244245
List<TypeParameter>? typeParameters, Loader loader) {
245246
if (typeParameters == null || typeParameters.length == 0) return null;
246-
return <NominalParameterBuilder>[
247+
return <DillNominalParameterBuilder>[
247248
for (TypeParameter typeParameter in typeParameters)
248-
new NominalParameterBuilder.fromKernel(typeParameter, loader: loader)
249+
new DillNominalParameterBuilder(typeParameter, loader: loader)
249250
];
250251
}

0 commit comments

Comments
 (0)