diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md index c8ada29af..d629561bd 100644 --- a/pkgs/ffigen/CHANGELOG.md +++ b/pkgs/ffigen/CHANGELOG.md @@ -9,6 +9,8 @@ `Declarations.includeMemberSet`, `Declarations.useOriginalName`, `Declarations.renameWithMap`, `Declarations.useMemberOriginalName`, and `Declarations.renameMemberWithMap`. +- Fix [a bug](https://github.com/dart-lang/native/issues/2795) where function + pointer param names could collide with keywords. - Fix [a bug](https://github.com/dart-lang/native/issues/2782) where unnamed enum constants were being multiply defined. - Fix [a bug](https://github.com/dart-lang/native/issues/2761) in imported diff --git a/pkgs/ffigen/lib/src/code_generator/func_type.dart b/pkgs/ffigen/lib/src/code_generator/func_type.dart index 27b1c0924..58b2b0e6e 100644 --- a/pkgs/ffigen/lib/src/code_generator/func_type.dart +++ b/pkgs/ffigen/lib/src/code_generator/func_type.dart @@ -30,8 +30,13 @@ class FunctionType extends Type with HasLocalScope { String? varArgWrapper, }) { final params = varArgWrapper != null ? parameters : dartTypeParameters; - String paramToString(Parameter p) => - '${typeToString(p.type)} ${writeArgumentNames ? p.originalName : ""}'; + String paramToString(Parameter p) { + final name = writeArgumentNames && p.originalName.isNotEmpty + ? p.name + : ''; + return '${typeToString(p.type)} $name'; + } + String? varArgPack; if (varArgWrapper != null && varArgParameters.isNotEmpty) { final varArgPackBuf = StringBuffer(); diff --git a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_reserved_keyword_collision_bindings.dart b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_reserved_keyword_collision_bindings.dart index d9bf4fa50..35583b337 100644 --- a/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_reserved_keyword_collision_bindings.dart +++ b/pkgs/ffigen/test/collision_tests/expected_bindings/_expected_reserved_keyword_collision_bindings.dart @@ -36,6 +36,13 @@ class NativeLibrary { set import(int value) => _import.value = value; } +final class Repro2795 extends ffi.Struct { + external ffi.Pointer< + ffi.NativeFunction in$)> + > + var$1; +} + final class abstract$ extends ffi.Opaque {} enum export$ { diff --git a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision.h b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision.h index 1ea919482..07bc4535e 100644 --- a/pkgs/ffigen/test/collision_tests/reserved_keyword_collision.h +++ b/pkgs/ffigen/test/collision_tests/reserved_keyword_collision.h @@ -8,3 +8,8 @@ enum export { covariant }; void implements(int dynamic, int in, int deferred) {} int import = 123; typedef void var; + +// Regression test for https://github.com/dart-lang/native/issues/2795 +struct Repro2795 { + void (*var)(void* in); +};