Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 38f740a

Browse files
author
Dart CI
committed
Version 2.18.0-168.0.dev
Merge commit '7a8f742425174182568488bc29792af099101813' into 'dev'
2 parents 5d44fae + 7a8f742 commit 38f740a

15 files changed

+160
-77
lines changed

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:kernel/ast.dart';
6+
import 'package:kernel/type_environment.dart';
67

78
import '../source/source_library_builder.dart';
89
import 'library_builder.dart';
910
import 'named_type_builder.dart';
1011
import 'nullability_builder.dart';
1112
import 'type_builder.dart';
1213

13-
class OmittedTypeBuilder extends TypeBuilder {
14+
abstract class OmittedTypeBuilder extends TypeBuilder {
15+
const OmittedTypeBuilder();
16+
1417
@override
1518
DartType build(LibraryBuilder library, TypeUse typeUse) {
1619
throw new UnsupportedError('$runtimeType.build');
@@ -66,10 +69,28 @@ class OmittedTypeBuilder extends TypeBuilder {
6669
return this;
6770
}
6871

72+
bool get hasType;
73+
74+
DartType get type;
75+
}
76+
77+
class ImplicitTypeBuilder extends OmittedTypeBuilder {
78+
const ImplicitTypeBuilder();
79+
80+
@override
81+
bool get hasType => true;
82+
83+
@override
84+
DartType get type => const DynamicType();
85+
}
86+
87+
class InferableTypeBuilder extends OmittedTypeBuilder {
88+
@override
6989
bool get hasType => _type != null;
7090

7191
DartType? _type;
7292

93+
@override
7394
DartType get type => _type!;
7495

7596
List<InferredTypeListener>? _listeners;
@@ -102,9 +123,46 @@ class OmittedTypeBuilder extends TypeBuilder {
102123
void registerInferredType(DartType type) {
103124
_registerType(type);
104125
}
126+
127+
Inferable? _inferable;
128+
129+
Inferable? get inferable => _inferable;
130+
131+
@override
132+
void registerInferable(Inferable inferable) {
133+
assert(
134+
_inferable == null,
135+
"Inferable $_inferable has already been register, "
136+
"trying to register $inferable.");
137+
_inferable = inferable;
138+
}
139+
140+
/// Triggers inference of this type.
141+
///
142+
/// If an [Inferable] has been register, this is called to infer the type of
143+
/// this builder. Otherwise the type is inferred to be `dynamic`.
144+
void inferType(TypeEnvironment typeEnvironment) {
145+
if (!hasType) {
146+
Inferable? inferable = _inferable;
147+
if (inferable != null) {
148+
inferable.inferTypes(typeEnvironment);
149+
} else {
150+
registerInferredType(const DynamicType());
151+
}
152+
assert(hasType);
153+
}
154+
}
105155
}
106156

107157
/// Listener for the late computation of an inferred type.
108158
abstract class InferredTypeListener {
159+
/// Called when the type of an [InferableTypeBuilder] has been computed.
109160
void onInferredType(DartType type);
110161
}
162+
163+
/// Interface for builders that can infer the type of an [InferableTypeBuilder].
164+
abstract class Inferable {
165+
/// Triggers the inference of the types of one or more
166+
/// [InferableTypeBuilder]s.
167+
void inferTypes(TypeEnvironment typeEnvironment);
168+
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,21 @@ abstract class TypeBuilder {
327327

328328
bool get isVoidType;
329329

330+
/// Register [type] as the inferred type of this type builder.
331+
///
332+
/// If this is not an [InferableTypeBuilder] this method will throw.
330333
void registerInferredType(DartType type) {
331334
throw new UnsupportedError("${runtimeType}.registerInferredType");
332335
}
333336

337+
/// Registers a [listener] that is called when this type has been inferred.
338+
// TODO(johnniwinther): Should we handle this for all types or just those
339+
// that are inferred or aliases of inferred types?
334340
void registerInferredTypeListener(InferredTypeListener listener) {}
341+
342+
/// Registers the [Inferable] object to be called when this type needs to be
343+
/// inferred.
344+
///
345+
/// If this type is not an [InferableTypeBuilder], this call is a no-op.
346+
void registerInferable(Inferable inferable) {}
335347
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,7 +1754,7 @@ class BodyBuilder extends StackListenerImpl
17541754
/* metadata = */ null,
17551755
FormalParameterKind.requiredPositional,
17561756
/* modifiers = */ 0,
1757-
libraryBuilder.addInferableType(),
1757+
const ImplicitTypeBuilder(),
17581758
formal.name!,
17591759
libraryBuilder,
17601760
formal.fileOffset,
@@ -4279,7 +4279,7 @@ class BodyBuilder extends StackListenerImpl
42794279
}
42804280
}
42814281
TypeBuilder type = formals.toFunctionType(
4282-
returnType ?? libraryBuilder.addInferableType(),
4282+
returnType ?? const ImplicitTypeBuilder(),
42834283
libraryBuilder.nullableBuilderIfTrue(questionMark != null),
42844284
typeVariables);
42854285
exitLocalScope();
@@ -4486,7 +4486,7 @@ class BodyBuilder extends StackListenerImpl
44864486
null,
44874487
kind,
44884488
modifiers,
4489-
type ?? libraryBuilder.addInferableType(),
4489+
type ?? const ImplicitTypeBuilder(),
44904490
name?.name ?? '',
44914491
libraryBuilder,
44924492
offsetForToken(nameToken),
@@ -4563,7 +4563,7 @@ class BodyBuilder extends StackListenerImpl
45634563
reportErrorIfNullableType(question);
45644564
}
45654565
TypeBuilder type = formals.toFunctionType(
4566-
returnType ?? libraryBuilder.addInferableType(),
4566+
returnType ?? const ImplicitTypeBuilder(),
45674567
libraryBuilder.nullableBuilderIfTrue(question != null),
45684568
typeVariables);
45694569
exitLocalScope();

pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,10 @@ class ClassMembersNodeBuilder {
9191
Iterable<ClassMember> overriddenMembers) {
9292
assert(!declaredMember.isGetter && !declaredMember.isSetter);
9393
if (declaredMember.classBuilder == classBuilder &&
94-
(declaredMember.returnType is OmittedTypeBuilder ||
94+
(declaredMember.returnType is InferableTypeBuilder ||
9595
declaredMember.formals != null &&
9696
declaredMember.formals!.any(
97-
(parameter) => parameter.type is OmittedTypeBuilder))) {
97+
(parameter) => parameter.type is InferableTypeBuilder))) {
9898
Procedure declaredProcedure = declaredMember.member as Procedure;
9999
FunctionNode declaredFunction = declaredProcedure.function;
100100
List<TypeParameter> declaredTypeParameters =
@@ -121,7 +121,7 @@ class ClassMembersNodeBuilder {
121121
bool cantInferReturnType = false;
122122
List<FormalParameterBuilder>? cantInferParameterTypes;
123123

124-
if (declaredMember.returnType is OmittedTypeBuilder) {
124+
if (declaredMember.returnType is InferableTypeBuilder) {
125125
if (combinedMemberSignatureType == null) {
126126
inferredReturnType = const InvalidType();
127127
cantInferReturnType = true;
@@ -132,7 +132,7 @@ class ClassMembersNodeBuilder {
132132
if (declaredMember.formals != null) {
133133
for (int i = 0; i < declaredPositional.length; i++) {
134134
FormalParameterBuilder declaredParameter = declaredMember.formals![i];
135-
if (declaredParameter.type is! OmittedTypeBuilder) {
135+
if (declaredParameter.type is! InferableTypeBuilder) {
136136
continue;
137137
}
138138

@@ -154,7 +154,7 @@ class ClassMembersNodeBuilder {
154154
i < declaredMember.formals!.length;
155155
i++) {
156156
FormalParameterBuilder declaredParameter = declaredMember.formals![i];
157-
if (declaredParameter.type is! OmittedTypeBuilder) {
157+
if (declaredParameter.type is! InferableTypeBuilder) {
158158
continue;
159159
}
160160

@@ -189,14 +189,14 @@ class ClassMembersNodeBuilder {
189189
classBuilder, cantInferParameterTypes.single, overriddenMembers);
190190
}
191191

192-
if (declaredMember.returnType is OmittedTypeBuilder) {
192+
if (declaredMember.returnType is InferableTypeBuilder) {
193193
inferredReturnType ??= const DynamicType();
194194
declaredMember.returnType.registerInferredType(inferredReturnType);
195195
}
196196
if (declaredMember.formals != null) {
197197
for (FormalParameterBuilder declaredParameter
198198
in declaredMember.formals!) {
199-
if (declaredParameter.type is OmittedTypeBuilder) {
199+
if (declaredParameter.type is InferableTypeBuilder) {
200200
DartType inferredParameterType =
201201
inferredParameterTypes[declaredParameter] ??
202202
const DynamicType();
@@ -249,7 +249,7 @@ class ClassMembersNodeBuilder {
249249
Iterable<ClassMember> overriddenMembers) {
250250
assert(declaredMember.isGetter);
251251
if (declaredMember.classBuilder == classBuilder &&
252-
declaredMember.returnType is OmittedTypeBuilder) {
252+
declaredMember.returnType is InferableTypeBuilder) {
253253
DartType? inferredType;
254254
overriddenMembers = toSet(classBuilder, overriddenMembers);
255255

@@ -313,7 +313,7 @@ class ClassMembersNodeBuilder {
313313
assert(declaredMember.isSetter);
314314
FormalParameterBuilder parameter = declaredMember.formals!.first;
315315
if (declaredMember.classBuilder == classBuilder &&
316-
parameter.type is OmittedTypeBuilder) {
316+
parameter.type is InferableTypeBuilder) {
317317
DartType? inferredType;
318318

319319
overriddenMembers = toSet(classBuilder, overriddenMembers);
@@ -414,7 +414,7 @@ class ClassMembersNodeBuilder {
414414
SourceFieldBuilder fieldBuilder,
415415
Iterable<ClassMember> overriddenMembers) {
416416
if (fieldBuilder.classBuilder == classBuilder &&
417-
fieldBuilder.type is OmittedTypeBuilder) {
417+
fieldBuilder.type is InferableTypeBuilder) {
418418
DartType? inferredType;
419419

420420
overriddenMembers = toSet(classBuilder, overriddenMembers);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ abstract class ImplicitFieldType extends DartType {
3434
"declaredNullability", fieldBuilder.charOffset, fieldBuilder.fileUri);
3535

3636
@override
37-
Nullability get nullability =>
38-
unsupported("nullability", fieldBuilder.charOffset, fieldBuilder.fileUri);
37+
Nullability get nullability {
38+
unsupported("nullability", fieldBuilder.charOffset, fieldBuilder.fileUri);
39+
}
3940

4041
@override
4142
R accept<R>(DartTypeVisitor<R> v) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ final TypeBuilder dummyTypeBuilder =
234234
new FixedTypeBuilder(dummyDartType, dummyUri, -1);
235235
final FormalParameterBuilder dummyFormalParameterBuilder =
236236
new FormalParameterBuilder(null, FormalParameterKind.requiredPositional, 0,
237-
new OmittedTypeBuilder(), '', null, -1,
237+
const ImplicitTypeBuilder(), '', null, -1,
238238
fileUri: dummyUri);
239239
final TypeVariableBuilder dummyTypeVariableBuilder = new TypeVariableBuilder(
240240
TypeVariableBuilder.noNameSentinel, null, -1, null,

pkg/front_end/lib/src/fasta/source/outline_builder.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import '../builder/metadata_builder.dart';
3232
import '../builder/mixin_application_builder.dart';
3333
import '../builder/named_type_builder.dart';
3434
import '../builder/nullability_builder.dart';
35+
import '../builder/omitted_type_builder.dart';
3536
import '../builder/type_builder.dart';
3637
import '../builder/type_variable_builder.dart';
3738
import '../combinator.dart' show CombinatorBuilder;
@@ -2259,6 +2260,9 @@ class OutlineBuilder extends StackListenerImpl {
22592260
metadata,
22602261
kind,
22612262
modifiers,
2263+
// TODO(johnniwinther): Avoid creating inferable types for omitted
2264+
// types in uninferable context, like omitted parameter types of
2265+
// function types.
22622266
type ?? libraryBuilder.addInferableType(),
22632267
name == null ? FormalParameterBuilder.noNameSentinel : name as String,
22642268
thisKeyword != null,
@@ -2582,7 +2586,7 @@ class OutlineBuilder extends StackListenerImpl {
25822586
List<TypeVariableBuilder>? typeVariables =
25832587
pop() as List<TypeVariableBuilder>?;
25842588
push(libraryBuilder.addFunctionType(
2585-
returnType ?? libraryBuilder.addInferableType(),
2589+
returnType ?? const ImplicitTypeBuilder(),
25862590
typeVariables,
25872591
formals,
25882592
libraryBuilder.nullableBuilderIfTrue(questionMark != null),
@@ -2603,7 +2607,7 @@ class OutlineBuilder extends StackListenerImpl {
26032607
reportErrorIfNullableType(question);
26042608
}
26052609
push(libraryBuilder.addFunctionType(
2606-
returnType ?? libraryBuilder.addInferableType(),
2610+
returnType ?? const ImplicitTypeBuilder(),
26072611
typeVariables,
26082612
formals,
26092613
libraryBuilder.nullableBuilderIfTrue(question != null),
@@ -2642,7 +2646,7 @@ class OutlineBuilder extends StackListenerImpl {
26422646
hasMembers: false);
26432647
// TODO(cstefantsova): Make sure that RHS of typedefs can't have '?'.
26442648
aliasedType = libraryBuilder.addFunctionType(
2645-
returnType ?? libraryBuilder.addInferableType(),
2649+
returnType ?? const ImplicitTypeBuilder(),
26462650
null,
26472651
formals,
26482652
const NullabilityBuilder.omitted(),

pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ abstract class SourceConstructorBuilder
6666
}
6767

6868
class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
69-
implements SourceConstructorBuilder {
69+
implements SourceConstructorBuilder, Inferable {
7070
@override
7171
final OmittedTypeBuilder returnType;
7272

@@ -141,7 +141,15 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
141141
_hasSuperInitializingFormals =
142142
formals?.any((formal) => formal.isSuperInitializingFormal) ?? false,
143143
super(metadata, modifiers, name, typeVariables, formals,
144-
compilationUnit, charOffset, nativeMethodName);
144+
compilationUnit, charOffset, nativeMethodName) {
145+
if (formals != null) {
146+
for (FormalParameterBuilder formal in formals!) {
147+
if (formal.isInitializingFormal || formal.isSuperInitializingFormal) {
148+
formal.type.registerInferable(this);
149+
}
150+
}
151+
}
152+
}
145153

146154
@override
147155
SourceClassBuilder get classBuilder =>
@@ -223,7 +231,7 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
223231
if (formals != null) {
224232
bool needsInference = false;
225233
for (FormalParameterBuilder formal in formals!) {
226-
if (formal.type is OmittedTypeBuilder &&
234+
if (formal.type is InferableTypeBuilder &&
227235
(formal.isInitializingFormal || formal.isSuperInitializingFormal)) {
228236
formal.variable!.type = const UnknownType();
229237
needsInference = true;
@@ -240,12 +248,17 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
240248
return _constructor;
241249
}
242250

251+
@override
252+
void inferTypes(TypeEnvironment typeEnvironment) {
253+
inferFormalTypes(typeEnvironment);
254+
}
255+
243256
@override
244257
void inferFormalTypes(TypeEnvironment typeEnvironment) {
245258
if (_hasFormalsInferred) return;
246259
if (formals != null) {
247260
for (FormalParameterBuilder formal in formals!) {
248-
if (formal.type is OmittedTypeBuilder) {
261+
if (formal.type is InferableTypeBuilder) {
249262
if (formal.isInitializingFormal) {
250263
formal.finalizeInitializingFormal(classBuilder);
251264
}
@@ -425,7 +438,7 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
425438
}
426439
}
427440

428-
if (formal.type is OmittedTypeBuilder) {
441+
if (formal.type is InferableTypeBuilder) {
429442
DartType? type = correspondingSuperFormalType;
430443
if (substitution.isNotEmpty && type != null) {
431444
type = substitute(type, substitution);

0 commit comments

Comments
 (0)