Skip to content

Commit 075bbe9

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Create SourceClassBuilder throught ClassDeclaration+Fragment
Change-Id: I9e5c1f6b15ce7d1f0814682904a2281589c3931e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/408020 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent c833c12 commit 075bbe9

13 files changed

+388
-386
lines changed

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

+1-4
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
9898
/// The type in the `implements` clause of a class or mixin declaration.
9999
List<TypeBuilder>? get interfaceBuilders;
100100

101-
/// The types in the `on` clause of an extension or mixin declaration.
102-
List<TypeBuilder>? get onTypes;
103-
104101
@override
105102
Uri get fileUri;
106103

@@ -124,7 +121,7 @@ abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
124121

125122
bool get isAnonymousMixinApplication;
126123

127-
abstract TypeBuilder? mixedInTypeBuilder;
124+
TypeBuilder? get mixedInTypeBuilder;
128125

129126
bool get isFutureOr;
130127

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

-11
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:kernel/class_hierarchy.dart';
77

88
import '../base/loader.dart';
99
import '../base/name_space.dart';
10-
import '../base/problems.dart' show unimplemented;
1110
import '../base/scope.dart';
1211
import '../builder/builder.dart';
1312
import '../builder/declaration_builders.dart';
@@ -148,10 +147,6 @@ class DillClassBuilder extends ClassBuilderImpl
148147
return supertype;
149148
}
150149

151-
@override
152-
// Coverage-ignore(suite): Not run.
153-
List<TypeBuilder>? get onTypes => null;
154-
155150
void addField(Field field) {
156151
DillFieldBuilder builder =
157152
new DillFieldBuilder(field, libraryBuilder, this);
@@ -239,12 +234,6 @@ class DillClassBuilder extends ClassBuilderImpl
239234
return computeTypeBuilder(libraryBuilder, cls.mixedInType);
240235
}
241236

242-
@override
243-
// Coverage-ignore(suite): Not run.
244-
void set mixedInTypeBuilder(TypeBuilder? mixin) {
245-
unimplemented("mixedInType=", -1, null);
246-
}
247-
248237
@override
249238
List<TypeBuilder>? get interfaceBuilders {
250239
if (cls.implementedTypes.isEmpty) return null;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
part of '../fragment.dart';
6+
7+
abstract class ClassDeclaration {
8+
String get name;
9+
List<MetadataBuilder>? get metadata;
10+
LookupScope get compilationUnitScope;
11+
Uri get fileUri;
12+
int get nameOffset;
13+
int get startOffset;
14+
int get endOffset;
15+
List<NominalParameterBuilder>? get typeParameters;
16+
bool get isMixinDeclaration;
17+
18+
TypeBuilder? get supertype;
19+
List<TypeBuilder>? get mixedInTypes;
20+
List<TypeBuilder>? get interfaces;
21+
}
22+
23+
class RegularClassDeclaration implements ClassDeclaration {
24+
final ClassFragment _fragment;
25+
26+
RegularClassDeclaration(this._fragment);
27+
28+
@override
29+
List<MetadataBuilder>? get metadata => _fragment.metadata;
30+
31+
@override
32+
LookupScope get compilationUnitScope => _fragment.compilationUnitScope;
33+
34+
@override
35+
Uri get fileUri => _fragment.fileUri;
36+
37+
@override
38+
int get endOffset => _fragment.endOffset;
39+
40+
@override
41+
String get name => _fragment.name;
42+
43+
@override
44+
int get nameOffset => _fragment.nameOffset;
45+
46+
@override
47+
int get startOffset => _fragment.startOffset;
48+
49+
@override
50+
List<NominalParameterBuilder>? get typeParameters => _fragment.typeParameters;
51+
52+
@override
53+
bool get isMixinDeclaration => false;
54+
55+
@override
56+
TypeBuilder? get supertype => _fragment.supertype;
57+
58+
@override
59+
List<TypeBuilder>? get mixedInTypes => _fragment.mixins;
60+
61+
@override
62+
List<TypeBuilder>? get interfaces => _fragment.interfaces;
63+
}
64+
65+
class EnumDeclaration implements ClassDeclaration {
66+
final EnumFragment _fragment;
67+
68+
@override
69+
final TypeBuilder supertype;
70+
71+
EnumDeclaration(this._fragment, this.supertype);
72+
73+
@override
74+
List<MetadataBuilder>? get metadata => _fragment.metadata;
75+
76+
@override
77+
LookupScope get compilationUnitScope => _fragment.compilationUnitScope;
78+
79+
@override
80+
Uri get fileUri => _fragment.fileUri;
81+
82+
@override
83+
int get endOffset => _fragment.endOffset;
84+
85+
@override
86+
String get name => _fragment.name;
87+
88+
@override
89+
int get nameOffset => _fragment.nameOffset;
90+
91+
@override
92+
int get startOffset => _fragment.startOffset;
93+
94+
@override
95+
List<NominalParameterBuilder>? get typeParameters => _fragment.typeParameters;
96+
97+
@override
98+
bool get isMixinDeclaration => false;
99+
100+
@override
101+
List<TypeBuilder>? get mixedInTypes => _fragment.mixins;
102+
103+
@override
104+
List<TypeBuilder>? get interfaces => _fragment.interfaces;
105+
}
106+
107+
class NamedMixinApplication implements ClassDeclaration {
108+
final NamedMixinApplicationFragment _fragment;
109+
110+
@override
111+
final List<TypeBuilder> mixedInTypes;
112+
113+
NamedMixinApplication(this._fragment, this.mixedInTypes);
114+
115+
@override
116+
List<MetadataBuilder>? get metadata => _fragment.metadata;
117+
118+
@override
119+
LookupScope get compilationUnitScope => _fragment.compilationUnitScope;
120+
121+
@override
122+
Uri get fileUri => _fragment.fileUri;
123+
124+
@override
125+
int get endOffset => _fragment.endOffset;
126+
127+
@override
128+
String get name => _fragment.name;
129+
130+
@override
131+
int get nameOffset => _fragment.nameOffset;
132+
133+
@override
134+
int get startOffset => _fragment.startOffset;
135+
136+
@override
137+
List<NominalParameterBuilder>? get typeParameters => _fragment.typeParameters;
138+
139+
@override
140+
bool get isMixinDeclaration => false;
141+
142+
@override
143+
TypeBuilder? get supertype => _fragment.supertype;
144+
145+
@override
146+
List<TypeBuilder>? get interfaces => _fragment.interfaces;
147+
}
148+
149+
class AnonymousMixinApplication implements ClassDeclaration {
150+
@override
151+
final String name;
152+
153+
@override
154+
final LookupScope compilationUnitScope;
155+
156+
@override
157+
final int nameOffset;
158+
159+
@override
160+
final int startOffset;
161+
162+
@override
163+
final int endOffset;
164+
165+
@override
166+
final Uri fileUri;
167+
168+
@override
169+
final List<NominalParameterBuilder>? typeParameters;
170+
171+
@override
172+
final TypeBuilder? supertype;
173+
174+
@override
175+
bool get isMixinDeclaration => false;
176+
177+
@override
178+
List<TypeBuilder>? get mixedInTypes => null;
179+
180+
@override
181+
final List<TypeBuilder>? interfaces;
182+
183+
AnonymousMixinApplication(
184+
{required this.name,
185+
required this.compilationUnitScope,
186+
required this.fileUri,
187+
required this.nameOffset,
188+
required this.startOffset,
189+
required this.endOffset,
190+
required this.typeParameters,
191+
required this.supertype,
192+
required this.interfaces});
193+
194+
@override
195+
List<MetadataBuilder>? get metadata => null;
196+
}
197+
198+
class MixinDeclaration implements ClassDeclaration {
199+
final MixinFragment _fragment;
200+
201+
MixinDeclaration(this._fragment);
202+
203+
@override
204+
List<MetadataBuilder>? get metadata => _fragment.metadata;
205+
206+
@override
207+
LookupScope get compilationUnitScope => _fragment.compilationUnitScope;
208+
209+
@override
210+
Uri get fileUri => _fragment.fileUri;
211+
212+
@override
213+
int get endOffset => _fragment.endOffset;
214+
215+
@override
216+
String get name => _fragment.name;
217+
218+
@override
219+
int get nameOffset => _fragment.nameOffset;
220+
221+
@override
222+
int get startOffset => _fragment.startOffset;
223+
224+
@override
225+
List<NominalParameterBuilder>? get typeParameters => _fragment.typeParameters;
226+
227+
@override
228+
bool get isMixinDeclaration => true;
229+
230+
@override
231+
TypeBuilder? get supertype => _fragment.supertype;
232+
233+
@override
234+
List<TypeBuilder>? get mixedInTypes => _fragment.mixins;
235+
236+
@override
237+
List<TypeBuilder>? get interfaces => _fragment.interfaces;
238+
}

pkg/front_end/lib/src/fragment/fragment.dart

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ import '../type_inference/type_inferrer.dart';
6262
import '../type_inference/type_schema.dart';
6363

6464
part 'class.dart';
65+
part 'class/declaration.dart';
6566
part 'constructor.dart';
6667
part 'enum.dart';
6768
part 'enum_element.dart';

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

+10-21
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ import 'package:kernel/type_algebra.dart';
1010
import '../../builder/builder.dart';
1111
import '../../builder/declaration_builders.dart';
1212
import '../../builder/library_builder.dart';
13-
import '../../builder/named_type_builder.dart';
14-
import '../../builder/nullability_builder.dart';
1513
import '../../builder/type_builder.dart';
1614
import '../../codes/cfe_codes.dart';
15+
import '../../source/source_class_builder.dart';
1716
import '../../source/source_library_builder.dart';
1817
import '../../testing/id_testing_utils.dart' show typeToText;
1918
import '../../type_inference/type_schema.dart' show UnknownType;
@@ -264,25 +263,15 @@ class ClassHierarchyNodeBuilder extends HierarchyNodeBuilder {
264263
if (typeArguments.isEmpty || typeArguments.first is! UnknownType) {
265264
return mixinNode;
266265
}
267-
new BuilderMixinInferrer(_classBuilder, _hierarchy,
268-
mixedInSupertype.classNode.typeParameters)
269-
.infer(cls);
270-
InterfaceType mixedInType = cls.mixedInType!.asInterfaceType;
271-
TypeBuilder mixedInTypeBuilder = _classBuilder.mixedInTypeBuilder!;
272-
_classBuilder.mixedInTypeBuilder = new NamedTypeBuilderImpl.forDartType(
273-
mixedInType,
274-
mixedInTypeBuilder.declaration!,
275-
new NullabilityBuilder.fromNullability(Nullability.nonNullable),
276-
arguments: new List<TypeBuilder>.generate(typeArguments.length,
277-
(int i) => _hierarchy.loader.computeTypeBuilder(typeArguments[i]),
278-
growable: false),
279-
fileUri: mixedInTypeBuilder.fileUri,
280-
charOffset: mixedInTypeBuilder.charOffset);
281-
LibraryBuilder library = _classBuilder.libraryBuilder;
282-
if (library is SourceLibraryBuilder) {
283-
library.registerBoundsCheck(mixedInType, mixedInTypeBuilder.fileUri!,
284-
mixedInTypeBuilder.charOffset!, TypeUse.classWithType,
285-
inferred: true);
266+
ClassBuilder classBuilder = _classBuilder;
267+
if (classBuilder is SourceClassBuilder) {
268+
new BuilderMixinInferrer(classBuilder, _hierarchy,
269+
mixedInSupertype.classNode.typeParameters)
270+
.infer(cls);
271+
classBuilder.setInferredMixedInTypeArguments(
272+
new List<TypeBuilder>.generate(typeArguments.length,
273+
(int i) => _hierarchy.loader.computeTypeBuilder(typeArguments[i]),
274+
growable: false));
286275
}
287276
return mixinNode;
288277
}

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

+9-6
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ import 'package:kernel/type_algebra.dart';
1111
import '../../base/messages.dart'
1212
show Message, templateMixinInferenceNoMatchingClass;
1313
import '../../base/problems.dart' show unexpected, unsupported;
14-
import '../../builder/declaration_builders.dart';
14+
import '../../source/source_class_builder.dart';
1515
import '../../type_inference/type_schema.dart';
1616

1717
class BuilderMixinInferrer {
1818
final CoreTypes coreTypes;
1919
final _MixinInferenceSolution _mixinInferenceSolution;
2020
final List<TypeParameter> typeParametersToSolveFor;
21-
final ClassBuilder cls;
21+
final SourceClassBuilder classBuilder;
2222
final ClassHierarchyBase classHierarchyBase;
2323

2424
BuilderMixinInferrer(
25-
this.cls, this.classHierarchyBase, this.typeParametersToSolveFor)
25+
this.classBuilder, this.classHierarchyBase, this.typeParametersToSolveFor)
2626
: coreTypes = classHierarchyBase.coreTypes,
2727
_mixinInferenceSolution =
2828
new _MixinInferenceSolution(typeParametersToSolveFor);
@@ -181,13 +181,16 @@ class BuilderMixinInferrer {
181181

182182
// Coverage-ignore(suite): Not run.
183183
void reportProblem(Message message, Class kernelClass) {
184-
int length = cls.isMixinApplication ? 1 : cls.fullNameForErrors.length;
185-
cls.addProblem(message, cls.fileOffset, length);
184+
int length = classBuilder.isMixinApplication
185+
? 1
186+
: classBuilder.fullNameForErrors.length;
187+
classBuilder.addProblem(message, classBuilder.fileOffset, length);
186188
}
187189

188190
// Coverage-ignore(suite): Not run.
189191
Never reportUnsupportedProblem(String operation) {
190-
return unsupported(operation, cls.fileOffset, cls.fileUri);
192+
return unsupported(
193+
operation, classBuilder.fileOffset, classBuilder.fileUri);
191194
}
192195
}
193196

0 commit comments

Comments
 (0)