Skip to content

Commit 1b8e01f

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Decouple member type inference from concrete member builders
Change-Id: I90031f57d5b57cb5d93ed2b0a9fcbfa91f05171d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/398900 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent bce3dd4 commit 1b8e01f

File tree

8 files changed

+288
-196
lines changed

8 files changed

+288
-196
lines changed

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,22 @@ abstract class MemberBuilder implements Builder {
1717

1818
LibraryBuilder get libraryBuilder;
1919

20-
/// The declared name of this member;
20+
/// The declared name of this member.
21+
///
22+
/// For extension and extension type members this is different from the
23+
/// name of the generated members.
24+
///
25+
/// For instance for
26+
///
27+
/// extension E {
28+
/// get foo => null;
29+
/// }
30+
/// extension type E(int id) {
31+
/// get foo => null;
32+
/// }
33+
///
34+
/// the [memberName] is `foo` for bother getters, but the name of the
35+
/// generated members is `E|foo` and `ET|foo`, respectively.
2136
Name get memberName;
2237

2338
/// The [Member] to use when reading from this member builder.

pkg/front_end/lib/src/kernel/hierarchy/class_member.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,10 @@ abstract class ClassMember {
326326
ClassMember get interfaceMember;
327327

328328
void inferType(ClassMembersBuilder membersBuilder);
329+
330+
/// Registers that this class member overrides [overriddenMembers].
331+
///
332+
/// This is used to infer types from the [overriddenMembers].
329333
void registerOverrideDependency(Set<ClassMember> overriddenMembers);
330334

331335
/// Returns `true` if this has the same underlying declaration as [other].

pkg/front_end/lib/src/kernel/hierarchy/members_builder.dart

Lines changed: 67 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import 'package:kernel/ast.dart';
66
import 'package:kernel/class_hierarchy.dart' show ClassHierarchyMembers;
77

88
import '../../builder/declaration_builders.dart';
9+
import '../../builder/formal_parameter_builder.dart';
10+
import '../../builder/type_builder.dart';
911
import '../../source/source_class_builder.dart';
10-
import '../../source/source_field_builder.dart';
11-
import '../../source/source_procedure_builder.dart';
1212
import 'class_member.dart';
1313
import 'delayed.dart';
1414
import 'extension_type_members.dart';
@@ -76,44 +76,74 @@ class ClassMembersBuilder implements ClassHierarchyMembers {
7676
return list;
7777
}
7878

79-
void inferFieldType(SourceFieldBuilder declaredMember,
80-
Iterable<ClassMember> overriddenMembers) {
81-
ClassMembersNodeBuilder.inferFieldType(
82-
hierarchyBuilder,
83-
this,
84-
declaredMember.classBuilder as SourceClassBuilder,
85-
declaredMember,
86-
overriddenMembers);
87-
}
88-
89-
void inferGetterType(SourceProcedureBuilder declaredMember,
90-
Iterable<ClassMember> overriddenMembers) {
91-
ClassMembersNodeBuilder.inferGetterType(
92-
hierarchyBuilder,
93-
this,
94-
declaredMember.classBuilder as SourceClassBuilder,
95-
declaredMember,
96-
overriddenMembers);
97-
}
98-
99-
void inferSetterType(SourceProcedureBuilder declaredMember,
100-
Iterable<ClassMember> overriddenMembers) {
101-
ClassMembersNodeBuilder.inferSetterType(
102-
hierarchyBuilder,
103-
this,
104-
declaredMember.classBuilder as SourceClassBuilder,
105-
declaredMember,
106-
overriddenMembers);
107-
}
108-
109-
void inferMethodType(SourceProcedureBuilder declaredMember,
110-
Iterable<ClassMember> overriddenMembers) {
79+
void inferFieldType(SourceClassBuilder enclosingClassBuilder,
80+
TypeBuilder declaredFieldType, Iterable<ClassMember> overriddenMembers,
81+
{required String name,
82+
required Uri fileUri,
83+
required int fileOffset,
84+
required int nameLength,
85+
required bool isAssignable}) {
86+
ClassMembersNodeBuilder.inferFieldType(hierarchyBuilder, this,
87+
enclosingClassBuilder, declaredFieldType, overriddenMembers,
88+
name: name,
89+
fileUri: fileUri,
90+
fileOffset: fileOffset,
91+
nameLength: nameLength,
92+
isAssignable: isAssignable);
93+
}
94+
95+
void inferGetterType(SourceClassBuilder enclosingClassBuilder,
96+
TypeBuilder declaredTypeBuilder, Iterable<ClassMember> overriddenMembers,
97+
{required String name,
98+
required Uri fileUri,
99+
required int fileOffset,
100+
required int nameLength}) {
101+
ClassMembersNodeBuilder.inferGetterType(hierarchyBuilder, this,
102+
enclosingClassBuilder, declaredTypeBuilder, overriddenMembers,
103+
name: name,
104+
fileUri: fileUri,
105+
fileOffset: fileOffset,
106+
nameLength: nameLength);
107+
}
108+
109+
void inferSetterType(
110+
SourceClassBuilder enclosingClassBuilder,
111+
List<FormalParameterBuilder>? formals,
112+
Iterable<ClassMember> overriddenMembers,
113+
{required String name,
114+
required Uri fileUri,
115+
required int fileOffset,
116+
required int nameLength}) {
117+
ClassMembersNodeBuilder.inferSetterType(hierarchyBuilder, this,
118+
enclosingClassBuilder, formals, overriddenMembers,
119+
name: name,
120+
fileUri: fileUri,
121+
fileOffset: fileOffset,
122+
nameLength: nameLength);
123+
}
124+
125+
void inferMethodType(
126+
SourceClassBuilder enclosingClassBuilder,
127+
FunctionNode declaredFunction,
128+
TypeBuilder declaredReturnType,
129+
List<FormalParameterBuilder>? formals,
130+
Iterable<ClassMember> overriddenMembers,
131+
{required String name,
132+
required Uri fileUri,
133+
required int fileOffset,
134+
required int nameLength}) {
111135
ClassMembersNodeBuilder.inferMethodType(
112136
hierarchyBuilder,
113137
this,
114-
declaredMember.classBuilder as SourceClassBuilder,
115-
declaredMember,
116-
overriddenMembers);
138+
enclosingClassBuilder,
139+
declaredFunction,
140+
declaredReturnType,
141+
formals,
142+
overriddenMembers,
143+
name: name,
144+
fileUri: fileUri,
145+
fileOffset: fileOffset,
146+
nameLength: nameLength);
117147
}
118148

119149
ClassMembersNode getNodeFromClassBuilder(ClassBuilder classBuilder) {

0 commit comments

Comments
 (0)