Skip to content

Commit a7e6a9f

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Add TypeParameterFactory
This adds a TypeParameterFactory to encapsulate the creation of type parameters and ensure the computation of their bounds. Change-Id: Ib9558ae3bafc7b30e67bac1fc3a098f93fbf29d0 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/438080 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 875980c commit a7e6a9f

Some content is hidden

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

52 files changed

+594
-635
lines changed

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

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity;
6+
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
67
import 'package:kernel/ast.dart' show Annotatable, Library, Version;
78
import 'package:kernel/reference_from_index.dart';
89

@@ -18,7 +19,6 @@ import '../fragment/fragment.dart';
1819
import '../kernel/body_builder_context.dart';
1920
import '../source/name_space_builder.dart';
2021
import '../source/offset_map.dart';
21-
import '../source/outline_builder.dart';
2222
import '../source/source_class_builder.dart';
2323
import '../source/source_library_builder.dart';
2424
import '../source/source_loader.dart';
@@ -87,7 +87,7 @@ abstract class DillCompilationUnit implements CompilationUnit {}
8787

8888
abstract class SourceCompilationUnit
8989
implements CompilationUnit, LibraryFragment {
90-
OutlineBuilder createOutlineBuilder();
90+
void buildOutline(Token tokens);
9191

9292
/// Creates a [SourceLibraryBuilder] for with this [SourceCompilationUnit] as
9393
/// the main compilation unit.
@@ -288,11 +288,7 @@ abstract class SourceCompilationUnit
288288
///
289289
/// This is used to compute the bounds of type parameters while taking the
290290
/// bound dependencies, which might span multiple libraries, into account.
291-
void collectUnboundTypeParameters(
292-
SourceLibraryBuilder libraryBuilder,
293-
Map<NominalParameterBuilder, SourceLibraryBuilder> nominalParameters,
294-
Map<StructuralParameterBuilder, SourceLibraryBuilder>
295-
structuralParameters);
291+
List<TypeParameterBuilder> collectUnboundTypeParameters();
296292

297293
/// Adds [prefixFragment] to library name space.
298294
///

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import '../base/scope.dart';
1515
import '../base/uris.dart';
1616
import '../codes/cfe_codes.dart';
1717
import '../source/source_library_builder.dart';
18+
import '../source/type_parameter_factory.dart';
1819
import '../type_inference/type_schema.dart' show UnknownType;
1920
import '../util/helpers.dart';
2021
import 'builder.dart';

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:kernel/src/bounds_checks.dart' show VarianceCalculationValue;
99
import '../base/problems.dart';
1010
import '../kernel/type_algorithms.dart';
1111
import '../source/source_loader.dart';
12+
import '../source/type_parameter_factory.dart';
1213
import 'declaration_builders.dart';
1314
import 'library_builder.dart';
1415
import 'nullability_builder.dart';
@@ -113,7 +114,7 @@ class FixedTypeBuilderImpl extends FixedTypeBuilder {
113114
TypeBuilder? substituteRange(
114115
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
115116
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
116-
List<StructuralParameterBuilder> unboundTypeParameters,
117+
TypeParameterFactory typeParameterFactory,
117118
{Variance variance = Variance.covariant}) {
118119
return null;
119120
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import '../kernel/type_algorithms.dart';
2121
import '../source/source_library_builder.dart';
2222
import '../source/source_loader.dart';
2323
import '../source/source_type_parameter_builder.dart';
24+
import '../source/type_parameter_factory.dart';
2425
import 'declaration_builders.dart';
2526
import 'formal_parameter_builder.dart';
2627
import 'inferable_type_builder.dart';
@@ -292,7 +293,7 @@ abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
292293
TypeBuilder? substituteRange(
293294
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
294295
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
295-
List<StructuralParameterBuilder> unboundTypeParameters,
296+
TypeParameterFactory typeParameterFactory,
296297
{final Variance variance = Variance.covariant}) {
297298
List<StructuralParameterBuilder>? typeParameters = this.typeParameters;
298299
List<ParameterBuilder>? formals = this.formals;
@@ -310,16 +311,16 @@ abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
310311
TypeBuilder? bound;
311312
if (variable.bound != null) {
312313
bound = variable.bound!.substituteRange(
313-
upperSubstitution, lowerSubstitution, unboundTypeParameters,
314+
upperSubstitution, lowerSubstitution, typeParameterFactory,
314315
variance: Variance.invariant);
315316
}
316317
if (bound != null) {
317318
newTypeParameters ??= typeParameters.toList();
318319
StructuralParameterBuilder newTypeParameterBuilder =
319-
newTypeParameters[i] = new SourceStructuralParameterBuilder(
320-
new SyntheticStructuralParameterDeclaration(variable))
320+
newTypeParameters[i] = typeParameterFactory
321+
.createStructuralParameterBuilder(
322+
new SyntheticStructuralParameterDeclaration(variable))
321323
..bound = bound;
322-
unboundTypeParameters.add(newTypeParameterBuilder);
323324
if (functionTypeUpperSubstitution == null) {
324325
functionTypeUpperSubstitution = {...upperSubstitution};
325326
functionTypeLowerSubstitution = {...lowerSubstitution};
@@ -340,7 +341,7 @@ abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
340341
TypeBuilder? parameterType = formal.type.substituteRange(
341342
functionTypeUpperSubstitution ?? upperSubstitution,
342343
functionTypeLowerSubstitution ?? lowerSubstitution,
343-
unboundTypeParameters,
344+
typeParameterFactory,
344345
variance: variance.combine(Variance.contravariant));
345346
if (parameterType != null) {
346347
newFormals ??= new List.of(formals);
@@ -352,7 +353,7 @@ abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder {
352353
newReturnType = returnType.substituteRange(
353354
functionTypeUpperSubstitution ?? upperSubstitution,
354355
functionTypeLowerSubstitution ?? lowerSubstitution,
355-
unboundTypeParameters,
356+
typeParameterFactory,
356357
variance: variance);
357358

358359
if (newTypeParameters != null ||

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:kernel/ast.dart';
66
import 'package:kernel/class_hierarchy.dart';
77

88
import '../kernel/type_algorithms.dart';
9+
import '../source/type_parameter_factory.dart';
910
import 'declaration_builders.dart';
1011
import 'library_builder.dart';
1112
import 'nullability_builder.dart';
@@ -95,7 +96,7 @@ class InvalidTypeBuilderImpl extends InvalidTypeBuilder {
9596
TypeBuilder? substituteRange(
9697
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
9798
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
98-
List<StructuralParameterBuilder> unboundTypeParameters,
99+
TypeParameterFactory typeParameterFactory,
99100
{Variance variance = Variance.covariant}) {
100101
return null;
101102
}

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import '../kernel/implicit_field_type.dart';
4242
import '../kernel/type_algorithms.dart';
4343
import '../source/source_library_builder.dart';
4444
import '../source/source_loader.dart';
45+
import '../source/type_parameter_factory.dart';
4546
import '../util/helpers.dart';
4647
import 'builder.dart';
4748
import 'declaration_builders.dart';
@@ -494,12 +495,10 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
494495
@override
495496
TypeBuilder? unalias(
496497
{Set<TypeAliasBuilder>? usedTypeAliasBuilders,
497-
List<TypeBuilder>? unboundTypes,
498-
List<StructuralParameterBuilder>? unboundTypeParameters}) {
498+
List<TypeBuilder>? unboundTypes}) {
499499
if (declaration is TypeAliasBuilder) {
500-
return (declaration as TypeAliasBuilder).unalias(typeArguments,
501-
usedTypeAliasBuilders: usedTypeAliasBuilders,
502-
unboundTypeParameters: unboundTypeParameters);
500+
return (declaration as TypeAliasBuilder)
501+
.unalias(typeArguments, usedTypeAliasBuilders: usedTypeAliasBuilders);
503502
}
504503
return this;
505504
}
@@ -837,7 +836,7 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
837836
TypeBuilder? substituteRange(
838837
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
839838
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
840-
List<StructuralParameterBuilder> unboundTypeParameters,
839+
TypeParameterFactory typeParameterFactory,
841840
{final Variance variance = Variance.covariant}) {
842841
TypeDeclarationBuilder declaration = this.declaration;
843842
List<TypeBuilder>? arguments = this.typeArguments;
@@ -870,7 +869,7 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
870869
case ClassBuilder():
871870
for (int i = 0; i < arguments.length; ++i) {
872871
TypeBuilder? substitutedArgument = arguments[i].substituteRange(
873-
upperSubstitution, lowerSubstitution, unboundTypeParameters,
872+
upperSubstitution, lowerSubstitution, typeParameterFactory,
874873
variance: variance);
875874
if (substitutedArgument != null) {
876875
newArguments ??= arguments.toList();
@@ -880,7 +879,7 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
880879
case ExtensionTypeDeclarationBuilder():
881880
for (int i = 0; i < arguments.length; ++i) {
882881
TypeBuilder? substitutedArgument = arguments[i].substituteRange(
883-
upperSubstitution, lowerSubstitution, unboundTypeParameters,
882+
upperSubstitution, lowerSubstitution, typeParameterFactory,
884883
variance: variance);
885884
if (substitutedArgument != null) {
886885
newArguments ??= arguments.toList();
@@ -891,7 +890,7 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
891890
for (int i = 0; i < arguments.length; ++i) {
892891
NominalParameterBuilder variable = declaration.typeParameters![i];
893892
TypeBuilder? substitutedArgument = arguments[i].substituteRange(
894-
upperSubstitution, lowerSubstitution, unboundTypeParameters,
893+
upperSubstitution, lowerSubstitution, typeParameterFactory,
895894
variance: variance.combine(variable.variance));
896895
if (substitutedArgument != null) {
897896
newArguments ??= arguments.toList();
@@ -926,15 +925,14 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder {
926925
TypeBuilder? unaliasAndErase() {
927926
TypeDeclarationBuilder declaration = this.declaration;
928927
if (declaration is TypeAliasBuilder) {
929-
// We pass empty lists as [unboundTypes] and [unboundTypeParameters]
928+
// We pass a fresh [TypeParameterFactory] to [TypeBuilder.unalias]
930929
// because new builders can be generated during unaliasing. We ignore
931-
// the returned builders, however, because they will not be used in the
932-
// output and are needed only for the checks.
930+
// the created parameter builders, however, because they will not be used
931+
// in the output and are needed only for the checks.
933932
//
934933
// We also don't instantiate-to-bound raw types because it won't affect
935934
// the dependency cycle analysis.
936-
return declaration
937-
.unalias(typeArguments, unboundTypeParameters: [])?.unaliasAndErase();
935+
return declaration.unalias(typeArguments)?.unaliasAndErase();
938936
} else if (declaration is ExtensionTypeDeclarationBuilder) {
939937
TypeBuilder? representationType =
940938
declaration.declaredRepresentationTypeBuilder;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import '../kernel/implicit_field_type.dart';
1111
import '../kernel/type_algorithms.dart';
1212
import '../source/source_library_builder.dart';
1313
import '../source/source_loader.dart';
14+
import '../source/type_parameter_factory.dart';
1415
import 'declaration_builders.dart';
1516
import 'inferable_type_builder.dart';
1617
import 'library_builder.dart';
@@ -84,7 +85,7 @@ abstract class OmittedTypeBuilderImpl extends OmittedTypeBuilder {
8485
TypeBuilder? substituteRange(
8586
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
8687
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
87-
List<StructuralParameterBuilder> unboundTypeParameters,
88+
TypeParameterFactory typeParameterFactory,
8889
{Variance variance = Variance.covariant}) {
8990
return null;
9091
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import '../kernel/implicit_field_type.dart';
2828
import '../kernel/type_algorithms.dart';
2929
import '../source/source_library_builder.dart';
3030
import '../source/source_loader.dart';
31+
import '../source/type_parameter_factory.dart';
3132
import '../util/helpers.dart';
3233
import 'declaration_builders.dart';
3334
import 'inferable_type_builder.dart';
@@ -360,7 +361,7 @@ abstract class RecordTypeBuilderImpl extends RecordTypeBuilder {
360361
TypeBuilder? substituteRange(
361362
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
362363
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
363-
List<StructuralParameterBuilder> unboundTypeParameters,
364+
TypeParameterFactory typeParameterFactory,
364365
{final Variance variance = Variance.covariant}) {
365366
List<RecordTypeFieldBuilder>? positionalFields = this.positionalFields;
366367
List<RecordTypeFieldBuilder>? namedFields = this.namedFields;
@@ -372,7 +373,7 @@ abstract class RecordTypeBuilderImpl extends RecordTypeBuilder {
372373
RecordTypeFieldBuilder positionalFieldBuilder = positionalFields[i];
373374
TypeBuilder? positionalFieldType = positionalFieldBuilder.type
374375
.substituteRange(
375-
upperSubstitution, lowerSubstitution, unboundTypeParameters,
376+
upperSubstitution, lowerSubstitution, typeParameterFactory,
376377
variance: variance);
377378
if (positionalFieldType != null) {
378379
newPositionalFields ??= positionalFields.toList();
@@ -388,7 +389,7 @@ abstract class RecordTypeBuilderImpl extends RecordTypeBuilder {
388389
for (int i = 0; i < namedFields.length; i++) {
389390
RecordTypeFieldBuilder namedFieldBuilder = namedFields[i];
390391
TypeBuilder? namedFieldType = namedFieldBuilder.type.substituteRange(
391-
upperSubstitution, lowerSubstitution, unboundTypeParameters,
392+
upperSubstitution, lowerSubstitution, typeParameterFactory,
392393
variance: variance);
393394
if (namedFieldType != null) {
394395
newNamedFields ??= namedFields.toList();

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:kernel/type_algebra.dart' show Substitution;
1212

1313
import '../kernel/type_algorithms.dart';
1414
import '../source/source_loader.dart';
15+
import '../source/type_parameter_factory.dart';
1516
import 'declaration_builders.dart';
1617
import 'library_builder.dart';
1718
import 'nullability_builder.dart';
@@ -196,7 +197,7 @@ class SynthesizedTypeBuilder extends FixedTypeBuilder {
196197
TypeBuilder? substituteRange(
197198
Map<TypeParameterBuilder, TypeBuilder> upperSubstitution,
198199
Map<TypeParameterBuilder, TypeBuilder> lowerSubstitution,
199-
List<StructuralParameterBuilder> unboundTypeParameters,
200+
TypeParameterFactory typeParameterFactory,
200201
{Variance variance = Variance.covariant}) {
201202
Map<TypeParameterBuilder, TypeBuilder> oldUpperSubstitution = {};
202203
for (MapEntry<TypeParameterBuilder, TypeBuilder> entry
@@ -216,7 +217,7 @@ class SynthesizedTypeBuilder extends FixedTypeBuilder {
216217
}
217218
}
218219
return _applySubstitution(_typeBuilder.substituteRange(
219-
oldUpperSubstitution, oldLowerSubstitution, unboundTypeParameters));
220+
oldUpperSubstitution, oldLowerSubstitution, typeParameterFactory));
220221
}
221222

222223
@override

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

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ abstract class TypeAliasBuilder implements TypeDeclarationBuilder {
5858
// TODO(johnniwinther): Used this instead of [unaliasDeclaration] and
5959
// [unaliasTypeArguments].
6060
TypeBuilder? unalias(List<TypeBuilder>? typeArguments,
61-
{Set<TypeAliasBuilder>? usedTypeAliasBuilders,
62-
List<StructuralParameterBuilder>? unboundTypeParameters});
61+
{Set<TypeAliasBuilder>? usedTypeAliasBuilders});
6362

6463
/// Returns the [TypeDeclarationBuilder] for the type aliased by `this`,
6564
/// based on the given [typeArguments]. It expands type aliases repeatedly
@@ -188,8 +187,7 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
188187
hasExplicitTypeArguments: hasExplicitTypeArguments);
189188
}
190189

191-
void _ensureUnaliasedType(
192-
{required List<StructuralParameterBuilder>? unboundTypeParameters}) {
190+
void _ensureUnaliasedType() {
193191
if (_unaliasedRhsType != null) {
194192
return;
195193
}
@@ -212,8 +210,7 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
212210
List<TypeBuilder>? typeArguments = type.typeArguments;
213211
TypeBuilder? unaliasedRhsType = rhsTypeDeclaration.unalias(
214212
typeArguments,
215-
usedTypeAliasBuilders: usedTypeAliasBuilders,
216-
unboundTypeParameters: unboundTypeParameters);
213+
usedTypeAliasBuilders: usedTypeAliasBuilders);
217214
_unaliasedRhsType = unaliasedRhsType;
218215
if (typeParameters != null) {
219216
if (typeArguments == null ||
@@ -229,9 +226,7 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
229226
?.subst(
230227
new Map<NominalParameterBuilder, TypeBuilder>.fromIterables(
231228
typeParameters, typeArguments))
232-
.unalias(
233-
usedTypeAliasBuilders: usedTypeAliasBuilders,
234-
unboundTypeParameters: unboundTypeParameters);
229+
.unalias(usedTypeAliasBuilders: usedTypeAliasBuilders);
235230
}
236231
_typeAliasesUsedInUnaliasing.addAll(usedTypeAliasBuilders);
237232
// Coverage-ignore(suite): Not run.
@@ -243,9 +238,8 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
243238

244239
@override
245240
TypeBuilder? unalias(List<TypeBuilder>? typeArguments,
246-
{Set<TypeAliasBuilder>? usedTypeAliasBuilders,
247-
List<StructuralParameterBuilder>? unboundTypeParameters}) {
248-
_ensureUnaliasedType(unboundTypeParameters: unboundTypeParameters);
241+
{Set<TypeAliasBuilder>? usedTypeAliasBuilders}) {
242+
_ensureUnaliasedType();
249243
if (usedTypeAliasBuilders != null) {
250244
usedTypeAliasBuilders.addAll(_typeAliasesUsedInUnaliasing);
251245
}
@@ -272,10 +266,12 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
272266
typeParameter.defaultType!
273267
];
274268
}
269+
// We allow creating new type parameters during unaliasing. The type
270+
// variables are short-lived and therefore don't need to be bound.
275271
return unaliasedRhsType!.subst(
276272
new Map<NominalParameterBuilder, TypeBuilder>.fromIterables(
277273
typeParameters, typeArguments),
278-
unboundTypeParameters: unboundTypeParameters);
274+
typeParameterFactory: new TypeParameterFactory());
279275
}
280276
case ExtensionBuilder():
281277
case BuiltinTypeDeclarationBuilder():
@@ -569,9 +565,8 @@ abstract class TypeAliasBuilderImpl extends TypeDeclarationBuilderImpl
569565
Nullability computeNullabilityWithArguments(List<TypeBuilder>? typeArguments,
570566
{required Map<TypeParameterBuilder, TraversalState>
571567
typeParametersTraversalState}) {
572-
return unalias(typeArguments, unboundTypeParameters: [])!
573-
.computeNullability(
574-
typeParametersTraversalState: typeParametersTraversalState);
568+
return unalias(typeArguments)!.computeNullability(
569+
typeParametersTraversalState: typeParametersTraversalState);
575570
}
576571
}
577572

0 commit comments

Comments
 (0)