Skip to content

Commit 622f407

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Handle all type parameters in TypeBuilderComputer
Closes #53427 Change-Id: Ie4bf17b54db82416d77e3bbc063d0e628a4d6c24 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/324500 Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 27d321e commit 622f407

21 files changed

+320
-64
lines changed

pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,13 @@ class TypeVariableBuilder extends TypeDeclarationBuilderImpl {
7777
..variance = variableVariance,
7878
super(metadata, 0, name, compilationUnit, charOffset);
7979

80-
TypeVariableBuilder.fromKernel(
81-
TypeParameter parameter, LibraryBuilder compilationUnit)
80+
TypeVariableBuilder.fromKernel(TypeParameter parameter)
8281
: actualParameter = parameter,
8382
// TODO(johnniwinther): Do we need to support synthesized type
8483
// parameters from kernel?
8584
kind = TypeVariableKind.fromKernel,
86-
fileUri = compilationUnit.fileUri,
87-
super(null, 0, parameter.name ?? '', compilationUnit,
88-
parameter.fileOffset);
85+
fileUri = null,
86+
super(null, 0, parameter.name ?? '', null, parameter.fileOffset);
8987

9088
@override
9189
bool get isTypeVariable => true;

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ class DillClassBuilder extends ClassBuilderImpl {
8484
List<TypeVariableBuilder>? get typeVariables {
8585
List<TypeVariableBuilder>? typeVariables = _typeVariables;
8686
if (typeVariables == null && cls.typeParameters.isNotEmpty) {
87-
typeVariables = _typeVariables =
88-
computeTypeVariableBuilders(libraryBuilder, cls.typeParameters);
87+
typeVariables =
88+
_typeVariables = computeTypeVariableBuilders(cls.typeParameters);
8989
}
9090
return typeVariables;
9191
}
@@ -253,9 +253,9 @@ TypeBuilder? computeTypeBuilder(
253253
}
254254

255255
List<TypeVariableBuilder>? computeTypeVariableBuilders(
256-
LibraryBuilder library, List<TypeParameter>? typeParameters) {
256+
List<TypeParameter>? typeParameters) {
257257
if (typeParameters == null || typeParameters.length == 0) return null;
258258
return new List.generate(typeParameters.length,
259-
(int i) => new TypeVariableBuilder.fromKernel(typeParameters[i], library),
259+
(int i) => new TypeVariableBuilder.fromKernel(typeParameters[i]),
260260
growable: false);
261261
}

pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,7 @@ class DillExtensionBuilder extends ExtensionBuilderImpl {
9494
@override
9595
List<TypeVariableBuilder>? get typeParameters {
9696
if (_typeParameters == null && extension.typeParameters.isNotEmpty) {
97-
_typeParameters =
98-
computeTypeVariableBuilders(libraryBuilder, extension.typeParameters);
97+
_typeParameters = computeTypeVariableBuilders(extension.typeParameters);
9998
}
10099
return _typeParameters;
101100
}

pkg/front_end/lib/src/fasta/dill/dill_extension_type_declaration_builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,8 @@ class DillExtensionTypeDeclarationBuilder
141141
List<TypeVariableBuilder>? typeVariables = _typeParameters;
142142
if (typeVariables == null &&
143143
_extensionTypeDeclaration.typeParameters.isNotEmpty) {
144-
typeVariables = _typeParameters = computeTypeVariableBuilders(
145-
libraryBuilder, _extensionTypeDeclaration.typeParameters);
144+
typeVariables = _typeParameters =
145+
computeTypeVariableBuilders(_extensionTypeDeclaration.typeParameters);
146146
}
147147
return typeVariables;
148148
}

pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ class DillTypeAliasBuilder extends TypeAliasBuilderImpl {
4040
@override
4141
List<TypeVariableBuilder>? get typeVariables {
4242
if (_typeVariables == null && typedef.typeParameters.isNotEmpty) {
43-
_typeVariables =
44-
computeTypeVariableBuilders(libraryBuilder, typedef.typeParameters);
43+
_typeVariables = computeTypeVariableBuilders(typedef.typeParameters);
4544
}
4645
return _typeVariables;
4746
}

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,8 +1737,8 @@ class BodyBuilder extends StackListenerImpl
17371737
List<TypeVariableBuilder>? typeParameterBuilders;
17381738
for (TypeParameter typeParameter in parameters.typeParameters) {
17391739
typeParameterBuilders ??= <TypeVariableBuilder>[];
1740-
typeParameterBuilders.add(
1741-
new TypeVariableBuilder.fromKernel(typeParameter, libraryBuilder));
1740+
typeParameterBuilders
1741+
.add(new TypeVariableBuilder.fromKernel(typeParameter));
17421742
}
17431743
enterFunctionTypeScope(typeParameterBuilders);
17441744

pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import '../builder/fixed_type_builder.dart';
1616
import '../builder/formal_parameter_builder.dart';
1717
import '../builder/function_type_builder.dart';
1818
import '../builder/future_or_type_declaration_builder.dart';
19-
import '../builder/library_builder.dart';
2019
import '../builder/named_type_builder.dart';
2120
import '../builder/never_type_declaration_builder.dart';
2221
import '../builder/null_type_declaration_builder.dart';
@@ -56,6 +55,8 @@ class TypeBuilderComputer implements DartTypeVisitor<TypeBuilder> {
5655

5756
TypeBuilderComputer(this.loader);
5857

58+
final Map<TypeParameter, TypeVariableBuilder> functionTypeParameters = {};
59+
5960
@override
6061
TypeBuilder defaultDartType(DartType node) {
6162
throw "Unsupported";
@@ -176,17 +177,8 @@ class TypeBuilderComputer implements DartTypeVisitor<TypeBuilder> {
176177
@override
177178
TypeBuilder visitTypeParameterType(TypeParameterType node) {
178179
TypeParameter parameter = node.parameter;
179-
TreeNode? kernelClassOrTypeDef = parameter.parent;
180-
Library? kernelLibrary;
181-
if (kernelClassOrTypeDef is Class) {
182-
kernelLibrary = kernelClassOrTypeDef.enclosingLibrary;
183-
} else if (kernelClassOrTypeDef is Typedef) {
184-
kernelLibrary = kernelClassOrTypeDef.enclosingLibrary;
185-
}
186-
LibraryBuilder library =
187-
loader.lookupLibraryBuilder(kernelLibrary!.importUri)!;
188180
return new NamedTypeBuilderImpl.fromTypeDeclarationBuilder(
189-
new TypeVariableBuilder.fromKernel(parameter, library),
181+
new TypeVariableBuilder.fromKernel(parameter),
190182
new NullabilityBuilder.fromNullability(node.nullability),
191183
instanceTypeVariableAccess: InstanceTypeVariableAccessState.Allowed,
192184
type: node);

pkg/front_end/test/fasta/generator_to_string_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ Future<void> main() async {
101101
PrefixBuilder prefixBuilder =
102102
new PrefixBuilder("myPrefix", false, libraryBuilder, null, -1, -1);
103103
String assignmentOperator = "+=";
104-
TypeDeclarationBuilder declaration = new TypeVariableBuilder.fromKernel(
105-
new TypeParameter("T"), libraryBuilder);
104+
TypeDeclarationBuilder declaration =
105+
new TypeVariableBuilder.fromKernel(new TypeParameter("T"));
106106
VariableDeclaration variable =
107107
new VariableDeclaration(null, isSynthesized: true);
108108

pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,31 @@ test(
2323
List<T4> t4b, // Error,
2424
void Function(T4) t4c, // Error
2525
void Function(List<T4>) t4d, // Error
26+
T5 t5a, // Error,
27+
List<T5> t5b, // Error,
28+
void Function(T5) t5c, // Error
29+
void Function(List<T5>) t5d, // Error
30+
T6 t6a, // Error,
31+
List<T6> t6b, // Error,
32+
void Function(T6) t6c, // Error
33+
void Function(List<T6>) t6d, // Error
34+
T7 t7a, // Error,
35+
List<T7> t7b, // Error,
36+
void Function(T7) t7c, // Error
37+
void Function(List<T7>) t7d, // Error
38+
T8 t8a, // Error,
39+
List<T8> t8b, // Error,
40+
void Function(T8) t8c, // Error
41+
void Function(List<T8>) t8d, // Error
2642
) {
2743
new T4(); // Error
2844
<T4>[]; // Error
2945
<void Function(T4)>[]; // Error
3046
<void Function(List<T4>)>[]; // Error
47+
new T7(0); // Error
48+
<T7>[]; // Error
49+
<void Function(T7)>[]; // Error
50+
<void Function(List<T7>)>[]; // Error
3151
}
3252

3353
main() {}

pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart.strong.expect

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ library;
3232
// void Function(List<T4>) t4d, // Error
3333
// ^
3434
//
35+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:39:3: Error: A generic function type can't be used as a type argument.
36+
// Try using a non-generic function type.
37+
// List<T8> t8b, // Error,
38+
// ^
39+
//
40+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:41:17: Error: A generic function type can't be used as a type argument.
41+
// Try using a non-generic function type.
42+
// void Function(List<T8>) t8d, // Error
43+
// ^
44+
//
3545
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:18:3: Error: Generic function type 'List<void Function<T>(T)>' used as a type argument through typedef 'T3'.
3646
// - 'List' is from 'dart:core'.
3747
// Try providing a non-generic function type explicitly.
@@ -56,22 +66,27 @@ library;
5666
// void Function(List<T3>) t3d, // Error
5767
// ^
5868
//
59-
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:27:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
69+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:47:10: Error: The argument type 'int' can't be assigned to the parameter type 'List<dynamic>'.
70+
// - 'List' is from 'dart:core'.
71+
// new T7(0); // Error
72+
// ^
73+
//
74+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:43:7: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
6075
// Try providing a non-generic function type explicitly.
6176
// new T4(); // Error
6277
// ^
6378
//
64-
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:28:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
79+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:44:4: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
6580
// Try providing a non-generic function type explicitly.
6681
// <T4>[]; // Error
6782
// ^
6883
//
69-
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:29:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
84+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:45:18: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
7085
// Try providing a non-generic function type explicitly.
7186
// <void Function(T4)>[]; // Error
7287
// ^
7388
//
74-
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:30:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
89+
// pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:46:23: Error: Generic function type 'void Function<T>(T)' inferred as a type argument.
7590
// Try providing a non-generic function type explicitly.
7691
// <void Function(List<T4>)>[]; // Error
7792
// ^
@@ -82,11 +97,18 @@ import "alias_from_opt_in_lib.dart" as ali;
8297

8398
import "org-dartlang-testcase:///alias_from_opt_in_lib.dart";
8499

85-
static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d) → dynamic {
100+
static method test(<T extends core::Object? = dynamic>(T%) → void t1a, core::List<<T extends core::Object? = dynamic>(T%) → void> t1b, (<T extends core::Object? = dynamic>(T%) → void) → void t1c, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t1d, (<T extends core::Object? = dynamic>(T%) → void) → void t2a, core::List<(<T extends core::Object? = dynamic>(T%) → void) → void> t2b, ((<T extends core::Object? = dynamic>(T%) → void) → void) → void t2c, (core::List<(<T extends core::Object? = dynamic>(T%) → void) → void>) → void t2d, core::List<<T extends core::Object? = dynamic>(T%) → void> t3a, core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>> t3b, (core::List<<T extends core::Object? = dynamic>(T%) → void>) → void t3c, (core::List<core::List<<T extends core::Object? = dynamic>(T%) → void>>) → void t3d, ali::Class<<T extends core::Object? = dynamic>(T%) → void> t4a, core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>> t4b, (ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void t4c, (core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void t4d, (<T extends core::Object? = dynamic>(T%) → void, core::int) t5a, core::List<(<T extends core::Object? = dynamic>(T%) → void, core::int)> t5b, ((<T extends core::Object? = dynamic>(T%) → void, core::int)) → void t5c, (core::List<(<T extends core::Object? = dynamic>(T%) → void, core::int)>) → void t5d, ({required a: <T extends core::Object? = dynamic>(T%) → void, required b: core::int}) t6a, core::List<({required a: <T extends core::Object? = dynamic>(T%) → void, required b: core::int})> t6b, (({required a: <T extends core::Object? = dynamic>(T%) → void, required b: core::int})) → void t6c, (core::List<({required a: <T extends core::Object? = dynamic>(T%) → void, required b: core::int})>) → void t6d, ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */ t7a, core::List<ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */> t7b, (ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */) → void t7c, (core::List<ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */>) → void t7d, <S extends <T extends core::Object? = dynamic>(T%) → void = dynamic>(S) → void t8a, core::List<<S extends <T extends core::Object? = dynamic>(T%) → void = dynamic>(S) → void> t8b, (<S extends <T extends core::Object? = dynamic>(T%) → void = dynamic>(S) → void) → void t8c, (core::List<<S extends <T extends core::Object? = dynamic>(T%) → void = dynamic>(S) → void>) → void t8d) → dynamic {
86101
new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
87102
<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>[];
88103
<(ali::Class<<T extends core::Object? = dynamic>(T%) → void>) → void>[];
89104
<(core::List<ali::Class<<T extends core::Object? = dynamic>(T%) → void>>) → void>[];
105+
ali::ExtensionType|<dynamic>(invalid-expression "pkg/front_end/testcases/generic_metadata/alias_from_opt_in.dart:47:10: Error: The argument type 'int' can't be assigned to the parameter type 'List<dynamic>'.
106+
- 'List' is from 'dart:core'.
107+
new T7(0); // Error
108+
^" in 0 as{TypeError} core::List<dynamic>);
109+
<ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */>[];
110+
<(ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */) → void>[];
111+
<(core::List<ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */>) → void>[];
90112
}
91113
static method main() → dynamic {}
92114

@@ -98,13 +120,28 @@ typedef T1 = <T extends core::Object? = dynamic>(T%) → void;
98120
typedef T2 = (<T extends core::Object? = dynamic>(T%) → void) → void;
99121
typedef T3 = core::List<<T extends core::Object? = dynamic>(T%) → void>;
100122
typedef T4<X extends <T extends core::Object? = dynamic>(T%) → void> = ali::Class<X>;
123+
typedef T5 = (<T extends core::Object? = dynamic>(T%) → void, core::int);
124+
typedef T6 = ({required a: <T extends core::Object? = dynamic>(T%) → void, required b: core::int});
125+
typedef T7 = ali::ExtensionType<<T extends core::Object? = dynamic>(T%) → void> /* = core::List<<T extends core::Object? = dynamic>(T%) → void> */;
126+
typedef T8 = <S extends <T extends core::Object? = dynamic>(T%) → void = dynamic>(S) → void;
101127
class Class<T extends core::Object? = dynamic> extends core::Object {
102128
synthetic constructor •() → ali::Class<ali::Class::T%>
103129
: super core::Object::•()
104130
;
105131
}
106-
static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3) → dynamic {
132+
extension type ExtensionType<T extends core::Object? = dynamic>(core::List<T%> it) {
133+
constructor • = ali::ExtensionType|;
134+
tearoff • = ali::ExtensionType|_#new#tearOff;
135+
}
136+
static inline-class-member method ExtensionType|<T extends core::Object? = dynamic>(core::List<ali::ExtensionType|::T%> it) → ali::ExtensionType<ali::ExtensionType|::T%> /* = core::List<ali::ExtensionType|::T%> */ {
137+
lowered final ali::ExtensionType<ali::ExtensionType|::T%> /* = core::List<ali::ExtensionType|::T%> */ #this = it;
138+
return #this;
139+
}
140+
static inline-class-member method ExtensionType|_#new#tearOff<T extends core::Object? = dynamic>(core::List<ali::ExtensionType|_#new#tearOff::T%> it) → ali::ExtensionType<ali::ExtensionType|_#new#tearOff::T%> /* = core::List<ali::ExtensionType|_#new#tearOff::T%> */
141+
return ali::ExtensionType|<ali::ExtensionType|_#new#tearOff::T%>(it);
142+
static method test(<T extends core::Object? = dynamic>(T%) → void t1, <T extends core::Object? = dynamic>(T%) → void t2, core::List<<T extends core::Object? = dynamic>(T%) → void> t3, (<T extends core::Object? = dynamic>(T%) → void, core::int) t5, ({required a: <T extends core::Object? = dynamic>(T%) → void, required b: core::int}) t6, <S extends <T extends core::Object? = dynamic>(T%) → void = dynamic>(S) → void t8) → dynamic {
107143
new ali::Class::•<<T extends core::Object? = dynamic>(T%) → void>();
144+
ali::ExtensionType|<dynamic>(<dynamic>[]);
108145
}
109146
static method _#T4#new#tearOff<X extends <T extends core::Object? = dynamic>(T%) → void>() → ali::Class<ali::_#T4#new#tearOff::X>
110147
return new ali::Class::•<ali::_#T4#new#tearOff::X>();

0 commit comments

Comments
 (0)