Skip to content

Fixes and tests for listener block native bindings #1250

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

Merged
merged 2 commits into from
Jul 2, 2024
Merged

Conversation

liamappelbe
Copy link
Contributor

#1203 added a small ObjC trampoline to some listener blocks. This PR fixes 3 bugs in that generated ObjC code that were found while working on the large ObjC integration test, and also reported by @brianquinlan.

  • For listener blocks with nullable arguments, the _Nullable annotation was being placed in the wrong spot (DummyObject* arg0 _Nullable instead of DummyObject* _Nullable arg0). Fixes Missgenerated objc-bindings for nullable types #1230.
  • If a struct is declared like struct Foo {} instead of typedef struct {} Foo, we have to refer to it (in ObjC code) as struct Foo instead of just Foo. Same for unions. This distinction wasn't surfaced at all in the existing Struct/Union class.
    • The type spelling string of the declaration contains this distinction, being either "struct Foo" or "Foo", so we could check if this string starts with "struct" and set a bool flag on the Struct object. But since this string is already formatted exactly as I want, I'm just plumbing it through directly.
  • The generated ObjC code needs to #include the entrypoint(s), so that it has access to all the classes etc declared by the entrypoint header or its dependencies.

Now that the generated ObjC bindings include the entrypoint, my hack of putting all the ObjC code for each test in a single header and using that as the ffigen entrypoint doesn't work. I had to split a header file off of block_test.m to resolve duplicate symbol errors during linking.

Copy link

github-actions bot commented Jul 2, 2024

PR Health

Coverage ⚠️

Details
File Coverage
pkgs/ffigen/lib/src/code_generator/compound.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/library.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/objc_block.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/objc_nullable.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/struct.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/union.dart 💔 Not covered
pkgs/ffigen/lib/src/code_generator/writer.dart 💔 Not covered
pkgs/ffigen/lib/src/config_provider/spec_utils.dart 💔 Not covered
pkgs/ffigen/lib/src/header_parser/parser.dart 💔 Not covered
pkgs/ffigen/lib/src/header_parser/sub_parsers/compounddecl_parser.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 ✔️

Details
// 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
no missing headers

All source files should start with a license header.

Unrelated files missing license headers
Files
pkgs/ffi/example/main.dart
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/config_provider/config_spec.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_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/lang/jcharacter.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/elements/elements.g.dart
pkgs/jnigen/test/jackson_core_test/third_party/bindings/com/fasterxml/jackson/core/_package.dart
pkgs/jnigen/tool/command_runner.dart
pkgs/native_assets_cli/lib/src/api/builder.dart
pkgs/native_assets_cli/lib/src/api/linker.dart
pkgs/native_assets_cli/test/model/checksum_test.dart
pkgs/swiftgen/swift2objc/lib/src/ast/ast.dart
pkgs/swiftgen/swift2objc/lib/src/ast/declarations/built_in/built_in_declaration.dart

Package publish validation ✔️

Details
Package Version Status
package:ffi 2.1.2 already published at pub.dev
package:ffigen 13.0.0-wip WIP (no publish necessary)
package:jni 0.9.3 already published at pub.dev
package:jnigen 0.10.0-wip WIP (no publish necessary)
package:native_assets_cli 0.6.1-wip WIP (no publish necessary)
package:objective_c 1.1.0-wip WIP (no publish necessary)
package:swiftgen 0.0.1-wip WIP (no publish necessary)

Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation.

@coveralls
Copy link

Coverage Status

coverage: 91.792% (+0.8%) from 91.024%
when pulling 0b20cfc on nattypes
into bafe220 on main.

@dcharkes
Copy link
Collaborator

dcharkes commented Jul 2, 2024

  • The type spelling string of the declaration contains this distinction, being either "struct Foo" or "Foo", so we could check if this string starts with "struct" and set a bool flag on the Struct object. But since this string is already formatted exactly as I want, I'm just plumbing it through directly.

We'd have similar issues in C/C++ but we don't generate any C/C++ code ever. However if we would in the future, this logic should not live in some objective-c specific place. From the code it looks like it just lives in the compound which is used for both C and Objective-C. 👍

Copy link
Collaborator

@dcharkes dcharkes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! 🔥

@coveralls
Copy link

Coverage Status

coverage: 91.792% (+0.8%) from 91.024%
when pulling 339aa85 on nattypes
into bafe220 on main.

@liamappelbe liamappelbe merged commit 249d665 into main Jul 2, 2024
17 checks passed
@liamappelbe liamappelbe deleted the nattypes branch July 2, 2024 23:48
liamappelbe added a commit that referenced this pull request Jul 17, 2024
* Resolve conflicts in native block wrapper names.

Also remove nullable annotation from native code. It doesn't do
anything and is sometimes invalid.

* Use <> style imports for framework headers in ObjC native code

Also, use #import instead of #include

* Test framework header parser

* More tests

* Revert renaming of originalName. Add Func.useNameForLookup instead

* nits
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.

Missgenerated objc-bindings for nullable types
3 participants