Skip to content

Commit ed2df21

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Decouple MemberBuilder from ClassMember
Change-Id: Ia9d3a3ffa51781cfef1af0451902fe97620d2517 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/135303 Reviewed-by: Dmitry Stefantsov <dmitryas@google.com> Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
1 parent 776b984 commit ed2df21

35 files changed

Lines changed: 1266 additions & 276 deletions
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright (c) 2020, 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+
/*library: nnbd=true*/
6+
7+
import 'opt_in.dart';
8+
import 'opt_out.dart';
9+
10+
/*class: SubClass1:Class,Interface,LegacyClass1,Object,SubClass1*/
11+
class SubClass1 extends LegacyClass1 {
12+
/*member: SubClass1.method:int* Function(int*)**/
13+
}
14+
15+
/*class: SubClass2:Class,Interface,LegacyClass2,Object,SubClass2*/
16+
class SubClass2 extends LegacyClass2 implements Interface {
17+
// TODO(johnniwinther): Correctly merge `Interface.method` with
18+
// `LegacyClass2.method` to show nullabilities.
19+
/*member: SubClass2.method:int* Function(int*)**/
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) 2020, 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+
/*library: nnbd=true*/
6+
7+
/*class: Class:Class,Object*/
8+
class Class {
9+
/*member: Class.method:int! Function(int?)!*/
10+
int method(int? i) => i ?? 0;
11+
}
12+
13+
/*class: Interface:Interface,Object*/
14+
abstract class Interface {
15+
/*member: Interface.method:int? Function(int!)!*/
16+
int? method(int i) => i;
17+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Copyright (c) 2020, 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+
// @dart=2.6
6+
7+
/*library: nnbd=false*/
8+
9+
import 'opt_in.dart';
10+
11+
/*class: LegacyClass1:Class,Interface,LegacyClass1,Object*/
12+
abstract class LegacyClass1 extends Class implements Interface {
13+
/*member: LegacyClass1.method:int* Function(int*)**/
14+
}
15+
16+
/*class: LegacyClass2:Class,LegacyClass2,Object*/
17+
abstract class LegacyClass2 extends Class {
18+
/*member: LegacyClass2.method:int* Function(int*)**/
19+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) 2020, 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+
/*library: nnbd=true*/
6+
7+
import 'opt_out.dart';
8+
9+
/*class: Interface:Interface,Object*/
10+
abstract class Interface {
11+
/*member: Interface.method:int! Function(int?)!*/
12+
int method(int? i) => i ?? 0;
13+
}
14+
15+
/*class: Class:Class,Interface,LegacyClass,Object*/
16+
abstract class Class extends LegacyClass implements Interface {
17+
/*member: Class.method:int! Function(int?)!*/
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) 2020, 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+
/*library: nnbd=false*/
6+
7+
// @dart=2.6
8+
9+
/*class: LegacyClass:LegacyClass,Object*/
10+
class LegacyClass {
11+
/*member: LegacyClass.method:int* Function(int*)**/
12+
int method(int i) => i;
13+
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import 'package:kernel/core_types.dart';
1212
import '../constant_context.dart' show ConstantContext;
1313

1414
import '../kernel/body_builder.dart' show BodyBuilder;
15-
15+
import '../kernel/class_hierarchy_builder.dart' show ClassMember;
1616
import '../kernel/expression_generator_helper.dart'
1717
show ExpressionGeneratorHelper;
1818

@@ -360,4 +360,12 @@ class ConstructorBuilderImpl extends FunctionBuilderImpl
360360
superInitializer = null;
361361
hasMovedSuperInitializer = false;
362362
}
363+
364+
@override
365+
List<ClassMember> get localMembers =>
366+
throw new UnsupportedError('${runtimeType}.localMembers');
367+
368+
@override
369+
List<ClassMember> get localSetters =>
370+
throw new UnsupportedError('${runtimeType}.localSetters');
363371
}

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

Lines changed: 79 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import '../constant_context.dart' show ConstantContext;
1515
import '../fasta_codes.dart' show messageInternalProblemAlreadyInitialized;
1616

1717
import '../kernel/body_builder.dart' show BodyBuilder;
18-
import '../kernel/class_hierarchy_builder.dart' show ClassMember;
18+
import '../kernel/class_hierarchy_builder.dart'
19+
show ClassHierarchyBuilder, ClassMember;
1920
import '../kernel/kernel_builder.dart' show ImplicitFieldType;
2021
import '../kernel/late_lowering.dart' as late_lowering;
2122

@@ -577,13 +578,34 @@ class RegularFieldEncoding implements FieldEncoding {
577578

578579
@override
579580
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) =>
580-
<ClassMember>[fieldBuilder];
581+
<ClassMember>[new SourceFieldMember(fieldBuilder)];
581582

582583
@override
583584
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder) =>
584585
const <ClassMember>[];
585586
}
586587

588+
class SourceFieldMember extends BuilderClassMember {
589+
@override
590+
final SourceFieldBuilder memberBuilder;
591+
592+
SourceFieldMember(this.memberBuilder);
593+
594+
TypeBuilder get type => memberBuilder.type;
595+
596+
bool get hadTypesInferred => memberBuilder.hadTypesInferred;
597+
598+
void set hadTypesInferred(bool value) {
599+
memberBuilder.hadTypesInferred = value;
600+
}
601+
602+
DartType get fieldType => memberBuilder.fieldType;
603+
604+
void set fieldType(DartType value) {
605+
memberBuilder.fieldType = value;
606+
}
607+
}
608+
587609
abstract class AbstractLateFieldEncoding implements FieldEncoding {
588610
final String name;
589611
final int fileOffset;
@@ -868,11 +890,11 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
868890
@override
869891
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) {
870892
List<ClassMember> list = <ClassMember>[
871-
new _ClassMember(fieldBuilder, field),
872-
new _ClassMember(fieldBuilder, _lateGetter)
893+
new _LateFieldClassMember(fieldBuilder, field),
894+
new _LateFieldClassMember(fieldBuilder, _lateGetter)
873895
];
874896
if (_lateIsSetField != null) {
875-
list.add(new _ClassMember(fieldBuilder, _lateIsSetField));
897+
list.add(new _LateFieldClassMember(fieldBuilder, _lateIsSetField));
876898
}
877899
return list;
878900
}
@@ -881,7 +903,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
881903
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder) {
882904
return _lateSetter == null
883905
? const <ClassMember>[]
884-
: <ClassMember>[new _ClassMember(fieldBuilder, _lateSetter)];
906+
: <ClassMember>[new _LateFieldClassMember(fieldBuilder, _lateSetter)];
885907
}
886908
}
887909

@@ -1022,56 +1044,80 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
10221044
null;
10231045
}
10241046

1025-
class _ClassMember implements ClassMember {
1047+
class _LateFieldClassMember implements ClassMember {
10261048
final SourceFieldBuilder fieldBuilder;
10271049

1028-
@override
1029-
final Member member;
1050+
final Member _member;
10301051

1031-
_ClassMember(this.fieldBuilder, this.member);
1052+
_LateFieldClassMember(this.fieldBuilder, this._member);
1053+
1054+
Member getMember(ClassHierarchyBuilder hierarchy) => _member;
10321055

10331056
@override
10341057
ClassBuilder get classBuilder => fieldBuilder.classBuilder;
10351058

1059+
@override
1060+
bool isObjectMember(ClassBuilder objectClass) {
1061+
return classBuilder == objectClass;
1062+
}
1063+
10361064
@override
10371065
bool get isDuplicate => fieldBuilder.isDuplicate;
10381066

10391067
@override
10401068
bool get isStatic => fieldBuilder.isStatic;
10411069

10421070
@override
1043-
bool get isField => member is Field;
1071+
bool get isField => _member is Field;
10441072

10451073
@override
10461074
bool get isAssignable {
1047-
Member field = member;
1075+
Member field = _member;
10481076
return field is Field && field.hasSetter;
10491077
}
10501078

10511079
@override
10521080
bool get isSetter {
1053-
Member procedure = member;
1081+
Member procedure = _member;
10541082
return procedure is Procedure && procedure.kind == ProcedureKind.Setter;
10551083
}
10561084

10571085
@override
10581086
bool get isGetter {
1059-
Member procedure = member;
1087+
Member procedure = _member;
10601088
return procedure is Procedure && procedure.kind == ProcedureKind.Getter;
10611089
}
10621090

10631091
@override
10641092
bool get isFinal {
1065-
Member field = member;
1093+
Member field = _member;
10661094
return field is Field && field.isFinal;
10671095
}
10681096

10691097
@override
10701098
bool get isConst {
1071-
Member field = member;
1099+
Member field = _member;
10721100
return field is Field && field.isConst;
10731101
}
10741102

1103+
@override
1104+
ProcedureKind get memberKind {
1105+
Member procedure = _member;
1106+
return procedure is Procedure ? procedure.kind : null;
1107+
}
1108+
1109+
@override
1110+
Name get name => _member.name;
1111+
1112+
@override
1113+
String get fullName {
1114+
String suffix = isSetter ? "=" : "";
1115+
String className = classBuilder?.fullNameForErrors;
1116+
return className == null
1117+
? "${fullNameForErrors}$suffix"
1118+
: "${className}.${fullNameForErrors}$suffix";
1119+
}
1120+
10751121
@override
10761122
String get fullNameForErrors => fieldBuilder.fullNameForErrors;
10771123

@@ -1082,5 +1128,21 @@ class _ClassMember implements ClassMember {
10821128
int get charOffset => fieldBuilder.charOffset;
10831129

10841130
@override
1085-
String toString() => '_ClassMember($fieldBuilder,$member)';
1131+
bool get isAbstract => _member.isAbstract;
1132+
1133+
@override
1134+
bool get hasExplicitReturnType {
1135+
// The return type of the getter is explicit if the field type is explicit.
1136+
return fieldBuilder.type != null;
1137+
}
1138+
1139+
@override
1140+
bool hasExplicitlyTypedFormalParameter(int index) {
1141+
// The type of the setter parameter is explicit if the field type is
1142+
// explicit.
1143+
return fieldBuilder.type != null;
1144+
}
1145+
1146+
@override
1147+
String toString() => '_ClassMember($fieldBuilder,$_member)';
10861148
}

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import 'package:kernel/type_algebra.dart';
1414
import '../identifiers.dart';
1515
import '../scope.dart';
1616

17-
import '../kernel/class_hierarchy_builder.dart' show ClassMember;
1817
import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
1918
import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
2019

@@ -561,12 +560,4 @@ abstract class FunctionBuilderImpl extends MemberBuilderImpl
561560
messagePatchDeclarationOrigin.withLocation(fileUri, charOffset, noLength)
562561
]);
563562
}
564-
565-
@override
566-
List<ClassMember> get localMembers =>
567-
isSetter ? const <ClassMember>[] : <ClassMember>[this];
568-
569-
@override
570-
List<ClassMember> get localSetters =>
571-
isSetter ? <ClassMember>[this] : const <ClassMember>[];
572563
}

0 commit comments

Comments
 (0)