Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Swiftgen prototype and example #1367

Draft
wants to merge 44 commits into
base: main
Choose a base branch
from
Draft

WIP: Swiftgen prototype and example #1367

wants to merge 44 commits into from

Conversation

liamappelbe
Copy link
Contributor

@liamappelbe liamappelbe commented Jul 22, 2024

This is a prototype of swiftgen, and an example program that uses the Swift AVAudioPlayer API to play some audio from Dart.

example/generate_code.dart uses swiftgen to generate Dart bindings like this:

await generate(Config(
  target: Target(
    triple: 'x86_64-apple-macosx14.0',
    sdk: Uri.directory(
        '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk'),
  ),
  input: SwiftModuleInput(module: 'AVFAudio'),
  tempDir: Uri.directory('temp'),
  outputModule: 'AVFAudioWrapper',
  objcSwiftFile: Uri.file('avf_audio_wrapper.swift'),
  ffigen: FfiGenConfig(
    output: Uri.file('avf_audio_bindings.dart'),
    outputObjC: Uri.file('avf_audio_wrapper.m'),
    externalVersions: ffigen.ExternalVersions(
      ios: ffigen.Versions(min: Version(12, 0, 0)),
      macos: ffigen.Versions(min: Version(10, 14, 0)),
    ),
    objcInterfaces: ffigen.DeclarationFilters(
      shouldInclude: (decl) => decl.originalName == 'AVAudioPlayerWrapper',
    ),
  ),
));

Then example/play_audio.dart uses the generated Dart bindings to play audio:

for (final file in args) {
  final fileStr = NSString(file);
  print('Loading $fileStr');
  final fileUrl = NSURL.fileURLWithPath_(fileStr);
  final player = AVAudioPlayerWrapper.alloc()
      .initWithContentsOf_error_(fileUrl, nullptr);
  if (player == null) {
    print('Failed to load audio');
    continue;
  }
  final durationSeconds = player.duration.ceil();
  print('$durationSeconds sec');
  final status = player.play();
  if (status) {
    print('Playing...');
    await Future<void>.delayed(Duration(seconds: durationSeconds));
  } else {
    print('Failed to play audio.');
  }
}

There are a few remaining hacks to iron out, due to #1775 and #1774.

@github-actions github-actions bot added type-infra A repository infrastructure change or enhancement package:swiftgen labels Jul 22, 2024
@github-actions github-actions bot removed the type-infra A repository infrastructure change or enhancement label Jul 22, 2024
Copy link

github-actions bot commented Aug 6, 2024

PR Health

Changelog Entry
Package Changed Files
package:ffigen pkgs/ffigen/lib/ffigen.dart
pkgs/ffigen/lib/src/code_generator/pointer.dart
pkgs/ffigen/lib/src/config_provider.dart
pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart
package:swift2objc pkgs/swift2objc/lib/src/ast/declarations/built_in/built_in_declaration.dart
pkgs/swift2objc/lib/src/config.dart
pkgs/swift2objc/lib/src/parser/parsers/declaration_parsers/parse_compound_declaration.dart
pkgs/swift2objc/lib/src/parser/parsers/parse_type.dart
package:swiftgen pkgs/swiftgen/bin/swiftgen.dart
pkgs/swiftgen/lib/src/config.dart
pkgs/swiftgen/lib/src/generator.dart
pkgs/swiftgen/lib/src/util.dart
pkgs/swiftgen/lib/swiftgen.dart
pkgs/swiftgen/pubspec.yaml

Changes to files need to be accounted for in their respective changelogs.

This check can be disabled by tagging the PR with skip-changelog-check.

Coverage ⚠️
File Coverage
pkgs/ffigen/lib/ffigen.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/pointer.dart 💔 Not covered
pkgs/ffigen/lib/src/config_provider.dart 💔 Not covered
pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart 💔 Not covered
pkgs/swift2objc/lib/src/ast/declarations/built_in/built_in_declaration.dart 💚 38 %
pkgs/swift2objc/lib/src/config.dart 💚 59 %
pkgs/swift2objc/lib/src/parser/parsers/declaration_parsers/parse_compound_declaration.dart 💚 100 %
pkgs/swift2objc/lib/src/parser/parsers/parse_type.dart 💚 88 %
pkgs/swiftgen/bin/swiftgen.dart 💔 Not covered
pkgs/swiftgen/example/avf_audio_bindings.dart 💔 Not covered
pkgs/swiftgen/example/generate_code.dart 💔 Not covered
pkgs/swiftgen/example/play_audio.dart 💔 Not covered
pkgs/swiftgen/lib/src/config.dart 💔 Not covered
pkgs/swiftgen/lib/src/generator.dart 💔 Not covered
pkgs/swiftgen/lib/src/util.dart 💔 Not covered
pkgs/swiftgen/lib/swiftgen.dart 💔 Not covered
pkgs/swiftgen/tool/regen_test_bindings.dart 💔 Not covered

This check for test coverage is informational (issues shown here will not fail the PR).

This check can be disabled by tagging the PR with skip-coverage-check.

License Headers ⚠️
// Copyright (c) 2024, 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.
Files
pkgs/swift2objc/lib/src/config.dart
pkgs/swiftgen/example/avf_audio_bindings.dart
pkgs/swiftgen/test/integration/classes_bindings.dart

All source files should start with a license header.

Unrelated files missing license headers
Files
pkgs/ffigen/example/libclang-example/generated_bindings.dart
pkgs/ffigen/example/shared_bindings/generate.dart
pkgs/ffigen/example/shared_bindings/lib/generated/a_gen.dart
pkgs/ffigen/example/shared_bindings/lib/generated/a_shared_b_gen.dart
pkgs/ffigen/example/shared_bindings/lib/generated/base_gen.dart
pkgs/ffigen/example/simple/generated_bindings.dart
pkgs/ffigen/lib/src/header_parser/clang_bindings/clang_bindings.dart
pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_decl_collision_bindings.dart
pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_symbol_address_collision_bindings.dart
pkgs/ffigen/test/collision_tests/expected_bindings/_expected_decl_type_name_collision_bindings.dart
pkgs/ffigen/test/collision_tests/expected_bindings/_expected_reserved_keyword_collision_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_comment_markup_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_dart_handle_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_enum_int_mimic_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_forward_decl_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_functions_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_imported_types_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_native_func_typedef_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_opaque_dependencies_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_packed_structs_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_regress_384_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_sort_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_struct_fptr_fields_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_typedef_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_unions_bindings.dart
pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_varargs_bindings.dart
pkgs/ffigen/test/large_integration_tests/_expected_cjson_bindings.dart
pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart
pkgs/ffigen/test/large_integration_tests/_expected_sqlite_bindings.dart
pkgs/ffigen/test/native_test/_expected_native_test_bindings.dart
pkgs/jni/lib/src/third_party/generated_bindings.dart
pkgs/jni/lib/src/third_party/global_env_extensions.dart
pkgs/jni/lib/src/third_party/jni_bindings_generated.dart
pkgs/jnigen/android_test_runner/lib/main.dart
pkgs/jnigen/example/in_app_java/lib/android_utils.dart
pkgs/jnigen/example/kotlin_plugin/example/lib/main.dart
pkgs/jnigen/example/kotlin_plugin/lib/kotlin_bindings.dart
pkgs/jnigen/example/kotlin_plugin/lib/kotlin_plugin.dart
pkgs/jnigen/example/pdfbox_plugin/lib/pdfbox_plugin.dart
pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocument.dart
pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/PDDocumentInformation.dart
pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/pdmodel/_package.dart
pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/PDFTextStripper.dart
pkgs/jnigen/example/pdfbox_plugin/lib/src/third_party/org/apache/pdfbox/text/_package.dart
pkgs/jnigen/lib/src/bindings/descriptor.dart
pkgs/jnigen/lib/src/bindings/printer.dart
pkgs/jnigen/lib/src/elements/elements.g.dart
pkgs/jnigen/test/jackson_core_test/third_party/bindings/com/fasterxml/jackson/core/_package.dart
pkgs/jnigen/test/type_path_test.dart
pkgs/jnigen/tool/command_runner.dart
pkgs/native_assets_builder/test_data/native_dynamic_linking/bin/native_dynamic_linking.dart
pkgs/objective_c/lib/src/ns_input_stream.dart
pkgs/swift2objc/lib/src/generate_wrapper.dart
pkgs/swift2objc/lib/src/generator/_core/utils.dart
pkgs/swift2objc/lib/src/generator/generator.dart
pkgs/swift2objc/lib/src/parser/parsers/declaration_parsers/parse_initializer_declaration.dart
pkgs/swift2objc/lib/src/transformer/transformers/transform_globals.dart
pkgs/swift2objc/lib/src/transformer/transformers/transform_variable.dart

This check can be disabled by tagging the PR with skip-license-check.

@liamappelbe liamappelbe changed the title WIP: swiftgen prototype WIP: Swiftgen prototype and example Dec 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant