Skip to content

Commit dd3705d

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[cfe] Allow extension types implement Object
This is a prerequisite to the implementation of dart-lang/language#3434 Closes #53840 Part of #49731 Change-Id: Ib3bb5961cd8c4919cbc8c8ba37ac4d76fb72a3de Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/333000 Commit-Queue: Chloe Stefantsova <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent e2aa60d commit dd3705d

17 files changed

+1944
-33
lines changed

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,7 @@ class SourceExtensionTypeDeclarationBuilder
201201
}
202202
} else {
203203
Class cls = interface.classNode;
204-
if (LibraryBuilder.isObject(cls, coreLibrary) ||
205-
LibraryBuilder.isFunction(cls, coreLibrary) ||
204+
if (LibraryBuilder.isFunction(cls, coreLibrary) ||
206205
LibraryBuilder.isRecord(cls, coreLibrary)) {
207206
if (aliasBuilder != null) {
208207
errorMessage =

pkg/front_end/testcases/extension_types/implement_all.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ extension type ET_Void(Null it) implements void /* Error */ {}
3434

3535
extension type ET_Never(Never it) implements Never /* Error */ {}
3636

37-
extension type ET_Object(Object it) implements Object /* Error */ {}
37+
extension type ET_Object(Object it) implements Object /* Ok */ {}
3838

3939
extension type ET_Record(Record it) implements Record /* Error */ {}
4040

pkg/front_end/testcases/extension_types/implement_all.dart.strong.expect

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ library;
3535
// extension type ET_Never(Never it) implements Never /* Error */ {}
3636
// ^^
3737
//
38-
// pkg/front_end/testcases/extension_types/implement_all.dart:37:48: Error: The type 'Object' can't be implemented by an extension type.
39-
// extension type ET_Object(Object it) implements Object /* Error */ {}
40-
// ^
41-
//
4238
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
4339
// extension type ET_Record(Record it) implements Record /* Error */ {}
4440
// ^
@@ -140,7 +136,7 @@ extension type ET_Never(invalid-type it) {
140136
constructor • = self::ET_Never|constructor#;
141137
constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
142138
}
143-
extension type ET_Object(core::Object it) {
139+
extension type ET_Object(core::Object it) implements core::Object {
144140
abstract inline-class-member representation-field get it() → core::Object;
145141
constructor • = self::ET_Object|constructor#;
146142
constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;

pkg/front_end/testcases/extension_types/implement_all.dart.strong.transformed.expect

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ library;
3535
// extension type ET_Never(Never it) implements Never /* Error */ {}
3636
// ^^
3737
//
38-
// pkg/front_end/testcases/extension_types/implement_all.dart:37:48: Error: The type 'Object' can't be implemented by an extension type.
39-
// extension type ET_Object(Object it) implements Object /* Error */ {}
40-
// ^
41-
//
4238
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
4339
// extension type ET_Record(Record it) implements Record /* Error */ {}
4440
// ^
@@ -140,7 +136,7 @@ extension type ET_Never(invalid-type it) {
140136
constructor • = self::ET_Never|constructor#;
141137
constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
142138
}
143-
extension type ET_Object(core::Object it) {
139+
extension type ET_Object(core::Object it) implements core::Object {
144140
abstract inline-class-member representation-field get it() → core::Object;
145141
constructor • = self::ET_Object|constructor#;
146142
constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;

pkg/front_end/testcases/extension_types/implement_all.dart.weak.expect

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ library;
3535
// extension type ET_Never(Never it) implements Never /* Error */ {}
3636
// ^^
3737
//
38-
// pkg/front_end/testcases/extension_types/implement_all.dart:37:48: Error: The type 'Object' can't be implemented by an extension type.
39-
// extension type ET_Object(Object it) implements Object /* Error */ {}
40-
// ^
41-
//
4238
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
4339
// extension type ET_Record(Record it) implements Record /* Error */ {}
4440
// ^
@@ -140,7 +136,7 @@ extension type ET_Never(invalid-type it) {
140136
constructor • = self::ET_Never|constructor#;
141137
constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
142138
}
143-
extension type ET_Object(core::Object it) {
139+
extension type ET_Object(core::Object it) implements core::Object {
144140
abstract inline-class-member representation-field get it() → core::Object;
145141
constructor • = self::ET_Object|constructor#;
146142
constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;

pkg/front_end/testcases/extension_types/implement_all.dart.weak.modular.expect

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ library;
3535
// extension type ET_Never(Never it) implements Never /* Error */ {}
3636
// ^^
3737
//
38-
// pkg/front_end/testcases/extension_types/implement_all.dart:37:48: Error: The type 'Object' can't be implemented by an extension type.
39-
// extension type ET_Object(Object it) implements Object /* Error */ {}
40-
// ^
41-
//
4238
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
4339
// extension type ET_Record(Record it) implements Record /* Error */ {}
4440
// ^
@@ -140,7 +136,7 @@ extension type ET_Never(invalid-type it) {
140136
constructor • = self::ET_Never|constructor#;
141137
constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
142138
}
143-
extension type ET_Object(core::Object it) {
139+
extension type ET_Object(core::Object it) implements core::Object {
144140
abstract inline-class-member representation-field get it() → core::Object;
145141
constructor • = self::ET_Object|constructor#;
146142
constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;

pkg/front_end/testcases/extension_types/implement_all.dart.weak.outline.expect

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ library;
3535
// extension type ET_Never(Never it) implements Never /* Error */ {}
3636
// ^^
3737
//
38-
// pkg/front_end/testcases/extension_types/implement_all.dart:37:48: Error: The type 'Object' can't be implemented by an extension type.
39-
// extension type ET_Object(Object it) implements Object /* Error */ {}
40-
// ^
41-
//
4238
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
4339
// extension type ET_Record(Record it) implements Record /* Error */ {}
4440
// ^
@@ -138,7 +134,7 @@ extension type ET_Never(invalid-type it) {
138134
constructor • = self::ET_Never|constructor#;
139135
constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
140136
}
141-
extension type ET_Object(core::Object it) {
137+
extension type ET_Object(core::Object it) implements core::Object {
142138
abstract inline-class-member representation-field get it() → core::Object;
143139
constructor • = self::ET_Object|constructor#;
144140
constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;

pkg/front_end/testcases/extension_types/implement_all.dart.weak.transformed.expect

+1-5
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ library;
3535
// extension type ET_Never(Never it) implements Never /* Error */ {}
3636
// ^^
3737
//
38-
// pkg/front_end/testcases/extension_types/implement_all.dart:37:48: Error: The type 'Object' can't be implemented by an extension type.
39-
// extension type ET_Object(Object it) implements Object /* Error */ {}
40-
// ^
41-
//
4238
// pkg/front_end/testcases/extension_types/implement_all.dart:39:48: Error: The type 'Record' can't be implemented by an extension type.
4339
// extension type ET_Record(Record it) implements Record /* Error */ {}
4440
// ^
@@ -140,7 +136,7 @@ extension type ET_Never(invalid-type it) {
140136
constructor • = self::ET_Never|constructor#;
141137
constructor tearoff • = self::ET_Never|constructor#_#new#tearOff;
142138
}
143-
extension type ET_Object(core::Object it) {
139+
extension type ET_Object(core::Object it) implements core::Object {
144140
abstract inline-class-member representation-field get it() → core::Object;
145141
constructor • = self::ET_Object|constructor#;
146142
constructor tearoff • = self::ET_Object|constructor#_#new#tearOff;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) 2023, 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+
import 'dart:async';
6+
7+
class A {}
8+
9+
mixin M on A {}
10+
11+
enum En {
12+
element;
13+
}
14+
15+
extension type E1(num it) implements Object {} // Ok.
16+
extension type E2(E1 it) implements Object {} // Ok.
17+
extension type E3(String? it) implements Object {} // Error.
18+
extension type E4(E3 it) implements Object {} // Error.
19+
20+
extension type E5(Null it) implements void {} // Error.
21+
extension type E6(Null it) implements dynamic {} // Error.
22+
extension type E7(Null it) implements double? {} // Error.
23+
extension type E8(bool it) implements FutureOr<bool> {} // Error.
24+
extension type E9<X>(X it) implements FutureOr<X> {} // Error.
25+
extension type E10(void Function(int) it) implements Function {} // Error.
26+
extension type E11(String Function() it) implements String Function() {} // Error.
27+
extension type E12((int, Object?) it) implements Record {} // Error.
28+
extension type E13((Null, num) it) implements (Null, num) {} // Error.
29+
extension type E14(Null it) implements Null {} // Error.
30+
extension type E15<X>(X it) implements Never {} // Error.
31+
extension type E16(Null it) implements Never {} // Error.
32+
33+
extension type E17(A a) implements A {} // Ok.
34+
extension type E18(M m) implements M {} // Ok.
35+
extension type E19(En en) implements En {} // Ok.

0 commit comments

Comments
 (0)