-
Couldn't load subscription status.
- Fork 82
[ffigen] Fix method vs getter conflicts #1707
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
Conversation
PR Health
Coverage
|
| File | Coverage |
|---|---|
| pkgs/ffigen/lib/src/code_generator/objc_interface.dart | 💔 Not covered |
| pkgs/ffigen/lib/src/code_generator/objc_methods.dart | 💔 Not covered |
| pkgs/ffigen/lib/src/header_parser/sub_parsers/objcinterfacedecl_parser.dart | 💔 Not covered |
| pkgs/ffigen/lib/src/visitor/fix_overridden_methods.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 |
|---|
| no missing headers |
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/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_builder/test_data/native_dynamic_linking/bin/native_dynamic_linking.dart |
| pkgs/objective_c/lib/src/ns_input_stream.dart |
| pkgs/swift2objc/lib/src/config.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/generator/generators/class_generator.dart |
| pkgs/swift2objc/lib/src/parser/parsers/declaration_parsers/parse_initializer_declaration.dart |
| pkgs/swift2objc/lib/src/parser/parsers/declaration_parsers/parse_variable_declaration.dart |
| pkgs/swift2objc/lib/src/transformer/_core/unique_namer.dart |
| pkgs/swift2objc/lib/src/transformer/_core/utils.dart |
| pkgs/swift2objc/lib/src/transformer/transformers/transform_globals.dart |
| pkgs/swift2objc/lib/src/transformer/transformers/transform_variable.dart |
| pkgs/swift2objc/test/unit/parse_initializer_param_test.dart |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM with question
| -(int32_t)methodVsGetter { return 1; } | ||
| @end | ||
|
|
||
| @interface BadOverrideUncle : BadOverrideGrandparent {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I also have grandparent in my test code but no uncle and aunt, I should add them 🤣
| return (root, rootMethod); | ||
| } | ||
|
|
||
| void _convertAllSubtreeMethodsToProperties( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about the case where some code is already generated with methods in another package and we want to interop with that code instead of regenerating the parent classes? In that case we would want to convert everything to methods instead.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmmm. There's also the case where two imported packages disagree about whether a method is a getter or an ordinary method, in which case there's no valid choice. I think I'll probably need an option to control whether getters are generated eventually. I think these edge cases are pretty unlikely though, so I'll defer that for now.
Fix one of the bad override bugs: conflicts between methods and getters.
In ObjC, supertypes and subtypes can have a method that's an ordinary method in some classes of the heirarchy, and a property in others. This isn't allowed in Dart, so we change all such conflicts to properties. This change could cause more conflicts in the heirarchy, so first we walk up to find the root of the subtree that has this method, then we walk down the subtreee to change all conflicting methods to properties.
Why change them all to properties, not methods? If a method can sensibly be made into a getter, that's always preferable. And we know these methods are reasonable candidates to be made into getters, since some of them already are. Also, if we changed the getters into methods, we'd have to worry about conflicts with setters.
The remaining bad override issues are related to subtyping, and I'll tackle them next.
#1220