diff --git a/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs b/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs index b0167c024..72653900c 100644 --- a/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs @@ -22,7 +22,7 @@ namespace Flax.Build.Bindings public string[] Comment; public bool IsInBuild; public bool IsDeprecated; - public string MarshalAs; + public TypeInfo MarshalAs; internal bool IsInited; internal TypedefInfo Instigator; diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs index 4a0070710..1849513f9 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs @@ -197,7 +197,7 @@ namespace Flax.Build.Bindings if (apiType != null) { if (apiType.MarshalAs != null) - return UsePassByReference(buildData, new TypeInfo(apiType.MarshalAs), caller); + return UsePassByReference(buildData, apiType.MarshalAs, caller); // Skip for scripting objects if (apiType.IsScriptingObject) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index 845e4e62b..dc9f74369 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -439,7 +439,7 @@ namespace Flax.Build.Bindings } if (apiType.MarshalAs != null) - return GenerateCSharpManagedToNativeType(buildData, new TypeInfo(apiType.MarshalAs), caller); + return GenerateCSharpManagedToNativeType(buildData, apiType.MarshalAs, caller); if (apiType.IsScriptingObject || apiType.IsInterface) return "IntPtr"; } @@ -531,7 +531,7 @@ namespace Flax.Build.Bindings { var apiType = FindApiTypeInfo(buildData, functionInfo.ReturnType, caller); if (apiType != null && apiType.MarshalAs != null) - returnValueType = GenerateCSharpNativeToManaged(buildData, new TypeInfo(apiType.MarshalAs), caller); + returnValueType = GenerateCSharpNativeToManaged(buildData, apiType.MarshalAs, caller); else returnValueType = GenerateCSharpNativeToManaged(buildData, functionInfo.ReturnType, caller); } diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs index 079a5839f..d78af861f 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs @@ -19,7 +19,7 @@ namespace Flax.Build.Bindings partial class BindingsGenerator { private static readonly Dictionary TypeCache = new Dictionary(); - private const int CacheVersion = 21; + private const int CacheVersion = 22; internal static void Write(BinaryWriter writer, string e) { diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs index 4e632014a..c9c80fe87 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -597,7 +597,7 @@ namespace Flax.Build.Bindings CppReferencesFiles.Add(apiType.File); if (apiType.MarshalAs != null) - return GenerateCppWrapperNativeToManaged(buildData, new TypeInfo(apiType.MarshalAs), caller, out type, functionInfo); + return GenerateCppWrapperNativeToManaged(buildData, apiType.MarshalAs, caller, out type, functionInfo); // Scripting Object if (apiType.IsScriptingObject) @@ -801,7 +801,7 @@ namespace Flax.Build.Bindings if (apiType != null) { if (apiType.MarshalAs != null) - return GenerateCppWrapperManagedToNative(buildData, new TypeInfo(apiType.MarshalAs), caller, out type, out apiType, functionInfo, out needLocalVariable); + return GenerateCppWrapperManagedToNative(buildData, apiType.MarshalAs, caller, out type, out apiType, functionInfo, out needLocalVariable); // Scripting Object (for non-pod types converting only, other API converts managed to unmanaged object in C# wrapper code) if (CppNonPodTypesConvertingGeneration && apiType.IsScriptingObject && typeInfo.IsPtr) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs index 0b71af086..3db43edf0 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs @@ -185,6 +185,11 @@ namespace Flax.Build.Bindings tag.Value = tag.Value.Substring(1, tag.Value.Length - 2); if (tag.Value.Contains("\\\"")) tag.Value = tag.Value.Replace("\\\"", "\""); + token = context.Tokenizer.NextToken(); + if (token.Type == TokenType.Multiply) + tag.Value += token.Value; + else + context.Tokenizer.PreviousToken(); parameters.Add(tag); break; case TokenType.Whitespace: @@ -647,7 +652,7 @@ namespace Flax.Build.Bindings desc.Namespace = tag.Value; break; case "marshalas": - desc.MarshalAs = tag.Value; + desc.MarshalAs = TypeInfo.FromString(tag.Value); break; case "tag": ParseTag(ref desc.Tags, tag); @@ -1236,7 +1241,7 @@ namespace Flax.Build.Bindings desc.Namespace = tag.Value; break; case "marshalas": - desc.MarshalAs = tag.Value; + desc.MarshalAs = TypeInfo.FromString(tag.Value); break; case "tag": ParseTag(ref desc.Tags, tag); diff --git a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs index cdf293085..61946bae2 100644 --- a/Source/Tools/Flax.Build/Bindings/TypeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/TypeInfo.cs @@ -180,6 +180,17 @@ namespace Flax.Build.Bindings return sb.ToString(); } + public static TypeInfo FromString(string text) + { + var result = new TypeInfo(text); + if (result.Type.EndsWith('*')) + { + result.IsPtr = true; + result.Type = result.Type.Substring(0, result.Type.Length - 1); + } + return result; + } + public string ToString(bool canRef = true) { var sb = new StringBuilder(64);