diff --git a/src/c/tests/structs/struct_anonymous_char_int/config.json b/src/c/tests/structs/struct_anonymous_char_int/config.json new file mode 100644 index 0000000..1ed6c07 --- /dev/null +++ b/src/c/tests/structs/struct_anonymous_char_int/config.json @@ -0,0 +1,27 @@ +{ + "inputFilePath": "./main.c", + "userIncludeDirectories": [ + "../../../production/ffi_helper/include" + ], + "ignoredIncludeFiles": [ + "../../../production/ffi_helper/include/ffi_helper.h" + ], + "targetPlatforms": { + "windows": { + "i686-pc-windows-msvc": {}, + "x86_64-pc-windows-msvc": {}, + "aarch64-pc-windows-msvc": {} + }, + "macos": { + "i686-apple-darwin": {}, + "aarch64-apple-darwin": {}, + "x86_64-apple-darwin": {}, + "aarch64-apple-ios": {} + }, + "linux": { + "i686-unknown-linux-gnu": {}, + "x86_64-unknown-linux-gnu": {}, + "aarch64-unknown-linux-gnu": {} + } + } +} diff --git a/src/c/tests/structs/struct_anonymous_char_int/main.c b/src/c/tests/structs/struct_anonymous_char_int/main.c new file mode 100644 index 0000000..e0546ec --- /dev/null +++ b/src/c/tests/structs/struct_anonymous_char_int/main.c @@ -0,0 +1,12 @@ +#include +#include "ffi_helper.h" + +struct struct_anonymous_char_int +{ + struct { + char a; + int b; + }; +}; + +FFI_API_DECL struct struct_anonymous_char_int struct_anonymous_char_int; diff --git a/src/c/tests/structs/struct_anonymous_nested/config.json b/src/c/tests/structs/struct_anonymous_nested/config.json new file mode 100644 index 0000000..1ed6c07 --- /dev/null +++ b/src/c/tests/structs/struct_anonymous_nested/config.json @@ -0,0 +1,27 @@ +{ + "inputFilePath": "./main.c", + "userIncludeDirectories": [ + "../../../production/ffi_helper/include" + ], + "ignoredIncludeFiles": [ + "../../../production/ffi_helper/include/ffi_helper.h" + ], + "targetPlatforms": { + "windows": { + "i686-pc-windows-msvc": {}, + "x86_64-pc-windows-msvc": {}, + "aarch64-pc-windows-msvc": {} + }, + "macos": { + "i686-apple-darwin": {}, + "aarch64-apple-darwin": {}, + "x86_64-apple-darwin": {}, + "aarch64-apple-ios": {} + }, + "linux": { + "i686-unknown-linux-gnu": {}, + "x86_64-unknown-linux-gnu": {}, + "aarch64-unknown-linux-gnu": {} + } + } +} diff --git a/src/c/tests/structs/struct_anonymous_nested/main.c b/src/c/tests/structs/struct_anonymous_nested/main.c new file mode 100644 index 0000000..7ea7435 --- /dev/null +++ b/src/c/tests/structs/struct_anonymous_nested/main.c @@ -0,0 +1,18 @@ +#include +#include "ffi_helper.h" + +struct struct_anonymous_nested +{ + struct { + struct { + char a; + int b; + }; + struct { + char c; + int d; + }; + }; +}; + +FFI_API_DECL struct struct_anonymous_nested struct_anonymous_nested; diff --git a/src/c/tests/structs/struct_int/main.c b/src/c/tests/structs/struct_int/main.c index f93fff5..70106a3 100644 --- a/src/c/tests/structs/struct_int/main.c +++ b/src/c/tests/structs/struct_int/main.c @@ -4,6 +4,6 @@ struct struct_int { int a; -} +}; FFI_API_DECL struct struct_int struct_int; diff --git a/src/c/tests/unions/union_anonymous_char_int/config.json b/src/c/tests/unions/union_anonymous_char_int/config.json new file mode 100644 index 0000000..1ed6c07 --- /dev/null +++ b/src/c/tests/unions/union_anonymous_char_int/config.json @@ -0,0 +1,27 @@ +{ + "inputFilePath": "./main.c", + "userIncludeDirectories": [ + "../../../production/ffi_helper/include" + ], + "ignoredIncludeFiles": [ + "../../../production/ffi_helper/include/ffi_helper.h" + ], + "targetPlatforms": { + "windows": { + "i686-pc-windows-msvc": {}, + "x86_64-pc-windows-msvc": {}, + "aarch64-pc-windows-msvc": {} + }, + "macos": { + "i686-apple-darwin": {}, + "aarch64-apple-darwin": {}, + "x86_64-apple-darwin": {}, + "aarch64-apple-ios": {} + }, + "linux": { + "i686-unknown-linux-gnu": {}, + "x86_64-unknown-linux-gnu": {}, + "aarch64-unknown-linux-gnu": {} + } + } +} diff --git a/src/c/tests/unions/union_anonymous_char_int/main.c b/src/c/tests/unions/union_anonymous_char_int/main.c new file mode 100644 index 0000000..228920b --- /dev/null +++ b/src/c/tests/unions/union_anonymous_char_int/main.c @@ -0,0 +1,12 @@ +#include +#include "ffi_helper.h" + +union union_anonymous_char_int +{ + union { + char a; + int b; + }; +}; + +FFI_API_DECL union union_anonymous_char_int union_anonymous_char_int; diff --git a/src/c/tests/unions/union_anonymous_nested/config.json b/src/c/tests/unions/union_anonymous_nested/config.json new file mode 100644 index 0000000..1ed6c07 --- /dev/null +++ b/src/c/tests/unions/union_anonymous_nested/config.json @@ -0,0 +1,27 @@ +{ + "inputFilePath": "./main.c", + "userIncludeDirectories": [ + "../../../production/ffi_helper/include" + ], + "ignoredIncludeFiles": [ + "../../../production/ffi_helper/include/ffi_helper.h" + ], + "targetPlatforms": { + "windows": { + "i686-pc-windows-msvc": {}, + "x86_64-pc-windows-msvc": {}, + "aarch64-pc-windows-msvc": {} + }, + "macos": { + "i686-apple-darwin": {}, + "aarch64-apple-darwin": {}, + "x86_64-apple-darwin": {}, + "aarch64-apple-ios": {} + }, + "linux": { + "i686-unknown-linux-gnu": {}, + "x86_64-unknown-linux-gnu": {}, + "aarch64-unknown-linux-gnu": {} + } + } +} diff --git a/src/c/tests/unions/union_anonymous_nested/main.c b/src/c/tests/unions/union_anonymous_nested/main.c new file mode 100644 index 0000000..e497d70 --- /dev/null +++ b/src/c/tests/unions/union_anonymous_nested/main.c @@ -0,0 +1,18 @@ +#include +#include "ffi_helper.h" + +union union_anonymous_nested +{ + union { + union { + char a; + int b; + }; + union { + char c; + int d; + }; + }; +}; + +FFI_API_DECL union union_anonymous_nested union_anonymous_nested; diff --git a/src/cs/production/c2ffi.Data/CLocation.cs b/src/cs/production/c2ffi.Data/CLocation.cs index 808bb36..6609b5e 100644 --- a/src/cs/production/c2ffi.Data/CLocation.cs +++ b/src/cs/production/c2ffi.Data/CLocation.cs @@ -17,13 +17,13 @@ public record struct CLocation : IComparable /// /// Gets or sets the file name of the C header file with it's file extension but without it's directory path. /// - [JsonPropertyName("fileName")] + [JsonPropertyName("file_name")] public string FileName { get; set; } /// /// Gets or sets the relative file path of the C header file. /// - [JsonPropertyName("filePath")] + [JsonPropertyName("file_path")] public string FilePath { get; set; } /// @@ -47,7 +47,7 @@ public record struct CLocation : IComparable /// /// Gets or sets a value indicating whether the location originates from a system header. /// - [JsonPropertyName("isSystem")] + [JsonPropertyName("is_system")] public bool IsSystem { get; set; } /// @@ -71,11 +71,6 @@ public int CompareTo(CLocation other) } result = LineColumn.CompareTo(other.LineColumn); - if (result != 0) - { - return result; - } - return result; } diff --git a/src/cs/production/c2ffi.Data/CTypeInfo.cs b/src/cs/production/c2ffi.Data/CType.cs similarity index 85% rename from src/cs/production/c2ffi.Data/CTypeInfo.cs rename to src/cs/production/c2ffi.Data/CType.cs index 02bde1e..9fa7822 100644 --- a/src/cs/production/c2ffi.Data/CTypeInfo.cs +++ b/src/cs/production/c2ffi.Data/CType.cs @@ -10,10 +10,10 @@ namespace c2ffi.Data; // NOTE: Properties are required for System.Text.Json serialization /// -/// Represents information about a C type. +/// Represents a C type. /// [PublicAPI] -public class CTypeInfo : IEquatable +public class CType : IEquatable { /// /// Gets or sets the name of the C type. @@ -54,7 +54,7 @@ public class CTypeInfo : IEquatable /// /// Gets or sets a value indicating whether the C type is anonymous. /// - [JsonPropertyName("is_snonymous")] + [JsonPropertyName("is_anonymous")] public bool? IsAnonymous { get; set; } /// @@ -73,7 +73,7 @@ public class CTypeInfo : IEquatable /// Gets or sets the inner type information for pointer, array, and typedef alias types. /// [JsonPropertyName("inner_type")] - public CTypeInfo? InnerTypeInfo { get; set; } + public CType? InnerType { get; set; } /// [ExcludeFromCodeCoverage] @@ -83,14 +83,14 @@ public override string ToString() } /// - /// Determines whether the specified is equal to the current . + /// Determines whether the specified is equal to the current . /// - /// The to compare with the current . + /// The to compare with the current . /// - /// if the specified is equal to the current - /// ; otherwise, . + /// if the specified is equal to the current + /// ; otherwise, . /// - public bool Equals(CTypeInfo? other) + public bool Equals(CType? other) { if (other is null) { @@ -130,7 +130,7 @@ public override bool Equals(object? obj) return false; } - return Equals((CTypeInfo)obj); + return Equals((CType)obj); } /// @@ -147,7 +147,7 @@ public override int GetHashCode() hashCode.Add(IsAnonymous); hashCode.Add(IsConst); hashCode.Add(Location); - hashCode.Add(InnerTypeInfo); + hashCode.Add(InnerType); return hashCode.ToHashCode(); // ReSharper restore NonReadonlyMemberInGetHashCode } diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunction.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunction.g.cs index 521337b..0c60d0b 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunction.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunction.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunction), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnTypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnTypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnType, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnType = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "ReturnTypeInfo", + PropertyName = "ReturnType", JsonPropertyName = "return_type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionParameter.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionParameter.g.cs index b951521..83c2d58 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionParameter.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionParameter.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionParameter), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointer.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointer.g.cs index 938a20b..7e48f7c 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointer.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointer.g.cs @@ -45,43 +45,43 @@ public partial class JsonSerializerContextCFfiCrossPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[7]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionPointer), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionPointer), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnTypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnTypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnType, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnType = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "ReturnTypeInfo", + PropertyName = "ReturnType", JsonPropertyName = "return_type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointerParameter.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointerParameter.g.cs index 9b90e6e..2c1cdc1 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointerParameter.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CFunctionPointerParameter.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionPointerParameter), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CLocation.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CLocation.g.cs index bafaa8c..03733f8 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CLocation.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CLocation.g.cs @@ -59,7 +59,7 @@ public partial class JsonSerializerContextCFfiCrossPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "FileName", - JsonPropertyName = "fileName" + JsonPropertyName = "file_name" }; properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); @@ -78,7 +78,7 @@ public partial class JsonSerializerContextCFfiCrossPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "FilePath", - JsonPropertyName = "filePath" + JsonPropertyName = "file_path" }; properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); @@ -154,7 +154,7 @@ public partial class JsonSerializerContextCFfiCrossPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "IsSystem", - JsonPropertyName = "isSystem" + JsonPropertyName = "is_system" }; properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CMacroObject.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CMacroObject.g.cs index ed9fea5..8b5f723 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CMacroObject.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CMacroObject.g.cs @@ -45,24 +45,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[5]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CMacroObject), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CMacroObject)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CMacroObject)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CMacroObject)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CMacroObject)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecord.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecord.g.cs index bbf8374..9364a2b 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecord.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecord.g.cs @@ -43,7 +43,7 @@ public partial class JsonSerializerContextCFfiCrossPlatform private static global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[] CRecordPropInit(global::System.Text.Json.JsonSerializerOptions options) { - var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[7]; + var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[8]; var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { @@ -102,7 +102,26 @@ public partial class JsonSerializerContextCFfiCrossPlatform properties[2] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info2); - var info3 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> + var info3 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.Nodes.CRecord), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.Nodes.CRecord)obj).IsAnonymous, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CRecord)obj).IsAnonymous = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "IsAnonymous", + JsonPropertyName = "is_anonymous" + }; + + properties[3] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info3); + + var info4 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> { IsProperty = true, IsPublic = true, @@ -119,9 +138,9 @@ public partial class JsonSerializerContextCFfiCrossPlatform JsonPropertyName = "fields" }; - properties[3] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo>(options, info3); + properties[4] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo>(options, info4); - var info4 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info5 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, @@ -138,9 +157,9 @@ public partial class JsonSerializerContextCFfiCrossPlatform JsonPropertyName = "location" }; - properties[4] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info4); + properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); - var info5 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info6 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, @@ -157,9 +176,9 @@ public partial class JsonSerializerContextCFfiCrossPlatform JsonPropertyName = "comment" }; - properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); + properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); - var info6 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info7 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, @@ -176,7 +195,7 @@ public partial class JsonSerializerContextCFfiCrossPlatform JsonPropertyName = null }; - properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); + properties[7] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info7); return properties; } diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecordField.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecordField.g.cs index 0b9953c..65ff25d 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecordField.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CRecordField.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CRecordField), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CRecordField)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CRecordField)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CRecordField)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CRecordField)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CType.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CType.g.cs new file mode 100644 index 0000000..ee59c1f --- /dev/null +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CType.g.cs @@ -0,0 +1,241 @@ +// + +#nullable enable annotations +#nullable disable warnings + +// Suppress warnings about [Obsolete] member usage in generated code. +#pragma warning disable CS0612, CS0618 + +namespace c2ffi.Data.Serialization +{ + public partial class JsonSerializerContextCFfiCrossPlatform + { + private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo? _CType; + + /// + /// Defines the source generated JSON serialization contract metadata for a given type. + /// + public global::System.Text.Json.Serialization.Metadata.JsonTypeInfo CType + { + get => _CType ??= (global::System.Text.Json.Serialization.Metadata.JsonTypeInfo)Options.GetTypeInfo(typeof(global::c2ffi.Data.CType)); + } + + private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo Create_CType(global::System.Text.Json.JsonSerializerOptions options) + { + if (!TryGetTypeInfoForRuntimeCustomConverter(options, out global::System.Text.Json.Serialization.Metadata.JsonTypeInfo jsonTypeInfo)) + { + var objectInfo = new global::System.Text.Json.Serialization.Metadata.JsonObjectInfoValues + { + ObjectCreator = () => new global::c2ffi.Data.CType(), + ObjectWithParameterizedConstructorCreator = null, + PropertyMetadataInitializer = _ => CTypePropInit(options), + ConstructorParameterMetadataInitializer = null, + SerializeHandler = null + }; + + jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateObjectInfo(options, objectInfo); + jsonTypeInfo.NumberHandling = null; + } + + jsonTypeInfo.OriginatingResolver = this; + return jsonTypeInfo; + } + + private static global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[] CTypePropInit(global::System.Text.Json.JsonSerializerOptions options) + { + var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[10]; + + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).Name, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).Name = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "Name", + JsonPropertyName = "name" + }; + + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).NodeKind, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).NodeKind = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "NodeKind", + JsonPropertyName = "kind" + }; + + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + + var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).SizeOf, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).SizeOf = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "SizeOf", + JsonPropertyName = "size_of" + }; + + properties[2] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info2); + + var info3 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).AlignOf, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).AlignOf = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "AlignOf", + JsonPropertyName = "align_of" + }; + + properties[3] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info3); + + var info4 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).ElementSize, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).ElementSize = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "ElementSize", + JsonPropertyName = "size_of_element" + }; + + properties[4] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info4); + + var info5 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).ArraySizeOf, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).ArraySizeOf = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "ArraySizeOf", + JsonPropertyName = "array_size" + }; + + properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); + + var info6 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).IsAnonymous, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).IsAnonymous = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "IsAnonymous", + JsonPropertyName = "is_anonymous" + }; + + properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); + + var info7 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).IsConst, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).IsConst = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "IsConst", + JsonPropertyName = "is_const" + }; + + properties[7] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info7); + + var info8 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).Location, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).Location = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "Location", + JsonPropertyName = "location" + }; + + properties[8] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info8); + + var info9 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).InnerType, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).InnerType = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "InnerType", + JsonPropertyName = "inner_type" + }; + + properties[9] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info9); + + return properties; + } + } +} diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeAlias.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeAlias.g.cs index f45fc36..6fb86c7 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeAlias.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeAlias.g.cs @@ -45,24 +45,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[4]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CTypeAlias), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingTypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingTypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingType, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingType = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "UnderlyingTypeInfo", + PropertyName = "UnderlyingType", JsonPropertyName = "underlyingType" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeInfo.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeInfo.g.cs index 7216d1c..9d1887b 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeInfo.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CTypeInfo.g.cs @@ -173,7 +173,7 @@ public partial class JsonSerializerContextCFfiCrossPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "IsAnonymous", - JsonPropertyName = "is_snonymous" + JsonPropertyName = "is_anonymous" }; properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CVariable.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CVariable.g.cs index c7493b2..e5b511f 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CVariable.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.CVariable.g.cs @@ -45,24 +45,24 @@ public partial class JsonSerializerContextCFfiCrossPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[4]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CVariable), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CVariable)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CVariable)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CVariable)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CVariable)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.GetJsonTypeInfo.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.GetJsonTypeInfo.g.cs index 0ee0f8a..5245086 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.GetJsonTypeInfo.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.GetJsonTypeInfo.g.cs @@ -51,9 +51,9 @@ public partial class JsonSerializerContextCFfiCrossPlatform : global::System.Tex { return Create_CRecordKind(options); } - if (type == typeof(global::c2ffi.Data.CTypeInfo)) + if (type == typeof(global::c2ffi.Data.CType)) { - return Create_CTypeInfo(options); + return Create_CType(options); } if (type == typeof(global::c2ffi.Data.Nodes.CEnum)) { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.g.cs index dc32503..c72dfe1 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiCrossPlatform.g.cs @@ -8,7 +8,7 @@ namespace c2ffi.Data.Serialization { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.Json.SourceGeneration", "8.0.9.8001")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.Json.SourceGeneration", "8.0.10.11423")] public partial class JsonSerializerContextCFfiCrossPlatform { private readonly static global::System.Text.Json.JsonSerializerOptions s_defaultOptions = new() diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunction.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunction.g.cs index ad9be00..28ce0f3 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunction.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunction.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunction), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnTypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnTypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnType, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunction)obj).ReturnType = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "ReturnTypeInfo", + PropertyName = "ReturnType", JsonPropertyName = "return_type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionParameter.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionParameter.g.cs index 42d966e..4c0ba06 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionParameter.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionParameter.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionParameter), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionParameter)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointer.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointer.g.cs index 6fdc8ba..50cfafa 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointer.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointer.g.cs @@ -45,43 +45,43 @@ public partial class JsonSerializerContextCFfiTargetPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[7]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionPointer), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionPointer), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnTypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnTypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnType, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointer)obj).ReturnType = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "ReturnTypeInfo", + PropertyName = "ReturnType", JsonPropertyName = "return_type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointerParameter.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointerParameter.g.cs index a10d53e..258097d 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointerParameter.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CFunctionPointerParameter.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CFunctionPointerParameter), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CFunctionPointerParameter)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CLocation.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CLocation.g.cs index fef23df..8832d0d 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CLocation.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CLocation.g.cs @@ -59,7 +59,7 @@ public partial class JsonSerializerContextCFfiTargetPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "FileName", - JsonPropertyName = "fileName" + JsonPropertyName = "file_name" }; properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); @@ -78,7 +78,7 @@ public partial class JsonSerializerContextCFfiTargetPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "FilePath", - JsonPropertyName = "filePath" + JsonPropertyName = "file_path" }; properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); @@ -154,7 +154,7 @@ public partial class JsonSerializerContextCFfiTargetPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "IsSystem", - JsonPropertyName = "isSystem" + JsonPropertyName = "is_system" }; properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CMacroObject.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CMacroObject.g.cs index 8a195a4..702d9a0 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CMacroObject.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CMacroObject.g.cs @@ -45,24 +45,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[5]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CMacroObject), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CMacroObject)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CMacroObject)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CMacroObject)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CMacroObject)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecord.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecord.g.cs index ef0260d..168d6bd 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecord.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecord.g.cs @@ -43,7 +43,7 @@ public partial class JsonSerializerContextCFfiTargetPlatform private static global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[] CRecordPropInit(global::System.Text.Json.JsonSerializerOptions options) { - var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[7]; + var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[8]; var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { @@ -102,7 +102,26 @@ public partial class JsonSerializerContextCFfiTargetPlatform properties[2] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info2); - var info3 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> + var info3 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.Nodes.CRecord), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.Nodes.CRecord)obj).IsAnonymous, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CRecord)obj).IsAnonymous = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "IsAnonymous", + JsonPropertyName = "is_anonymous" + }; + + properties[3] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info3); + + var info4 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues> { IsProperty = true, IsPublic = true, @@ -119,9 +138,9 @@ public partial class JsonSerializerContextCFfiTargetPlatform JsonPropertyName = "fields" }; - properties[3] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo>(options, info3); + properties[4] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo>(options, info4); - var info4 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info5 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, @@ -138,9 +157,9 @@ public partial class JsonSerializerContextCFfiTargetPlatform JsonPropertyName = "location" }; - properties[4] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info4); + properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); - var info5 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info6 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, @@ -157,9 +176,9 @@ public partial class JsonSerializerContextCFfiTargetPlatform JsonPropertyName = "comment" }; - properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); + properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); - var info6 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info7 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, @@ -176,7 +195,7 @@ public partial class JsonSerializerContextCFfiTargetPlatform JsonPropertyName = null }; - properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); + properties[7] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info7); return properties; } diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecordField.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecordField.g.cs index c38cc68..239d7f8 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecordField.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CRecordField.g.cs @@ -64,24 +64,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); - var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CRecordField), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CRecordField)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CRecordField)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CRecordField)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CRecordField)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CType.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CType.g.cs new file mode 100644 index 0000000..c09b974 --- /dev/null +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CType.g.cs @@ -0,0 +1,241 @@ +// + +#nullable enable annotations +#nullable disable warnings + +// Suppress warnings about [Obsolete] member usage in generated code. +#pragma warning disable CS0612, CS0618 + +namespace c2ffi.Data.Serialization +{ + public partial class JsonSerializerContextCFfiTargetPlatform + { + private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo? _CType; + + /// + /// Defines the source generated JSON serialization contract metadata for a given type. + /// + public global::System.Text.Json.Serialization.Metadata.JsonTypeInfo CType + { + get => _CType ??= (global::System.Text.Json.Serialization.Metadata.JsonTypeInfo)Options.GetTypeInfo(typeof(global::c2ffi.Data.CType)); + } + + private global::System.Text.Json.Serialization.Metadata.JsonTypeInfo Create_CType(global::System.Text.Json.JsonSerializerOptions options) + { + if (!TryGetTypeInfoForRuntimeCustomConverter(options, out global::System.Text.Json.Serialization.Metadata.JsonTypeInfo jsonTypeInfo)) + { + var objectInfo = new global::System.Text.Json.Serialization.Metadata.JsonObjectInfoValues + { + ObjectCreator = () => new global::c2ffi.Data.CType(), + ObjectWithParameterizedConstructorCreator = null, + PropertyMetadataInitializer = _ => CTypePropInit(options), + ConstructorParameterMetadataInitializer = null, + SerializeHandler = null + }; + + jsonTypeInfo = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreateObjectInfo(options, objectInfo); + jsonTypeInfo.NumberHandling = null; + } + + jsonTypeInfo.OriginatingResolver = this; + return jsonTypeInfo; + } + + private static global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[] CTypePropInit(global::System.Text.Json.JsonSerializerOptions options) + { + var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[10]; + + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).Name, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).Name = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "Name", + JsonPropertyName = "name" + }; + + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + + var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).NodeKind, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).NodeKind = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "NodeKind", + JsonPropertyName = "kind" + }; + + properties[1] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info1); + + var info2 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).SizeOf, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).SizeOf = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "SizeOf", + JsonPropertyName = "size_of" + }; + + properties[2] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info2); + + var info3 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).AlignOf, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).AlignOf = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "AlignOf", + JsonPropertyName = "align_of" + }; + + properties[3] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info3); + + var info4 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).ElementSize, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).ElementSize = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "ElementSize", + JsonPropertyName = "size_of_element" + }; + + properties[4] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info4); + + var info5 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).ArraySizeOf, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).ArraySizeOf = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "ArraySizeOf", + JsonPropertyName = "array_size" + }; + + properties[5] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info5); + + var info6 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).IsAnonymous, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).IsAnonymous = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "IsAnonymous", + JsonPropertyName = "is_anonymous" + }; + + properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); + + var info7 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).IsConst, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).IsConst = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "IsConst", + JsonPropertyName = "is_const" + }; + + properties[7] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info7); + + var info8 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).Location, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).Location = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "Location", + JsonPropertyName = "location" + }; + + properties[8] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info8); + + var info9 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + { + IsProperty = true, + IsPublic = true, + IsVirtual = false, + DeclaringType = typeof(global::c2ffi.Data.CType), + Converter = null, + Getter = static obj => ((global::c2ffi.Data.CType)obj).InnerType, + Setter = static (obj, value) => ((global::c2ffi.Data.CType)obj).InnerType = value!, + IgnoreCondition = null, + HasJsonInclude = false, + IsExtensionData = false, + NumberHandling = null, + PropertyName = "InnerType", + JsonPropertyName = "inner_type" + }; + + properties[9] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info9); + + return properties; + } + } +} diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeAlias.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeAlias.g.cs index a651bf9..795f9a0 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeAlias.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeAlias.g.cs @@ -45,24 +45,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[4]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CTypeAlias), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingTypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingTypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingType, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CTypeAlias)obj).UnderlyingType = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "UnderlyingTypeInfo", + PropertyName = "UnderlyingType", JsonPropertyName = "underlyingType" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeInfo.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeInfo.g.cs index 8044a90..8677508 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeInfo.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CTypeInfo.g.cs @@ -173,7 +173,7 @@ public partial class JsonSerializerContextCFfiTargetPlatform IsExtensionData = false, NumberHandling = null, PropertyName = "IsAnonymous", - JsonPropertyName = "is_snonymous" + JsonPropertyName = "is_anonymous" }; properties[6] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info6); diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CVariable.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CVariable.g.cs index 91da346..82f5a0d 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CVariable.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.CVariable.g.cs @@ -45,24 +45,24 @@ public partial class JsonSerializerContextCFfiTargetPlatform { var properties = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfo[4]; - var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues + var info0 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { IsProperty = true, IsPublic = true, IsVirtual = false, DeclaringType = typeof(global::c2ffi.Data.Nodes.CVariable), Converter = null, - Getter = static obj => ((global::c2ffi.Data.Nodes.CVariable)obj).TypeInfo, - Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CVariable)obj).TypeInfo = value!, + Getter = static obj => ((global::c2ffi.Data.Nodes.CVariable)obj).Type, + Setter = static (obj, value) => ((global::c2ffi.Data.Nodes.CVariable)obj).Type = value!, IgnoreCondition = null, HasJsonInclude = false, IsExtensionData = false, NumberHandling = null, - PropertyName = "TypeInfo", + PropertyName = "Type", JsonPropertyName = "type" }; - properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); + properties[0] = global::System.Text.Json.Serialization.Metadata.JsonMetadataServices.CreatePropertyInfo(options, info0); var info1 = new global::System.Text.Json.Serialization.Metadata.JsonPropertyInfoValues { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.GetJsonTypeInfo.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.GetJsonTypeInfo.g.cs index e711762..f2a5604 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.GetJsonTypeInfo.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.GetJsonTypeInfo.g.cs @@ -51,9 +51,9 @@ public partial class JsonSerializerContextCFfiTargetPlatform : global::System.Te { return Create_CRecordKind(options); } - if (type == typeof(global::c2ffi.Data.CTypeInfo)) + if (type == typeof(global::c2ffi.Data.CType)) { - return Create_CTypeInfo(options); + return Create_CType(options); } if (type == typeof(global::c2ffi.Data.Nodes.CEnum)) { diff --git a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.g.cs b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.g.cs index cf2f03a..0477062 100644 --- a/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.g.cs +++ b/src/cs/production/c2ffi.Data/Generated/System.Text.Json.SourceGeneration/System.Text.Json.SourceGeneration.JsonSourceGenerator/JsonSerializerContextCFfiTargetPlatform.g.cs @@ -8,7 +8,7 @@ namespace c2ffi.Data.Serialization { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.Json.SourceGeneration", "8.0.9.8001")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Text.Json.SourceGeneration", "8.0.10.11423")] public partial class JsonSerializerContextCFfiTargetPlatform { private readonly static global::System.Text.Json.JsonSerializerOptions s_defaultOptions = new() diff --git a/src/cs/production/c2ffi.Data/Nodes/CArray.cs b/src/cs/production/c2ffi.Data/Nodes/CArray.cs index 2d4a3fd..efbea43 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CArray.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CArray.cs @@ -18,7 +18,7 @@ public class CArray : CNode /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// public override bool Equals(CNode? other) @@ -28,7 +28,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo); + return Type.Equals(other2.Type); } /// @@ -40,7 +40,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CFunction.cs b/src/cs/production/c2ffi.Data/Nodes/CFunction.cs index 6c6a4e5..9fcc9bd 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CFunction.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CFunction.cs @@ -26,7 +26,7 @@ public class CFunction : CNodeWithLocation /// Gets or sets the function's return type information. /// [JsonPropertyName("return_type")] - public CTypeInfo ReturnTypeInfo { get; set; } = null!; + public CType ReturnType { get; set; } = null!; /// /// Gets or sets the function's parameters. @@ -51,7 +51,7 @@ public override bool Equals(CNode? other) var callingConventionsAreEqual = CallingConvention == other2.CallingConvention; var parametersAreEqual = Parameters.SequenceEqual(other2.Parameters); - var returnTypesAreEqual = ReturnTypeInfo.Equals(other2.ReturnTypeInfo); + var returnTypesAreEqual = ReturnType.Equals(other2.ReturnType); return callingConventionsAreEqual && returnTypesAreEqual && parametersAreEqual; } @@ -65,7 +65,7 @@ public override int GetHashCode() // ReSharper disable NonReadonlyMemberInGetHashCode hashCode.Add(CallingConvention); - hashCode.Add(ReturnTypeInfo); + hashCode.Add(ReturnType); foreach (var parameter in Parameters) { diff --git a/src/cs/production/c2ffi.Data/Nodes/CFunctionParameter.cs b/src/cs/production/c2ffi.Data/Nodes/CFunctionParameter.cs index 046cf32..d56ef61 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CFunctionParameter.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CFunctionParameter.cs @@ -29,13 +29,13 @@ public class CFunctionParameter : CNodeWithLocation /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// [ExcludeFromCodeCoverage] public override string ToString() { - return $"FunctionParameter '{Name}': {TypeInfo} @ {Location}"; + return $"FunctionParameter '{Name}': {Type} @ {Location}"; } /// @@ -46,7 +46,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo); + return Type.Equals(other2.Type); } /// @@ -58,7 +58,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CFunctionPointer.cs b/src/cs/production/c2ffi.Data/Nodes/CFunctionPointer.cs index 85dc604..ccaf449 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CFunctionPointer.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CFunctionPointer.cs @@ -20,13 +20,13 @@ public class CFunctionPointer : CNodeWithLocation /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// /// Gets or sets the return type information. /// [JsonPropertyName("return_type")] - public CTypeInfo ReturnTypeInfo { get; set; } = null!; + public CType ReturnType { get; set; } = null!; /// /// Gets or sets the parameters. @@ -44,7 +44,7 @@ public class CFunctionPointer : CNodeWithLocation [ExcludeFromCodeCoverage] public override string ToString() { - return $"FunctionPointer {TypeInfo} @ {Location}"; + return $"FunctionPointer {Type} @ {Location}"; } /// @@ -55,8 +55,8 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo) && - ReturnTypeInfo.Equals(other2.ReturnTypeInfo) && + return Type.Equals(other2.Type) && + ReturnType.Equals(other2.ReturnType) && Parameters.SequenceEqual(other2.Parameters); } @@ -69,8 +69,8 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); - hashCode.Add(ReturnTypeInfo); + hashCode.Add(Type); + hashCode.Add(ReturnType); foreach (var parameter in Parameters) { diff --git a/src/cs/production/c2ffi.Data/Nodes/CFunctionPointerParameter.cs b/src/cs/production/c2ffi.Data/Nodes/CFunctionPointerParameter.cs index f9a222b..7f3096c 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CFunctionPointerParameter.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CFunctionPointerParameter.cs @@ -29,13 +29,13 @@ public class CFunctionPointerParameter : CNode /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// [ExcludeFromCodeCoverage] public override string ToString() { - return $"FunctionPointerParameter '{Name}': {TypeInfo}"; + return $"FunctionPointerParameter '{Name}': {Type}"; } /// @@ -46,7 +46,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo); + return Type.Equals(other2.Type); } /// @@ -58,7 +58,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CMacroObject.cs b/src/cs/production/c2ffi.Data/Nodes/CMacroObject.cs index 50ab2c7..71112fb 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CMacroObject.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CMacroObject.cs @@ -19,7 +19,7 @@ public class CMacroObject : CNodeWithLocation /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// /// Gets or sets the value. @@ -42,7 +42,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo) && Value == other2.Value; + return Type.Equals(other2.Type) && Value == other2.Value; } public bool EqualsWithoutValue(CMacroObject other) @@ -52,7 +52,7 @@ public bool EqualsWithoutValue(CMacroObject other) return false; } - return TypeInfo.Equals(other.TypeInfo); + return Type.Equals(other.Type); } /// @@ -64,7 +64,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); hashCode.Add(Value); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CPointer.cs b/src/cs/production/c2ffi.Data/Nodes/CPointer.cs index 69b2683..e0830be 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CPointer.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CPointer.cs @@ -18,7 +18,7 @@ public class CPointer : CNode /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// public override bool Equals(CNode? other) @@ -28,7 +28,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo); + return Type.Equals(other2.Type); } /// @@ -40,7 +40,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CPrimitive.cs b/src/cs/production/c2ffi.Data/Nodes/CPrimitive.cs index 77cb4b5..3148f7d 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CPrimitive.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CPrimitive.cs @@ -18,7 +18,7 @@ public class CPrimitive : CNode /// Gets or sets the type information. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// public override bool Equals(CNode? other) @@ -28,7 +28,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo); + return Type.Equals(other2.Type); } /// @@ -40,7 +40,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CRecord.cs b/src/cs/production/c2ffi.Data/Nodes/CRecord.cs index ae7dea5..2a7e31c 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CRecord.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CRecord.cs @@ -34,6 +34,12 @@ public class CRecord : CNodeWithLocation [JsonPropertyName("align_of")] public int AlignOf { get; set; } + /// + /// Gets or sets a value indicating whether the C type is anonymous. + /// + [JsonPropertyName("is_anonymous")] + public bool IsAnonymous { get; set; } + /// /// Gets or sets the fields. /// @@ -55,10 +61,15 @@ public override bool Equals(CNode? other) return false; } - return RecordKind == other2.RecordKind && - SizeOf == other2.SizeOf && - AlignOf == other2.AlignOf && - Fields.SequenceEqual(other2.Fields); + var kindsAreEqual = RecordKind == other2.RecordKind; + var sizesAreEqual = SizeOf == other2.SizeOf; + var alignmentsAreEqual = AlignOf == other2.AlignOf; + var fieldsAreEqual = Fields.SequenceEqual(other2.Fields); + + return kindsAreEqual && + sizesAreEqual && + alignmentsAreEqual && + fieldsAreEqual; } /// diff --git a/src/cs/production/c2ffi.Data/Nodes/CRecordField.cs b/src/cs/production/c2ffi.Data/Nodes/CRecordField.cs index eb934b1..eeb2598 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CRecordField.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CRecordField.cs @@ -29,7 +29,7 @@ public class CRecordField : CNodeWithLocation /// Gets or sets the type information of this field. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// /// Gets or sets the byte offset of this field. @@ -41,7 +41,7 @@ public class CRecordField : CNodeWithLocation [ExcludeFromCodeCoverage] public override string ToString() { - return $"Record field '{Name}': {TypeInfo} @ {Location}"; + return $"Record field '{Name}': {Type} @ {Location}"; } /// @@ -52,7 +52,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo) && OffsetOf == other2.OffsetOf; + return Type.Equals(other2.Type) && OffsetOf == other2.OffsetOf; } /// @@ -64,7 +64,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo); + hashCode.Add(Type); hashCode.Add(OffsetOf); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CTypeAlias.cs b/src/cs/production/c2ffi.Data/Nodes/CTypeAlias.cs index cf132da..66451f8 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CTypeAlias.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CTypeAlias.cs @@ -19,13 +19,13 @@ public class CTypeAlias : CNodeWithLocation /// Gets or sets the underlying type information. /// [JsonPropertyName("underlyingType")] - public CTypeInfo UnderlyingTypeInfo { get; set; } = null!; + public CType UnderlyingType { get; set; } = null!; /// [ExcludeFromCodeCoverage] public override string ToString() { - return $"Typedef '{Name}': {UnderlyingTypeInfo} @ {Location}"; + return $"Typedef '{Name}': {UnderlyingType} @ {Location}"; } /// @@ -36,7 +36,7 @@ public override bool Equals(CNode? other) return false; } - return UnderlyingTypeInfo.Equals(other2.UnderlyingTypeInfo); + return UnderlyingType.Equals(other2.UnderlyingType); } /// @@ -48,7 +48,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(UnderlyingTypeInfo); + hashCode.Add(UnderlyingType); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Data/Nodes/CVariable.cs b/src/cs/production/c2ffi.Data/Nodes/CVariable.cs index 06b91e0..5ce0de5 100644 --- a/src/cs/production/c2ffi.Data/Nodes/CVariable.cs +++ b/src/cs/production/c2ffi.Data/Nodes/CVariable.cs @@ -19,13 +19,13 @@ public class CVariable : CNodeWithLocation /// Gets or sets the type of the variable. /// [JsonPropertyName("type")] - public CTypeInfo TypeInfo { get; set; } = null!; + public CType Type { get; set; } = null!; /// [ExcludeFromCodeCoverage] public override string ToString() { - return $"Variable '{Name}': {TypeInfo} @ {Location}"; + return $"Variable '{Name}': {Type} @ {Location}"; } /// @@ -36,7 +36,7 @@ public override bool Equals(CNode? other) return false; } - return TypeInfo.Equals(other2.TypeInfo); + return Type.Equals(other2.Type); } /// @@ -48,7 +48,7 @@ public override int GetHashCode() hashCode.Add(baseHashCode); // ReSharper disable NonReadonlyMemberInGetHashCode - hashCode.Add(TypeInfo.GetHashCode()); + hashCode.Add(Type.GetHashCode()); // ReSharper restore NonReadonlyMemberInGetHashCode diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/Context/ExploreContext.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/Context/ExploreContext.cs index 843a5be..e5be2a2 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/Context/ExploreContext.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/Context/ExploreContext.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using bottlenoselabs; using c2ffi.Data; using c2ffi.Data.Nodes; @@ -64,22 +65,23 @@ public bool IsIncludeIgnored(string filePath) return _ignoredIncludeFiles.Contains(filePath); } - public CTypeInfo VisitType( + public CType VisitType( clang.CXType clangType, ExploreNodeInfo? parentInfo, CNodeKind? nodeKind = null) { - var clangTypeInfo = ClangTypeInfoProvider.GetTypeInfo(clangType, parentInfo?.NodeKind); - var nodeKindUsed = nodeKind ?? clangTypeInfo.NodeKind; + var typeInfo = ClangTypeInfoProvider.GetTypeInfo(clangType, parentInfo?.NodeKind); + var nodeKindUsed = nodeKind ?? typeInfo.NodeKind; - var typeInfo = VisitTypeInternal( + var type = VisitTypeInternal( nodeKindUsed, - clangTypeInfo.Name, - clangTypeInfo.ClangType, + typeInfo.Name, + typeInfo.ClangType, clangType, - clangTypeInfo.ClangCursor, + typeInfo.ClangCursor, parentInfo); - return typeInfo; + + return type; } public string? Comment(clang.CXCursor clangCursor) @@ -96,13 +98,26 @@ public ExploreNodeInfo CreateTopLevelNodeInfo( var clangCursorName = clangCursor.Spelling(); var clangCursorType = clang.clang_getCursorType(clangCursor); - var clangCursorTypeCanonical = clangCursorType; - if (clangCursorType.kind == clang.CXTypeKind.CXType_Attributed) + if (nodeKind == CNodeKind.MacroObject) { - clangCursorTypeCanonical = clang.clang_Type_getModifiedType(clangCursorType); + return CreateNodeInfo( + nodeKind, + clangCursorName, + clangCursorType.Spelling(), + clangCursor, + clangCursorType, + null); } - return CreateNodeInfo(nodeKind, clangCursorName, clangCursor, clangCursorTypeCanonical, null); + var clangTypeInfo = ClangTypeInfoProvider.GetTypeInfo(clangCursorType); + + return CreateNodeInfo( + nodeKind, + clangCursorName, + clangTypeInfo.Name, + clangCursor, + clangTypeInfo.ClangType, + null); } public void Dispose() @@ -110,7 +125,7 @@ public void Dispose() ParseContext.Dispose(); } - private CTypeInfo VisitTypeInternal( + private CType VisitTypeInternal( CNodeKind nodeKind, string typeName, clang.CXType clangType, @@ -123,69 +138,28 @@ private CTypeInfo VisitTypeInternal( int? sizeOf; int? alignOf; - CTypeInfo? innerType = null; - if (nodeKind is CNodeKind.Pointer) - { - var pointeeTypeCandidate = clang.clang_getPointeeType(clangType); - var pointeeTypeInfo = ClangTypeInfoProvider.GetTypeInfo(pointeeTypeCandidate, nodeKind); - - innerType = VisitTypeInternal( - pointeeTypeInfo.NodeKind, - pointeeTypeInfo.Name, - pointeeTypeInfo.ClangType, - pointeeTypeCandidate, - pointeeTypeInfo.ClangCursor, - rootNode); - sizeOf = ParseContext.PointerSize; - alignOf = ParseContext.PointerSize; - } - else if (nodeKind is CNodeKind.Array) - { - var elementTypeCandidate = clang.clang_getArrayElementType(clangType); - var elementTypeInfo = ClangTypeInfoProvider.GetTypeInfo(elementTypeCandidate, nodeKind); - - innerType = VisitTypeInternal( - elementTypeInfo.NodeKind, - elementTypeInfo.Name, - elementTypeInfo.ClangType, - elementTypeCandidate, - elementTypeInfo.ClangCursor, - rootNode); - sizeOf = ParseContext.PointerSize; - alignOf = ParseContext.PointerSize; - } - else if (nodeKind is CNodeKind.TypeAlias) + CType? innerType = null; + switch (nodeKind) { - var aliasTypeCandidate = clang.clang_getTypedefDeclUnderlyingType(clangCursor); - var aliasTypeInfo = ClangTypeInfoProvider.GetTypeInfo(aliasTypeCandidate, nodeKind); - - innerType = VisitTypeInternal( - aliasTypeInfo.NodeKind, - aliasTypeInfo.Name, - aliasTypeInfo.ClangType, - aliasTypeCandidate, - aliasTypeInfo.ClangCursor, - rootNode); - if (innerType != null) - { - if (innerType.NodeKind == CNodeKind.OpaqueType) - { - return innerType; - } - + case CNodeKind.Pointer: + innerType = VisitTypeInternalPointer(nodeKind, clangType, rootNode); + sizeOf = ParseContext.PointerSize; + alignOf = ParseContext.PointerSize; + break; + case CNodeKind.Array: + innerType = VisitTypeInternalArray(nodeKind, clangType, rootNode); + sizeOf = ParseContext.PointerSize; + alignOf = ParseContext.PointerSize; + break; + case CNodeKind.TypeAlias: + innerType = VisitTypeInternalTypeAlias(nodeKind, clangCursor, rootNode); sizeOf = innerType.SizeOf; alignOf = innerType.AlignOf; - } - else - { - sizeOf = ParseContext.SizeOf(nodeKind, aliasTypeInfo.ClangType); - alignOf = ParseContext.AlignOf(nodeKind, aliasTypeInfo.ClangType); - } - } - else - { - sizeOf = ParseContext.SizeOf(nodeKind, clangContainerType); - alignOf = ParseContext.AlignOf(nodeKind, clangContainerType); + break; + default: + sizeOf = ParseContext.SizeOf(nodeKind, clangContainerType); + alignOf = ParseContext.AlignOf(nodeKind, clangContainerType); + break; } var arraySizeValue = (int)clang.clang_getArraySize(clangContainerType); @@ -206,7 +180,7 @@ private CTypeInfo VisitTypeInternal( var isAnonymous = clang.clang_Cursor_isAnonymous(clangCursorLocation) > 0; - var typeInfo = new CTypeInfo + var type = new CType { Name = typeName, NodeKind = nodeKind, @@ -217,34 +191,89 @@ private CTypeInfo VisitTypeInternal( Location = location, IsAnonymous = isAnonymous ? true : null, IsConst = false, - InnerTypeInfo = innerType + InnerType = innerType }; - if (typeInfo.NodeKind == CNodeKind.TypeAlias && typeInfo.InnerTypeInfo != null && - typeInfo.Name == typeInfo.InnerTypeInfo.Name) + if (type is { NodeKind: CNodeKind.TypeAlias, InnerType: not null } && + type.Name == type.InnerType.Name) { - return typeInfo; + return type; } if (location.IsSystem && nodeKind != CNodeKind.FunctionPointer) { - return typeInfo; + return type; } - var info = CreateNodeInfo(typeInfo.NodeKind, typeInfo.Name, clangCursor, clangType, rootNode); + var info = CreateNodeInfo(type.NodeKind, type.Name, type.Name, clangCursor, clangType, rootNode); TryEnqueueNode(info); - return typeInfo; + return type; + } + + private CType VisitTypeInternalPointer( + CNodeKind nodeKind, + clang.CXType clangType, + ExploreNodeInfo? rootNode) + { + var pointeeTypeCandidate = clang.clang_getPointeeType(clangType); + var pointeeTypeInfo = ClangTypeInfoProvider.GetTypeInfo(pointeeTypeCandidate, nodeKind); + + var innerType = VisitTypeInternal( + pointeeTypeInfo.NodeKind, + pointeeTypeInfo.Name, + pointeeTypeInfo.ClangType, + pointeeTypeCandidate, + pointeeTypeInfo.ClangCursor, + rootNode); + return innerType; + } + + private CType VisitTypeInternalArray( + CNodeKind nodeKind, + clang.CXType clangType, + ExploreNodeInfo? rootNode) + { + var elementTypeCandidate = clang.clang_getArrayElementType(clangType); + var elementTypeInfo = ClangTypeInfoProvider.GetTypeInfo(elementTypeCandidate, nodeKind); + + var innerType = VisitTypeInternal( + elementTypeInfo.NodeKind, + elementTypeInfo.Name, + elementTypeInfo.ClangType, + elementTypeCandidate, + elementTypeInfo.ClangCursor, + rootNode); + return innerType; + } + + private CType VisitTypeInternalTypeAlias( + CNodeKind nodeKind, + clang.CXCursor clangCursor, + ExploreNodeInfo? rootNode) + { + var aliasTypeCandidate = clang.clang_getTypedefDeclUnderlyingType(clangCursor); + var aliasTypeInfo = ClangTypeInfoProvider.GetTypeInfo(aliasTypeCandidate, nodeKind); + + var innerType = VisitTypeInternal( + aliasTypeInfo.NodeKind, + aliasTypeInfo.Name, + aliasTypeInfo.ClangType, + aliasTypeCandidate, + aliasTypeInfo.ClangCursor, + rootNode); + + return innerType; } private ExploreNodeInfo CreateNodeInfo( CNodeKind kind, string name, + string typeName, clang.CXCursor clangCursor, clang.CXType clangType, ExploreNodeInfo? parentInfo) { var location = ParseContext.Location(clangCursor); - var typeName = clangType.Spelling(); var sizeOf = ParseContext.SizeOf(kind, clangType); var alignOf = ParseContext.AlignOf(kind, clangType); @@ -253,8 +282,8 @@ private ExploreNodeInfo CreateNodeInfo( NodeKind = kind, Name = name, TypeName = typeName, - Type = clangType, - Cursor = clangCursor, + ClangType = clangType, + ClangCursor = clangCursor, Location = location, Parent = parentInfo, SizeOf = sizeOf, diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/ExploreNodeInfo.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/ExploreNodeInfo.cs index c20c424..b4037d5 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/ExploreNodeInfo.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/ExploreNodeInfo.cs @@ -14,9 +14,9 @@ public sealed class ExploreNodeInfo public string TypeName { get; init; } = string.Empty; - public CXCursor Cursor { get; init; } + public CXCursor ClangCursor { get; init; } - public CXType Type { get; init; } + public CXType ClangType { get; init; } public CLocation Location { get; init; } diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorer.cs index 5b30e89..ce4e8cc 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorer.cs @@ -64,13 +64,13 @@ internal bool CanVisitInternal(ExploreContext context, ExploreNodeInfo info) { if (!IsExpectedCursor(info)) { - LogFailureUnexpectedCursor(info.Cursor.kind); + LogFailureUnexpectedCursor(info.ClangCursor.kind); return false; } if (!IsExpectedType(info)) { - LogFailureUnexpectedType(info.Type.kind); + LogFailureUnexpectedType(info.ClangType.kind); return false; } @@ -119,12 +119,12 @@ private void MarkAsVisited(ExploreNodeInfo info) private bool IsExpectedCursor(ExploreNodeInfo info) { - return ExpectedCursors.Matches(info.Cursor.kind); + return ExpectedCursors.Matches(info.ClangCursor.kind); } private bool IsExpectedType(ExploreNodeInfo info) { - var typeKind = info.Type.kind; + var typeKind = info.ClangType.kind; return ExpectedTypes.Matches(typeKind); } diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/ArrayExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/ArrayExplorer.cs index 70d088a..9b34a34 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/ArrayExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/ArrayExplorer.cs @@ -29,13 +29,13 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static CArray Array(ExploreContext context, ExploreNodeInfo info) { - var type = clang_getElementType(info.Type); - var typeInfo = context.VisitType(type, info); + var clangElementType = clang_getElementType(info.ClangType); + var elementType = context.VisitType(clangElementType, info); var result = new CArray { Name = info.Name, - TypeInfo = typeInfo + Type = elementType }; return result; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/EnumExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/EnumExplorer.cs index d205383..6d4016e 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/EnumExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/EnumExplorer.cs @@ -28,15 +28,15 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private CEnum Enum(ExploreContext context, ExploreNodeInfo info) { - var integerTypeInfo = IntegerTypeInfo(context, info); - var enumValues = EnumValues(info.Cursor); - var comment = context.Comment(info.Cursor); + var integerType = IntegerTypeInfo(context, info); + var enumValues = EnumValues(info.ClangCursor); + var comment = context.Comment(info.ClangCursor); var result = new CEnum { Name = info.Name, Location = info.Location, - SizeOf = integerTypeInfo.SizeOf!.Value, + SizeOf = integerType.SizeOf!.Value, Values = enumValues, Comment = comment }; @@ -44,17 +44,17 @@ private CEnum Enum(ExploreContext context, ExploreNodeInfo info) return result; } - private static CTypeInfo IntegerTypeInfo(ExploreContext context, ExploreNodeInfo info) + private static CType IntegerTypeInfo(ExploreContext context, ExploreNodeInfo info) { - var clangType = clang_getEnumDeclIntegerType(info.Cursor); + var clangType = clang_getEnumDeclIntegerType(info.ClangCursor); return context.VisitType(clangType, info); } - private ImmutableArray EnumValues(CXCursor cursor) + private ImmutableArray EnumValues(CXCursor clangCursor) { var builder = ImmutableArray.CreateBuilder(); - var enumValuesCursors = cursor.GetDescendents( + var enumValuesCursors = clangCursor.GetDescendents( static (child, _) => child.kind == CXCursorKind.CXCursor_EnumConstantDecl); foreach (var enumValueCursor in enumValuesCursors) @@ -67,10 +67,10 @@ private ImmutableArray EnumValues(CXCursor cursor) return result; } - private CEnumValue CreateEnumValue(CXCursor cursor, string? name = null) + private CEnumValue CreateEnumValue(CXCursor clangCursor, string? name = null) { - var value = clang_getEnumConstantDeclValue(cursor); - name ??= cursor.Spelling(); + var value = clang_getEnumConstantDeclValue(clangCursor); + name ??= clangCursor.Spelling(); var result = new CEnumValue { diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionExplorer.cs index d2d97b9..3679fab 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionExplorer.cs @@ -50,16 +50,16 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private CFunction Function(ExploreContext context, ExploreNodeInfo info) { - var returnTypeInfo = FunctionReturnType(context, info); + var returnType = FunctionReturnType(context, info); var parameters = FunctionParameters(context, info); - var callingConvention = FunctionCallingConvention(info.Type); - var comment = context.Comment(info.Cursor); + var callingConvention = FunctionCallingConvention(info.ClangType); + var comment = context.Comment(info.ClangCursor); var result = new CFunction { Name = info.Name, Location = info.Location, - ReturnTypeInfo = returnTypeInfo, + ReturnType = returnType, Parameters = parameters, CallingConvention = callingConvention, Comment = comment @@ -82,10 +82,10 @@ private static CFunctionCallingConvention FunctionCallingConvention(CXType type) return result; } - private static CTypeInfo FunctionReturnType( + private static CType FunctionReturnType( ExploreContext context, ExploreNodeInfo parentInfo) { - var resultType = clang_getCursorResultType(parentInfo.Cursor); + var resultType = clang_getCursorResultType(parentInfo.ClangCursor); return context.VisitType(resultType, parentInfo); } @@ -95,10 +95,10 @@ private ImmutableArray FunctionParameters( { var builder = ImmutableArray.CreateBuilder(); - var count = clang_Cursor_getNumArguments(info.Cursor); + var count = clang_Cursor_getNumArguments(info.ClangCursor); for (uint i = 0; i < count; i++) { - var parameterCursor = clang_Cursor_getArgument(info.Cursor, i); + var parameterCursor = clang_Cursor_getArgument(info.ClangCursor, i); var functionParameter = FunctionParameter(context, parameterCursor, info); builder.Add(functionParameter); @@ -123,7 +123,7 @@ private static CFunctionParameter FunctionParameter( { Name = name, Location = parameterTypeInfo.Location, - TypeInfo = parameterTypeInfo, + Type = parameterTypeInfo, Comment = comment }; return functionExternParameter; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionPointerExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionPointerExplorer.cs index 3cd2cba..6862f2a 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionPointerExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/FunctionPointerExplorer.cs @@ -39,19 +39,19 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static CFunctionPointer FunctionPointer(ExploreContext context, ExploreNodeInfo info) { - var typeInfo = context.VisitType(info.Type, info, nodeKind: CNodeKind.FunctionPointer); - var returnTypeInfo = FunctionPointerReturnType(context, info); + var type = context.VisitType(info.ClangType, info, nodeKind: CNodeKind.FunctionPointer); + var returnType = FunctionPointerReturnType(context, info); var parameters = FunctionPointerParameters(context, info); - var callingConvention = FunctionPointerCallingConvention(info.Type); - var comment = context.Comment(info.Cursor); + var callingConvention = FunctionPointerCallingConvention(info.ClangType); + var comment = context.Comment(info.ClangCursor); var result = new CFunctionPointer { Name = info.Name, Location = info.Location, CallingConvention = callingConvention, - TypeInfo = typeInfo, - ReturnTypeInfo = returnTypeInfo, + Type = type, + ReturnType = returnType, Parameters = parameters, Comment = comment }; @@ -59,9 +59,9 @@ private static CFunctionPointer FunctionPointer(ExploreContext context, ExploreN return result; } - private static CTypeInfo FunctionPointerReturnType(ExploreContext context, ExploreNodeInfo info) + private static CType FunctionPointerReturnType(ExploreContext context, ExploreNodeInfo info) { - var returnType = clang_getResultType(info.Type); + var returnType = clang_getResultType(info.ClangType); var returnTypeInfo = context.VisitType(returnType, info)!; return returnTypeInfo; } @@ -72,10 +72,10 @@ private static ImmutableArray FunctionPointerParamete { var builder = ImmutableArray.CreateBuilder(); - var count = clang_getNumArgTypes(info.Type); + var count = clang_getNumArgTypes(info.ClangType); for (uint i = 0; i < count; i++) { - var parameterType = clang_getArgType(info.Type, i); + var parameterType = clang_getArgType(info.ClangType, i); var functionPointerParameter = FunctionPointerParameter(context, parameterType, info); builder.Add(functionPointerParameter); } @@ -94,7 +94,7 @@ private static CFunctionPointerParameter FunctionPointerParameter( var result = new CFunctionPointerParameter { Name = string.Empty, - TypeInfo = parameterTypeInfo + Type = parameterTypeInfo }; return result; } diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/MacroObjectExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/MacroObjectExplorer.cs index 8ad68c8..7e058c9 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/MacroObjectExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/MacroObjectExplorer.cs @@ -59,7 +59,7 @@ protected override bool IsAllowed(ExploreContext context, ExploreNodeInfo info) private CMacroObject? MacroObject(ExploreContext context, ExploreNodeInfo info) { - var macroObjectCandidate = MacroObjectCandidate.Parse(context.ParseContext, info.Cursor); + var macroObjectCandidate = MacroObjectCandidate.Parse(context.ParseContext, info.ClangCursor); if (macroObjectCandidate == null) { return null; @@ -181,12 +181,12 @@ int main(void) return null; } - var typeInfo = context.VisitType(clangType, info); + var type = context.VisitType(clangType, info); var macroObject = new CMacroObject { Name = macroName, Value = value, - TypeInfo = typeInfo, + Type = type, Location = info.Location }; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/OpaqueTypeExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/OpaqueTypeExplorer.cs index 94b672d..dbce979 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/OpaqueTypeExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/OpaqueTypeExplorer.cs @@ -23,7 +23,7 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static COpaqueType OpaqueDataType(ExploreContext context, ExploreNodeInfo info) { - var comment = context.Comment(info.Cursor); + var comment = context.Comment(info.ClangCursor); var result = new COpaqueType { diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PointerExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PointerExplorer.cs index 07ca30d..7537915 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PointerExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PointerExplorer.cs @@ -25,14 +25,14 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static CPointer Pointer(ExploreContext context, ExploreNodeInfo info) { - var type = clang_getPointeeType(info.Type); - var typeInfo = context.VisitType(type, info); - var comment = context.Comment(info.Cursor); + var clangType = clang_getPointeeType(info.ClangType); + var type = context.VisitType(clangType, info); + var comment = context.Comment(info.ClangCursor); var result = new CPointer { Name = info.Name, - TypeInfo = typeInfo, + Type = type, Comment = comment }; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PrimitiveExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PrimitiveExplorer.cs index 4a27dad..f799c46 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PrimitiveExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/PrimitiveExplorer.cs @@ -46,13 +46,13 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static CPrimitive Primitive(ExploreContext context, ExploreNodeInfo info) { - var typeInfo = context.VisitType(info.Type, info); - var comment = context.Comment(info.Cursor); + var type = context.VisitType(info.ClangType, info); + var comment = context.Comment(info.ClangCursor); var result = new CPrimitive { Name = info.Name, - TypeInfo = typeInfo, + Type = type, Comment = comment }; return result; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/StructExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/StructExplorer.cs index 5ce1f5a..6c5dd90 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/StructExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/StructExplorer.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. using System.Collections.Immutable; +using bottlenoselabs; using c2ffi.Data; using c2ffi.Data.Nodes; using c2ffi.Tool.Commands.Extract.Domain.Explore.Context; @@ -26,7 +27,8 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private CRecord Struct(ExploreContext context, ExploreNodeInfo info) { var fields = StructFields(context, info); - var comment = context.Comment(info.Cursor); + var comment = context.Comment(info.ClangCursor); + var isAnonymous = clang_Cursor_isAnonymous(info.ClangCursor) > 0; var record = new CRecord { @@ -36,6 +38,7 @@ private CRecord Struct(ExploreContext context, ExploreNodeInfo info) Fields = fields, SizeOf = info.SizeOf!.Value, AlignOf = info.AlignOf!.Value, + IsAnonymous = isAnonymous, Comment = comment }; @@ -47,14 +50,14 @@ private ImmutableArray StructFields( ExploreNodeInfo structInfo) { var builder = ImmutableArray.CreateBuilder(); - var fieldCursors = FieldCursors(structInfo.Type); + var fieldCursors = FieldCursors(structInfo.ClangType); var fieldCursorsLength = fieldCursors.Length; if (fieldCursorsLength > 0) { for (var i = 0; i < fieldCursors.Length; i++) { - var fieldCursor = fieldCursors[i]; - var field = StructField(context, structInfo, fieldCursor); + var clangCursor = fieldCursors[i]; + var field = StructField(context, structInfo, clangCursor); builder.Add(field); } } @@ -66,20 +69,20 @@ private ImmutableArray StructFields( private CRecordField StructField( ExploreContext context, ExploreNodeInfo structInfo, - CXCursor fieldCursor) + CXCursor clangCursor) { - var fieldName = fieldCursor.Spelling(); - var type = clang_getCursorType(fieldCursor); - var location = context.ParseContext.Location(fieldCursor); - var typeInfo = context.VisitType(type, structInfo); - var offsetOf = (int)clang_Cursor_getOffsetOfField(fieldCursor) / 8; - var comment = context.Comment(fieldCursor); + var fieldName = clangCursor.Spelling(); + var clangType = clang_getCursorType(clangCursor); + var location = context.ParseContext.Location(clangCursor); + var type = context.VisitType(clangType, structInfo); + var offsetOf = (int)clang_Cursor_getOffsetOfField(clangCursor) / 8; + var comment = context.Comment(clangCursor); return new CRecordField { Name = fieldName, Location = location, - TypeInfo = typeInfo, + Type = type, OffsetOf = offsetOf, Comment = comment }; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/TypeAliasExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/TypeAliasExplorer.cs index a7feaa8..5c2e68b 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/TypeAliasExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/TypeAliasExplorer.cs @@ -29,17 +29,17 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static CTypeAlias TypeAlias(ExploreContext context, ExploreNodeInfo info) { - var aliasType = clang_getTypedefDeclUnderlyingType(info.Cursor); - var aliasTypeInfo = context.VisitType(aliasType, info); - var comment = context.Comment(info.Cursor); + var clangAliasType = clang_getTypedefDeclUnderlyingType(info.ClangCursor); + var underlyingType = context.VisitType(clangAliasType, info); + var comment = context.Comment(info.ClangCursor); - var typedef = new CTypeAlias + var typeAlias = new CTypeAlias { Name = info.Name, Location = info.Location, - UnderlyingTypeInfo = aliasTypeInfo, + UnderlyingType = underlyingType, Comment = comment }; - return typedef; + return typeAlias; } } diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/UnionExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/UnionExplorer.cs index f593173..4da9b3e 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/UnionExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/UnionExplorer.cs @@ -25,10 +25,11 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private CRecord Union(ExploreContext context, ExploreNodeInfo info) { - var fields = UnionFields(context, info.Type, info); - var comment = context.Comment(info.Cursor); + var fields = UnionFields(context, info.ClangType, info); + var comment = context.Comment(info.ClangCursor); + var isAnonymous = clang_Cursor_isAnonymous(info.ClangCursor) > 0; - var result = new CRecord + var record = new CRecord { RecordKind = CRecordKind.Union, Location = info.Location, @@ -36,25 +37,26 @@ private CRecord Union(ExploreContext context, ExploreNodeInfo info) Fields = fields, SizeOf = info.SizeOf!.Value, AlignOf = info.AlignOf!.Value, - Comment = comment + Comment = comment, + IsAnonymous = isAnonymous }; - return result; + return record; } private ImmutableArray UnionFields( ExploreContext context, - CXType type, + CXType clangType, ExploreNodeInfo parentInfo) { var builder = ImmutableArray.CreateBuilder(); - var fieldCursors = FieldCursors(type); + var fieldCursors = FieldCursors(clangType); for (var i = 0; i < fieldCursors.Length; i++) { - var fieldCursor = fieldCursors[i]; - var nextRecordField = UnionField(context, fieldCursor, parentInfo); - builder.Add(nextRecordField); + var clangCursor = fieldCursors[i]; + var field = UnionField(context, clangCursor, parentInfo); + builder.Add(field); } var result = builder.ToImmutable(); @@ -67,16 +69,16 @@ private CRecordField UnionField( ExploreNodeInfo parentInfo) { var name = clangCursor.Spelling(); - var type = clang_getCursorType(clangCursor); + var clangType = clang_getCursorType(clangCursor); var location = context.ParseContext.Location(clangCursor); - var typeInfo = context.VisitType(type, parentInfo); + var type = context.VisitType(clangType, parentInfo); var comment = context.Comment(clangCursor); var result = new CRecordField { Name = name, Location = location, - TypeInfo = typeInfo, + Type = type, Comment = comment }; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/VariableExplorer.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/VariableExplorer.cs index 0858f79..9f2fe93 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/VariableExplorer.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Explore/NodeExplorers/VariableExplorer.cs @@ -39,14 +39,14 @@ protected override CNode GetNode(ExploreContext context, ExploreNodeInfo info) private static CVariable Variable(ExploreContext context, ExploreNodeInfo info) { - var typeInfo = context.VisitType(info.Type, info); - var comment = context.Comment(info.Cursor); + var type = context.VisitType(info.ClangType, info); + var comment = context.Comment(info.ClangCursor); var result = new CVariable { Location = info.Location, Name = info.Name, - TypeInfo = typeInfo, + Type = type, Comment = comment }; return result; diff --git a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Parse/ClangTypeInfoProvider.cs b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Parse/ClangTypeInfoProvider.cs index 516f6b6..67ea5be 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Parse/ClangTypeInfoProvider.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Extract/Domain/Parse/ClangTypeInfoProvider.cs @@ -22,11 +22,12 @@ public struct ClangTypeInfo public static ClangTypeInfo Create(CNodeKind nodeKind, clang.CXType clangTypeCanonical) { var result = default(ClangTypeInfo); + var clangCursor = clang.clang_getTypeDeclaration(clangTypeCanonical); - result.Name = clangTypeCanonical.Spelling(); + result.Name = GetTypeName(clangTypeCanonical, clangCursor); result.NodeKind = nodeKind; result.ClangType = clangTypeCanonical; - result.ClangCursor = clang.clang_getTypeDeclaration(clangTypeCanonical); + result.ClangCursor = clangCursor; return result; } @@ -43,42 +44,42 @@ public static ClangTypeInfo GetTypeInfo( if (clangCursorType.IsPrimitive()) { - return TypeKindPrimitive(clangCursorType); + return GetTypeInfoPrimitive(clangCursorType); } switch (clangCursorType.kind) { case clang.CXTypeKind.CXType_Attributed: - return TypeKindAttributed(parentNodeKind, clangCursorType); + return GetTypeInfoAttributed(parentNodeKind, clangCursorType); case clang.CXTypeKind.CXType_Elaborated: - return TypeKindElaborated(parentNodeKind, clangCursorType); + return GetTypeInfoElaborated(parentNodeKind, clangCursorType); case clang.CXTypeKind.CXType_ConstantArray: case clang.CXTypeKind.CXType_IncompleteArray: - return TypeKindArray(clangCursorType); + return GetTypeInfoArray(clangCursorType); case clang.CXTypeKind.CXType_Unexposed: - return TypeKindUnexposed(parentNodeKind, clangCursorType); + return GetTypeInfoUnexposed(parentNodeKind, clangCursorType); case clang.CXTypeKind.CXType_Pointer: - return TypeKindPointer(clangCursorType); + return GetTypeInfoPointer(clangCursorType); case clang.CXTypeKind.CXType_Enum: - return TypeKindEnum(clangCursorType); + return GetTypeInfoEnum(clangCursorType); case clang.CXTypeKind.CXType_Record: - return TypeKindRecord(clangCursorType, clangCursor.kind); + return GetTypeInfoRecord(clangCursorType, clangCursor.kind); case clang.CXTypeKind.CXType_Typedef: - return TypeKindTypeAlias(parentNodeKind, clangCursor, clangCursorType); + return GetTypeInfoAlias(clangCursorType); case clang.CXTypeKind.CXType_FunctionNoProto or clang.CXTypeKind.CXType_FunctionProto: - return TypeKindFunction(parentNodeKind, clangCursor, clangCursorType); + return GetTypeInfoFunction(parentNodeKind, clangCursor, clangCursorType); } var up = new InvalidOperationException($"Unknown Clang type kind '{clangType.kind}'."); throw up; } - private static ClangTypeInfo TypeKindPrimitive(clang.CXType clangCursorType) + private static ClangTypeInfo GetTypeInfoPrimitive(clang.CXType clangCursorType) { return ClangTypeInfo.Create(CNodeKind.Primitive, clangCursorType); } - private static ClangTypeInfo TypeKindAttributed( + private static ClangTypeInfo GetTypeInfoAttributed( CNodeKind? parentNodeKind, clang.CXType clangCursorType) { @@ -86,7 +87,7 @@ private static ClangTypeInfo TypeKindAttributed( return GetTypeInfo(clangType, parentNodeKind); } - private static ClangTypeInfo TypeKindElaborated( + private static ClangTypeInfo GetTypeInfoElaborated( CNodeKind? parentNodeKind, clang.CXType clangCursorType) { @@ -94,7 +95,7 @@ private static ClangTypeInfo TypeKindElaborated( return GetTypeInfo(clangType, parentNodeKind); } - private static ClangTypeInfo TypeKindUnexposed( + private static ClangTypeInfo GetTypeInfoUnexposed( CNodeKind? parentNodeKind, clang.CXType clangCursorType) { @@ -102,13 +103,13 @@ private static ClangTypeInfo TypeKindUnexposed( return GetTypeInfo(clangTypeCanonical, parentNodeKind); } - private static ClangTypeInfo TypeKindArray( + private static ClangTypeInfo GetTypeInfoArray( clang.CXType clangCursorType) { return ClangTypeInfo.Create(CNodeKind.Array, clangCursorType); } - private static ClangTypeInfo TypeKindPointer( + private static ClangTypeInfo GetTypeInfoPointer( clang.CXType clangCursorType) { // ReSharper disable once IdentifierTypo @@ -128,13 +129,13 @@ clang.CXTypeKind.CXType_FunctionProto or return ClangTypeInfo.Create(CNodeKind.Pointer, clangCursorType); } - private static ClangTypeInfo TypeKindEnum( + private static ClangTypeInfo GetTypeInfoEnum( clang.CXType clangCursorType) { return ClangTypeInfo.Create(CNodeKind.Enum, clangCursorType); } - private static ClangTypeInfo TypeKindRecord( + private static ClangTypeInfo GetTypeInfoRecord( clang.CXType clangCursorType, clang.CXCursorKind clangCursorKind) { @@ -149,10 +150,7 @@ private static ClangTypeInfo TypeKindRecord( return ClangTypeInfo.Create(kind, clangCursorType); } - private static ClangTypeInfo TypeKindTypeAlias( - CNodeKind? parentNodeKind, - clang.CXCursor clangCursor, - clang.CXType clangCursorType) + private static ClangTypeInfo GetTypeInfoAlias(clang.CXType clangCursorType) { // var clangTypeUnderlying = clang.clang_getTypedefDeclUnderlyingType(clangCursor); // var clangTypeUnderlyingInfo = GetTypeInfo(clangTypeUnderlying, parentNodeKind); @@ -160,7 +158,7 @@ private static ClangTypeInfo TypeKindTypeAlias( return ClangTypeInfo.Create(CNodeKind.TypeAlias, clangCursorType); } - private static ClangTypeInfo TypeKindFunction( + private static ClangTypeInfo GetTypeInfoFunction( CNodeKind? parentNodeKind, clang.CXCursor clangCursor, clang.CXType clangCursorType) @@ -174,4 +172,44 @@ private static ClangTypeInfo TypeKindFunction( ? ClangTypeInfo.Create(CNodeKind.FunctionPointer, clangCursorType) : ClangTypeInfo.Create(CNodeKind.Function, clangCursorType); } + + private static string GetTypeName(clang.CXType clangType, clang.CXCursor clangCursor) + { + var isAnonymous = clang.clang_Cursor_isAnonymous(clangCursor) > 0; + var isRecord = clangCursor.kind is clang.CXCursorKind.CXCursor_StructDecl or clang.CXCursorKind.CXCursor_UnionDecl; + if (!isRecord || !isAnonymous) + { + return clangType.Spelling(); + } + + var clangCursorParent = clang.clang_getCursorSemanticParent(clangCursor); + var clangTypeParent = clang.clang_getCursorType(clangCursorParent); + var parentName = GetTypeName(clangTypeParent, clangCursorParent); + + var clangCursorFields = clangTypeParent.GetFields(); + var index = -1; + for (var i = 0; i < clangCursorFields.Length; i++) + { + var clangCursorField = clangCursorFields[i]; + var clangTypeField = clang.clang_getCursorType(clangCursorField); + if (clangTypeField.kind == clang.CXTypeKind.CXType_Elaborated) + { + clangTypeField = clang.clang_Type_getNamedType(clangTypeField); + } + + var areEqual = clang.clang_equalTypes(clangType, clangTypeField) > 0; + if (areEqual) + { + index = i; + } + } + + if (index == -1) + { + var name = clangType.Spelling(); + throw new InvalidOperationException($"Could not find anonymous record declaration for type '{name}' in parent record '{parentName}'."); + } + + return $"{parentName}_ANONYMOUS_{index}"; + } } diff --git a/src/cs/production/c2ffi.Tool/Commands/Merge/MergeFfisTool.cs b/src/cs/production/c2ffi.Tool/Commands/Merge/MergeFfisTool.cs index 9e7e505..d4d3044 100644 --- a/src/cs/production/c2ffi.Tool/Commands/Merge/MergeFfisTool.cs +++ b/src/cs/production/c2ffi.Tool/Commands/Merge/MergeFfisTool.cs @@ -120,11 +120,11 @@ private void AddCrossPlatformNode(CNodeWithTargetPlatform nodeWithTargetPlatform _opaqueTypes.Add(opaqueType); break; case CFunction function: - ClearLocationForTypeInfo(function.ReturnTypeInfo); + ClearLocationForTypeInfo(function.ReturnType); foreach (var parameter in function.Parameters) { parameter.Location = null; - ClearLocationForTypeInfo(parameter.TypeInfo); + ClearLocationForTypeInfo(parameter.Type); } _functions.Add(function); @@ -133,26 +133,26 @@ private void AddCrossPlatformNode(CNodeWithTargetPlatform nodeWithTargetPlatform foreach (var field in record.Fields) { field.Location = null; - ClearLocationForTypeInfo(field.TypeInfo); + ClearLocationForTypeInfo(field.Type); } _records.Add(record); break; case CFunctionPointer functionPointer: - ClearLocationForTypeInfo(functionPointer.ReturnTypeInfo); + ClearLocationForTypeInfo(functionPointer.ReturnType); foreach (var parameter in functionPointer.Parameters) { - ClearLocationForTypeInfo(parameter.TypeInfo); + ClearLocationForTypeInfo(parameter.Type); } _functionPointers.Add(functionPointer); break; case CMacroObject macroObject: - ClearLocationForTypeInfo(macroObject.TypeInfo); + ClearLocationForTypeInfo(macroObject.Type); _macroObjects.Add(macroObject); break; case CTypeAlias typeAlias: - ClearLocationForTypeInfo(typeAlias.UnderlyingTypeInfo); + ClearLocationForTypeInfo(typeAlias.UnderlyingType); _typeAliases.Add(typeAlias); break; default: @@ -160,13 +160,13 @@ private void AddCrossPlatformNode(CNodeWithTargetPlatform nodeWithTargetPlatform } } - private void ClearLocationForTypeInfo(CTypeInfo typeInfo) + private void ClearLocationForTypeInfo(CType type) { - var currentTypeInfo = typeInfo; + var currentTypeInfo = type; while (currentTypeInfo != null) { currentTypeInfo.Location = null; - currentTypeInfo = currentTypeInfo.InnerTypeInfo; + currentTypeInfo = currentTypeInfo.InnerType; } } diff --git a/src/cs/production/c2ffi.Tool/Generated/Microsoft.Extensions.Logging.Generators/Microsoft.Extensions.Logging.Generators.LoggerMessageGenerator/LoggerMessage.g.cs b/src/cs/production/c2ffi.Tool/Generated/Microsoft.Extensions.Logging.Generators/Microsoft.Extensions.Logging.Generators.LoggerMessageGenerator/LoggerMessage.g.cs index 5fd91e9..eeee4de 100644 --- a/src/cs/production/c2ffi.Tool/Generated/Microsoft.Extensions.Logging.Generators/Microsoft.Extensions.Logging.Generators.LoggerMessageGenerator/LoggerMessage.g.cs +++ b/src/cs/production/c2ffi.Tool/Generated/Microsoft.Extensions.Logging.Generators/Microsoft.Extensions.Logging.Generators.LoggerMessageGenerator/LoggerMessage.g.cs @@ -1,5 +1,5 @@ -// -#nullable enable +// +#nullable enable namespace c2ffi.Tool.Commands.Extract.Domain.Explore.Context { diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/GlobalUsings.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/GlobalUsings.cs index 4326dfe..d552c82 100644 --- a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/GlobalUsings.cs +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/GlobalUsings.cs @@ -1,6 +1,9 @@ // Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. // Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. +global using c2ffi.Tests.Library.Models; +global using FluentAssertions; global using Xunit; +global using static c2ffi.Tests.Library.CTestTypeAssertionExtensions; [assembly: CollectionBehavior(MaxParallelThreads = 1)] diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/MacroObjects/macro_object_ignored/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/MacroObjects/macro_object_ignored/Test.cs index eb96d46..19542f1 100644 --- a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/MacroObjects/macro_object_ignored/Test.cs +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/MacroObjects/macro_object_ignored/Test.cs @@ -23,7 +23,7 @@ public class Test : ExtractFfiTest ]; [Fact] - public void Function() + public void MacroObject() { var ffis = GetTargetPlatformFfis( $"src/c/tests/macro_objects/macro_object_ignored/config.json"); diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_anonymous_char_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_anonymous_char_int/Test.cs new file mode 100644 index 0000000..bd4cec8 --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_anonymous_char_int/Test.cs @@ -0,0 +1,66 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Extract.Structs.struct_anonymous_char_int; + +public class Test : ExtractFfiTest +{ + private const string StructName = "struct_anonymous_char_int"; + + [Fact] + public void Struct() + { + var ffis = GetTargetPlatformFfis( + $"src/c/tests/structs/{StructName}/config.json"); + Assert.True(ffis.Length > 0); + + foreach (var ffi in ffis) + { + StructExists(ffi); + } + } + + private void StructExists(CTestFfiTargetPlatform ffi) + { + const string name = $"struct {StructName}"; + var @struct = ffi.GetRecord(name); + @struct.Name.Should().Be(name); + @struct.IsStruct.Should().BeTrue(); + @struct.IsUnion.Should().BeFalse(); + @struct.IsAnonymous.Should().BeFalse(); + + @struct.Fields.Length.Should().Be(1); + + var field = @struct.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be(name + "_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(8); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousStruct = ffi.GetRecord(fieldType.Name); + anonymousStruct.IsStruct.Should().BeTrue(); + anonymousStruct.IsUnion.Should().BeFalse(); + anonymousStruct.SizeOf.Should().Be(8); + anonymousStruct.AlignOf.Should().Be(4); + anonymousStruct.IsAnonymous.Should().BeTrue(); + + anonymousStruct.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousStruct.Fields[0]; + anonymousField1.Name.Should().Be("a"); + anonymousField1.Type.Should().BeChar(); + anonymousField1.OffsetOf.Should().Be(0); + + var anonymousField2 = anonymousStruct.Fields[1]; + anonymousField2.Name.Should().Be("b"); + anonymousField2.Type.Should().BeInt(); + anonymousField2.OffsetOf.Should().Be(4); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_anonymous_nested/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_anonymous_nested/Test.cs new file mode 100644 index 0000000..c511937 --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_anonymous_nested/Test.cs @@ -0,0 +1,109 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Extract.Structs.struct_anonymous_nested; + +public class Test : ExtractFfiTest +{ + private const string StructName = "struct_anonymous_nested"; + + [Fact] + public void Struct() + { + var ffis = GetTargetPlatformFfis( + $"src/c/tests/structs/{StructName}/config.json"); + Assert.True(ffis.Length > 0); + + foreach (var ffi in ffis) + { + StructExists(ffi); + } + } + + private void StructExists(CTestFfiTargetPlatform ffi) + { + const string name = $"struct {StructName}"; + var @struct = ffi.GetRecord(name); + @struct.Name.Should().Be(name); + @struct.IsStruct.Should().BeTrue(); + @struct.IsUnion.Should().BeFalse(); + @struct.IsAnonymous.Should().BeFalse(); + + @struct.Fields.Length.Should().Be(1); + + var field = @struct.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be(name + "_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(16); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousStruct = ffi.GetRecord(fieldType.Name); + anonymousStruct.IsStruct.Should().BeTrue(); + anonymousStruct.IsUnion.Should().BeFalse(); + anonymousStruct.SizeOf.Should().Be(16); + anonymousStruct.AlignOf.Should().Be(4); + anonymousStruct.IsAnonymous.Should().BeTrue(); + anonymousStruct.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousStruct.Fields[0]; + anonymousField1.Name.Should().BeEmpty(); + anonymousField1.OffsetOf.Should().Be(0); + anonymousField1.Type.Name.Should().Be(anonymousStruct.Name + "_ANONYMOUS_0"); + anonymousField1.Type.SizeOf.Should().Be(8); + anonymousField1.Type.AlignOf.Should().Be(4); + anonymousField1.Type.IsAnonymous.Should().BeTrue(); + anonymousField1.Type.InnerType.Should().BeNull(); + + var anonymousField2 = anonymousStruct.Fields[1]; + anonymousField2.Name.Should().BeEmpty(); + anonymousField2.OffsetOf.Should().Be(8); + anonymousField2.Type.Name.Should().Be(anonymousStruct.Name + "_ANONYMOUS_1"); + anonymousField2.Type.SizeOf.Should().Be(8); + anonymousField2.Type.AlignOf.Should().Be(4); + anonymousField2.Type.IsAnonymous.Should().BeTrue(); + anonymousField2.Type.InnerType.Should().BeNull(); + + var nestedAnonymousStruct1 = ffi.GetRecord(anonymousField1.Type.Name); + nestedAnonymousStruct1.IsStruct.Should().BeTrue(); + nestedAnonymousStruct1.IsUnion.Should().BeFalse(); + nestedAnonymousStruct1.SizeOf.Should().Be(8); + nestedAnonymousStruct1.AlignOf.Should().Be(4); + nestedAnonymousStruct1.IsAnonymous.Should().BeTrue(); + nestedAnonymousStruct1.Fields.Length.Should().Be(2); + + var nestedAnonymousStruct1Field1 = nestedAnonymousStruct1.Fields[0]; + nestedAnonymousStruct1Field1.Name.Should().Be("a"); + nestedAnonymousStruct1Field1.Type.Should().BeChar(); + nestedAnonymousStruct1Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousStruct1Field2 = nestedAnonymousStruct1.Fields[1]; + nestedAnonymousStruct1Field2.Name.Should().Be("b"); + nestedAnonymousStruct1Field2.Type.Should().BeInt(); + nestedAnonymousStruct1Field2.OffsetOf.Should().Be(4); + + var nestedAnonymousStruct2 = ffi.GetRecord(anonymousField2.Type.Name); + nestedAnonymousStruct2.IsStruct.Should().BeTrue(); + nestedAnonymousStruct2.IsUnion.Should().BeFalse(); + nestedAnonymousStruct2.SizeOf.Should().Be(8); + nestedAnonymousStruct2.AlignOf.Should().Be(4); + nestedAnonymousStruct2.IsAnonymous.Should().BeTrue(); + nestedAnonymousStruct2.Fields.Length.Should().Be(2); + + var nestedAnonymousStruct2Field1 = nestedAnonymousStruct2.Fields[0]; + nestedAnonymousStruct2Field1.Name.Should().Be("c"); + nestedAnonymousStruct2Field1.Type.Should().BeChar(); + nestedAnonymousStruct2Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousStruct2Field2 = nestedAnonymousStruct2.Fields[1]; + nestedAnonymousStruct2Field2.Name.Should().Be("d"); + nestedAnonymousStruct2Field2.Type.Should().BeInt(); + nestedAnonymousStruct2Field2.OffsetOf.Should().Be(4); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_int/Test.cs index 99c0143..58b62c5 100644 --- a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_int/Test.cs +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Structs/struct_int/Test.cs @@ -21,26 +21,24 @@ public void Struct() foreach (var ffi in ffis) { - FfiStructExists(ffi); + StructExists(ffi); } } - private void FfiStructExists(CTestFfiTargetPlatform ffi) + private void StructExists(CTestFfiTargetPlatform ffi) { const string name = $"struct {StructName}"; var record = ffi.GetRecord(name); record.Name.Should().Be(name); - record.IsStruct.Should().Be(true); - record.IsUnion.Should().Be(false); + record.IsStruct.Should().BeTrue(); + record.IsUnion.Should().BeFalse(); + record.IsAnonymous.Should().BeFalse(); record.Fields.Length.Should().Be(1); var field = record.Fields[0]; field.Name.Should().Be("a"); field.OffsetOf.Should().Be(0); - field.Type.Name.Should().Be("int"); - field.Type.SizeOf.Should().Be(4); - field.Type.AlignOf.Should().Be(4); - field.Type.InnerType.Should().BeNull(); + field.Type.Should().BeInt(); } } diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_anonymous_char_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_anonymous_char_int/Test.cs new file mode 100644 index 0000000..578c8ed --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_anonymous_char_int/Test.cs @@ -0,0 +1,66 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Extract.Unions.union_anonymous_char_int; + +public class Test : ExtractFfiTest +{ + private const string StructName = "union_anonymous_char_int"; + + [Fact] + public void Union() + { + var ffis = GetTargetPlatformFfis( + $"src/c/tests/unions/{StructName}/config.json"); + Assert.True(ffis.Length > 0); + + foreach (var ffi in ffis) + { + UnionExists(ffi); + } + } + + private void UnionExists(CTestFfiTargetPlatform ffi) + { + const string name = $"union {StructName}"; + var union = ffi.GetRecord(name); + union.Name.Should().Be(name); + union.IsStruct.Should().BeFalse(); + union.IsUnion.Should().BeTrue(); + union.IsAnonymous.Should().BeFalse(); + + union.Fields.Length.Should().Be(1); + + var field = union.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be($"{name}_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(4); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousUnion = ffi.GetRecord(fieldType.Name); + anonymousUnion.IsStruct.Should().BeFalse(); + anonymousUnion.IsUnion.Should().BeTrue(); + anonymousUnion.SizeOf.Should().Be(4); + anonymousUnion.AlignOf.Should().Be(4); + anonymousUnion.IsAnonymous.Should().BeTrue(); + + anonymousUnion.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousUnion.Fields[0]; + anonymousField1.Name.Should().Be("a"); + anonymousField1.Type.Should().BeChar(); + anonymousField1.OffsetOf.Should().Be(0); + + var anonymousField2 = anonymousUnion.Fields[1]; + anonymousField2.Name.Should().Be("b"); + anonymousField2.Type.Should().BeInt(); + anonymousField2.OffsetOf.Should().Be(0); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_anonymous_nested/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_anonymous_nested/Test.cs new file mode 100644 index 0000000..079b97b --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_anonymous_nested/Test.cs @@ -0,0 +1,109 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Extract.Unions.union_anonymous_nested; + +public class Test : ExtractFfiTest +{ + private const string UnionName = "union_anonymous_nested"; + + [Fact] + public void Union() + { + var ffis = GetTargetPlatformFfis( + $"src/c/tests/unions/{UnionName}/config.json"); + Assert.True(ffis.Length > 0); + + foreach (var ffi in ffis) + { + UnionExists(ffi); + } + } + + private void UnionExists(CTestFfiTargetPlatform ffi) + { + const string name = $"union {UnionName}"; + var union = ffi.GetRecord(name); + union.Name.Should().Be(name); + union.IsStruct.Should().BeFalse(); + union.IsUnion.Should().BeTrue(); + union.IsAnonymous.Should().BeFalse(); + + union.Fields.Length.Should().Be(1); + + var field = union.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be(name + "_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(4); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousUnion = ffi.GetRecord(fieldType.Name); + anonymousUnion.IsStruct.Should().BeFalse(); + anonymousUnion.IsUnion.Should().BeTrue(); + anonymousUnion.SizeOf.Should().Be(4); + anonymousUnion.AlignOf.Should().Be(4); + anonymousUnion.IsAnonymous.Should().BeTrue(); + anonymousUnion.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousUnion.Fields[0]; + anonymousField1.Name.Should().BeEmpty(); + anonymousField1.OffsetOf.Should().Be(0); + anonymousField1.Type.Name.Should().Be(anonymousUnion.Name + "_ANONYMOUS_0"); + anonymousField1.Type.SizeOf.Should().Be(4); + anonymousField1.Type.AlignOf.Should().Be(4); + anonymousField1.Type.IsAnonymous.Should().BeTrue(); + anonymousField1.Type.InnerType.Should().BeNull(); + + var anonymousField2 = anonymousUnion.Fields[1]; + anonymousField2.Name.Should().BeEmpty(); + anonymousField2.OffsetOf.Should().Be(0); + anonymousField2.Type.Name.Should().Be(anonymousUnion.Name + "_ANONYMOUS_1"); + anonymousField2.Type.SizeOf.Should().Be(4); + anonymousField2.Type.AlignOf.Should().Be(4); + anonymousField2.Type.IsAnonymous.Should().BeTrue(); + anonymousField2.Type.InnerType.Should().BeNull(); + + var nestedAnonymousUnion1 = ffi.GetRecord(anonymousField1.Type.Name); + nestedAnonymousUnion1.IsStruct.Should().BeFalse(); + nestedAnonymousUnion1.IsUnion.Should().BeTrue(); + nestedAnonymousUnion1.SizeOf.Should().Be(4); + nestedAnonymousUnion1.AlignOf.Should().Be(4); + nestedAnonymousUnion1.IsAnonymous.Should().BeTrue(); + nestedAnonymousUnion1.Fields.Length.Should().Be(2); + + var nestedAnonymousUnion1Field1 = nestedAnonymousUnion1.Fields[0]; + nestedAnonymousUnion1Field1.Name.Should().Be("a"); + nestedAnonymousUnion1Field1.Type.Should().BeChar(); + nestedAnonymousUnion1Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousUnion1Field2 = nestedAnonymousUnion1.Fields[1]; + nestedAnonymousUnion1Field2.Name.Should().Be("b"); + nestedAnonymousUnion1Field2.Type.Should().BeInt(); + nestedAnonymousUnion1Field2.OffsetOf.Should().Be(0); + + var nestedAnonymousUnion2 = ffi.GetRecord(anonymousField2.Type.Name); + nestedAnonymousUnion2.IsStruct.Should().BeFalse(); + nestedAnonymousUnion2.IsUnion.Should().BeTrue(); + nestedAnonymousUnion2.SizeOf.Should().Be(4); + nestedAnonymousUnion2.AlignOf.Should().Be(4); + nestedAnonymousUnion2.IsAnonymous.Should().BeTrue(); + nestedAnonymousUnion2.Fields.Length.Should().Be(2); + + var nestedAnonymousUnion2Field1 = nestedAnonymousUnion2.Fields[0]; + nestedAnonymousUnion2Field1.Name.Should().Be("c"); + nestedAnonymousUnion2Field1.Type.Should().BeChar(); + nestedAnonymousUnion2Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousUnion2Field2 = nestedAnonymousUnion2.Fields[1]; + nestedAnonymousUnion2Field2.Name.Should().Be("d"); + nestedAnonymousUnion2Field2.Type.Should().BeInt(); + nestedAnonymousUnion2Field2.OffsetOf.Should().Be(0); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_int_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_int_int/Test.cs index 577f3e5..243cbc0 100644 --- a/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_int_int/Test.cs +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Extract/Unions/union_int_int/Test.cs @@ -21,11 +21,11 @@ public void Union() foreach (var ffi in ffis) { - FfiUnionExists(ffi); + UnionExists(ffi); } } - private void FfiUnionExists(CTestFfiTargetPlatform ffi) + private void UnionExists(CTestFfiTargetPlatform ffi) { const string name = $"union {UnionName}"; var record = ffi.GetRecord(name); diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/GlobalUsings.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/GlobalUsings.cs new file mode 100644 index 0000000..405de96 --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/GlobalUsings.cs @@ -0,0 +1,7 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +global using c2ffi.Tests.Library.Models; +global using FluentAssertions; +global using Xunit; +global using static c2ffi.Tests.Library.CTestTypeAssertionExtensions; diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_anonymous_char_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_anonymous_char_int/Test.cs new file mode 100644 index 0000000..1adae7e --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_anonymous_char_int/Test.cs @@ -0,0 +1,61 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Merge.Structs.struct_anonymous_char_int; + +public class Test : MergeFfisTest +{ + private const string StructName = "struct_anonymous_char_int"; + + [Fact] + public void Struct() + { + var ffi = GetCrossPlatformFfi( + $"src/c/tests/structs/{StructName}/ffi"); + StructExists(ffi); + } + + private void StructExists(CTestFfiCrossPlatform ffi) + { + const string name = $"struct {StructName}"; + var @struct = ffi.GetRecord(name); + @struct.Name.Should().Be(name); + @struct.IsStruct.Should().BeTrue(); + @struct.IsUnion.Should().BeFalse(); + @struct.IsAnonymous.Should().BeFalse(); + + @struct.Fields.Length.Should().Be(1); + + var field = @struct.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().NotBeNull(); + fieldType.SizeOf.Should().Be(8); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousStruct = ffi.GetRecord(fieldType.Name); + anonymousStruct.IsStruct.Should().BeTrue(); + anonymousStruct.IsUnion.Should().BeFalse(); + anonymousStruct.SizeOf.Should().Be(8); + anonymousStruct.AlignOf.Should().Be(4); + anonymousStruct.IsAnonymous.Should().BeTrue(); + + anonymousStruct.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousStruct.Fields[0]; + anonymousField1.Name.Should().Be("a"); + anonymousField1.Type.Should().BeChar(); + anonymousField1.OffsetOf.Should().Be(0); + + var anonymousField2 = anonymousStruct.Fields[1]; + anonymousField2.Name.Should().Be("b"); + anonymousField2.Type.Should().BeInt(); + anonymousField2.OffsetOf.Should().Be(4); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_anonymous_nested/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_anonymous_nested/Test.cs new file mode 100644 index 0000000..dbf842a --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_anonymous_nested/Test.cs @@ -0,0 +1,105 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Merge.Structs.struct_anonymous_nested; + +public class Test : MergeFfisTest +{ + private const string StructName = "struct_anonymous_nested"; + + [Fact] + public void Struct() + { + var ffi = GetCrossPlatformFfi( + $"src/c/tests/structs/{StructName}/ffi"); + + StructExists(ffi); + } + + private void StructExists(CTestFfiCrossPlatform ffi) + { + const string name = $"struct {StructName}"; + var @struct = ffi.GetRecord(name); + @struct.Name.Should().Be(name); + @struct.IsStruct.Should().BeTrue(); + @struct.IsUnion.Should().BeFalse(); + @struct.IsAnonymous.Should().BeFalse(); + + @struct.Fields.Length.Should().Be(1); + + var field = @struct.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be(name + "_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(16); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousStruct = ffi.GetRecord(fieldType.Name); + anonymousStruct.IsStruct.Should().BeTrue(); + anonymousStruct.IsUnion.Should().BeFalse(); + anonymousStruct.SizeOf.Should().Be(16); + anonymousStruct.AlignOf.Should().Be(4); + anonymousStruct.IsAnonymous.Should().BeTrue(); + anonymousStruct.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousStruct.Fields[0]; + anonymousField1.Name.Should().BeEmpty(); + anonymousField1.OffsetOf.Should().Be(0); + anonymousField1.Type.Name.Should().Be(anonymousStruct.Name + "_ANONYMOUS_0"); + anonymousField1.Type.SizeOf.Should().Be(8); + anonymousField1.Type.AlignOf.Should().Be(4); + anonymousField1.Type.IsAnonymous.Should().BeTrue(); + anonymousField1.Type.InnerType.Should().BeNull(); + + var anonymousField2 = anonymousStruct.Fields[1]; + anonymousField2.Name.Should().BeEmpty(); + anonymousField2.OffsetOf.Should().Be(8); + anonymousField2.Type.Name.Should().Be(anonymousStruct.Name + "_ANONYMOUS_1"); + anonymousField2.Type.SizeOf.Should().Be(8); + anonymousField2.Type.AlignOf.Should().Be(4); + anonymousField2.Type.IsAnonymous.Should().BeTrue(); + anonymousField2.Type.InnerType.Should().BeNull(); + + var nestedAnonymousStruct1 = ffi.GetRecord(anonymousField1.Type.Name); + nestedAnonymousStruct1.IsStruct.Should().BeTrue(); + nestedAnonymousStruct1.IsUnion.Should().BeFalse(); + nestedAnonymousStruct1.SizeOf.Should().Be(8); + nestedAnonymousStruct1.AlignOf.Should().Be(4); + nestedAnonymousStruct1.IsAnonymous.Should().BeTrue(); + nestedAnonymousStruct1.Fields.Length.Should().Be(2); + + var nestedAnonymousStruct1Field1 = nestedAnonymousStruct1.Fields[0]; + nestedAnonymousStruct1Field1.Name.Should().Be("a"); + nestedAnonymousStruct1Field1.Type.Should().BeChar(); + nestedAnonymousStruct1Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousStruct1Field2 = nestedAnonymousStruct1.Fields[1]; + nestedAnonymousStruct1Field2.Name.Should().Be("b"); + nestedAnonymousStruct1Field2.Type.Should().BeInt(); + nestedAnonymousStruct1Field2.OffsetOf.Should().Be(4); + + var nestedAnonymousStruct2 = ffi.GetRecord(anonymousField2.Type.Name); + nestedAnonymousStruct2.IsStruct.Should().BeTrue(); + nestedAnonymousStruct2.IsUnion.Should().BeFalse(); + nestedAnonymousStruct2.SizeOf.Should().Be(8); + nestedAnonymousStruct2.AlignOf.Should().Be(4); + nestedAnonymousStruct2.IsAnonymous.Should().BeTrue(); + nestedAnonymousStruct2.Fields.Length.Should().Be(2); + + var nestedAnonymousStruct2Field1 = nestedAnonymousStruct2.Fields[0]; + nestedAnonymousStruct2Field1.Name.Should().Be("c"); + nestedAnonymousStruct2Field1.Type.Should().BeChar(); + nestedAnonymousStruct2Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousStruct2Field2 = nestedAnonymousStruct2.Fields[1]; + nestedAnonymousStruct2Field2.Name.Should().Be("d"); + nestedAnonymousStruct2Field2.Type.Should().BeInt(); + nestedAnonymousStruct2Field2.OffsetOf.Should().Be(4); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_int/Test.cs index 7a92ca0..0434318 100644 --- a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_int/Test.cs +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Structs/struct_int/Test.cs @@ -35,9 +35,6 @@ private void FfiStructExists(CTestFfiCrossPlatform ffi) var field = record.Fields[0]; field.Name.Should().Be("a"); field.OffsetOf.Should().Be(0); - field.Type.Name.Should().Be("int"); - field.Type.SizeOf.Should().Be(4); - field.Type.AlignOf.Should().Be(4); - field.Type.InnerType.Should().BeNull(); + field.Type.Should().BeInt(); } } diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_anonymous_char_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_anonymous_char_int/Test.cs new file mode 100644 index 0000000..c46347e --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_anonymous_char_int/Test.cs @@ -0,0 +1,62 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Merge.Unions.union_anonymous_char_int; + +public class Test : MergeFfisTest +{ + private const string StructName = "union_anonymous_char_int"; + + [Fact] + public void Union() + { + var ffi = GetCrossPlatformFfi( + $"src/c/tests/unions/{StructName}/ffi"); + + UnionExists(ffi); + } + + private void UnionExists(CTestFfiCrossPlatform ffi) + { + const string name = $"union {StructName}"; + var union = ffi.GetRecord(name); + union.Name.Should().Be(name); + union.IsStruct.Should().BeFalse(); + union.IsUnion.Should().BeTrue(); + union.IsAnonymous.Should().BeFalse(); + + union.Fields.Length.Should().Be(1); + + var field = union.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be($"{name}_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(4); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousUnion = ffi.GetRecord(fieldType.Name); + anonymousUnion.IsStruct.Should().BeFalse(); + anonymousUnion.IsUnion.Should().BeTrue(); + anonymousUnion.SizeOf.Should().Be(4); + anonymousUnion.AlignOf.Should().Be(4); + anonymousUnion.IsAnonymous.Should().BeTrue(); + + anonymousUnion.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousUnion.Fields[0]; + anonymousField1.Name.Should().Be("a"); + anonymousField1.Type.Should().BeChar(); + anonymousField1.OffsetOf.Should().Be(0); + + var anonymousField2 = anonymousUnion.Fields[1]; + anonymousField2.Name.Should().Be("b"); + anonymousField2.Type.Should().BeInt(); + anonymousField2.OffsetOf.Should().Be(0); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_anonymous_nested/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_anonymous_nested/Test.cs new file mode 100644 index 0000000..afba0b7 --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_anonymous_nested/Test.cs @@ -0,0 +1,104 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Merge.Unions.union_anonymous_nested; + +public class Test : MergeFfisTest +{ + private const string UnionName = "union_anonymous_nested"; + + [Fact] + public void Union() + { + var ffi = GetCrossPlatformFfi( + $"src/c/tests/unions/{UnionName}/ffi"); + UnionExists(ffi); + } + + private void UnionExists(CTestFfiCrossPlatform ffi) + { + const string name = $"union {UnionName}"; + var union = ffi.GetRecord(name); + union.Name.Should().Be(name); + union.IsStruct.Should().BeFalse(); + union.IsUnion.Should().BeTrue(); + union.IsAnonymous.Should().BeFalse(); + + union.Fields.Length.Should().Be(1); + + var field = union.Fields[0]; + field.Name.Should().BeEmpty(); + field.OffsetOf.Should().Be(0); + + var fieldType = field.Type; + fieldType.Name.Should().Be(name + "_ANONYMOUS_0"); + fieldType.SizeOf.Should().Be(4); + fieldType.AlignOf.Should().Be(4); + fieldType.IsAnonymous.Should().BeTrue(); + fieldType.InnerType.Should().BeNull(); + + var anonymousUnion = ffi.GetRecord(fieldType.Name); + anonymousUnion.IsStruct.Should().BeFalse(); + anonymousUnion.IsUnion.Should().BeTrue(); + anonymousUnion.SizeOf.Should().Be(4); + anonymousUnion.AlignOf.Should().Be(4); + anonymousUnion.IsAnonymous.Should().BeTrue(); + anonymousUnion.Fields.Length.Should().Be(2); + + var anonymousField1 = anonymousUnion.Fields[0]; + anonymousField1.Name.Should().BeEmpty(); + anonymousField1.OffsetOf.Should().Be(0); + anonymousField1.Type.Name.Should().Be(anonymousUnion.Name + "_ANONYMOUS_0"); + anonymousField1.Type.SizeOf.Should().Be(4); + anonymousField1.Type.AlignOf.Should().Be(4); + anonymousField1.Type.IsAnonymous.Should().BeTrue(); + anonymousField1.Type.InnerType.Should().BeNull(); + + var anonymousField2 = anonymousUnion.Fields[1]; + anonymousField2.Name.Should().BeEmpty(); + anonymousField2.OffsetOf.Should().Be(0); + anonymousField2.Type.Name.Should().Be(anonymousUnion.Name + "_ANONYMOUS_1"); + anonymousField2.Type.SizeOf.Should().Be(4); + anonymousField2.Type.AlignOf.Should().Be(4); + anonymousField2.Type.IsAnonymous.Should().BeTrue(); + anonymousField2.Type.InnerType.Should().BeNull(); + + var nestedAnonymousUnion1 = ffi.GetRecord(anonymousField1.Type.Name); + nestedAnonymousUnion1.IsStruct.Should().BeFalse(); + nestedAnonymousUnion1.IsUnion.Should().BeTrue(); + nestedAnonymousUnion1.SizeOf.Should().Be(4); + nestedAnonymousUnion1.AlignOf.Should().Be(4); + nestedAnonymousUnion1.IsAnonymous.Should().BeTrue(); + nestedAnonymousUnion1.Fields.Length.Should().Be(2); + + var nestedAnonymousUnion1Field1 = nestedAnonymousUnion1.Fields[0]; + nestedAnonymousUnion1Field1.Name.Should().Be("a"); + nestedAnonymousUnion1Field1.Type.Should().BeChar(); + nestedAnonymousUnion1Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousUnion1Field2 = nestedAnonymousUnion1.Fields[1]; + nestedAnonymousUnion1Field2.Name.Should().Be("b"); + nestedAnonymousUnion1Field2.Type.Should().BeInt(); + nestedAnonymousUnion1Field2.OffsetOf.Should().Be(0); + + var nestedAnonymousUnion2 = ffi.GetRecord(anonymousField2.Type.Name); + nestedAnonymousUnion2.IsStruct.Should().BeFalse(); + nestedAnonymousUnion2.IsUnion.Should().BeTrue(); + nestedAnonymousUnion2.SizeOf.Should().Be(4); + nestedAnonymousUnion2.AlignOf.Should().Be(4); + nestedAnonymousUnion2.IsAnonymous.Should().BeTrue(); + nestedAnonymousUnion2.Fields.Length.Should().Be(2); + + var nestedAnonymousUnion2Field1 = nestedAnonymousUnion2.Fields[0]; + nestedAnonymousUnion2Field1.Name.Should().Be("c"); + nestedAnonymousUnion2Field1.Type.Should().BeChar(); + nestedAnonymousUnion2Field1.OffsetOf.Should().Be(0); + + var nestedAnonymousUnion2Field2 = nestedAnonymousUnion2.Fields[1]; + nestedAnonymousUnion2Field2.Name.Should().Be("d"); + nestedAnonymousUnion2Field2.Type.Should().BeInt(); + nestedAnonymousUnion2Field2.OffsetOf.Should().Be(0); + } +} diff --git a/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_int_int/Test.cs b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_int_int/Test.cs new file mode 100644 index 0000000..27bdc59 --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.EndToEnd.Merge/Unions/union_int_int/Test.cs @@ -0,0 +1,46 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +#pragma warning disable CA1707 + +namespace c2ffi.Tests.EndToEnd.Merge.Unions.union_int_int; + +public class Test : MergeFfisTest +{ + private const string UnionName = "union_int_int"; + + [Fact] + public void Union() + { + var ffi = GetCrossPlatformFfi( + $"src/c/tests/unions/{UnionName}/ffi"); + UnionExists(ffi); + } + + private void UnionExists(CTestFfiCrossPlatform ffi) + { + const string name = $"union {UnionName}"; + var record = ffi.GetRecord(name); + record.Name.Should().Be(name); + record.IsStruct.Should().Be(false); + record.IsUnion.Should().Be(true); + + record.Fields.Length.Should().Be(2); + + var field1 = record.Fields[0]; + field1.Name.Should().Be("a"); + field1.OffsetOf.Should().Be(0); + field1.Type.Name.Should().Be("int"); + field1.Type.SizeOf.Should().Be(4); + field1.Type.AlignOf.Should().Be(4); + field1.Type.InnerType.Should().BeNull(); + + var field2 = record.Fields[1]; + field2.Name.Should().Be("b"); + field2.OffsetOf.Should().Be(0); + field2.Type.Name.Should().Be("int"); + field2.Type.SizeOf.Should().Be(4); + field2.Type.AlignOf.Should().Be(4); + field2.Type.InnerType.Should().BeNull(); + } +} diff --git a/src/cs/tests/c2ffi.Tests.Library/Assertions/CTestTypeAssertions.cs b/src/cs/tests/c2ffi.Tests.Library/Assertions/CTestTypeAssertions.cs new file mode 100644 index 0000000..d87384e --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.Library/Assertions/CTestTypeAssertions.cs @@ -0,0 +1,42 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +using c2ffi.Tests.Library.Models; +using FluentAssertions; +using FluentAssertions.Primitives; + +namespace c2ffi.Tests.Library.Assertions; + +public class CTestTypeAssertions : ReferenceTypeAssertions +{ + public CTestTypeAssertions(CTestType? instance) + : base(instance) + { + } + + protected override string Identifier => "type"; + + [CustomAssertion] + public void BeChar(string because = "", params object[] becauseArgs) + { + Subject.Should().NotBeNull(because, becauseArgs); + Subject!.Name.Should().Be("char", because, becauseArgs); + Subject.NodeKind.Should().Be("primitive", because, becauseArgs); + Subject.AlignOf.Should().Be(1, because, becauseArgs); + Subject.SizeOf.Should().Be(1, because, becauseArgs); + Subject.IsAnonymous.Should().Be(false, because, becauseArgs); + Subject.InnerType.Should().BeNull(because, becauseArgs); + } + + [CustomAssertion] + public void BeInt(string because = "", params object[] becauseArgs) + { + Subject.Should().NotBeNull(because, becauseArgs); + Subject!.Name.Should().Be("int", because, becauseArgs); + Subject.NodeKind.Should().Be("primitive", because, becauseArgs); + Subject.AlignOf.Should().Be(4, because, becauseArgs); + Subject.SizeOf.Should().Be(4, because, becauseArgs); + Subject.IsAnonymous.Should().Be(false, because, becauseArgs); + Subject.InnerType.Should().BeNull(because, becauseArgs); + } +} diff --git a/src/cs/tests/c2ffi.Tests.Library/CTestTypeAssertionExtensions.cs b/src/cs/tests/c2ffi.Tests.Library/CTestTypeAssertionExtensions.cs new file mode 100644 index 0000000..2cab919 --- /dev/null +++ b/src/cs/tests/c2ffi.Tests.Library/CTestTypeAssertionExtensions.cs @@ -0,0 +1,15 @@ +// Copyright (c) Bottlenose Labs Inc. (https://github.com/bottlenoselabs). All rights reserved. +// Licensed under the MIT license. See LICENSE file in the Git repository root directory for full license information. + +using c2ffi.Tests.Library.Assertions; +using c2ffi.Tests.Library.Models; + +namespace c2ffi.Tests.Library; + +public static class CTestTypeAssertionExtensions +{ + public static CTestTypeAssertions Should(this CTestType? instance) + { + return new CTestTypeAssertions(instance); + } +} diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiCrossPlatform.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiCrossPlatform.cs index 9d1b127..6f3a0cb 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiCrossPlatform.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiCrossPlatform.cs @@ -238,10 +238,13 @@ private void AssertRecordField(CTestRecord record, CTestRecordField field, List< { var recordKindName = record.IsUnion ? "union" : "struct"; - Assert.False( - namesLookup.Contains(field.Name), - $"C {recordKindName} '{record.Name}' already has a field named `{field.Name}`."); - namesLookup.Add(field.Name); + if (!field.Type.IsAnonymous) + { + Assert.False( + namesLookup.Contains(field.Name), + $"C {recordKindName} '{record.Name}' already has a field named `{field.Name}`."); + namesLookup.Add(field.Name); + } Assert.True( field.OffsetOf >= 0, @@ -256,8 +259,8 @@ private void AssertRecordField(CTestRecord record, CTestRecordField field, List< field.OffsetOf == 0, $"C union '{record.Name}' field '{field.Name}' does not have an offset of zero."); Assert.True( - field.Type.SizeOf == record.SizeOf, - $"C union '{record.Name}' field '{field.Name}' does not have a size that matches the union."); + field.Type.SizeOf <= record.SizeOf, + $"C union '{record.Name}' field '{field.Name}' is larger than the size of the containing record."); } } } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiTargetPlatform.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiTargetPlatform.cs index 30c279a..1a6ab48 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiTargetPlatform.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFfiTargetPlatform.cs @@ -3,6 +3,7 @@ using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using FluentAssertions; using JetBrains.Annotations; using Xunit; @@ -251,10 +252,13 @@ private void AssertRecordField(CTestRecord record, CTestRecordField field, List< { var recordKindName = record.IsUnion ? "union" : "struct"; - Assert.False( - namesLookup.Contains(field.Name), - $"C {recordKindName} '{record.Name}' already has a field named `{field.Name}`."); - namesLookup.Add(field.Name); + if (!field.Type.IsAnonymous) + { + Assert.False( + namesLookup.Contains(field.Name), + $"C {recordKindName} '{record.Name}' already has a field named `{field.Name}`."); + namesLookup.Add(field.Name); + } Assert.True( field.OffsetOf >= 0, @@ -269,8 +273,8 @@ private void AssertRecordField(CTestRecord record, CTestRecordField field, List< field.OffsetOf == 0, $"C union '{record.Name}' field '{field.Name}' does not have an offset of zero."); Assert.True( - field.Type.SizeOf == record.SizeOf, - $"C union '{record.Name}' field '{field.Name}' does not have a size that matches the union."); + field.Type.SizeOf <= record.SizeOf, + $"C union '{record.Name}' field '{field.Name}' is larger than the size of the containing record."); } } } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunction.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunction.cs index bcee204..6db3a04 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunction.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunction.cs @@ -16,7 +16,7 @@ public class CTestFunction public string CallingConvention { get; } - public CTestTypeInfo ReturnType { get; } + public CTestType ReturnType { get; } public ImmutableArray Parameters { get; } @@ -26,7 +26,7 @@ public CTestFunction(CFunction function) { Name = function.Name; CallingConvention = function.CallingConvention.ToString().ToLowerInvariant(); - ReturnType = new CTestTypeInfo(function.ReturnTypeInfo); + ReturnType = new CTestType(function.ReturnType); Parameters = function.Parameters .Select(x => new CTestFunctionParameter(x)).ToImmutableArray(); Comment = function.Comment; diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionParameter.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionParameter.cs index 8b2344f..f8e8953 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionParameter.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionParameter.cs @@ -13,12 +13,12 @@ public class CTestFunctionParameter { public string Name { get; } - public CTestTypeInfo Type { get; } + public CTestType Type { get; } public CTestFunctionParameter(CFunctionParameter functionParameter) { Name = functionParameter.Name; - Type = new CTestTypeInfo(functionParameter.TypeInfo); + Type = new CTestType(functionParameter.Type); } public override string ToString() diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointer.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointer.cs index 8745c73..a352039 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointer.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointer.cs @@ -16,7 +16,7 @@ public class CTestFunctionPointer public string CallingConvention { get; } - public CTestTypeInfo ReturnType { get; } + public CTestType ReturnType { get; } public ImmutableArray Parameters { get; set; } @@ -24,7 +24,7 @@ public CTestFunctionPointer(CFunctionPointer functionPointer) { Name = functionPointer.Name; CallingConvention = functionPointer.CallingConvention.ToString().ToLowerInvariant(); - ReturnType = new CTestTypeInfo(functionPointer.ReturnTypeInfo); + ReturnType = new CTestType(functionPointer.ReturnType); Parameters = functionPointer.Parameters .Select(x => new CTestFunctionPointerParameter(x)).ToImmutableArray(); } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointerParameter.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointerParameter.cs index 018f00d..6962036 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointerParameter.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestFunctionPointerParameter.cs @@ -18,7 +18,7 @@ public class CTestFunctionPointerParameter public CTestFunctionPointerParameter(CFunctionPointerParameter functionPointerParameter) { Name = functionPointerParameter.Name; - TypeName = functionPointerParameter.TypeInfo.Name; + TypeName = functionPointerParameter.Type.Name; } public override string ToString() diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestMacroObject.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestMacroObject.cs index 89ba7b9..b816162 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestMacroObject.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestMacroObject.cs @@ -13,14 +13,14 @@ public class CTestMacroObject { public string Name { get; } - public CTestTypeInfo Type { get; } + public CTestType Type { get; } public string Value { get; } public CTestMacroObject(CMacroObject macroObject) { Name = macroObject.Name; - Type = new CTestTypeInfo(macroObject.TypeInfo); + Type = new CTestType(macroObject.Type); Value = macroObject.Value; } } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecord.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecord.cs index 2f42796..7367faa 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecord.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecord.cs @@ -21,6 +21,8 @@ public class CTestRecord public bool IsUnion { get; } + public bool IsAnonymous { get; } + public bool IsStruct => !IsUnion; public ImmutableArray Fields { get; } @@ -31,6 +33,7 @@ public CTestRecord(CRecord record) SizeOf = record.SizeOf; AlignOf = record.AlignOf; IsUnion = record.RecordKind == CRecordKind.Union; + IsAnonymous = record.IsAnonymous; Fields = record.Fields.Select(field => new CTestRecordField(field)).ToImmutableArray(); } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecordField.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecordField.cs index 623501b..f2e437a 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecordField.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestRecordField.cs @@ -15,13 +15,13 @@ public class CTestRecordField public int OffsetOf { get; } - public CTestTypeInfo Type { get; } + public CTestType Type { get; } public CTestRecordField(CRecordField field) { Name = field.Name; OffsetOf = field.OffsetOf; - Type = new CTestTypeInfo(field.TypeInfo); + Type = new CTestType(field.Type); } public override string ToString() diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeInfo.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestType.cs similarity index 50% rename from src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeInfo.cs rename to src/cs/tests/c2ffi.Tests.Library/Models/CTestType.cs index ab2e593..a27fe9c 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeInfo.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestType.cs @@ -5,7 +5,7 @@ namespace c2ffi.Tests.Library.Models; -public class CTestTypeInfo +public class CTestType { public string NodeKind { get; } @@ -15,14 +15,17 @@ public class CTestTypeInfo public int? AlignOf { get; } - public CTestTypeInfo? InnerType { get; } + public bool IsAnonymous { get; set; } - public CTestTypeInfo(CTypeInfo typeInfo) + public CTestType? InnerType { get; } + + public CTestType(CType type) { - NodeKind = typeInfo.NodeKind.ToString().ToLowerInvariant(); - Name = typeInfo.Name; - SizeOf = typeInfo.SizeOf; - AlignOf = typeInfo.AlignOf; - InnerType = typeInfo.InnerTypeInfo != null ? new CTestTypeInfo(typeInfo.InnerTypeInfo) : null; + NodeKind = type.NodeKind.ToString().ToLowerInvariant(); + Name = type.Name; + SizeOf = type.SizeOf; + AlignOf = type.AlignOf; + IsAnonymous = type.IsAnonymous ?? false; + InnerType = type.InnerType != null ? new CTestType(type.InnerType) : null; } } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeAlias.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeAlias.cs index 0ce6083..3b7e001 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeAlias.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestTypeAlias.cs @@ -13,11 +13,11 @@ public class CTestTypeAlias { public string Name { get; } - public CTestTypeInfo UnderlyingType { get; } + public CTestType UnderlyingType { get; } public CTestTypeAlias(CTypeAlias typeAlias) { Name = typeAlias.Name; - UnderlyingType = new CTestTypeInfo(typeAlias.UnderlyingTypeInfo); + UnderlyingType = new CTestType(typeAlias.UnderlyingType); } } diff --git a/src/cs/tests/c2ffi.Tests.Library/Models/CTestVariable.cs b/src/cs/tests/c2ffi.Tests.Library/Models/CTestVariable.cs index 4e80f44..e8592cf 100644 --- a/src/cs/tests/c2ffi.Tests.Library/Models/CTestVariable.cs +++ b/src/cs/tests/c2ffi.Tests.Library/Models/CTestVariable.cs @@ -18,6 +18,6 @@ public class CTestVariable public CTestVariable(CVariable variable) { Name = variable.Name; - TypeName = variable.TypeInfo.Name; + TypeName = variable.Type.Name; } } diff --git a/src/cs/tests/c2ffi.Tests.Library/c2ffi.Tests.Library.csproj b/src/cs/tests/c2ffi.Tests.Library/c2ffi.Tests.Library.csproj index 78c42c9..800494e 100644 --- a/src/cs/tests/c2ffi.Tests.Library/c2ffi.Tests.Library.csproj +++ b/src/cs/tests/c2ffi.Tests.Library/c2ffi.Tests.Library.csproj @@ -12,6 +12,7 @@ +