Skip to content

Commit f87142f

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[kernel] Add ExtensionTypeDeclaration.procedures
This adds a list of `Procedure`s to `ExtensionTypeDeclaration`. This is meant to model representation fields and combined member signatures computed from inherited non-extension type members. These are not meant to be handled by the backends. The combined member signature can be the interface target of an `InstanceInvocation` expression but will always have a `.memberSignatureOrigin` value from one of the original class members. TEST=existing Change-Id: I87768ed75a3c7126b0a30f8ccf06e46678c56db6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330301 Reviewed-by: Alexander Markov <[email protected]> Reviewed-by: Srujan Gaddam <[email protected]> Reviewed-by: Jens Johansen <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 06ab207 commit f87142f

27 files changed

+260
-166
lines changed

pkg/_js_interop_checks/lib/src/transformations/export_checker.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ extension ExtensionMemberDescriptorExtension on ExtensionMemberDescriptor {
254254
bool get isSetter => kind == ExtensionMemberKind.Setter;
255255
bool get isMethod => kind == ExtensionMemberKind.Method;
256256

257-
bool get isExternal => (member.asProcedure).isExternal;
257+
bool get isExternal => (memberReference.asProcedure).isExternal;
258258
}
259259

260260
extension ProcedureExtension on Procedure {

pkg/_js_interop_checks/lib/src/transformations/js_util_optimizer.dart

+6-6
Original file line numberDiff line numberDiff line change
@@ -714,8 +714,8 @@ class ExtensionIndex {
714714
void _indexExtensions(Library library) {
715715
if (_processedExtensionLibraries.contains(library)) return;
716716
for (var extension in library.extensions) {
717-
for (var descriptor in extension.members) {
718-
var reference = descriptor.member;
717+
for (var descriptor in extension.memberDescriptors) {
718+
var reference = descriptor.memberReference;
719719
var onType = extension.onType;
720720
bool isInteropOnType = false;
721721
Annotatable? cls;
@@ -738,7 +738,7 @@ class ExtensionIndex {
738738
_extensionMemberIndex[reference] = descriptor;
739739
_extensionAnnotatableIndex[reference] = cls!;
740740
_extensionIndex[reference] = extension;
741-
final tearOffReference = descriptor.tearOff;
741+
final tearOffReference = descriptor.tearOffReference;
742742
if (tearOffReference != null) {
743743
_extensionMemberIndex[tearOffReference] = descriptor;
744744
_extensionIndex[tearOffReference] = extension;
@@ -832,11 +832,11 @@ class ExtensionIndex {
832832
if (_processedExtensionTypeLibraries.contains(library)) return;
833833
for (var extensionType in library.extensionTypeDeclarations) {
834834
if (isInteropExtensionType(extensionType)) {
835-
for (var descriptor in extensionType.members) {
836-
final reference = descriptor.member;
835+
for (var descriptor in extensionType.memberDescriptors) {
836+
final reference = descriptor.memberReference;
837837
_extensionTypeMemberIndex[reference] = descriptor;
838838
_extensionTypeIndex[reference] = extensionType;
839-
final tearOffReference = descriptor.tearOff;
839+
final tearOffReference = descriptor.tearOffReference;
840840
if (tearOffReference != null) {
841841
_extensionTypeMemberIndex[tearOffReference] = descriptor;
842842
_extensionTypeIndex[tearOffReference] = extensionType;

pkg/_js_interop_checks/lib/src/transformations/static_interop_mock_validator.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ class StaticInteropMockValidator {
199199
// setters return their return and parameter types, respectively.
200200
DartType _getTypeOfDescriptor(ExtensionMemberDescriptor interopDescriptor) {
201201
// CFE creates static procedures for each extension member.
202-
var interopMember = interopDescriptor.member.asProcedure;
202+
var interopMember = interopDescriptor.memberReference.asProcedure;
203203

204204
if (interopDescriptor.isGetter) {
205205
return interopMember.function.returnType;
@@ -325,7 +325,7 @@ class StaticInteropMockValidator {
325325
var extensions = _staticInteropClassesWithExtensions[cls.reference];
326326
if (extensions != null) {
327327
for (var extension in extensions) {
328-
for (var descriptor in extension.members) {
328+
for (var descriptor in extension.memberDescriptors) {
329329
if (!descriptor.isExternal || descriptor.isStatic) continue;
330330
// No need to handle external fields - they are transformed to
331331
// external getters/setters by the CFE.
@@ -336,7 +336,8 @@ class StaticInteropMockValidator {
336336
}
337337
_descriptorToExtensionName[descriptor] =
338338
extension.isUnnamedExtension ? '<unnamed>' : extension.name;
339-
var name = js_interop.getJSName(descriptor.member.asMember);
339+
var name =
340+
js_interop.getJSName(descriptor.memberReference.asMember);
340341
if (name.isEmpty) name = descriptor.name.text;
341342
exportNameToDescriptors!
342343
.putIfAbsent(name, () => {})

pkg/compiler/lib/src/io/kernel_source_information.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ String? computeKernelElementNameForSourceMaps(
7777
String _findExtensionMemberName(ir.Member member) {
7878
assert(member.isExtensionMember);
7979
for (ir.Extension extension in member.enclosingLibrary.extensions) {
80-
for (ir.ExtensionMemberDescriptor descriptor in extension.members) {
81-
if (descriptor.member == member.reference ||
82-
descriptor.tearOff == member.reference) {
80+
for (ir.ExtensionMemberDescriptor descriptor
81+
in extension.memberDescriptors) {
82+
if (descriptor.memberReference == member.reference ||
83+
descriptor.tearOffReference == member.reference) {
8384
String extensionName;
8485
// Anonymous extensions contain a # on their synthetic name.
8586
if (extension.name.contains('#')) {

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,20 @@ class DillExtensionBuilder extends ExtensionBuilderImpl {
3232
parent: parent.scope,
3333
debugName: "extension ${extension.name}",
3434
isModifiable: false)) {
35-
for (ExtensionMemberDescriptor descriptor in extension.members) {
35+
for (ExtensionMemberDescriptor descriptor in extension.memberDescriptors) {
3636
Name name = descriptor.name;
3737
switch (descriptor.kind) {
3838
case ExtensionMemberKind.Method:
3939
if (descriptor.isStatic) {
40-
Procedure procedure = descriptor.member.asProcedure;
40+
Procedure procedure = descriptor.memberReference.asProcedure;
4141
scope.addLocalMember(
4242
name.text,
4343
new DillExtensionStaticMethodBuilder(
4444
procedure, descriptor, this),
4545
setter: false);
4646
} else {
47-
Procedure procedure = descriptor.member.asProcedure;
48-
Procedure? tearOff = descriptor.tearOff?.asProcedure;
47+
Procedure procedure = descriptor.memberReference.asProcedure;
48+
Procedure? tearOff = descriptor.tearOffReference?.asProcedure;
4949
assert(tearOff != null, "No tear found for ${descriptor}");
5050
scope.addLocalMember(
5151
name.text,
@@ -55,25 +55,25 @@ class DillExtensionBuilder extends ExtensionBuilderImpl {
5555
}
5656
break;
5757
case ExtensionMemberKind.Getter:
58-
Procedure procedure = descriptor.member.asProcedure;
58+
Procedure procedure = descriptor.memberReference.asProcedure;
5959
scope.addLocalMember(name.text,
6060
new DillExtensionGetterBuilder(procedure, descriptor, this),
6161
setter: false);
6262
break;
6363
case ExtensionMemberKind.Field:
64-
Field field = descriptor.member.asField;
64+
Field field = descriptor.memberReference.asField;
6565
scope.addLocalMember(
6666
name.text, new DillExtensionFieldBuilder(field, descriptor, this),
6767
setter: false);
6868
break;
6969
case ExtensionMemberKind.Setter:
70-
Procedure procedure = descriptor.member.asProcedure;
70+
Procedure procedure = descriptor.memberReference.asProcedure;
7171
scope.addLocalMember(name.text,
7272
new DillExtensionSetterBuilder(procedure, descriptor, this),
7373
setter: true);
7474
break;
7575
case ExtensionMemberKind.Operator:
76-
Procedure procedure = descriptor.member.asProcedure;
76+
Procedure procedure = descriptor.memberReference.asProcedure;
7777
scope.addLocalMember(name.text,
7878
new DillExtensionOperatorBuilder(procedure, descriptor, this),
7979
setter: false);

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

+12-12
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,20 @@ class DillExtensionTypeDeclarationBuilder
4343
new ConstructorScope(
4444
_extensionTypeDeclaration.name, <String, MemberBuilder>{})) {
4545
for (ExtensionTypeMemberDescriptor descriptor
46-
in _extensionTypeDeclaration.members) {
46+
in _extensionTypeDeclaration.memberDescriptors) {
4747
Name name = descriptor.name;
4848
switch (descriptor.kind) {
4949
case ExtensionTypeMemberKind.Method:
5050
if (descriptor.isStatic) {
51-
Procedure procedure = descriptor.member.asProcedure;
51+
Procedure procedure = descriptor.memberReference.asProcedure;
5252
scope.addLocalMember(
5353
name.text,
5454
new DillExtensionTypeStaticMethodBuilder(
5555
procedure, descriptor, this),
5656
setter: false);
5757
} else {
58-
Procedure procedure = descriptor.member.asProcedure;
59-
Procedure? tearOff = descriptor.tearOff?.asProcedure;
58+
Procedure procedure = descriptor.memberReference.asProcedure;
59+
Procedure? tearOff = descriptor.tearOffReference?.asProcedure;
6060
assert(tearOff != null, "No tear found for ${descriptor}");
6161
scope.addLocalMember(
6262
name.text,
@@ -66,41 +66,41 @@ class DillExtensionTypeDeclarationBuilder
6666
}
6767
break;
6868
case ExtensionTypeMemberKind.Getter:
69-
Procedure procedure = descriptor.member.asProcedure;
69+
Procedure procedure = descriptor.memberReference.asProcedure;
7070
scope.addLocalMember(name.text,
7171
new DillExtensionTypeGetterBuilder(procedure, descriptor, this),
7272
setter: false);
7373
break;
7474
case ExtensionTypeMemberKind.Field:
75-
Field field = descriptor.member.asField;
75+
Field field = descriptor.memberReference.asField;
7676
scope.addLocalMember(name.text,
7777
new DillExtensionTypeFieldBuilder(field, descriptor, this),
7878
setter: false);
7979
break;
8080
case ExtensionTypeMemberKind.Setter:
81-
Procedure procedure = descriptor.member.asProcedure;
81+
Procedure procedure = descriptor.memberReference.asProcedure;
8282
scope.addLocalMember(name.text,
8383
new DillExtensionTypeSetterBuilder(procedure, descriptor, this),
8484
setter: true);
8585
break;
8686
case ExtensionTypeMemberKind.Operator:
87-
Procedure procedure = descriptor.member.asProcedure;
87+
Procedure procedure = descriptor.memberReference.asProcedure;
8888
scope.addLocalMember(name.text,
8989
new DillExtensionTypeOperatorBuilder(procedure, descriptor, this),
9090
setter: false);
9191
break;
9292
case ExtensionTypeMemberKind.Constructor:
93-
Procedure procedure = descriptor.member.asProcedure;
94-
Procedure? tearOff = descriptor.tearOff?.asProcedure;
93+
Procedure procedure = descriptor.memberReference.asProcedure;
94+
Procedure? tearOff = descriptor.tearOffReference?.asProcedure;
9595
constructorScope.addLocalMember(
9696
name.text,
9797
new DillExtensionTypeConstructorBuilder(
9898
procedure, tearOff, descriptor, this));
9999
break;
100100
case ExtensionTypeMemberKind.Factory:
101101
case ExtensionTypeMemberKind.RedirectingFactory:
102-
Procedure procedure = descriptor.member.asProcedure;
103-
Procedure? tearOff = descriptor.tearOff?.asProcedure;
102+
Procedure procedure = descriptor.memberReference.asProcedure;
103+
Procedure? tearOff = descriptor.tearOffReference?.asProcedure;
104104
constructorScope.addLocalMember(
105105
name.text,
106106
new DillExtensionTypeFactoryBuilder(

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -149,10 +149,10 @@ class SourceExtensionBuilder extends ExtensionBuilderImpl
149149
kind = ExtensionMemberKind.Operator;
150150
break;
151151
}
152-
extension.members.add(new ExtensionMemberDescriptor(
152+
extension.memberDescriptors.add(new ExtensionMemberDescriptor(
153153
name: new Name(name, libraryBuilder.library),
154-
member: memberReference,
155-
tearOff: tearOffReference,
154+
memberReference: memberReference,
155+
tearOffReference: tearOffReference,
156156
isStatic: memberBuilder.isStatic,
157157
kind: kind));
158158
}

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -503,12 +503,13 @@ class SourceExtensionTypeDeclarationBuilder
503503
kind = ExtensionTypeMemberKind.Operator;
504504
break;
505505
}
506-
extensionTypeDeclaration.members.add(new ExtensionTypeMemberDescriptor(
507-
name: new Name(name, libraryBuilder.library),
508-
member: memberReference,
509-
tearOff: tearOffReference,
510-
isStatic: memberBuilder.isStatic,
511-
kind: kind));
506+
extensionTypeDeclaration.memberDescriptors.add(
507+
new ExtensionTypeMemberDescriptor(
508+
name: new Name(name, libraryBuilder.library),
509+
memberReference: memberReference,
510+
tearOffReference: tearOffReference,
511+
isStatic: memberBuilder.isStatic,
512+
kind: kind));
512513
}
513514

514515
@override

pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart

+6-6
Original file line numberDiff line numberDiff line change
@@ -986,33 +986,33 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
986986
Member? targetTearoff;
987987
ProcedureKind? targetKind;
988988
for (ExtensionTypeMemberDescriptor descriptor
989-
in extensionType.extensionTypeDeclaration.members) {
989+
in extensionType.extensionTypeDeclaration.memberDescriptors) {
990990
if (descriptor.name == name) {
991991
switch (descriptor.kind) {
992992
case ExtensionTypeMemberKind.Method:
993993
if (!isSetter) {
994-
targetMember = descriptor.member.asMember;
995-
targetTearoff = descriptor.tearOff?.asMember;
994+
targetMember = descriptor.memberReference.asMember;
995+
targetTearoff = descriptor.tearOffReference?.asMember;
996996
targetKind = ProcedureKind.Method;
997997
}
998998
break;
999999
case ExtensionTypeMemberKind.Getter:
10001000
if (!isSetter) {
1001-
targetMember = descriptor.member.asMember;
1001+
targetMember = descriptor.memberReference.asMember;
10021002
targetTearoff = null;
10031003
targetKind = ProcedureKind.Getter;
10041004
}
10051005
break;
10061006
case ExtensionTypeMemberKind.Setter:
10071007
if (isSetter) {
1008-
targetMember = descriptor.member.asMember;
1008+
targetMember = descriptor.memberReference.asMember;
10091009
targetTearoff = null;
10101010
targetKind = ProcedureKind.Setter;
10111011
}
10121012
break;
10131013
case ExtensionTypeMemberKind.Operator:
10141014
if (!isSetter) {
1015-
targetMember = descriptor.member.asMember;
1015+
targetMember = descriptor.memberReference.asMember;
10161016
targetTearoff = null;
10171017
targetKind = ProcedureKind.Operator;
10181018
}

pkg/front_end/lib/src/testing/id_testing_utils.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -853,9 +853,9 @@ List<String> extensionMethodDescriptorToText(
853853
}
854854

855855
return [
856-
descriptorToText(descriptor.member, forTearOff: false),
857-
if (descriptor.tearOff != null)
858-
descriptorToText(descriptor.tearOff!, forTearOff: true),
856+
descriptorToText(descriptor.memberReference, forTearOff: false),
857+
if (descriptor.tearOffReference != null)
858+
descriptorToText(descriptor.tearOffReference!, forTearOff: true),
859859
];
860860
}
861861

pkg/front_end/test/extensions/extensions_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ class ExtensionsDataExtractor extends CfeDataExtractor<Features> {
217217
features.addElement(
218218
Tags.extensionTypeParameters, typeParameterToText(typeParameter));
219219
}
220-
for (ExtensionMemberDescriptor descriptor in extension.members) {
220+
for (ExtensionMemberDescriptor descriptor in extension.memberDescriptors) {
221221
for (String text in extensionMethodDescriptorToText(descriptor)) {
222222
features.addElement(Tags.extensionMembers, text);
223223
}

pkg/front_end/test/spell_checking_list_code.txt

+1
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ dereferencing
400400
deregister
401401
descent
402402
descriptive
403+
descriptors
403404
deserializable
404405
deserializer
405406
deserializers

pkg/front_end/tool/ast_model.dart

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ const Map<String?, Map<String, FieldRule?>> _fieldRuleMap = {
117117
},
118118
'ExtensionTypeDeclaration': {
119119
'typeParameters': FieldRule(isDeclaration: true),
120+
'_procedures': FieldRule(name: 'procedures'),
120121
},
121122
'Field': {
122123
'reference': FieldRule(name: 'fieldReference'),

pkg/kernel/binary.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ type CanonicalName {
147147

148148
type ComponentFile {
149149
UInt32 magic = 0x90ABCDEF;
150-
UInt32 formatVersion = 111;
150+
UInt32 formatVersion = 112;
151151
Byte[10] shortSdkHash;
152152
List<String> problemsAsJson; // Described in problems.md.
153153
Library[] libraries;
@@ -374,6 +374,7 @@ type ExtensionTypeDeclaration extends Node {
374374
DartType declaredRepresentationType;
375375
StringReference representationName;
376376
List<DartType> implements;
377+
List<Procedure> procedures;
377378
List<ExtensionTypeMemberKind> members;
378379
}
379380

0 commit comments

Comments
 (0)