diff --git a/Source/Engine/Core/Config.h b/Source/Engine/Core/Config.h index 9c0d49122..feae02139 100644 --- a/Source/Engine/Core/Config.h +++ b/Source/Engine/Core/Config.h @@ -52,6 +52,6 @@ #define API_EVENT(...) #define API_PARAM(...) #define API_TYPEDEF(...) -#define API_INJECT_CPP_CODE(...) +#define API_INJECT_CODE(...) #define API_AUTO_SERIALIZATION(...) public: void Serialize(SerializeStream& stream, const void* otherObj) override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override; #define DECLARE_SCRIPTING_TYPE_MINIMAL(type) public: friend class type##Internal; static struct ScriptingTypeInitializer TypeInitializer; diff --git a/Source/Engine/Platform/Base/ClipboardBase.h b/Source/Engine/Platform/Base/ClipboardBase.h index ed7cf722b..709b6664e 100644 --- a/Source/Engine/Platform/Base/ClipboardBase.h +++ b/Source/Engine/Platform/Base/ClipboardBase.h @@ -7,7 +7,7 @@ #include "Engine/Core/Types/StringView.h" #include "Engine/Core/Collections/Array.h" -API_INJECT_CPP_CODE("#include \"Engine/Platform/Clipboard.h\""); +API_INJECT_CODE(cpp, "#include \"Engine/Platform/Clipboard.h\""); /// /// Native platform clipboard service. diff --git a/Source/Engine/Platform/Base/FileSystemBase.h b/Source/Engine/Platform/Base/FileSystemBase.h index c99fd74da..782ff89b3 100644 --- a/Source/Engine/Platform/Base/FileSystemBase.h +++ b/Source/Engine/Platform/Base/FileSystemBase.h @@ -35,7 +35,7 @@ enum class SpecialFolder Temporary, }; -API_INJECT_CPP_CODE("#include \"Engine/Platform/FileSystem.h\""); +API_INJECT_CODE(cpp, "#include \"Engine/Platform/FileSystem.h\""); /// /// Platform implementation of filesystem service. diff --git a/Source/Engine/Platform/Base/NetworkBase.h b/Source/Engine/Platform/Base/NetworkBase.h index 506edaa54..a18ad97ec 100644 --- a/Source/Engine/Platform/Base/NetworkBase.h +++ b/Source/Engine/Platform/Base/NetworkBase.h @@ -5,7 +5,7 @@ #include "Engine/Core/Types/BaseTypes.h" #include "Engine/Core/Types/String.h" -API_INJECT_CPP_CODE("#include \"Engine/Platform/Network.h\""); +API_INJECT_CODE(cpp, "#include \"Engine/Platform/Network.h\""); /// /// Network connection protocol type. diff --git a/Source/Engine/Platform/Base/PlatformBase.h b/Source/Engine/Platform/Base/PlatformBase.h index 1c01bd0bc..0508cccd3 100644 --- a/Source/Engine/Platform/Base/PlatformBase.h +++ b/Source/Engine/Platform/Base/PlatformBase.h @@ -124,7 +124,7 @@ enum class ThreadPriority extern FLAXENGINE_API const Char* ToString(ThreadPriority value); -API_INJECT_CPP_CODE("#include \"Engine/Platform/Platform.h\""); +API_INJECT_CODE(cpp, "#include \"Engine/Platform/Platform.h\""); /// /// Runtime platform service. diff --git a/Source/Engine/Platform/Base/UserBase.h b/Source/Engine/Platform/Base/UserBase.h index bc60763c1..f486f5d35 100644 --- a/Source/Engine/Platform/Base/UserBase.h +++ b/Source/Engine/Platform/Base/UserBase.h @@ -5,7 +5,7 @@ #include "Engine/Core/Types/String.h" #include "Engine/Scripting/ScriptingObject.h" -API_INJECT_CPP_CODE("#include \"Engine/Platform/User.h\""); +API_INJECT_CODE(cpp, "#include \"Engine/Platform/User.h\""); /// /// Native platform user object. diff --git a/Source/Engine/Platform/Base/WindowBase.h b/Source/Engine/Platform/Base/WindowBase.h index 7c1602f5c..638a7e84a 100644 --- a/Source/Engine/Platform/Base/WindowBase.h +++ b/Source/Engine/Platform/Base/WindowBase.h @@ -263,7 +263,7 @@ API_ENUM() enum class WindowHitCodes Help = 21, }; -API_INJECT_CPP_CODE("#include \"Engine/Platform/Window.h\""); +API_INJECT_CODE(cpp, "#include \"Engine/Platform/Window.h\""); /// /// Native platform window object. diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs index 1d4dc8065..e8f98d401 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Api.cs @@ -21,7 +21,7 @@ namespace Flax.Build.Bindings public const string Event = "API_EVENT"; public const string Param = "API_PARAM"; public const string Typedef = "API_TYPEDEF"; - public const string InjectCppCode = "API_INJECT_CPP_CODE"; + public const string InjectCode = "API_INJECT_CODE"; public const string AutoSerialization = "API_AUTO_SERIALIZATION"; public static readonly string[] SearchTags = diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index c9a48d1ed..207f543cc 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -1383,6 +1383,17 @@ namespace Flax.Build.Bindings GenerateCSharpEnum(buildData, contents, indent, enumInfo); else if (type is InterfaceInfo interfaceInfo) GenerateCSharpInterface(buildData, contents, indent, interfaceInfo); + else if (type is InjectCodeInfo injectCodeInfo && string.Equals(injectCodeInfo.Lang, "csharp", StringComparison.OrdinalIgnoreCase)) + { + // `using` directives needs to go above the generated code + foreach(var code in injectCodeInfo.Code.Split(';')) + { + if (code.StartsWith("using")) + CSharpUsedNamespaces.Add(code.Substring(6)); + else if (code.Length > 0) + contents.Append(injectCodeInfo.Code).AppendLine(";"); + } + } else return false; } diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs index 8984d7e2a..ae4b71271 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 = 13; + private const int CacheVersion = 14; 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 a75b13ea0..64a8ce9c2 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cpp.cs @@ -2178,8 +2178,8 @@ namespace Flax.Build.Bindings GenerateCppEnum(buildData, contents, moduleInfo, enumInfo); else if (type is InterfaceInfo interfaceInfo) GenerateCppInterface(buildData, contents, moduleInfo, interfaceInfo); - else if (type is InjectCppCodeInfo injectCppCodeInfo) - contents.AppendLine(injectCppCodeInfo.Code); + else if (type is InjectCodeInfo injectCodeInfo && string.Equals(injectCodeInfo.Lang, "cpp", StringComparison.OrdinalIgnoreCase)) + contents.AppendLine(injectCodeInfo.Code); } catch { diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs index 565da0571..457787a22 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Parsing.cs @@ -1310,13 +1310,12 @@ namespace Flax.Build.Bindings return desc; } - private static InjectCppCodeInfo ParseInjectCppCode(ref ParsingContext context) + private static InjectCodeInfo ParseInjectCode(ref ParsingContext context) { context.Tokenizer.ExpectToken(TokenType.LeftParent); - var desc = new InjectCppCodeInfo - { - Code = context.Tokenizer.ExpectToken(TokenType.String).Value.Replace("\\\"", "\""), - }; + var desc = new InjectCodeInfo(); + context.Tokenizer.SkipUntil(TokenType.Comma, out desc.Lang); + desc.Code = context.Tokenizer.ExpectToken(TokenType.String).Value.Replace("\\\"", "\""); desc.Code = desc.Code.Substring(1, desc.Code.Length - 2); context.Tokenizer.ExpectToken(TokenType.RightParent); return desc; diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs index 081b390c8..ad37850dd 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.cs @@ -302,10 +302,10 @@ namespace Flax.Build.Bindings var typeInfo = ParseTypedef(ref context); fileInfo.AddChild(typeInfo); } - else if (string.Equals(token.Value, ApiTokens.InjectCppCode, StringComparison.Ordinal)) + else if (string.Equals(token.Value, ApiTokens.InjectCode, StringComparison.Ordinal)) { - var injectCppCodeInfo = ParseInjectCppCode(ref context); - fileInfo.AddChild(injectCppCodeInfo); + var injectCodeInfo = ParseInjectCode(ref context); + fileInfo.AddChild(injectCodeInfo); } else if (string.Equals(token.Value, ApiTokens.Interface, StringComparison.Ordinal)) { @@ -560,7 +560,7 @@ namespace Flax.Build.Bindings return type is ClassInfo || type is StructureInfo || type is InterfaceInfo || - type is InjectCppCodeInfo; + type is InjectCodeInfo; } /// diff --git a/Source/Tools/Flax.Build/Bindings/InjectCppCodeInfo.cs b/Source/Tools/Flax.Build/Bindings/InjectCodeInfo.cs similarity index 72% rename from Source/Tools/Flax.Build/Bindings/InjectCppCodeInfo.cs rename to Source/Tools/Flax.Build/Bindings/InjectCodeInfo.cs index b7cef27b1..55d2356c6 100644 --- a/Source/Tools/Flax.Build/Bindings/InjectCppCodeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/InjectCodeInfo.cs @@ -5,14 +5,16 @@ using System.IO; namespace Flax.Build.Bindings { /// - /// The custom C++ code injection information for bindings generator. + /// The custom C++/C# code injection information for bindings generator. /// - public class InjectCppCodeInfo : ApiTypeInfo + public class InjectCodeInfo : ApiTypeInfo { + public string Lang; public string Code; public override void Write(BinaryWriter writer) { + writer.Write(Lang); writer.Write(Code); base.Write(writer); @@ -20,6 +22,7 @@ namespace Flax.Build.Bindings public override void Read(BinaryReader reader) { + Lang = reader.ReadString(); Code = reader.ReadString(); base.Read(reader); diff --git a/Source/Tools/Flax.Build/Flax.Build.csproj b/Source/Tools/Flax.Build/Flax.Build.csproj index 61fda8b97..27770cd87 100644 --- a/Source/Tools/Flax.Build/Flax.Build.csproj +++ b/Source/Tools/Flax.Build/Flax.Build.csproj @@ -76,7 +76,7 @@ - +