Skip to content

Commit fc8e7a2

Browse files
alexmarkovCommit Queue
authored andcommitted
[dyn_modules] Support const constructors in extension types
Such constructors are desugared to top-level Procedures marked as const. TEST=pkg/dynamic_modules/test/data/extension_type2 Change-Id: I131f720249292e77a9ec7010aaefcde550605bd9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/463500 Reviewed-by: Sigmund Cherem <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Alexander Markov <[email protected]>
1 parent a981d46 commit fc8e7a2

File tree

6 files changed

+24
-3
lines changed

6 files changed

+24
-3
lines changed

pkg/dynamic_modules/test/data/extension_type2/main.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import '../../common/testing.dart' as helper;
66
import 'package:expect/expect.dart';
77

88
void main() async {
9-
final result = (await helper.load('entry1.dart')) as int;
10-
Expect.equals(1, result);
9+
final result = (await helper.load('entry1.dart')) as List;
10+
Expect.equals(1, result[0] as int);
11+
Expect.equals(52, (result[1] as int Function(int)).call(10));
12+
Expect.equals(53, (result[2] as int Function(int)).call(10));
1113
helper.done();
1214
}

pkg/dynamic_modules/test/data/extension_type2/modules/entry1.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@
55
import '../shared/shared.dart';
66

77
@pragma('dyn-module:entry-point')
8-
Object? dynamicModuleEntrypoint() => method(value);
8+
Object? dynamicModuleEntrypoint() => [
9+
method(value),
10+
const C.foo42(),
11+
const C.foo43(),
12+
];
913

1014
int method(B b) => b.foo();

pkg/dynamic_modules/test/data/extension_type2/shared/shared.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,10 @@ B get value => B(A());
99
extension type B(A _internal) {
1010
int foo() => 1;
1111
}
12+
13+
extension type const C(int Function(int) raw) {
14+
const C.foo42() : this(_foo42);
15+
const C.foo43() : this(foo43);
16+
}
17+
18+
int _foo42(int x) => x + 42;

pkg/dynamic_modules/test/data/extension_type2/shared/shared_a.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
class A {}
6+
7+
int foo43(int x) => x + 43;

pkg/front_end/lib/src/util/trim.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,8 @@ class Trimmer extends RecursiveVisitor {
212212

213213
@override
214214
void visitProcedure(Procedure node) {
215+
// Keep bodies of const factories.
216+
if (node.isConst) return;
215217
// Preserve method bodies of mixin declarations, these are copied when
216218
// mixins are applied in subtypes.
217219
if (!preserveMemberBodies) {

pkg/vm/lib/transformations/dynamic_interface_annotator.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ class _Annotator extends RecursiveVisitor {
262262
annotateMember(tearOff as Member);
263263
}
264264
}
265+
node.declaredRepresentationType.accept(this);
265266
}
266267
}
267268

@@ -397,6 +398,9 @@ class _ImplicitUsesAnnotator extends RecursiveVisitor {
397398
final target = node.function.redirectingFactoryTarget?.target;
398399
target?.acceptReference(this);
399400
}
401+
if (node.isConst) {
402+
node.visitChildren(this);
403+
}
400404
}
401405

402406
@override

0 commit comments

Comments
 (0)