p-hatan/ mirror

pub repository

mirror.p-hatan.com

record_use

0.6.0

The serialization logic and API for the usage recording SDK feature.

Download archive

Readme

[!CAUTION] This is an experimental package. Its API and the underlying JSON format will break as we are actively iterating. Use at your own discretion.

We are continuously changing the implementation, so a released version of the package may only work with one or two dev releases of the Dart SDK. This version will work with the first dev release after 3.12.0-203.0.dev.

This package provides the data classes for the usage recording feature in the Dart SDK.

Dart objects with the @RecordUse() annotation are being recorded at compile time, providing the user with information. The information depends on the object being recorded.

  • If placed on a static method, the annotation means that arguments passed to the method will be recorded, as far as they can be inferred at compile time.
  • If placed on a class, the annotation means that any constant instance of the class and any constructor invocation will be recorded.

[!NOTE] The @RecordUse() annotation is only allowed on definitions within a package's lib/ directory. This includes definitions that are members of a class, such as static methods.

Example

void main() {
  PirateTranslator.speak('Hello');
  print(const PirateShip('Black Pearl', 50));
}

abstract class PirateTranslator {
  @RecordUse()
  static String speak(String english) => 'Ahoy $english';
}

@RecordUse()
final class PirateShip {
  final String name;
  final int cannons;

  const PirateShip(this.name, this.cannons);
}

This code will generate a data file that contains both the field values of the PirateShip instances, as well as the arguments for the speak method annotated with @RecordUse().

This information can then be accessed in a link hook as follows:

void main(List<String> arguments) {
  link(arguments, (input, output) async {
    final usesUri = input.recordedUsagesFile;
    if (usesUri == null) return;
    final usesJson = await File.fromUri(usesUri).readAsString();
    final uses = Recordings.fromJson(
      jsonDecode(usesJson) as Map<String, Object?>,
    );

    final calls = uses.calls[methodId] ?? [];
    for (final call in calls) {
      switch (call) {
        case CallWithArguments(
          positionalArguments: [StringConstant(value: final english), ...],
        ):
          // Shrink a translations file based on all the different translation
          // keys.
          print('Translating to pirate: $english');
        case _:
          print('Cannot determine which translations are used.');
      }
    }

    final ships = uses.instances[classId] ?? [];
    for (final ship in ships) {
      switch (ship) {
        case InstanceConstantReference(
          instanceConstant: InstanceConstant(
            fields: {'name': StringConstant(value: final name)},
          ),
        ):
          // Include the 3d model for this ship in the application but not
          // bundle the other ships.
          print('Pirate ship found: $name');
        case _:
          print('Cannot determine which ships are used.');
      }
    }
  });
}

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

Changelog

0.6.0

  • Breaking Change: Changed the JSON format and Dart API in various ways.

0.5.0

  • Complete reimplementation of the package. The Dart API changed completely, the underlying JSON format changed completely, the internal architecture changed completely to be based on a JSON schema, the format can now express many more recordings, the code samples in the doc comments are now tested and up to date, and many more changes. This is by no means a final version, but will enable people to play with the current state of the implementation.

0.4.2

  • Fix empty instance parsing.

0.4.1

  • Fix bug in signature parsing.

0.4.0

  • Update SDK constraint to ^3.5.0.
  • Rewrite API to expose less symbols.
  • Remove locations for easier caching.

0.3.0

  • Make InstanceConstant a Constant.
  • Separate import from location uri.

0.2.0

  • Use maps instead of lists in serialization.

0.1.1

  • Fix repository link.

0.1.0

  • Initial version.

Installing

export PUB_HOSTED_URL=https://pub.mirror.p-hatan.com
flutter pub add record_use
pubspec.yaml
name: record_use
description: >
  The serialization logic and API for the usage recording SDK feature.
version: 0.6.0
repository: https://github.com/dart-lang/native/tree/main/pkgs/record_use

environment:
  sdk: '>=3.10.0 <4.0.0'

resolution: workspace

dependencies:
  collection: ^1.19.1
  meta: ^1.17.0
  pub_semver: ^2.2.0

dev_dependencies:
  dart_flutter_team_lints: ^3.5.2
  json_schema: ^5.2.2
  json_syntax_generator: ^0.1.0-wip
  native_test_helpers: ^0.1.0-wip
  test: ^1.25.15

Version history

VersionPublishedArchiveSHA-256
0.1.02024-09-06T13:16:07.619797ZDownload3aa9785ab984e967c6ab50bf1b55d18cdea258c2b9a7c0a275bd1cdd0a18ba41
0.2.02024-09-13T08:33:42.350999ZDownloadaa2630e495bf522df65248c2488b4b05790b9356743b41d5b24d39f47f6d6085
0.3.02024-09-13T09:43:31.776788ZDownload7c8e4f5ae82350f12d328e37892ca5874b69ab9393d14210d781ccce2e9a98f6
0.4.02025-05-05T11:25:28.405679ZDownload67febd9224ec96fc73522ffe3037e96a74589f6a11a6c99100b1850f159402b1
0.4.12025-06-24T10:35:55.925846ZDownloade2e0d735e843f81a8ab28572fcff9f30aeb0a5870b6450d4bc6778cbc919c8e8
0.4.22025-09-29T15:03:11.895281ZDownloadd3d59b18ca7aa1ce689bb3b3fd982bbebdfcd9e89f977576486a55e3b0f19a27
0.5.02026-03-06T11:26:11.668488ZDownloadbd4b242e3e16ad772db86581b40b3a5e0d159205211b02acff15974ac6c3b939
0.6.02026-03-25T12:19:08.173499ZDownload2551bd8eecfe95d14ae75f6021ad0248be5c27f138c2ec12fcb52b500b3ba1ed
1.0.02026-07-13T14:23:16.395334ZDownloadaf37186ff9ede46fa32f152526c48f46c5b3ad7d3d5a566140cb5df3dc4ed737
1.1.02026-08-10T09:34:54.558113ZDownload3b4ab682aff40175afca6ff090cc5aa7ce9dafe8dfbae1537a6c678e6678baee
1.1.12026-08-18T07:25:17.066900ZDownload1cb8564af8d43b464294411db9217f5ec04891c6f22ee2c32d73ae05e88a6bd2

Dependencies

collection "^1.19.1"

meta "^1.17.0"

pub_semver "^2.2.0"