From 4d08dc77b248afc4d12115bde64c4ce4487b5969 Mon Sep 17 00:00:00 2001 From: Wojciech Figat Date: Mon, 10 Oct 2022 14:40:59 +0200 Subject: [PATCH] Add custom Tags for scripting api types to be used by plugins --- .../Tools/Flax.Build/Bindings/ApiTypeInfo.cs | 17 +++++++++ .../Bindings/BindingsGenerator.Cache.cs | 35 ++++++++++++++++++- .../Tools/Flax.Build/Bindings/MemberInfo.cs | 19 ++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs b/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs index b09d63f09..4b05336ee 100644 --- a/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/ApiTypeInfo.cs @@ -13,6 +13,7 @@ namespace Flax.Build.Bindings public class ApiTypeInfo : IBindingsCache, ICloneable { public ApiTypeInfo Parent; + public Dictionary Tags; public List Children = new List(); public string NativeName; public string Name; @@ -109,6 +110,20 @@ namespace Flax.Build.Bindings } } + public string GetTag(string tag) + { + if (Tags != null && Tags.TryGetValue(tag, out var value)) + return value; + return null; + } + + public void SetTag(string tag, string value) + { + if (Tags == null) + Tags = new Dictionary(); + Tags[tag] = value; + } + public virtual void AddChild(ApiTypeInfo apiTypeInfo) { apiTypeInfo.Parent = this; @@ -124,6 +139,7 @@ namespace Flax.Build.Bindings BindingsGenerator.Write(writer, Comment); writer.Write(IsInBuild); writer.Write(IsDeprecated); + BindingsGenerator.Write(writer, Tags); BindingsGenerator.Write(writer, Children); } @@ -136,6 +152,7 @@ namespace Flax.Build.Bindings Comment = BindingsGenerator.Read(reader, Comment); IsInBuild = reader.ReadBoolean(); IsDeprecated = reader.ReadBoolean(); + Tags = BindingsGenerator.Read(reader, Tags); Children = BindingsGenerator.Read(reader, Children); // Fix hierarchy diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.Cache.cs index ceee5c814..dda671203 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 = 16; + private const int CacheVersion = 17; internal static void Write(BinaryWriter writer, string e) { @@ -43,6 +43,23 @@ namespace Flax.Build.Bindings } } + internal static void Write(BinaryWriter writer, Dictionary map) + { + if (map != null) + { + writer.Write(map.Count); + foreach (var e in map) + { + writer.Write(e.Key); + writer.Write(e.Value); + } + } + else + { + writer.Write(0); + } + } + internal static void Write(BinaryWriter writer, HashSet list) { if (list != null) @@ -156,6 +173,22 @@ namespace Flax.Build.Bindings return list; } + internal static Dictionary Read(BinaryReader reader, Dictionary map) + { + var count = reader.ReadInt32(); + if (count != 0) + { + map = new Dictionary(); + for (int i = 0; i < count; i++) + { + var key = reader.ReadString(); + var value = reader.ReadString(); + map.Add(key, value); + } + } + return map; + } + internal static T Read(BinaryReader reader, T e) where T : IBindingsCache { var typename = reader.ReadString(); diff --git a/Source/Tools/Flax.Build/Bindings/MemberInfo.cs b/Source/Tools/Flax.Build/Bindings/MemberInfo.cs index 1422e25a7..f7b2c366b 100644 --- a/Source/Tools/Flax.Build/Bindings/MemberInfo.cs +++ b/Source/Tools/Flax.Build/Bindings/MemberInfo.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. +using System.Collections.Generic; using System.IO; namespace Flax.Build.Bindings @@ -17,12 +18,28 @@ namespace Flax.Build.Bindings public bool IsHidden; public AccessLevel Access; public string Attributes; + public Dictionary Tags; public bool HasAttribute(string name) { return Attributes != null && Attributes.Contains(name); } + public string GetTag(string tag) + { + if (Tags != null && Tags.TryGetValue(tag, out var value)) + return value; + return null; + } + + public void SetTag(string tag, string value) + { + if (Tags == null) + Tags = new Dictionary(); + Tags[tag] = value; + } + + public virtual void Write(BinaryWriter writer) { writer.Write(Name); @@ -33,6 +50,7 @@ namespace Flax.Build.Bindings writer.Write(IsHidden); writer.Write((byte)Access); BindingsGenerator.Write(writer, Attributes); + BindingsGenerator.Write(writer, Tags); } public virtual void Read(BinaryReader reader) @@ -45,6 +63,7 @@ namespace Flax.Build.Bindings IsHidden = reader.ReadBoolean(); Access = (AccessLevel)reader.ReadByte(); Attributes = BindingsGenerator.Read(reader, Attributes); + Tags = BindingsGenerator.Read(reader, Tags); } } }