Add supertype to enum classes.

TEST= language/enum/enum_test

Change-Id: I83b7fd1c29103c3aa4dc7ad3e41141fb8c62339e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/203564
Commit-Queue: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Lasse R.H. Nielsen 2021-06-25 14:08:16 +00:00 committed by commit-bot@chromium.org
parent 253764ebbb
commit 43cff26365
78 changed files with 233 additions and 90 deletions

View file

@ -4,9 +4,9 @@
### `dart:html`
* [#44319][]: `convertNativeToDart_Dictionary()` now converts objects
recursively, this fixes APIs like MediaStreamTrack.getCapabilities
that convert between Maps and browser Dictionaries.
* [#44319][]: `convertNativeToDart_Dictionary()` now converts objects
recursively, this fixes APIs like MediaStreamTrack.getCapabilities
that convert between Maps and browser Dictionaries.
[44319]: (https://github.com/dart-lang/sdk/issues/44319)
@ -23,6 +23,8 @@
#### `dart:core`
* Introduce `Enum` interface implemented by all `enum` declarations.
* The native `DateTime` class now better handles local time around
daylight saving changes that are not precisely one hour.
(No change on the Web which uses the JavaScript `Date` object.)

View file

@ -24,6 +24,9 @@ class Object {
String toString() => '';
}
/*class: Enum:Enum,Object*/
abstract class Enum {}
/*class: Null:Null,Object*/
class Null {
factory Null._uninstantiable() {

View file

@ -26,6 +26,9 @@ class Object {
String toString() => '';
}
/*class: Enum:Enum,Object*/
abstract class Enum {}
/*class: Null:Null,Object*/
class Null {
factory Null._uninstantiable() {

View file

@ -38,6 +38,7 @@ class double {}
class int {}
class num {}
class Object {}
class Enum {}
class Iterable<E> {}
class Map<K, V> {}
class Null {}

View file

@ -31,6 +31,12 @@ abstract class TypeProvider {
/// Return the type representing the built-in type `dynamic`.
DartType get dynamicType;
/// Return the element representing the built-in type `Enum`.
ClassElement get enumElement;
/// Return the type representing the built-in type `Enum`.
InterfaceType get enumType;
/// Return the type representing the built-in type `Function`.
InterfaceType get functionType;

View file

@ -2668,7 +2668,8 @@ class EnumElementImpl extends AbstractClassElementImpl {
}
@override
List<InterfaceType> get allSupertypes => <InterfaceType>[supertype];
List<InterfaceType> get allSupertypes =>
<InterfaceType>[...interfaces, supertype];
List<FieldElement> get constants {
return fields.where((field) => !field.isSynthetic).toList();
@ -2700,7 +2701,8 @@ class EnumElementImpl extends AbstractClassElementImpl {
bool get hasStaticMember => true;
@override
List<InterfaceType> get interfaces => const <InterfaceType>[];
List<InterfaceType> get interfaces =>
<InterfaceType>[library.typeProvider.enumType];
@override
bool get isAbstract => false;

View file

@ -27,6 +27,7 @@ const Set<String> _nonSubtypableDartAsyncClassNames = {
const Set<String> _nonSubtypableDartCoreClassNames = {
'bool',
'double',
'Enum',
'int',
'Null',
'num',
@ -104,6 +105,7 @@ class TypeProviderImpl extends TypeProviderBase {
ClassElement? _boolElement;
ClassElement? _doubleElement;
ClassElement? _enumElement;
ClassElement? _futureElement;
ClassElement? _futureOrElement;
ClassElement? _intElement;
@ -122,6 +124,7 @@ class TypeProviderImpl extends TypeProviderBase {
InterfaceType? _deprecatedType;
InterfaceType? _doubleType;
InterfaceType? _doubleTypeQuestion;
InterfaceType? _enumType;
InterfaceType? _functionType;
InterfaceType? _futureDynamicType;
InterfaceType? _futureNullType;
@ -151,7 +154,7 @@ class TypeProviderImpl extends TypeProviderBase {
required LibraryElement coreLibrary,
required LibraryElement asyncLibrary,
required bool isNonNullableByDefault,
}) : _coreLibrary = coreLibrary,
}) : _coreLibrary = coreLibrary,
_asyncLibrary = asyncLibrary,
isNonNullableByDefault = isNonNullableByDefault;
@ -219,6 +222,16 @@ class TypeProviderImpl extends TypeProviderBase {
@override
DartType get dynamicType => DynamicTypeImpl.instance;
@override
ClassElement get enumElement {
return _enumElement ??= _getClassElement(_coreLibrary, "Enum");
}
@override
InterfaceType get enumType {
return _enumType ??= _getType(_coreLibrary, "Enum");
}
@override
InterfaceType get functionType {
return _functionType ??= _getType(_coreLibrary, "Function");

View file

@ -523,6 +523,10 @@ class Object {
external dynamic noSuchMethod(Invocation invocation);
}
abstract class Enum {
int get index;
}
abstract class Pattern {
Iterable<Match> allMatches(String string, [int start = 0]);
}

View file

@ -24,7 +24,7 @@ var v = [E1.a, E2.b];
''');
var v = findElement.topVar('v');
assertType(v.type, 'List<Object>');
assertType(v.type, 'List<Enum>');
}
test_isConstantEvaluated() async {

View file

@ -4624,6 +4624,8 @@ library
enum E @5
codeOffset: 0
codeLength: 26
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -9667,6 +9669,8 @@ library
synthetic @-1
enums
enum E @30
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -11764,6 +11768,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -11816,6 +11822,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14445,6 +14453,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14467,6 +14477,8 @@ library
synthetic toString @-1
returnType: String
enum E @19
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14723,6 +14735,8 @@ library
enums
enum E @65
documentationComment: /**\n * Docs\n */
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14758,6 +14772,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14804,6 +14820,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14863,6 +14881,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14894,6 +14914,8 @@ library
definingUnit
enums
enum E1 @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14912,6 +14934,8 @@ library
synthetic toString @-1
returnType: String
enum E2 @20
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -14997,6 +15021,8 @@ library
superKeyword: super @0
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -22565,6 +22591,8 @@ library
definingUnit
enums
enum E @19
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -22634,6 +22662,8 @@ library
returnType: dynamic
enums
enum E @64
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -22707,6 +22737,8 @@ library
staticElement: self::@getter::a
staticType: null
token: a @15
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -24202,6 +24234,8 @@ library
staticElement: self::@getter::foo
staticType: null
token: foo @17
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -25392,6 +25426,8 @@ library
synthetic @-1
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -26873,6 +26909,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -29182,6 +29220,8 @@ library
synthetic @-1
enums
enum E @16
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -29288,6 +29328,8 @@ library
synthetic @-1
enums
enum E @27
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -29328,6 +29370,8 @@ library
synthetic @-1
enums
enum E @42
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -29405,6 +29449,8 @@ library
synthetic @-1
enums
enum E @27
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -29480,6 +29526,8 @@ library
synthetic @-1
enums
enum E @27
interfaces
Enum
fields
synthetic final index @-1
type: int
@ -29623,6 +29671,8 @@ library
definingUnit
enums
enum E @5
interfaces
Enum
fields
synthetic final index @-1
type: int

View file

@ -79,6 +79,8 @@ class EnumBuilder extends SourceClassBuilder {
final NamedTypeBuilder objectType;
final NamedTypeBuilder enumType;
final NamedTypeBuilder listType;
EnumBuilder.internal(
@ -91,6 +93,7 @@ class EnumBuilder extends SourceClassBuilder {
this.intType,
this.listType,
this.objectType,
this.enumType,
this.stringType,
LibraryBuilder parent,
int startCharOffset,
@ -151,6 +154,12 @@ class EnumBuilder extends SourceClassBuilder {
/* arguments = */ null,
/* fileUri = */ null,
/* charOffset = */ null);
NamedTypeBuilder enumType = new NamedTypeBuilder(
"Enum",
const NullabilityBuilder.omitted(),
/* arguments = */ null,
/* fileUri = */ null,
/* charOffset = */ null);
Class cls = new Class(
name: name, reference: referencesFrom?.reference, fileUri: fileUri);
Map<String, MemberBuilder> members = <String, MemberBuilder>{};
@ -393,6 +402,7 @@ class EnumBuilder extends SourceClassBuilder {
intType,
listType,
objectType,
enumType,
stringType,
parent,
startCharOffsetComputed,
@ -429,8 +439,12 @@ class EnumBuilder extends SourceClassBuilder {
coreLibrary.scope, charOffset, fileUri, libraryBuilder);
objectType.resolveIn(
coreLibrary.scope, charOffset, fileUri, libraryBuilder);
enumType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
cls.implementedTypes
.add(enumType.buildSupertype(libraryBuilder, charOffset, fileUri));
SourceFieldBuilder indexFieldBuilder = firstMemberNamed("index");
indexFieldBuilder.build(libraryBuilder);
Field indexField = indexFieldBuilder.field;

View file

@ -8,6 +8,7 @@ const List<String> denylistedCoreClasses = [
"int",
"num",
"double",
"Enum",
"String",
"Null"
];

View file

@ -1578,6 +1578,9 @@ class Object {
bool operator==(dynamic) {}
}
abstract class Enum {
}
class String {}
class Symbol {}

View file

@ -16,7 +16,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<mai::Enum> values = #C4;

View file

@ -17,7 +17,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
abstract class Enum extends core::Object {
abstract class Enum extends core::Object implements core::Enum {
}
class Class extends core::Object {
synthetic constructor •() → mai::Class

View file

@ -16,7 +16,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<mai::Enum> values = #C4;

View file

@ -10,7 +10,7 @@ library /*isNonNullableByDefault*/;
import self as self2;
import "dart:core" as core;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self2::Enum> values = #C4;

View file

@ -17,7 +17,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
abstract class Enum extends core::Object {
abstract class Enum extends core::Object implements core::Enum {
abstract get /*isLegacy*/ index() → core::int;
}
class Class extends core::Object {

View file

@ -5,7 +5,7 @@ import "main_lib.dart" as mai;
import "org-dartlang-testcase:///main_lib.dart";
class UnusedEnum extends core::Object /*isEnum*/ {
class UnusedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::UnusedEnum> values = #C7;
@ -17,7 +17,7 @@ class UnusedEnum extends core::Object /*isEnum*/ {
method toString() → core::String
return this.{self::UnusedEnum::_name}{core::String};
}
class UsedEnum extends core::Object /*isEnum*/ {
class UsedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::UsedEnum> values = #C12;
@ -67,7 +67,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
class ConstEnum extends core::Object /*isEnum*/ {
class ConstEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<mai::ConstEnum> values = #C15;

View file

@ -6,9 +6,9 @@ import "dart:_internal" as _in;
import "org-dartlang-testcase:///main_lib.dart";
abstract class UnusedEnum extends core::Object {
abstract class UnusedEnum extends core::Object implements core::Enum {
}
class UsedEnum extends core::Object /*isEnum*/ {
class UsedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
method toString() → core::String
@ -43,7 +43,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
abstract class ConstEnum extends core::Object {
abstract class ConstEnum extends core::Object implements core::Enum {
}
class ConstClass extends core::Object {
synthetic constructor •() → mai::ConstClass

View file

@ -5,7 +5,7 @@ import "main_lib.dart" as mai;
import "org-dartlang-testcase:///main_lib.dart";
class UnusedEnum extends core::Object /*isEnum*/ {
class UnusedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::UnusedEnum> values = #C7;
@ -17,7 +17,7 @@ class UnusedEnum extends core::Object /*isEnum*/ {
method toString() → core::String
return this.{self::UnusedEnum::_name}{core::String};
}
class UsedEnum extends core::Object /*isEnum*/ {
class UsedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::UsedEnum> values = #C12;
@ -67,7 +67,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
class ConstEnum extends core::Object /*isEnum*/ {
class ConstEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<mai::ConstEnum> values = #C15;

View file

@ -4,7 +4,7 @@ import "dart:core" as core;
import "org-dartlang-testcase:///main_lib.dart";
class UnusedEnum extends core::Object /*isEnum*/ {
class UnusedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::UnusedEnum> values = const <self::UnusedEnum>[self::UnusedEnum::a, self::UnusedEnum::b];
@ -16,7 +16,7 @@ class UnusedEnum extends core::Object /*isEnum*/ {
method toString() → core::String
return this.{self::UnusedEnum::_name}{core::String};
}
class UsedEnum extends core::Object /*isEnum*/ {
class UsedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::UsedEnum> values = const <self::UsedEnum>[self::UsedEnum::unusedValue, self::UsedEnum::usedValue];
@ -55,7 +55,7 @@ library /*isNonNullableByDefault*/;
import self as self2;
import "dart:core" as core;
class ConstEnum extends core::Object /*isEnum*/ {
class ConstEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self2::ConstEnum> values = #C4;

View file

@ -6,9 +6,9 @@ import "dart:_internal" as _in;
import "org-dartlang-testcase:///main_lib.dart";
abstract class UnusedEnum extends core::Object {
abstract class UnusedEnum extends core::Object implements core::Enum {
}
class UsedEnum extends core::Object /*isEnum*/ {
class UsedEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
method toString() → core::String
@ -43,7 +43,7 @@ library /*isNonNullableByDefault*/;
import self as mai;
import "dart:core" as core;
abstract class ConstEnum extends core::Object {
abstract class ConstEnum extends core::Object implements core::Enum {
abstract get /*isLegacy*/ index() → core::int;
}
class ConstClass extends core::Object {

View file

@ -18,7 +18,7 @@ class Fisk<T extends core::Object* = dynamic> extends core::Object /*hasConstCon
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Foo extends core::Object /*isEnum*/ {
class Foo extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Foo*>* values = #C10;

View file

@ -18,7 +18,7 @@ class Fisk<T extends core::Object* = dynamic> extends core::Object /*hasConstCon
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Foo extends core::Object /*isEnum*/ {
class Foo extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Foo*>* values = const <self::Foo*>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];

View file

@ -18,7 +18,7 @@ class Fisk<T extends core::Object* = dynamic> extends core::Object /*hasConstCon
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Foo extends core::Object /*isEnum*/ {
class Foo extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Foo*>* values = #C10;

View file

@ -481,7 +481,7 @@ Try removing the extra positional arguments.
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#4 extends core::Object /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
class Enum#4 extends core::Object implements core::Enum /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#4*>* values = #C4;
@ -501,7 +501,7 @@ class Enum#4 extends core::Object /*isEnum*/ { // from org-dartlang-testcase://
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#3 extends core::Object /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
class Enum#3 extends core::Object implements core::Enum /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#3*>* values = #C12;
@ -523,7 +523,7 @@ class Enum#3 extends core::Object /*isEnum*/ { // from org-dartlang-testcase://
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#2 extends core::Object /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
class Enum#2 extends core::Object implements core::Enum /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#2*>* values = #C17;
@ -545,7 +545,7 @@ class Enum#2 extends core::Object /*isEnum*/ { // from org-dartlang-testcase://
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#1 extends core::Object /*isEnum*/ {
class Enum#1 extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#1*>* values = #C21;
@ -567,7 +567,7 @@ class Enum#1 extends core::Object /*isEnum*/ {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum*>* values = #C25;
@ -589,7 +589,7 @@ class Enum extends core::Object /*isEnum*/ {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class AnotherEnum extends core::Object /*isEnum*/ {
class AnotherEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::AnotherEnum*>* values = #C32;

View file

@ -419,7 +419,7 @@ class Sub extends core::Object {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#4 extends core::Object /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
class Enum#4 extends core::Object implements core::Enum /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#4*>* values = const <self::Enum#4*>[self::Enum#4::a];
@ -439,7 +439,7 @@ class Enum#4 extends core::Object /*isEnum*/ { // from org-dartlang-testcase://
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#3 extends core::Object /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
class Enum#3 extends core::Object implements core::Enum /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#3*>* values = const <self::Enum#3*>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
@ -461,7 +461,7 @@ class Enum#3 extends core::Object /*isEnum*/ { // from org-dartlang-testcase://
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#2 extends core::Object /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
class Enum#2 extends core::Object implements core::Enum /*isEnum*/ { // from org-dartlang-testcase:///duplicated_declarations_part.dart
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#2*>* values = const <self::Enum#2*>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
@ -483,7 +483,7 @@ class Enum#2 extends core::Object /*isEnum*/ { // from org-dartlang-testcase://
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum#1 extends core::Object /*isEnum*/ {
class Enum#1 extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum#1*>* values = const <self::Enum#1*>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
@ -505,7 +505,7 @@ class Enum#1 extends core::Object /*isEnum*/ {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Enum*>* values = const <self::Enum*>[self::Enum::Enum, self::Enum::a, self::Enum::b];
@ -527,7 +527,7 @@ class Enum extends core::Object /*isEnum*/ {
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class AnotherEnum extends core::Object /*isEnum*/ {
class AnotherEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::AnotherEnum*>* values = const <self::AnotherEnum*>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];

View file

@ -3,7 +3,7 @@ import self as self;
import "dart:core" as core;
@#C1
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = #C11;

View file

@ -3,7 +3,7 @@ import self as self;
import "dart:core" as core;
@self::a
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = const <self::E*>[self::E::E1, self::E::E2, self::E::E3];

View file

@ -3,7 +3,7 @@ import self as self;
import "dart:core" as core;
@#C1
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = #C11;

View file

@ -30,7 +30,7 @@ library from "org-dartlang-test:///main.dart" as main {
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C14;

View file

@ -30,7 +30,7 @@ library from "org-dartlang-test:///main.dart" as main {
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C14;

View file

@ -37,7 +37,7 @@ library from "org-dartlang-test:///main.dart" as main {
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C14;

View file

@ -37,7 +37,7 @@ library from "org-dartlang-test:///main.dart" as main {
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C14;

View file

@ -30,7 +30,7 @@ library from "org-dartlang-test:///main.dart" as main {
abstract member-signature method noSuchMethod(dart.core::Invocation* invocation) → dynamic; -> dart.core::Object::noSuchMethod
abstract member-signature get runtimeType() → dart.core::Type*; -> dart.core::Object::runtimeType
}
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C14;

View file

@ -42,7 +42,7 @@ library from "org-dartlang-test:///main.dart" as main {
}
}
@#C1
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C15;

View file

@ -42,7 +42,7 @@ library from "org-dartlang-test:///main.dart" as main {
}
}
@#C1
class CompilationStrategy extends dart.core::Object /*isEnum*/ {
class CompilationStrategy extends dart.core::Object implements dart.core::Enum /*isEnum*/ {
final field dart.core::int* index;
final field dart.core::String* _name;
static const field dart.core::List<main::CompilationStrategy*>* values = #C15;

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = #C4;

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = const <self::E*>[self::E::v1];

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = #C4;

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = #C4;

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = const <self::E*>[self::E::v1];

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::E*>* values = #C4;

View file

@ -58,7 +58,7 @@ import "dart:async" as asy;
import "dart:async";
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -58,7 +58,7 @@ import "dart:async" as asy;
import "dart:async";
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -59,7 +59,7 @@ import "dart:_internal" as _in;
import "dart:async";
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -5,7 +5,7 @@ import "dart:async" as asy;
import "dart:async";
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::a, self::Enum::b];

View file

@ -59,7 +59,7 @@ import "dart:_internal" as _in;
import "dart:async";
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -9,7 +9,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -9,7 +9,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -10,7 +10,7 @@ import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -2,7 +2,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::e1, self::Enum::e2];

View file

@ -10,7 +10,7 @@ import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
class Enum extends core::Object /*isEnum*/ {
class Enum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::Enum> values = #C7;

View file

@ -428,7 +428,7 @@ class OptInClass6b extends core::Object {
: uns::OptInClass6b::field = field, super core::Object::•()
;
}
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<uns::E> values = #C8;

View file

@ -201,7 +201,7 @@ class OptInClass6b extends core::Object {
constructor •(core::int field) → self2::OptInClass6b
;
}
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self2::E> values = const <self2::E>[self2::E::e1, self2::E::e2];

View file

@ -428,7 +428,7 @@ class OptInClass6b extends core::Object {
: uns::OptInClass6b::field = field, super core::Object::•()
;
}
class E extends core::Object /*isEnum*/ {
class E extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<uns::E> values = #C8;

View file

@ -2,7 +2,7 @@ library;
import self as self;
import "dart:core" as core;
class Foo extends core::Object /*isEnum*/ {
class Foo extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Foo*>* values = #C7;

View file

@ -2,7 +2,7 @@ library;
import self as self;
import "dart:core" as core;
class Foo extends core::Object /*isEnum*/ {
class Foo extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Foo*>* values = const <self::Foo*>[self::Foo::ec1, self::Foo::ec2];

View file

@ -2,7 +2,7 @@ library;
import self as self;
import "dart:core" as core;
class Foo extends core::Object /*isEnum*/ {
class Foo extends core::Object implements core::Enum /*isEnum*/ {
final field core::int* index;
final field core::String* _name;
static const field core::List<self::Foo*>* values = #C7;

View file

@ -2,7 +2,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object /*isEnum*/ {
class A extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::A> values = #C7;

View file

@ -2,7 +2,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object /*isEnum*/ {
class A extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::A> values = #C7;

View file

@ -2,7 +2,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object /*isEnum*/ {
class A extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::A> values = #C7;

View file

@ -2,7 +2,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object /*isEnum*/ {
class A extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::A> values = const <self::A>[self::A::a, self::A::b];

View file

@ -2,7 +2,7 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object /*isEnum*/ {
class A extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::A> values = #C7;

View file

@ -19,7 +19,7 @@ class Foo extends core::Object implements self::IFoo {
method toString() → core::String
return "I am a Foo";
}
class FooEnum extends core::Object /*isEnum*/ {
class FooEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::FooEnum> values = #C11;

View file

@ -19,7 +19,7 @@ class Foo extends core::Object implements self::IFoo {
method toString() → core::String
return super.toString();
}
class FooEnum extends core::Object /*isEnum*/ {
class FooEnum extends core::Object implements core::Enum /*isEnum*/ {
final field core::int index;
final field core::String _name;
static const field core::List<self::FooEnum> values = #C11;

View file

@ -11,7 +11,7 @@ class A extends core::Object {
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:2,getterSelectorId:3] method getBar() → core::String*
return "bar";
}
class B extends core::Object /*isEnum*/ {
class B extends core::Object implements core::Enum /*isEnum*/ {
[@vm.inferred-type.metadata=dart.core::_Smi (value: 1)] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:4] [@vm.unboxing-info.metadata=()->i] final field core::int* index;
[@vm.inferred-type.metadata=dart.core::_OneByteString (value: "B.b2")] [@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:5] final field core::String* _name;
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:6,getterSelectorId:7] method toString() → core::String*

View file

@ -3,7 +3,7 @@ import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;
abstract class Enum extends core::Object {
abstract class Enum extends core::Object implements core::Enum {
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,getterSelectorId:1] abstract get index() → core::int*;
}
class Class extends core::Object {

View file

@ -2,7 +2,7 @@ library #lib /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
abstract class A extends core::Object {
abstract class A extends core::Object implements core::Enum {
}
abstract class B extends core::Object {
[@vm.procedure-attributes.metadata=methodOrSetterCalledDynamically:false,getterCalledDynamically:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false,methodOrSetterSelectorId:1,getterSelectorId:2] abstract method foo() → void;

View file

@ -178,6 +178,7 @@ part "comparable.dart";
part "date_time.dart";
part "double.dart";
part "duration.dart";
part "enum.dart";
part "errors.dart";
part "exceptions.dart";
part "expando.dart";

View file

@ -13,6 +13,7 @@ core_sdk_sources = [
"date_time.dart",
"double.dart",
"duration.dart",
"enum.dart",
"errors.dart",
"exceptions.dart",
"expando.dart",

23
sdk/lib/core/enum.dart Normal file
View file

@ -0,0 +1,23 @@
// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of dart.core;
/// An enumerated value.
///
/// This class is implemented by all types and values
/// introduced using an `enum` declaration.
/// Non-platform classes cannot implement, extend or
/// mix in this class.
@Since("2.14")
abstract class Enum {
/// A numeric identifier for the enumerated value.
///
/// The values of a single enumeration are numbered
/// consecutively from zero to one less than the
/// number of values.
/// This is also the index of the value in the
/// enumerated type's static `values` list.
int get index;
}

View file

@ -88,6 +88,11 @@ main() {
expectIs(value, (e) => e is JSFunctionPrototype);
}
Expect.equals(JSFunctionPrototype.length, JSFunctionPrototype.values[0]);
// Enums implement Enum.
Expect.type<Enum>(Enum1._);
Enum enumValue = Enum1._;
Expect.equals(0, enumValue.index);
}
test1(Enum1 e) {

View file

@ -4,11 +4,12 @@
enum E1 { a, b }
enum E2 { a, b }
enum E3 { a, b }
var v = [E1.a, E2.b];
main() {
// Test that v is `List<Object>`, so any of these assignemnts are OK.
v[0] = 0;
v[1] = '1';
// Test that v is `List<Enum>`, so these assignments are OK.
v[0] = E3.a;
List<Enum> w = v;
}

View file

@ -90,6 +90,11 @@ main() {
expectIs(value, (e) => e is JSFunctionPrototype);
}
Expect.equals(JSFunctionPrototype.length, JSFunctionPrototype.values[0]);
// Enums implement Enum.
Expect.type<Enum>(Enum1._);
Enum enumValue = Enum1._;
Expect.equals(0, enumValue.index);
}
test1(Enum1 e) {

View file

@ -6,11 +6,12 @@
enum E1 { a, b }
enum E2 { a, b }
enum E3 { a, b }
var v = [E1.a, E2.b];
main() {
// Test that v is `List<Object>`, so any of these assignemnts are OK.
v[0] = 0;
v[1] = '1';
// Test that v is `List<Enum>`, so these assignments are OK.
v[0] = E3.a;
List<Enum> w = v;
}

View file

@ -50,6 +50,10 @@ import 'dart:_internal' as internal;
static var nan = 0;
static parse(s) {}
}''',
'Enum': r'''
abstract class Enum {
int get index;
}''',
'Function': r'''
class Function {
static apply(Function fn, List positional, [Map named]) => null;