Skip to content

Commit bbbf6b9

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Support extension types from dill
In response to #53036 Change-Id: I676f5086028b88023b37379d674d66a8908709e8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/316580 Reviewed-by: Chloe Stefantsova <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 2310994 commit bbbf6b9

File tree

122 files changed

+2862
-149
lines changed

Some content is hidden

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

122 files changed

+2862
-149
lines changed

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

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
7676
///
7777
/// Currently this also holds the synthesized super class for a mixin
7878
/// declaration.
79-
abstract TypeBuilder? supertypeBuilder;
79+
TypeBuilder? get supertypeBuilder;
8080

8181
/// The type in the `implements` clause of a class or mixin declaration.
82-
abstract List<TypeBuilder>? interfaceBuilders;
82+
List<TypeBuilder>? get interfaceBuilders;
8383

8484
/// The types in the `on` clause of an extension or mixin declaration.
8585
List<TypeBuilder>? get onTypes;
@@ -159,18 +159,6 @@ abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
159159

160160
abstract class ClassBuilderImpl extends DeclarationBuilderImpl
161161
implements ClassBuilder {
162-
@override
163-
List<TypeVariableBuilder>? typeVariables;
164-
165-
@override
166-
TypeBuilder? supertypeBuilder;
167-
168-
@override
169-
List<TypeBuilder>? interfaceBuilders;
170-
171-
@override
172-
List<TypeBuilder>? onTypes;
173-
174162
@override
175163
bool isNullClass = false;
176164

@@ -183,10 +171,6 @@ abstract class ClassBuilderImpl extends DeclarationBuilderImpl
183171
List<MetadataBuilder>? metadata,
184172
int modifiers,
185173
String name,
186-
this.typeVariables,
187-
this.supertypeBuilder,
188-
this.interfaceBuilders,
189-
this.onTypes,
190174
Scope scope,
191175
ConstructorScope constructorScope,
192176
LibraryBuilder parent,

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

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@ class DillClassBuilder extends ClassBuilderImpl {
2424
@override
2525
final Class cls;
2626

27-
DillClassBuilder(Class cls, DillLibraryBuilder parent)
28-
: cls = cls,
29-
super(
30-
null,
27+
List<TypeVariableBuilder>? _typeVariables;
28+
29+
TypeBuilder? _supertypeBuilder;
30+
31+
List<TypeBuilder>? _interfaceBuilders;
32+
33+
DillClassBuilder(this.cls, DillLibraryBuilder parent)
34+
: super(
35+
/*metadata builders*/ null,
3136
computeModifiers(cls),
3237
cls.name,
33-
null,
34-
null,
35-
null,
36-
null,
3738
new Scope(
3839
kind: ScopeKind.declaration,
3940
local: <String, MemberBuilder>{},
@@ -81,9 +82,9 @@ class DillClassBuilder extends ClassBuilderImpl {
8182

8283
@override
8384
List<TypeVariableBuilder>? get typeVariables {
84-
List<TypeVariableBuilder>? typeVariables = super.typeVariables;
85+
List<TypeVariableBuilder>? typeVariables = _typeVariables;
8586
if (typeVariables == null && cls.typeParameters.isNotEmpty) {
86-
typeVariables = super.typeVariables =
87+
typeVariables = _typeVariables =
8788
computeTypeVariableBuilders(libraryBuilder, cls.typeParameters);
8889
}
8990
return typeVariables;
@@ -94,16 +95,19 @@ class DillClassBuilder extends ClassBuilderImpl {
9495

9596
@override
9697
TypeBuilder? get supertypeBuilder {
97-
TypeBuilder? supertype = super.supertypeBuilder;
98+
TypeBuilder? supertype = _supertypeBuilder;
9899
if (supertype == null) {
99100
Supertype? targetSupertype = cls.supertype;
100101
if (targetSupertype == null) return null;
101-
super.supertypeBuilder =
102+
_supertypeBuilder =
102103
supertype = computeTypeBuilder(libraryBuilder, targetSupertype);
103104
}
104105
return supertype;
105106
}
106107

108+
@override
109+
List<TypeBuilder>? get onTypes => null;
110+
107111
void addField(Field field) {
108112
DillFieldBuilder builder = new DillFieldBuilder(field, this);
109113
String name = field.name.text;
@@ -192,15 +196,15 @@ class DillClassBuilder extends ClassBuilderImpl {
192196
@override
193197
List<TypeBuilder>? get interfaceBuilders {
194198
if (cls.implementedTypes.isEmpty) return null;
195-
if (super.interfaceBuilders == null) {
196-
List<TypeBuilder> result = new List<TypeBuilder>.generate(
199+
List<TypeBuilder>? interfaceBuilders = _interfaceBuilders;
200+
if (interfaceBuilders == null) {
201+
interfaceBuilders = _interfaceBuilders = new List<TypeBuilder>.generate(
197202
cls.implementedTypes.length,
198203
(int i) =>
199204
computeTypeBuilder(libraryBuilder, cls.implementedTypes[i])!,
200205
growable: false);
201-
super.interfaceBuilders = result;
202206
}
203-
return super.interfaceBuilders;
207+
return interfaceBuilders;
204208
}
205209

206210
@override
@@ -224,8 +228,9 @@ class DillClassBuilder extends ClassBuilderImpl {
224228
includeAugmentations: true, includeDuplicates: false);
225229

226230
void clearCachedValues() {
227-
supertypeBuilder = null;
228-
interfaceBuilders = null;
231+
_supertypeBuilder = null;
232+
_interfaceBuilders = null;
233+
_typeVariables = null;
229234
}
230235
}
231236

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
// Copyright (c) 2023, 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+
import '../builder/inline_class_builder.dart';
6+
import '../builder/member_builder.dart';
7+
import '../builder/type_builder.dart';
8+
import '../builder/type_variable_builder.dart';
9+
import 'package:kernel/ast.dart';
10+
11+
import '../scope.dart';
12+
import 'dill_class_builder.dart';
13+
import 'dill_extension_type_member_builder.dart';
14+
import 'dill_library_builder.dart';
15+
16+
class DillExtensionTypeBuilder extends InlineClassBuilderImpl {
17+
final InlineClass _extensionType;
18+
19+
List<TypeVariableBuilder>? _typeParameters;
20+
21+
List<TypeBuilder>? _interfaceBuilders;
22+
23+
DillExtensionTypeBuilder(this._extensionType, DillLibraryBuilder parent)
24+
: super(
25+
/*metadata builders*/
26+
null,
27+
/* modifiers*/
28+
0,
29+
_extensionType.name,
30+
parent,
31+
_extensionType.fileOffset,
32+
new Scope(
33+
kind: ScopeKind.declaration,
34+
local: <String, MemberBuilder>{},
35+
setters: <String, MemberBuilder>{},
36+
parent: parent.scope,
37+
debugName: "extension type ${_extensionType.name}",
38+
isModifiable: false),
39+
new ConstructorScope(
40+
_extensionType.name, <String, MemberBuilder>{})) {
41+
Map<Name, Procedure> _tearOffs = {};
42+
for (InlineClassMemberDescriptor descriptor in inlineClass.members) {
43+
Name name = descriptor.name;
44+
if (descriptor.kind == InlineClassMemberKind.TearOff) {
45+
_tearOffs[name] = descriptor.member.asProcedure;
46+
}
47+
}
48+
49+
for (InlineClassMemberDescriptor descriptor in inlineClass.members) {
50+
Name name = descriptor.name;
51+
switch (descriptor.kind) {
52+
case InlineClassMemberKind.Method:
53+
if (descriptor.isStatic) {
54+
Procedure procedure = descriptor.member.asProcedure;
55+
scope.addLocalMember(
56+
name.text,
57+
new DillExtensionTypeStaticMethodBuilder(
58+
procedure, descriptor, this),
59+
setter: false);
60+
} else {
61+
Procedure procedure = descriptor.member.asProcedure;
62+
assert(_tearOffs.containsKey(name),
63+
"No tear found for ${descriptor} in ${_tearOffs}");
64+
scope.addLocalMember(
65+
name.text,
66+
new DillExtensionTypeInstanceMethodBuilder(
67+
procedure, descriptor, this, _tearOffs[name]!),
68+
setter: false);
69+
}
70+
break;
71+
case InlineClassMemberKind.TearOff:
72+
assert(_tearOffs[name] == descriptor.member.asProcedure);
73+
break;
74+
case InlineClassMemberKind.Getter:
75+
Procedure procedure = descriptor.member.asProcedure;
76+
scope.addLocalMember(name.text,
77+
new DillExtensionTypeGetterBuilder(procedure, descriptor, this),
78+
setter: false);
79+
break;
80+
case InlineClassMemberKind.Field:
81+
Field field = descriptor.member.asField;
82+
scope.addLocalMember(name.text,
83+
new DillExtensionTypeFieldBuilder(field, descriptor, this),
84+
setter: false);
85+
break;
86+
case InlineClassMemberKind.Setter:
87+
Procedure procedure = descriptor.member.asProcedure;
88+
scope.addLocalMember(name.text,
89+
new DillExtensionTypeSetterBuilder(procedure, descriptor, this),
90+
setter: true);
91+
break;
92+
case InlineClassMemberKind.Operator:
93+
Procedure procedure = descriptor.member.asProcedure;
94+
scope.addLocalMember(name.text,
95+
new DillExtensionTypeOperatorBuilder(procedure, descriptor, this),
96+
setter: false);
97+
break;
98+
case InlineClassMemberKind.Constructor:
99+
Procedure procedure = descriptor.member.asProcedure;
100+
constructorScope.addLocalMember(
101+
name.text,
102+
new DillExtensionTypeConstructorBuilder(
103+
procedure, _tearOffs[name], descriptor, this));
104+
break;
105+
case InlineClassMemberKind.Factory:
106+
case InlineClassMemberKind.RedirectingFactory:
107+
Procedure procedure = descriptor.member.asProcedure;
108+
constructorScope.addLocalMember(
109+
name.text,
110+
new DillExtensionTypeFactoryBuilder(
111+
procedure, _tearOffs[name], descriptor, this));
112+
break;
113+
}
114+
}
115+
}
116+
117+
@override
118+
DillLibraryBuilder get libraryBuilder => parent as DillLibraryBuilder;
119+
120+
@override
121+
DartType get declaredRepresentationType =>
122+
_extensionType.declaredRepresentationType;
123+
124+
@override
125+
InlineClass get inlineClass => _extensionType;
126+
127+
@override
128+
List<TypeVariableBuilder>? get typeParameters {
129+
List<TypeVariableBuilder>? typeVariables = _typeParameters;
130+
if (typeVariables == null && _extensionType.typeParameters.isNotEmpty) {
131+
typeVariables = _typeParameters = computeTypeVariableBuilders(
132+
libraryBuilder, _extensionType.typeParameters);
133+
}
134+
return typeVariables;
135+
}
136+
137+
@override
138+
List<TypeBuilder>? get interfaceBuilders {
139+
if (_extensionType.implements.isEmpty) return null;
140+
List<TypeBuilder>? interfaceBuilders = _interfaceBuilders;
141+
if (interfaceBuilders == null) {
142+
interfaceBuilders = _interfaceBuilders = new List<TypeBuilder>.generate(
143+
_extensionType.implements.length,
144+
(int i) => libraryBuilder.loader
145+
.computeTypeBuilder(_extensionType.implements[i]),
146+
growable: false);
147+
}
148+
return interfaceBuilders;
149+
}
150+
}

0 commit comments

Comments
 (0)