diff --git a/pkgs/ffigen/CHANGELOG.md b/pkgs/ffigen/CHANGELOG.md index da30a97c6..1dd7776cb 100644 --- a/pkgs/ffigen/CHANGELOG.md +++ b/pkgs/ffigen/CHANGELOG.md @@ -9,6 +9,7 @@ - __Breaking change__: Certain synthetic USRs have been modified to ensure they cannot collide with real USRs. It's very unlikely that any user facing USRs are affected. +- Enum struct members now have setters. - __Breaking change__: Dart const values will be generated for global variables marked const in C (e.g. static const int) instead of symbol lookups. This supports integers, doubles, and string literals. Including the variable name diff --git a/pkgs/ffigen/example/libclang-example/generated_bindings.dart b/pkgs/ffigen/example/libclang-example/generated_bindings.dart index 4073e7a07..f0368fe87 100644 --- a/pkgs/ffigen/example/libclang-example/generated_bindings.dart +++ b/pkgs/ffigen/example/libclang-example/generated_bindings.dart @@ -7535,6 +7535,7 @@ final class CXTUResourceUsageEntry extends ffi.Struct { external int kindAsInt; CXTUResourceUsageKind get kind => CXTUResourceUsageKind.fromValue(kindAsInt); + set kind(CXTUResourceUsageKind value) => kindAsInt = value.value; @ffi.UnsignedLong() external int amount; @@ -8667,6 +8668,7 @@ final class CXCursor extends ffi.Struct { external int kindAsInt; CXCursorKind get kind => CXCursorKind.fromValue(kindAsInt); + set kind(CXCursorKind value) => kindAsInt = value.value; @ffi.Int() external int xdata; @@ -9259,6 +9261,7 @@ final class CXType extends ffi.Struct { external int kindAsInt; CXTypeKind get kind => CXTypeKind.fromValue(kindAsInt); + set kind(CXTypeKind value) => kindAsInt = value.value; @ffi.Array.multi([2]) external ffi.Array> data; @@ -10109,6 +10112,7 @@ final class CXCompletionResult extends ffi.Struct { external int CursorKindAsInt; CXCursorKind get CursorKind => CXCursorKind.fromValue(CursorKindAsInt); + set CursorKind(CXCursorKind value) => CursorKindAsInt = value.value; /// The code-completion string that describes how to insert this /// code-completion result into the editing buffer. @@ -10867,6 +10871,7 @@ final class CXIdxAttrInfo extends ffi.Struct { external int kindAsInt; CXIdxAttrKind get kind => CXIdxAttrKind.fromValue(kindAsInt); + set kind(CXIdxAttrKind value) => kindAsInt = value.value; external CXCursor cursor; @@ -10878,17 +10883,21 @@ final class CXIdxEntityInfo extends ffi.Struct { external int kindAsInt; CXIdxEntityKind get kind => CXIdxEntityKind.fromValue(kindAsInt); + set kind(CXIdxEntityKind value) => kindAsInt = value.value; @ffi.UnsignedInt() external int templateKindAsInt; CXIdxEntityCXXTemplateKind get templateKind => CXIdxEntityCXXTemplateKind.fromValue(templateKindAsInt); + set templateKind(CXIdxEntityCXXTemplateKind value) => + templateKindAsInt = value.value; @ffi.UnsignedInt() external int langAsInt; CXIdxEntityLanguage get lang => CXIdxEntityLanguage.fromValue(langAsInt); + set lang(CXIdxEntityLanguage value) => langAsInt = value.value; external ffi.Pointer name; @@ -10980,6 +10989,7 @@ final class CXIdxObjCContainerDeclInfo extends ffi.Struct { CXIdxObjCContainerKind get kind => CXIdxObjCContainerKind.fromValue(kindAsInt); + set kind(CXIdxObjCContainerKind value) => kindAsInt = value.value; } final class CXIdxBaseClassInfo extends ffi.Struct { @@ -11104,6 +11114,7 @@ final class CXIdxEntityRefInfo extends ffi.Struct { external int kindAsInt; CXIdxEntityRefKind get kind => CXIdxEntityRefKind.fromValue(kindAsInt); + set kind(CXIdxEntityRefKind value) => kindAsInt = value.value; /// Reference cursor. external CXCursor cursor; @@ -11132,6 +11143,7 @@ final class CXIdxEntityRefInfo extends ffi.Struct { external int roleAsInt; CXSymbolRole get role => CXSymbolRole.fromValue(roleAsInt); + set role(CXSymbolRole value) => roleAsInt = value.value; } /// A group of callbacks used by #clang_indexSourceFile and diff --git a/pkgs/ffigen/lib/src/code_generator/compound.dart b/pkgs/ffigen/lib/src/code_generator/compound.dart index 8777cd50f..55bc5691a 100644 --- a/pkgs/ffigen/lib/src/code_generator/compound.dart +++ b/pkgs/ffigen/lib/src/code_generator/compound.dart @@ -110,7 +110,11 @@ abstract class Compound extends BindingType with HasLocalScope { final memberName = m.name; s.write( '$enumName get $memberName => ' - '$enumName.fromValue(${memberName}AsInt);\n\n', + '$enumName.fromValue(${memberName}AsInt);\n', + ); + s.write( + 'set $memberName($enumName value) => ' + '${memberName}AsInt = value.value;\n\n', ); } } diff --git a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_func_and_struct_bindings.dart b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_func_and_struct_bindings.dart index 6a2723ab9..d8a3376fb 100644 --- a/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_func_and_struct_bindings.dart +++ b/pkgs/ffigen/test/code_generator_tests/expected_bindings/_expected_enumclass_func_and_struct_bindings.dart @@ -87,6 +87,7 @@ final class StructWithEnums extends ffi.Struct { external int enum1AsInt; Enum1 get enum1 => Enum1.fromValue(enum1AsInt); + set enum1(Enum1 value) => enum1AsInt = value.value; @ffi.Int() external int enum2; diff --git a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_enum_int_mimic_bindings.dart b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_enum_int_mimic_bindings.dart index 195bfa1f0..4d5aa7bb8 100644 --- a/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_enum_int_mimic_bindings.dart +++ b/pkgs/ffigen/test/header_parser_tests/expected_bindings/_expected_enum_int_mimic_bindings.dart @@ -77,6 +77,7 @@ final class Test extends ffi.Struct { external int simpleAsInt; Simple get simple => Simple.fromValue(simpleAsInt); + set simple(Simple value) => simpleAsInt = value.value; external ffi.Pointer simpleWithNegative; @@ -97,12 +98,16 @@ final class Test extends ffi.Struct { PositiveIntOverflow get positiveIntOverflow => PositiveIntOverflow.fromValue(positiveIntOverflowAsInt); + set positiveIntOverflow(PositiveIntOverflow value) => + positiveIntOverflowAsInt = value.value; @ffi.Uint16() external int explicitTypeWithOverflowAsInt; ExplicitTypeWithOverflow get explicitTypeWithOverflow => ExplicitTypeWithOverflow.fromValue(explicitTypeWithOverflowAsInt); + set explicitTypeWithOverflow(ExplicitTypeWithOverflow value) => + explicitTypeWithOverflowAsInt = value.value; } const int ANONYMOUS1 = 0; diff --git a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart index e1215b077..1573c903d 100644 --- a/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart +++ b/pkgs/ffigen/test/large_integration_tests/_expected_libclang_bindings.dart @@ -6076,6 +6076,7 @@ final class CXTUResourceUsageEntry extends ffi.Struct { external int kindAsInt; CXTUResourceUsageKind get kind => CXTUResourceUsageKind.fromValue(kindAsInt); + set kind(CXTUResourceUsageKind value) => kindAsInt = value.value; @ffi.UnsignedLong() external int amount; @@ -7040,6 +7041,7 @@ final class CXCursor extends ffi.Struct { external int kindAsInt; CXCursorKind get kind => CXCursorKind.fromValue(kindAsInt); + set kind(CXCursorKind value) => kindAsInt = value.value; @ffi.Int() external int xdata; @@ -7500,6 +7502,7 @@ final class CXType extends ffi.Struct { external int kindAsInt; CXTypeKind get kind => CXTypeKind.fromValue(kindAsInt); + set kind(CXTypeKind value) => kindAsInt = value.value; @ffi.Array.multi([2]) external ffi.Array> data; @@ -7932,6 +7935,7 @@ final class CXCompletionResult extends ffi.Struct { external int CursorKindAsInt; CXCursorKind get CursorKind => CXCursorKind.fromValue(CursorKindAsInt); + set CursorKind(CXCursorKind value) => CursorKindAsInt = value.value; /// The code-completion string that describes how to insert this /// code-completion result into the editing buffer. @@ -8500,6 +8504,7 @@ final class CXIdxAttrInfo extends ffi.Struct { external int kindAsInt; CXIdxAttrKind get kind => CXIdxAttrKind.fromValue(kindAsInt); + set kind(CXIdxAttrKind value) => kindAsInt = value.value; external CXCursor cursor; @@ -8511,17 +8516,21 @@ final class CXIdxEntityInfo extends ffi.Struct { external int kindAsInt; CXIdxEntityKind get kind => CXIdxEntityKind.fromValue(kindAsInt); + set kind(CXIdxEntityKind value) => kindAsInt = value.value; @ffi.UnsignedInt() external int templateKindAsInt; CXIdxEntityCXXTemplateKind get templateKind => CXIdxEntityCXXTemplateKind.fromValue(templateKindAsInt); + set templateKind(CXIdxEntityCXXTemplateKind value) => + templateKindAsInt = value.value; @ffi.UnsignedInt() external int langAsInt; CXIdxEntityLanguage get lang => CXIdxEntityLanguage.fromValue(langAsInt); + set lang(CXIdxEntityLanguage value) => langAsInt = value.value; external ffi.Pointer name; @@ -8625,6 +8634,7 @@ final class CXIdxObjCContainerDeclInfo extends ffi.Struct { CXIdxObjCContainerKind get kind => CXIdxObjCContainerKind.fromValue(kindAsInt); + set kind(CXIdxObjCContainerKind value) => kindAsInt = value.value; } final class CXIdxBaseClassInfo extends ffi.Struct { @@ -8743,6 +8753,7 @@ final class CXIdxEntityRefInfo extends ffi.Struct { external int kindAsInt; CXIdxEntityRefKind get kind => CXIdxEntityRefKind.fromValue(kindAsInt); + set kind(CXIdxEntityRefKind value) => kindAsInt = value.value; /// Reference cursor. external CXCursor cursor; @@ -8763,6 +8774,7 @@ final class CXIdxEntityRefInfo extends ffi.Struct { external int roleAsInt; CXSymbolRole get role => CXSymbolRole.fromValue(roleAsInt); + set role(CXSymbolRole value) => roleAsInt = value.value; } /// A group of callbacks used by #clang_indexSourceFile and diff --git a/pkgs/ffigen/test/native_test/_expected_native_test_bindings.dart b/pkgs/ffigen/test/native_test/_expected_native_test_bindings.dart index 208b97084..2557b980e 100644 --- a/pkgs/ffigen/test/native_test/_expected_native_test_bindings.dart +++ b/pkgs/ffigen/test/native_test/_expected_native_test_bindings.dart @@ -276,6 +276,7 @@ final class StructWithEnums extends ffi.Struct { external int enum1AsInt; Enum1 get enum1 => Enum1.fromValue(enum1AsInt); + set enum1(Enum1 value) => enum1AsInt = value.value; @ffi.Array.multi([5]) external ffi.Array enum1Array;