Skip to content

Commit 72aa281

Browse files
author
Dart CI
committed
Version 2.17.0-27.0.dev
Merge commit 'df0f4761773fba9b21ff47ad3863145f73fa366e' into 'dev'
2 parents df69303 + df0f476 commit 72aa281

29 files changed

+1312
-6
lines changed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2806,6 +2806,30 @@ const MessageCode messageEnumInstantiation = const MessageCode(
28062806
analyzerCodes: <String>["INSTANTIATE_ENUM"],
28072807
problemMessage: r"""Enums can't be instantiated.""");
28082808

2809+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2810+
const Template<Message Function(String name)>
2811+
templateEnumSupertypeOfNonAbstractClass =
2812+
const Template<Message Function(String name)>(
2813+
problemMessageTemplate:
2814+
r"""Non-abstract class '#name' has 'Enum' as a superinterface.""",
2815+
withArguments: _withArgumentsEnumSupertypeOfNonAbstractClass);
2816+
2817+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2818+
const Code<Message Function(String name)> codeEnumSupertypeOfNonAbstractClass =
2819+
const Code<Message Function(String name)>(
2820+
"EnumSupertypeOfNonAbstractClass",
2821+
);
2822+
2823+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2824+
Message _withArgumentsEnumSupertypeOfNonAbstractClass(String name) {
2825+
if (name.isEmpty) throw 'No name provided';
2826+
name = demangleMixinApplicationName(name);
2827+
return new Message(codeEnumSupertypeOfNonAbstractClass,
2828+
problemMessage:
2829+
"""Non-abstract class '${name}' has 'Enum' as a superinterface.""",
2830+
arguments: {'name': name});
2831+
}
2832+
28092833
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
28102834
const Code<Null> codeEqualityCannotBeEqualityOperand =
28112835
messageEqualityCannotBeEqualityOperand;

pkg/front_end/lib/src/fasta/denylisted_classes.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ const List<String> denylistedCoreClasses = [
88
"int",
99
"num",
1010
"double",
11-
"Enum",
1211
"String",
1312
"Null"
1413
];

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

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,8 @@ severity: $severity
16481648
denylistedCoreClasses[i],
16491649
required: true) as ClassBuilder);
16501650
}
1651+
ClassBuilder enumClass =
1652+
coreLibrary.lookupLocalMember("Enum", required: true) as ClassBuilder;
16511653
if (typedDataLibrary != null) {
16521654
for (int i = 0; i < denylistedTypedDataClasses.length; i++) {
16531655
// Allow the member to not exist. If it doesn't, nobody can extend it.
@@ -1664,8 +1666,8 @@ severity: $severity
16641666
topologicalSort(classGraph);
16651667
List<SourceClassBuilder> classes = result.sortedVertices;
16661668
for (SourceClassBuilder cls in classes) {
1667-
checkClassSupertypes(
1668-
cls, classGraph.directSupertypeMap[cls]!, denyListedClasses);
1669+
checkClassSupertypes(cls, classGraph.directSupertypeMap[cls]!,
1670+
denyListedClasses, enumClass);
16691671
}
16701672

16711673
List<SourceClassBuilder> classesWithCycles = result.cyclicVertices;
@@ -1708,10 +1710,30 @@ severity: $severity
17081710
}
17091711
}
17101712

1713+
bool checkEnumSupertypeIsDenylisted(SourceClassBuilder cls) {
1714+
if (!cls.library.enableEnhancedEnumsInLibrary) {
1715+
cls.addProblem(
1716+
templateExperimentNotEnabled.withArguments('enhanced-enums',
1717+
cls.library.enableEnhancedEnumsVersionInLibrary.toText()),
1718+
cls.charOffset,
1719+
noLength);
1720+
return true;
1721+
} else {
1722+
if (!cls.isAbstract) {
1723+
cls.addProblem(
1724+
templateEnumSupertypeOfNonAbstractClass.withArguments(cls.name),
1725+
cls.charOffset,
1726+
noLength);
1727+
}
1728+
return false;
1729+
}
1730+
}
1731+
17111732
void checkClassSupertypes(
17121733
SourceClassBuilder cls,
17131734
Map<TypeDeclarationBuilder?, TypeAliasBuilder?> directSupertypeMap,
1714-
Set<ClassBuilder> denyListedClasses) {
1735+
Set<ClassBuilder> denyListedClasses,
1736+
ClassBuilder enumClass) {
17151737
// Check that the direct supertypes aren't deny-listed or enums.
17161738
List<TypeDeclarationBuilder?> directSupertypes =
17171739
directSupertypeMap.keys.toList();
@@ -1721,7 +1743,9 @@ severity: $severity
17211743
cls.addProblem(templateExtendingEnum.withArguments(supertype.name),
17221744
cls.charOffset, noLength);
17231745
} else if (!cls.library.mayImplementRestrictedTypes &&
1724-
denyListedClasses.contains(supertype)) {
1746+
(denyListedClasses.contains(supertype) ||
1747+
identical(supertype, enumClass) &&
1748+
checkEnumSupertypeIsDenylisted(cls))) {
17251749
TypeAliasBuilder? aliasBuilder = directSupertypeMap[supertype];
17261750
if (aliasBuilder != null) {
17271751
cls.addProblem(

pkg/front_end/messages.status

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ EnumDeclaresConstFactory/example: Fail
218218
EnumDeclaresFactory/analyzerCode: Fail
219219
EnumDeclaresFactory/example: Fail
220220
EnumInstantiation/example: Fail
221+
EnumSupertypeOfNonAbstractClass/analyzerCode: Fail
222+
EnumSupertypeOfNonAbstractClass/example: Fail
221223
EqualityCannotBeEqualityOperand/part_wrapped_script1: Fail
222224
EqualityCannotBeEqualityOperand/part_wrapped_script2: Fail
223225
EqualityCannotBeEqualityOperand/script1: Fail

pkg/front_end/messages.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5455,3 +5455,6 @@ PositionalSuperParametersAndArguments:
54555455
SuperInitializerParameter:
54565456
problemMessage: "This is the super-initializer parameter."
54575457
severity: CONTEXT
5458+
5459+
EnumSupertypeOfNonAbstractClass:
5460+
problemMessage: "Non-abstract class '#name' has 'Enum' as a superinterface."

pkg/front_end/test/spell_checking_list_messages.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ stringokempty
7575
struct<#name
7676
structs
7777
super.namedconstructor
78+
superinterface
7879
supermixin
7980
team
8081
this.namedconstructor

pkg/front_end/test/spell_checking_list_tests.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,9 @@ dw
321321
dyn
322322
e's
323323
e2e
324+
ea
324325
ease
326+
eb
325327
ec
326328
echo
327329
edits
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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+
abstract class A extends Enum { // Ok.
6+
int get foo => index;
7+
}
8+
9+
enum EA with A { element }
10+
11+
abstract class B implements Enum { // Ok.
12+
int get foo => index;
13+
}
14+
15+
enum EB with B { element }
16+
17+
mixin M on Enum { // Ok.
18+
int get foo => index;
19+
}
20+
21+
enum EM with M { element }
22+
23+
mixin N implements Enum { // Ok.
24+
int get foo => index;
25+
}
26+
27+
enum EN with N { element }
28+
29+
expectEquals(x, y) {
30+
if (x != y) {
31+
throw "Expected '$x' to be equal to '$y'.";
32+
}
33+
}
34+
35+
main() {
36+
expectEquals(EA.element.foo, EA.element.index);
37+
expectEquals(EB.element.foo, EB.element.index);
38+
expectEquals(EM.element.foo, EM.element.index);
39+
expectEquals(EN.element.foo, EN.element.index);
40+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
abstract class A extends core::Enum {
6+
synthetic constructor •() → self::A
7+
: super core::Enum::•()
8+
;
9+
get foo() → core::int
10+
return this.{core::Enum::index}{core::int};
11+
}
12+
abstract class _EA&_Enum&A = core::_Enum with self::A /*isAnonymousMixin,hasConstConstructor*/ {
13+
const synthetic constructor •(core::int index, core::String _name) → self::_EA&_Enum&A
14+
: super core::_Enum::•(index, _name)
15+
;
16+
mixin-super-stub get foo() → core::int
17+
return super.{self::A::foo};
18+
}
19+
class EA extends self::_EA&_Enum&A /*isEnum*/ {
20+
static const field core::List<self::EA> values = #C4;
21+
static const field self::EA element = #C3;
22+
const constructor •(core::int index, core::String name) → self::EA
23+
: super self::_EA&_Enum&A::•(index, name)
24+
;
25+
method toString() → core::String
26+
;
27+
}
28+
abstract class B extends core::Object implements core::Enum {
29+
synthetic constructor •() → self::B
30+
: super core::Object::•()
31+
;
32+
get foo() → core::int
33+
return this.{core::Enum::index}{core::int};
34+
}
35+
abstract class _EB&_Enum&B = core::_Enum with self::B /*isAnonymousMixin,hasConstConstructor*/ {
36+
const synthetic constructor •(core::int index, core::String _name) → self::_EB&_Enum&B
37+
: super core::_Enum::•(index, _name)
38+
;
39+
mixin-super-stub get foo() → core::int
40+
return super.{self::B::foo};
41+
}
42+
class EB extends self::_EB&_Enum&B /*isEnum*/ {
43+
static const field core::List<self::EB> values = #C6;
44+
static const field self::EB element = #C5;
45+
const constructor •(core::int index, core::String name) → self::EB
46+
: super self::_EB&_Enum&B::•(index, name)
47+
;
48+
method toString() → core::String
49+
;
50+
}
51+
abstract class M extends core::Enum /*isMixinDeclaration*/ {
52+
get foo() → core::int
53+
return this.{core::Enum::index}{core::int};
54+
}
55+
abstract class _EM&_Enum&M = core::_Enum with self::M /*isAnonymousMixin,hasConstConstructor*/ {
56+
const synthetic constructor •(core::int index, core::String _name) → self::_EM&_Enum&M
57+
: super core::_Enum::•(index, _name)
58+
;
59+
mixin-super-stub get foo() → core::int
60+
return super.{self::M::foo};
61+
}
62+
class EM extends self::_EM&_Enum&M /*isEnum*/ {
63+
static const field core::List<self::EM> values = #C8;
64+
static const field self::EM element = #C7;
65+
const constructor •(core::int index, core::String name) → self::EM
66+
: super self::_EM&_Enum&M::•(index, name)
67+
;
68+
method toString() → core::String
69+
;
70+
}
71+
abstract class N extends core::Object implements core::Enum /*isMixinDeclaration*/ {
72+
get foo() → core::int
73+
return this.{core::Enum::index}{core::int};
74+
}
75+
abstract class _EN&_Enum&N = core::_Enum with self::N /*isAnonymousMixin,hasConstConstructor*/ {
76+
const synthetic constructor •(core::int index, core::String _name) → self::_EN&_Enum&N
77+
: super core::_Enum::•(index, _name)
78+
;
79+
mixin-super-stub get foo() → core::int
80+
return super.{self::N::foo};
81+
}
82+
class EN extends self::_EN&_Enum&N /*isEnum*/ {
83+
static const field core::List<self::EN> values = #C10;
84+
static const field self::EN element = #C9;
85+
const constructor •(core::int index, core::String name) → self::EN
86+
: super self::_EN&_Enum&N::•(index, name)
87+
;
88+
method toString() → core::String
89+
;
90+
}
91+
static method expectEquals(dynamic x, dynamic y) → dynamic {
92+
if(!(x =={core::Object::==}{(core::Object) → core::bool} y)) {
93+
throw "Expected '${x}' to be equal to '${y}'.";
94+
}
95+
}
96+
static method main() → dynamic {
97+
self::expectEquals(#C3.{self::_EA&_Enum&A::foo}{core::int}, #C3.{core::_Enum::index}{core::int});
98+
self::expectEquals(#C5.{self::_EB&_Enum&B::foo}{core::int}, #C5.{core::_Enum::index}{core::int});
99+
self::expectEquals(#C7.{self::_EM&_Enum&M::foo}{core::int}, #C7.{core::_Enum::index}{core::int});
100+
self::expectEquals(#C9.{self::_EN&_Enum&N::foo}{core::int}, #C9.{core::_Enum::index}{core::int});
101+
}
102+
103+
constants {
104+
#C1 = 0
105+
#C2 = "element"
106+
#C3 = self::EA {index:#C1, _name:#C2}
107+
#C4 = <self::EA>[#C3]
108+
#C5 = self::EB {index:#C1, _name:#C2}
109+
#C6 = <self::EB>[#C5]
110+
#C7 = self::EM {index:#C1, _name:#C2}
111+
#C8 = <self::EM>[#C7]
112+
#C9 = self::EN {index:#C1, _name:#C2}
113+
#C10 = <self::EN>[#C9]
114+
}
115+
116+
117+
Constructor coverage from constants:
118+
org-dartlang-testcase:///enum_as_supertype.dart:
119+
- EA. (from org-dartlang-testcase:///enum_as_supertype.dart:9:6)
120+
- _EA&_Enum&A. (from org-dartlang-testcase:///enum_as_supertype.dart:9:6)
121+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
122+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
123+
- EB. (from org-dartlang-testcase:///enum_as_supertype.dart:15:6)
124+
- _EB&_Enum&B. (from org-dartlang-testcase:///enum_as_supertype.dart:15:6)
125+
- EM. (from org-dartlang-testcase:///enum_as_supertype.dart:21:6)
126+
- _EM&_Enum&M. (from org-dartlang-testcase:///enum_as_supertype.dart:21:6)
127+
- EN. (from org-dartlang-testcase:///enum_as_supertype.dart:27:6)
128+
- _EN&_Enum&N. (from org-dartlang-testcase:///enum_as_supertype.dart:27:6)

0 commit comments

Comments
 (0)