Skip to content

Commit 28c6ab3

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Report errors on incompatible getter/setter types
Closes #42702 Change-Id: I9af4b8d616c4368c9f955f658f27e581352a3cd3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165806 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Dmitry Stefantsov <[email protected]>
1 parent 6320692 commit 28c6ab3

File tree

73 files changed

+5583
-213
lines changed

Some content is hidden

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

73 files changed

+5583
-213
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5337,6 +5337,78 @@ Message _withArgumentsInvalidContinueTarget(String name) {
53375337
message: """Can't continue at '${name}'.""", arguments: {'name': name});
53385338
}
53395339

5340+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5341+
const Template<Message Function(String name)>
5342+
templateInvalidGetterSetterTypeFieldContext =
5343+
const Template<Message Function(String name)>(
5344+
messageTemplate: r"""This is the declaration of the field '#name'.""",
5345+
withArguments: _withArgumentsInvalidGetterSetterTypeFieldContext);
5346+
5347+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5348+
const Code<Message Function(String name)>
5349+
codeInvalidGetterSetterTypeFieldContext =
5350+
const Code<Message Function(String name)>(
5351+
"InvalidGetterSetterTypeFieldContext",
5352+
templateInvalidGetterSetterTypeFieldContext,
5353+
severity: Severity.context);
5354+
5355+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5356+
Message _withArgumentsInvalidGetterSetterTypeFieldContext(String name) {
5357+
if (name.isEmpty) throw 'No name provided';
5358+
name = demangleMixinApplicationName(name);
5359+
return new Message(codeInvalidGetterSetterTypeFieldContext,
5360+
message: """This is the declaration of the field '${name}'.""",
5361+
arguments: {'name': name});
5362+
}
5363+
5364+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5365+
const Template<Message Function(String name)>
5366+
templateInvalidGetterSetterTypeGetterContext =
5367+
const Template<Message Function(String name)>(
5368+
messageTemplate: r"""This is the declaration of the getter '#name'.""",
5369+
withArguments: _withArgumentsInvalidGetterSetterTypeGetterContext);
5370+
5371+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5372+
const Code<Message Function(String name)>
5373+
codeInvalidGetterSetterTypeGetterContext =
5374+
const Code<Message Function(String name)>(
5375+
"InvalidGetterSetterTypeGetterContext",
5376+
templateInvalidGetterSetterTypeGetterContext,
5377+
severity: Severity.context);
5378+
5379+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5380+
Message _withArgumentsInvalidGetterSetterTypeGetterContext(String name) {
5381+
if (name.isEmpty) throw 'No name provided';
5382+
name = demangleMixinApplicationName(name);
5383+
return new Message(codeInvalidGetterSetterTypeGetterContext,
5384+
message: """This is the declaration of the getter '${name}'.""",
5385+
arguments: {'name': name});
5386+
}
5387+
5388+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5389+
const Template<Message Function(String name)>
5390+
templateInvalidGetterSetterTypeSetterContext =
5391+
const Template<Message Function(String name)>(
5392+
messageTemplate: r"""This is the declaration of the setter '#name'.""",
5393+
withArguments: _withArgumentsInvalidGetterSetterTypeSetterContext);
5394+
5395+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5396+
const Code<Message Function(String name)>
5397+
codeInvalidGetterSetterTypeSetterContext =
5398+
const Code<Message Function(String name)>(
5399+
"InvalidGetterSetterTypeSetterContext",
5400+
templateInvalidGetterSetterTypeSetterContext,
5401+
severity: Severity.context);
5402+
5403+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
5404+
Message _withArgumentsInvalidGetterSetterTypeSetterContext(String name) {
5405+
if (name.isEmpty) throw 'No name provided';
5406+
name = demangleMixinApplicationName(name);
5407+
return new Message(codeInvalidGetterSetterTypeSetterContext,
5408+
message: """This is the declaration of the setter '${name}'.""",
5409+
arguments: {'name': name});
5410+
}
5411+
53405412
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
53415413
const Code<Null> codeInvalidHexEscape = messageInvalidHexEscape;
53425414

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

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -713,6 +713,11 @@ class SourceFieldMember extends BuilderClassMember {
713713

714714
@override
715715
bool get isFunction => false;
716+
717+
@override
718+
bool isSameDeclaration(ClassMember other) {
719+
return other is SourceFieldMember && memberBuilder == other.memberBuilder;
720+
}
716721
}
717722

718723
abstract class AbstractLateFieldEncoding implements FieldEncoding {
@@ -1057,27 +1062,36 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
10571062
@override
10581063
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) {
10591064
List<ClassMember> list = <ClassMember>[
1060-
new _SynthesizedFieldClassMember(fieldBuilder, field,
1065+
new _SynthesizedFieldClassMember(
1066+
fieldBuilder, field, _SynthesizedFieldMemberKind.LateField,
10611067
isInternalImplementation: true),
10621068
new _SynthesizedFieldClassMember(fieldBuilder, _lateGetter,
1069+
_SynthesizedFieldMemberKind.LateGetterSetter,
10631070
isInternalImplementation: false)
10641071
];
10651072
if (_lateIsSetField != null) {
1066-
list.add(new _SynthesizedFieldClassMember(fieldBuilder, _lateIsSetField,
1073+
list.add(new _SynthesizedFieldClassMember(
1074+
fieldBuilder, _lateIsSetField, _SynthesizedFieldMemberKind.LateIsSet,
10671075
isInternalImplementation: true));
10681076
}
10691077
return list;
10701078
}
10711079

10721080
@override
10731081
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder) {
1074-
List<ClassMember> list = <ClassMember>[];
1082+
List<ClassMember> list = <ClassMember>[
1083+
new _SynthesizedFieldClassMember(
1084+
fieldBuilder, field, _SynthesizedFieldMemberKind.LateField,
1085+
forSetter: true, isInternalImplementation: true),
1086+
];
10751087
if (_lateIsSetField != null) {
1076-
list.add(new _SynthesizedFieldClassMember(fieldBuilder, _lateIsSetField,
1088+
list.add(new _SynthesizedFieldClassMember(
1089+
fieldBuilder, _lateIsSetField, _SynthesizedFieldMemberKind.LateIsSet,
10771090
forSetter: true, isInternalImplementation: true));
10781091
}
10791092
if (_lateSetter != null) {
10801093
list.add(new _SynthesizedFieldClassMember(fieldBuilder, _lateSetter,
1094+
_SynthesizedFieldMemberKind.LateGetterSetter,
10811095
forSetter: true, isInternalImplementation: false));
10821096
}
10831097
return list;
@@ -1274,6 +1288,7 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding {
12741288

12751289
class _SynthesizedFieldClassMember implements ClassMember {
12761290
final SourceFieldBuilder fieldBuilder;
1291+
final _SynthesizedFieldMemberKind _kind;
12771292

12781293
final Member _member;
12791294

@@ -1283,7 +1298,7 @@ class _SynthesizedFieldClassMember implements ClassMember {
12831298
@override
12841299
final bool isInternalImplementation;
12851300

1286-
_SynthesizedFieldClassMember(this.fieldBuilder, this._member,
1301+
_SynthesizedFieldClassMember(this.fieldBuilder, this._member, this._kind,
12871302
{this.forSetter: false, this.isInternalImplementation})
12881303
: assert(isInternalImplementation != null);
12891304

@@ -1415,8 +1430,16 @@ class _SynthesizedFieldClassMember implements ClassMember {
14151430
}
14161431

14171432
@override
1418-
String toString() =>
1419-
'_ClassMember($fieldBuilder,$_member,forSetter=${forSetter})';
1433+
bool isSameDeclaration(ClassMember other) {
1434+
if (identical(this, other)) return true;
1435+
return other is _SynthesizedFieldClassMember &&
1436+
fieldBuilder == other.fieldBuilder &&
1437+
_kind == other._kind;
1438+
}
1439+
1440+
@override
1441+
String toString() => '_SynthesizedFieldClassMember('
1442+
'$fieldBuilder,$_member,$_kind,forSetter=${forSetter})';
14201443
}
14211444

14221445
class AbstractOrExternalFieldEncoding implements FieldEncoding {
@@ -1584,6 +1607,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
15841607
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder) =>
15851608
<ClassMember>[
15861609
new _SynthesizedFieldClassMember(fieldBuilder, _getter,
1610+
_SynthesizedFieldMemberKind.AbstractExternalGetterSetter,
15871611
forSetter: false, isInternalImplementation: false)
15881612
];
15891613

@@ -1592,7 +1616,22 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
15921616
_setter != null
15931617
? <ClassMember>[
15941618
new _SynthesizedFieldClassMember(fieldBuilder, _setter,
1619+
_SynthesizedFieldMemberKind.AbstractExternalGetterSetter,
15951620
forSetter: true, isInternalImplementation: false)
15961621
]
15971622
: const <ClassMember>[];
15981623
}
1624+
1625+
enum _SynthesizedFieldMemberKind {
1626+
/// A `isSet` field used for late lowering.
1627+
LateIsSet,
1628+
1629+
/// A field used for the value of a late lowered field.
1630+
LateField,
1631+
1632+
/// A getter or setter used for late lowering.
1633+
LateGetterSetter,
1634+
1635+
/// A getter or setter used for abstract or external fields.
1636+
AbstractExternalGetterSetter,
1637+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,12 @@ class SourceProcedureMember extends BuilderClassMember {
614614

615615
@override
616616
bool get isFunction => !isProperty;
617+
618+
@override
619+
bool isSameDeclaration(ClassMember other) {
620+
return other is SourceProcedureMember &&
621+
memberBuilder == other.memberBuilder;
622+
}
617623
}
618624

619625
class RedirectingFactoryBuilder extends ProcedureBuilderImpl {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ class DillClassMember extends BuilderClassMember {
191191
// Do nothing; this is only for source members.
192192
}
193193

194+
@override
195+
bool isSameDeclaration(ClassMember other) {
196+
return other is DillClassMember && memberBuilder == other.memberBuilder;
197+
}
198+
194199
String toString() => 'DillClassMember($memberBuilder,forSetter=${forSetter})';
195200
}
196201

0 commit comments

Comments
 (0)