Skip to content

Commit ab84be0

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Fix _name field resolution for toString body generation
Part of #47453 Closes #48303 Change-Id: Ib2934779fc7295c066c1c1580609c933be76b618 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/232381 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 0ef68f8 commit ab84be0

29 files changed

+420
-72
lines changed

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

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -474,14 +474,7 @@ class SourceEnumBuilder extends SourceClassBuilder {
474474
@override
475475
TypeBuilder? get mixedInTypeBuilder => null;
476476

477-
@override
478-
Class build(SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) {
479-
cls.isEnum = true;
480-
intType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
481-
stringType.resolveIn(
482-
coreLibrary.scope, charOffset, fileUri, libraryBuilder);
483-
objectType.resolveIn(
484-
coreLibrary.scope, charOffset, fileUri, libraryBuilder);
477+
NamedTypeBuilder? _computeEnumSupertype() {
485478
TypeBuilder? supertypeBuilder = this.supertypeBuilder;
486479
NamedTypeBuilder? enumType;
487480

@@ -495,6 +488,18 @@ class SourceEnumBuilder extends SourceClassBuilder {
495488
}
496489
}
497490
assert(enumType is NamedTypeBuilder && enumType.name == "_Enum");
491+
return enumType;
492+
}
493+
494+
@override
495+
Class build(SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) {
496+
cls.isEnum = true;
497+
intType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
498+
stringType.resolveIn(
499+
coreLibrary.scope, charOffset, fileUri, libraryBuilder);
500+
objectType.resolveIn(
501+
coreLibrary.scope, charOffset, fileUri, libraryBuilder);
502+
NamedTypeBuilder? enumType = _computeEnumSupertype();
498503
enumType!.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
499504

500505
listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
@@ -695,21 +700,20 @@ class SourceEnumBuilder extends SourceClassBuilder {
695700
SourceProcedureBuilder toStringBuilder =
696701
firstMemberNamed("toString") as SourceProcedureBuilder;
697702

698-
TypeBuilder supertypeBuilder = this.supertypeBuilder!;
699-
ClassBuilder enumClass = supertypeBuilder.declaration as ClassBuilder;
703+
ClassBuilder enumClass =
704+
_computeEnumSupertype()!.declaration as ClassBuilder;
700705
MemberBuilder? nameFieldBuilder =
701706
enumClass.lookupLocalMember("_name") as MemberBuilder?;
702-
if (nameFieldBuilder != null) {
703-
Field nameField = nameFieldBuilder.member as Field;
704-
705-
toStringBuilder.body = new ReturnStatement(new StringConcatenation([
706-
new StringLiteral("${cls.demangledName}."),
707-
new InstanceGet.byReference(
708-
InstanceAccessKind.Instance, new ThisExpression(), nameField.name,
709-
interfaceTargetReference: nameField.getterReference,
710-
resultType: nameField.getterType),
711-
]));
712-
}
707+
assert(nameFieldBuilder != null);
708+
Field nameField = nameFieldBuilder!.member as Field;
709+
710+
toStringBuilder.body = new ReturnStatement(new StringConcatenation([
711+
new StringLiteral("${cls.demangledName}."),
712+
new InstanceGet.byReference(
713+
InstanceAccessKind.Instance, new ThisExpression(), nameField.name,
714+
interfaceTargetReference: nameField.getterReference,
715+
resultType: nameField.getterType),
716+
]));
713717

714718
super.buildOutlineExpressions(library, classHierarchy,
715719
delayedActionPerformers, synthesizedFunctionNodes);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2514,9 +2514,11 @@ class Object {
25142514
}
25152515
25162516
abstract class Enum {
2517+
String get _name;
25172518
}
25182519
25192520
abstract class _Enum {
2521+
final String _name;
25202522
}
25212523
25222524
class String {}

pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.strong.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class EA extends self::_EA&_Enum&A /*isEnum*/ {
2323
: super self::_EA&_Enum&A::•(index, name)
2424
;
2525
method toString() → core::String
26-
;
26+
return "EA.${this.{core::_Enum::_name}{core::String}}";
2727
}
2828
abstract class B extends core::Object implements core::Enum {
2929
synthetic constructor •() → self::B
@@ -46,7 +46,7 @@ class EB extends self::_EB&_Enum&B /*isEnum*/ {
4646
: super self::_EB&_Enum&B::•(index, name)
4747
;
4848
method toString() → core::String
49-
;
49+
return "EB.${this.{core::_Enum::_name}{core::String}}";
5050
}
5151
abstract class M extends core::Enum /*isMixinDeclaration*/ {
5252
get foo() → core::int
@@ -66,7 +66,7 @@ class EM extends self::_EM&_Enum&M /*isEnum*/ {
6666
: super self::_EM&_Enum&M::•(index, name)
6767
;
6868
method toString() → core::String
69-
;
69+
return "EM.${this.{core::_Enum::_name}{core::String}}";
7070
}
7171
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
7272
get foo() → core::int
@@ -86,7 +86,7 @@ class EN extends self::_EN&_Enum&N /*isEnum*/ {
8686
: super self::_EN&_Enum&N::•(index, name)
8787
;
8888
method toString() → core::String
89-
;
89+
return "EN.${this.{core::_Enum::_name}{core::String}}";
9090
}
9191
static method expectEquals(dynamic x, dynamic y) → dynamic {
9292
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {

pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.strong.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class EA extends self::_EA&_Enum&A /*isEnum*/ {
2323
: super self::_EA&_Enum&A::•(index, name)
2424
;
2525
method toString() → core::String
26-
;
26+
return "EA.${this.{core::_Enum::_name}{core::String}}";
2727
}
2828
abstract class B extends core::Object implements core::Enum {
2929
synthetic constructor •() → self::B
@@ -46,7 +46,7 @@ class EB extends self::_EB&_Enum&B /*isEnum*/ {
4646
: super self::_EB&_Enum&B::•(index, name)
4747
;
4848
method toString() → core::String
49-
;
49+
return "EB.${this.{core::_Enum::_name}{core::String}}";
5050
}
5151
abstract class M extends core::Enum /*isMixinDeclaration*/ {
5252
get foo() → core::int
@@ -66,7 +66,7 @@ class EM extends self::_EM&_Enum&M /*isEnum*/ {
6666
: super self::_EM&_Enum&M::•(index, name)
6767
;
6868
method toString() → core::String
69-
;
69+
return "EM.${this.{core::_Enum::_name}{core::String}}";
7070
}
7171
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
7272
get foo() → core::int
@@ -86,7 +86,7 @@ class EN extends self::_EN&_Enum&N /*isEnum*/ {
8686
: super self::_EN&_Enum&N::•(index, name)
8787
;
8888
method toString() → core::String
89-
;
89+
return "EN.${this.{core::_Enum::_name}{core::String}}";
9090
}
9191
static method expectEquals(dynamic x, dynamic y) → dynamic {
9292
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {

pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.weak.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class EA extends self::_EA&_Enum&A /*isEnum*/ {
2323
: super self::_EA&_Enum&A::•(index, name)
2424
;
2525
method toString() → core::String
26-
;
26+
return "EA.${this.{core::_Enum::_name}{core::String}}";
2727
}
2828
abstract class B extends core::Object implements core::Enum {
2929
synthetic constructor •() → self::B
@@ -46,7 +46,7 @@ class EB extends self::_EB&_Enum&B /*isEnum*/ {
4646
: super self::_EB&_Enum&B::•(index, name)
4747
;
4848
method toString() → core::String
49-
;
49+
return "EB.${this.{core::_Enum::_name}{core::String}}";
5050
}
5151
abstract class M extends core::Enum /*isMixinDeclaration*/ {
5252
get foo() → core::int
@@ -66,7 +66,7 @@ class EM extends self::_EM&_Enum&M /*isEnum*/ {
6666
: super self::_EM&_Enum&M::•(index, name)
6767
;
6868
method toString() → core::String
69-
;
69+
return "EM.${this.{core::_Enum::_name}{core::String}}";
7070
}
7171
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
7272
get foo() → core::int
@@ -86,7 +86,7 @@ class EN extends self::_EN&_Enum&N /*isEnum*/ {
8686
: super self::_EN&_Enum&N::•(index, name)
8787
;
8888
method toString() → core::String
89-
;
89+
return "EN.${this.{core::_Enum::_name}{core::String}}";
9090
}
9191
static method expectEquals(dynamic x, dynamic y) → dynamic {
9292
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {

pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.weak.modular.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class EA extends self::_EA&_Enum&A /*isEnum*/ {
2323
: super self::_EA&_Enum&A::•(index, name)
2424
;
2525
method toString() → core::String
26-
;
26+
return "EA.${this.{core::_Enum::_name}{core::String}}";
2727
}
2828
abstract class B extends core::Object implements core::Enum {
2929
synthetic constructor •() → self::B
@@ -46,7 +46,7 @@ class EB extends self::_EB&_Enum&B /*isEnum*/ {
4646
: super self::_EB&_Enum&B::•(index, name)
4747
;
4848
method toString() → core::String
49-
;
49+
return "EB.${this.{core::_Enum::_name}{core::String}}";
5050
}
5151
abstract class M extends core::Enum /*isMixinDeclaration*/ {
5252
get foo() → core::int
@@ -66,7 +66,7 @@ class EM extends self::_EM&_Enum&M /*isEnum*/ {
6666
: super self::_EM&_Enum&M::•(index, name)
6767
;
6868
method toString() → core::String
69-
;
69+
return "EM.${this.{core::_Enum::_name}{core::String}}";
7070
}
7171
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
7272
get foo() → core::int
@@ -86,7 +86,7 @@ class EN extends self::_EN&_Enum&N /*isEnum*/ {
8686
: super self::_EN&_Enum&N::•(index, name)
8787
;
8888
method toString() → core::String
89-
;
89+
return "EN.${this.{core::_Enum::_name}{core::String}}";
9090
}
9191
static method expectEquals(dynamic x, dynamic y) → dynamic {
9292
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {

pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.weak.outline.expect

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class EA extends self::_EA&_Enum&A /*isEnum*/ {
2121
const constructor •(core::int index, core::String name) → self::EA
2222
;
2323
method toString() → core::String
24-
;
24+
return "EA.${this.{core::_Enum::_name}{core::String}}";
2525
}
2626
abstract class B extends core::Object implements core::Enum {
2727
synthetic constructor •() → self::B
@@ -42,7 +42,7 @@ class EB extends self::_EB&_Enum&B /*isEnum*/ {
4242
const constructor •(core::int index, core::String name) → self::EB
4343
;
4444
method toString() → core::String
45-
;
45+
return "EB.${this.{core::_Enum::_name}{core::String}}";
4646
}
4747
abstract class M extends core::Enum /*isMixinDeclaration*/ {
4848
get foo() → core::int
@@ -61,7 +61,7 @@ class EM extends self::_EM&_Enum&M /*isEnum*/ {
6161
const constructor •(core::int index, core::String name) → self::EM
6262
;
6363
method toString() → core::String
64-
;
64+
return "EM.${this.{core::_Enum::_name}{core::String}}";
6565
}
6666
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
6767
get foo() → core::int
@@ -80,7 +80,7 @@ class EN extends self::_EN&_Enum&N /*isEnum*/ {
8080
const constructor •(core::int index, core::String name) → self::EN
8181
;
8282
method toString() → core::String
83-
;
83+
return "EN.${this.{core::_Enum::_name}{core::String}}";
8484
}
8585
static method expectEquals(dynamic x, dynamic y) → dynamic
8686
;
@@ -97,4 +97,4 @@ Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:21:6 ->
9797
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:21:18 -> InstanceConstant(const EM{})
9898
Evaluated: ListLiteral @ org-dartlang-testcase:///enum_as_supertype.dart:27:6 -> ListConstant(const <EN*>[const EN{}])
9999
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///enum_as_supertype.dart:27:18 -> InstanceConstant(const EN{})
100-
Extra constant evaluation: evaluated: 20, effectively constant: 8
100+
Extra constant evaluation: evaluated: 32, effectively constant: 8

pkg/front_end/testcases/enhanced_enums/enum_as_supertype.dart.weak.transformed.expect

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class EA extends self::_EA&_Enum&A /*isEnum*/ {
2323
: super self::_EA&_Enum&A::•(index, name)
2424
;
2525
method toString() → core::String
26-
;
26+
return "EA.${this.{core::_Enum::_name}{core::String}}";
2727
}
2828
abstract class B extends core::Object implements core::Enum {
2929
synthetic constructor •() → self::B
@@ -46,7 +46,7 @@ class EB extends self::_EB&_Enum&B /*isEnum*/ {
4646
: super self::_EB&_Enum&B::•(index, name)
4747
;
4848
method toString() → core::String
49-
;
49+
return "EB.${this.{core::_Enum::_name}{core::String}}";
5050
}
5151
abstract class M extends core::Enum /*isMixinDeclaration*/ {
5252
get foo() → core::int
@@ -66,7 +66,7 @@ class EM extends self::_EM&_Enum&M /*isEnum*/ {
6666
: super self::_EM&_Enum&M::•(index, name)
6767
;
6868
method toString() → core::String
69-
;
69+
return "EM.${this.{core::_Enum::_name}{core::String}}";
7070
}
7171
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
7272
get foo() → core::int
@@ -86,7 +86,7 @@ class EN extends self::_EN&_Enum&N /*isEnum*/ {
8686
: super self::_EN&_Enum&N::•(index, name)
8787
;
8888
method toString() → core::String
89-
;
89+
return "EN.${this.{core::_Enum::_name}{core::String}}";
9090
}
9191
static method expectEquals(dynamic x, dynamic y) → dynamic {
9292
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright (c) 2022, 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+
mixin M1 on Enum {
6+
int mixedInMethod1(int v) => v;
7+
}
8+
9+
enum E with M1 {
10+
e1,
11+
e2,
12+
e3;
13+
}
14+
15+
expectEquals(x, y) {
16+
if (x != y) {
17+
throw "Expected $x to be equal to $y.";
18+
}
19+
}
20+
21+
main() {
22+
expectEquals(E.e1.toString(), "E.e1");
23+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class M1 extends core::Enum /*isMixinDeclaration*/ {
6+
method mixedInMethod1(core::int v) → core::int
7+
return v;
8+
}
9+
abstract class _E&_Enum&M1 = core::_Enum with self::M1 /*isAnonymousMixin,hasConstConstructor*/ {
10+
const synthetic constructor •(core::int index, core::String _name) → self::_E&_Enum&M1
11+
: super core::_Enum::•(index, _name)
12+
;
13+
mixin-super-stub method mixedInMethod1(core::int v) → core::int
14+
return super.{self::M1::mixedInMethod1}(v);
15+
}
16+
class E extends self::_E&_Enum&M1 /*isEnum*/ {
17+
static const field core::List<self::E> values = #C10;
18+
static const field self::E e1 = #C3;
19+
static const field self::E e2 = #C6;
20+
static const field self::E e3 = #C9;
21+
const constructor •(core::int index, core::String name) → self::E
22+
: super self::_E&_Enum&M1::•(index, name)
23+
;
24+
method toString() → core::String
25+
return "E.${this.{core::_Enum::_name}{core::String}}";
26+
}
27+
static method expectEquals(dynamic x, dynamic y) → dynamic {
28+
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
29+
throw "Expected ${x} to be equal to ${y}.";
30+
}
31+
}
32+
static method main() → dynamic {
33+
self::expectEquals(#C3.{self::E::toString}(){() → core::String}, "E.e1");
34+
}
35+
36+
constants {
37+
#C1 = 0
38+
#C2 = "e1"
39+
#C3 = self::E {index:#C1, _name:#C2}
40+
#C4 = 1
41+
#C5 = "e2"
42+
#C6 = self::E {index:#C4, _name:#C5}
43+
#C7 = 2
44+
#C8 = "e3"
45+
#C9 = self::E {index:#C7, _name:#C8}
46+
#C10 = <self::E>[#C3, #C6, #C9]
47+
}
48+
49+
50+
Constructor coverage from constants:
51+
org-dartlang-testcase:///issue48303.dart:
52+
- E. (from org-dartlang-testcase:///issue48303.dart:9:6)
53+
- _E&_Enum&M1. (from org-dartlang-testcase:///issue48303.dart:9:6)
54+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
55+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

0 commit comments

Comments
 (0)