Files
sdk/pkg/vm/dynamic_interface.md
T
Sigmund Cherem 354b0f8606 [dyn_modules] Support types in a dynamic interface.
This CL adds a new `can-be-used-as-type` section in the dynamic
interface to expose the type of a class or extension type, without
making them callable or exposing their members.

Details:
* add the new section to the documentation
* add support in the TFA transformation to annotate kernel nodes
* add support to the validator to check for proper usage from dynamic modules
* add CFE, transformation, and end2end tests.

The CL ignores DDC and Dart2wasm at the moment and we intend to approve
any failures. It's possible that DDC works due to its modular nature.

BUG=b/488343137
TEST=cfe, annotator, and e2e tests

Change-Id: I900b22b85950f8ac379eabaa2ef58f075e18519c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/486340
Commit-Queue: Sigmund Cherem <sigmund@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2026-03-12 09:46:50 -07:00

4.7 KiB

Dynamic interface specification

This file describes the format of dynamic_interface.yaml file. Dynamic interface specifies classes and members of the host application which can be used, extended, implemented and overridden by a dynamically loaded module.

TODO(alexmarkov) Add a link to dynamic module API.

The dynamic interface yaml file can contain the following sections:

callable:
  - item 1
  ...
  - item N

extendable:
  - item 1
  ...
  - item N

can-be-overridden:
  - item 1
  ...
  - item N

can-be-used-as-type:
  - item 1
  ...
  - item N

callable section specifies members which can be called from dynamic module and classes which can be referenced in types of dynamic module.

extendable section specifies classes which dynamic module can be extend, mix-in or implement.

can-be-overridden section specifies instance members which dynamic module can override.

can-be-used-as-type section specifies classes and extension types which can be used in dynamic module in is checks, as casts, type parameters, or type literals.

Library

  - library: '<library-uri>'

Library item specifies all public classes and members in the given library. Public members of private classes are not included.

Class

  - library: '<library-uri>'
    class: '<class-name>'

Class item specifies given class and all public members of this class.

Extension Type

  - library: '<library-uri>'
    extension_type: '<extension-type-name>'

Extension Type item specifies given extension type and all public members of such extension type.

This item is only allowed in the callable section of the dynamic interface.

Class list

  - library: '<library-uri>'
    class: ['<class-name-1>', ..., 'class-name-N']

Class list item specifies given classes and all public members of these classes.

Extension Type list

  - library: '<library-uri>'
    extension_type: ['<extension-type-name-1>', ..., 'extension-type-name-N']

Extension type list item specifies given extension types and all public members of these.

Library member

  - library: '<library-uri>'
    member: '<member-name>'

Library member item specifies given top-level member in the given library.

Class member

  - library: '<library-uri>'
    class: '<class-name>'
    member: '<member-name>'

Class member item specifies given member of the given class.

Extension Type member

  - library: '<library-uri>'
    extension_type: '<extension-type-name>'
    member: '<member-name>'

Extension type member item specifies given member of the given extension type.

--

Extension

  - library: '<library-uri>'
    extension: '<extension-name>'

Extension item specifies given extension and all public members of such extension.

This item is only allowed in the callable section of the dynamic interface.

--

Extension list

  - library: '<library-uri>'
    extension: ['<extension-name-1>', ..., 'extension-name-N']

Extension list item specifies given extensions and all public members of these.

--

Extension member

  - library: '<library-uri>'
    extension: '<extension-name>'
    member: '<member-name>'

Extension member item specifies given member of the given extension.

--

Example

callable:
  # All public classes and members in `dart:core`.
  - library: 'dart:core'

  # Only `foo` in `package:my_app/dyn_interface.dart`.
  - library: 'package:my_app/dyn_interface.dart'
    member: foo

  # Only `DynInterface.bar` in `package:my_app/dyn_interface.dart`.
  - library: 'package:my_app/dyn_interface.dart'
    class: DynInterface
    member: 'bar'

  # Only `EType.baz` in `package:my_app/dyn_interface.dart`.
  - library: 'package:my_app/dyn_interface.dart'
    extension_type: Etype
    member: 'baz'

extendable:
  # All public classes in `dart:core`.
  - library: 'dart:core'

  # `StatefulWidget` and `StatelessWidget` classes in `package:flutter/src/widgets/framework.dart`.
  - library: 'package:flutter/src/widgets/framework.dart'
    class: ['StatefulWidget', 'StatelessWidget']

can-be-overridden:
  # All public classes and members in `dart:core`.
  - library: 'dart:core'

  # Only `StatelessWidget.build` in `package:flutter/src/widgets/framework.dart`.
  - library: 'package:flutter/src/widgets/framework.dart'
    class: 'StatelessWidget'
    member: 'build'

can-be-used-as-type:
  # All public classes in `dart:core`.
  - library: 'dart:core'

  # `MyClass` in `package:my_app/lib/my_app.dart`.
  - library: 'package:my_app/lib/my_app.dart'
    class: 'MyClass'