Skip to content

Commit f867dc7

Browse files
johnniwintherCommit Queue
authored and
Commit Queue
committed
[cfe] Don't create ClassMember for internal implementation
Internal implementation members, like those used for the late lowering, are not real instance members on should not be part of the hierarchy member computation. These members are only called directly from within the members for which these are generated, so we don't need to add forwarders and stubs to handle calls from the outside. Closes #49339 Change-Id: I4d87477243d4e015265c7bb200e1fb5431ae21f9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/424943 Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
1 parent f749040 commit f867dc7

30 files changed

+56
-587
lines changed

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,6 @@ abstract class BuilderClassMember implements ClassMember {
212212
// Coverage-ignore(suite): Not run.
213213
bool get isSynthesized => false;
214214

215-
@override
216-
// Coverage-ignore(suite): Not run.
217-
bool get isInternalImplementation => false;
218-
219215
@override
220216
// Coverage-ignore(suite): Not run.
221217
bool get isNoSuchMethodForwarder => false;

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

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,15 @@ mixin DillFieldBuilderMixin implements DillMemberBuilder, PropertyBuilder {
9898

9999
@override
100100
List<ClassMember> get localMembers =>
101-
_localMembers ??= [new DillClassMember(this, ClassMemberKind.Getter)];
101+
_localMembers ??= !member.isInternalImplementation
102+
? [new DillClassMember(this, ClassMemberKind.Getter)]
103+
: const [];
102104

103105
@override
104-
List<ClassMember> get localSetters => _localSetters ??= hasSetter
105-
? [new DillClassMember(this, ClassMemberKind.Setter)]
106-
: const [];
106+
List<ClassMember> get localSetters =>
107+
_localSetters ??= hasSetter && !member.isInternalImplementation
108+
? [new DillClassMember(this, ClassMemberKind.Setter)]
109+
: const [];
107110
}
108111

109112
mixin DillGetterBuilderMixin implements DillMemberBuilder, PropertyBuilder {
@@ -136,7 +139,9 @@ mixin DillGetterBuilderMixin implements DillMemberBuilder, PropertyBuilder {
136139

137140
@override
138141
List<ClassMember> get localMembers =>
139-
_localMembers ??= [new DillClassMember(this, ClassMemberKind.Getter)];
142+
_localMembers ??= !member.isInternalImplementation
143+
? [new DillClassMember(this, ClassMemberKind.Getter)]
144+
: const [];
140145

141146
@override
142147
List<ClassMember> get localSetters => const [];
@@ -179,7 +184,9 @@ mixin DillSetterBuilderMixin implements DillMemberBuilder, PropertyBuilder {
179184

180185
@override
181186
List<ClassMember> get localSetters =>
182-
_localSetters ??= [new DillClassMember(this, ClassMemberKind.Setter)];
187+
_localSetters ??= !member.isInternalImplementation
188+
? [new DillClassMember(this, ClassMemberKind.Setter)]
189+
: const [];
183190
}
184191

185192
mixin DillMethodBuilderMixin implements DillMemberBuilder, MethodBuilder {
@@ -207,7 +214,9 @@ mixin DillMethodBuilderMixin implements DillMemberBuilder, MethodBuilder {
207214

208215
@override
209216
List<ClassMember> get localMembers =>
210-
_localMembers ??= [new DillClassMember(this, ClassMemberKind.Method)];
217+
_localMembers ??= !member.isInternalImplementation
218+
? [new DillClassMember(this, ClassMemberKind.Method)]
219+
: const [];
211220

212221
@override
213222
List<ClassMember> get localSetters => const [];
@@ -247,7 +256,9 @@ mixin DillOperatorBuilderMixin implements DillMemberBuilder, MethodBuilder {
247256

248257
@override
249258
List<ClassMember> get localMembers =>
250-
_localMembers ??= [new DillClassMember(this, ClassMemberKind.Method)];
259+
_localMembers ??= !member.isInternalImplementation
260+
? [new DillClassMember(this, ClassMemberKind.Method)]
261+
: const [];
251262

252263
@override
253264
List<ClassMember> get localSetters => const [];

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,11 @@ class DillClassMember extends BuilderClassMember {
322322
@override
323323
final ClassMemberKind memberKind;
324324

325-
DillClassMember(this.memberBuilder, this.memberKind);
325+
DillClassMember(this.memberBuilder, this.memberKind)
326+
: assert(
327+
!memberBuilder.member.isInternalImplementation,
328+
"ClassMember should not be created for internal implementation "
329+
"member $memberBuilder.");
326330

327331
@override
328332
bool get isSourceDeclaration => false;
@@ -333,12 +337,6 @@ class DillClassMember extends BuilderClassMember {
333337
return member.isExtensionTypeMember;
334338
}
335339

336-
@override
337-
bool get isInternalImplementation {
338-
Member member = memberBuilder.member;
339-
return member.isInternalImplementation;
340-
}
341-
342340
@override
343341
bool get isNoSuchMethodForwarder {
344342
Member member = memberBuilder.member;

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,6 @@ class _EnumElementClassMember implements ClassMember {
163163
// Coverage-ignore(suite): Not run.
164164
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
165165

166-
@override
167-
// Coverage-ignore(suite): Not run.
168-
bool get isInternalImplementation => false;
169-
170166
@override
171167
// Coverage-ignore(suite): Not run.
172168
bool get isNoSuchMethodForwarder => false;

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

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,6 @@ class _FieldClassMember implements ClassMember {
103103
@override
104104
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
105105

106-
@override
107-
bool get isInternalImplementation => false;
108-
109106
@override
110107
bool get isNoSuchMethodForwarder => false;
111108

@@ -174,9 +171,6 @@ class _SynthesizedFieldClassMember implements ClassMember {
174171
_SynthesizedFieldClassMember(
175172
this._builder, this._member, this._name, this._kind, this.memberKind);
176173

177-
@override
178-
bool get isInternalImplementation => _kind.isInternalImplementation;
179-
180174
@override
181175
Member getMember(ClassMembersBuilder membersBuilder) {
182176
inferType(membersBuilder);
@@ -307,23 +301,12 @@ class _SynthesizedFieldClassMember implements ClassMember {
307301
}
308302

309303
enum _SynthesizedFieldMemberKind {
310-
/// A `isSet` field used for late lowering.
311-
LateIsSet(isInternalImplementation: true),
312-
313-
/// A field used for the value of a late lowered field.
314-
LateField(isInternalImplementation: true),
315-
316304
/// A getter or setter used for late lowering.
317-
LateGetterSetter(isInternalImplementation: false),
305+
LateGetterSetter,
318306

319307
/// A getter or setter used for abstract or external fields.
320-
AbstractExternalGetterSetter(isInternalImplementation: false),
308+
AbstractExternalGetterSetter,
321309

322310
/// A getter for an extension type declaration representation field.
323-
RepresentationField(isInternalImplementation: false),
324-
;
325-
326-
final bool isInternalImplementation;
327-
328-
const _SynthesizedFieldMemberKind({required this.isInternalImplementation});
311+
RepresentationField,
329312
}

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

Lines changed: 19 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
475475
}
476476

477477
@override
478+
// Coverage-ignore(suite): Not run.
478479
Field get field => _field!;
479480

480481
@override
@@ -635,52 +636,26 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
635636
}
636637

637638
@override
638-
List<ClassMember> get localMembers {
639-
List<ClassMember> list = [
640-
new _SynthesizedFieldClassMember(_fragment.builder, field, field.name,
641-
_SynthesizedFieldMemberKind.LateField, ClassMemberKind.Getter),
642-
new _SynthesizedFieldClassMember(
643-
_fragment.builder,
644-
_lateGetter!,
645-
_fragment.builder.memberName,
646-
_SynthesizedFieldMemberKind.LateGetterSetter,
647-
ClassMemberKind.Getter)
648-
];
649-
if (_lateIsSetField != null) {
650-
list.add(new _SynthesizedFieldClassMember(
651-
_fragment.builder,
652-
_lateIsSetField!,
653-
_lateIsSetField!.name,
654-
_SynthesizedFieldMemberKind.LateIsSet,
655-
ClassMemberKind.Getter));
656-
}
657-
return list;
658-
}
639+
List<ClassMember> get localMembers => [
640+
new _SynthesizedFieldClassMember(
641+
_fragment.builder,
642+
_lateGetter!,
643+
_fragment.builder.memberName,
644+
_SynthesizedFieldMemberKind.LateGetterSetter,
645+
ClassMemberKind.Getter)
646+
];
659647

660648
@override
661-
List<ClassMember> get localSetters {
662-
List<ClassMember> list = [
663-
new _SynthesizedFieldClassMember(_fragment.builder, field, field.name,
664-
_SynthesizedFieldMemberKind.LateField, ClassMemberKind.Setter),
665-
];
666-
if (_lateIsSetField != null) {
667-
list.add(new _SynthesizedFieldClassMember(
668-
_fragment.builder,
669-
_lateIsSetField!,
670-
_lateIsSetField!.name,
671-
_SynthesizedFieldMemberKind.LateIsSet,
672-
ClassMemberKind.Setter));
673-
}
674-
if (_lateSetter != null) {
675-
list.add(new _SynthesizedFieldClassMember(
676-
_fragment.builder,
677-
_lateSetter!,
678-
_fragment.builder.memberName,
679-
_SynthesizedFieldMemberKind.LateGetterSetter,
680-
ClassMemberKind.Setter));
681-
}
682-
return list;
683-
}
649+
List<ClassMember> get localSetters => _lateSetter != null
650+
? [
651+
new _SynthesizedFieldClassMember(
652+
_fragment.builder,
653+
_lateSetter!,
654+
_fragment.builder.memberName,
655+
_SynthesizedFieldMemberKind.LateGetterSetter,
656+
ClassMemberKind.Setter)
657+
]
658+
: const [];
684659

685660
@override
686661
void registerSuperCall() {

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

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,6 @@ abstract class ClassMember {
266266
/// source code.
267267
bool get isSynthesized;
268268

269-
/// If `true` this member is not part of the interface but only part of the
270-
/// class members.
271-
///
272-
/// This is `true` for instance for synthesized fields added for the late
273-
/// lowering.
274-
bool get isInternalImplementation;
275-
276269
/// Returns `true` if this member is a noSuchMethod forwarder.
277270
bool get isNoSuchMethodForwarder;
278271

@@ -375,9 +368,6 @@ abstract class SynthesizedMember extends ClassMember {
375368
@override
376369
bool get isDuplicate => false;
377370

378-
@override
379-
bool get isInternalImplementation => false;
380-
381371
@override
382372
bool get isSetter => forSetter;
383373

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

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -559,36 +559,7 @@ class ClassMembersNodeBuilder extends MembersNodeBuilder {
559559
///
560560
void registerAbstractMember(
561561
List<ClassMember> abstractMembers, ClassMember abstractMember) {
562-
if (!abstractMember.isInternalImplementation) {
563-
/// If `isInternalImplementation` is `true`, the member is synthesized
564-
/// implementation that does not require implementation in other
565-
/// classes.
566-
///
567-
/// This is for instance used for late lowering where
568-
///
569-
/// class Interface {
570-
/// late int? field;
571-
/// }
572-
/// class Class implements Interface {
573-
/// int? field;
574-
/// }
575-
///
576-
/// is encoded as
577-
///
578-
/// class Interface {
579-
/// bool _#field#isSet = false;
580-
/// int? _#field = null;
581-
/// int? get field => _#field#isSet ? _#field : throw ...;
582-
/// void set field(int? value) { ... }
583-
/// }
584-
/// class Class implements Interface {
585-
/// int? field;
586-
/// }
587-
///
588-
/// and `Class` should not be required to implement
589-
/// `Interface._#field#isSet` and `Interface._#field`.
590-
abstractMembers.add(abstractMember);
591-
}
562+
abstractMembers.add(abstractMember);
592563
}
593564

594565
/// Set to `true` during [build] if the class needs interfaces, that is, if it

pkg/front_end/lib/src/source/source_enum_builder.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -873,10 +873,6 @@ class _EnumValuesClassMember implements ClassMember {
873873
// Coverage-ignore(suite): Not run.
874874
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
875875

876-
@override
877-
// Coverage-ignore(suite): Not run.
878-
bool get isInternalImplementation => false;
879-
880876
@override
881877
// Coverage-ignore(suite): Not run.
882878
bool get isNoSuchMethodForwarder => false;

pkg/front_end/lib/src/source/source_method_builder.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,6 @@ class _MethodClassMember implements ClassMember {
364364
@override
365365
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
366366

367-
@override
368-
bool get isInternalImplementation => false;
369-
370367
@override
371368
bool get isNoSuchMethodForwarder => false;
372369

pkg/front_end/lib/src/source/source_property_builder.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -692,9 +692,6 @@ class _GetterClassMember implements ClassMember {
692692
@override
693693
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
694694

695-
@override
696-
bool get isInternalImplementation => false;
697-
698695
@override
699696
bool get isNoSuchMethodForwarder => false;
700697

@@ -829,9 +826,6 @@ class _SetterClassMember implements ClassMember {
829826
@override
830827
bool get isExtensionTypeMember => _builder.isExtensionTypeMember;
831828

832-
@override
833-
bool get isInternalImplementation => false;
834-
835829
@override
836830
bool get isNoSuchMethodForwarder => false;
837831

0 commit comments

Comments
 (0)