Add support for constexpr fields in Scripting API

This commit is contained in:
Wojtek Figat
2022-06-16 21:56:48 +02:00
parent 02cb0f938b
commit 2bd3c0f74f
5 changed files with 41 additions and 16 deletions

View File

@@ -878,11 +878,15 @@ namespace Flax.Build.Bindings
contents.Append("protected ");
else if (fieldInfo.Access == AccessLevel.Private)
contents.Append("private ");
if (fieldInfo.IsStatic)
if (fieldInfo.IsConstexpr)
contents.Append("const ");
else if (fieldInfo.IsStatic)
contents.Append("static ");
var returnValueType = GenerateCSharpNativeToManaged(buildData, fieldInfo.Type, classInfo);
contents.Append(returnValueType).Append(' ').Append(fieldInfo.Name);
if (!useUnmanaged)
if (!useUnmanaged || fieldInfo.IsConstexpr)
{
var defaultValue = GenerateCSharpDefaultValueNativeToManaged(buildData, fieldInfo.DefaultValue, classInfo, fieldInfo.Type);
if (!string.IsNullOrEmpty(defaultValue))
@@ -1156,7 +1160,9 @@ namespace Flax.Build.Bindings
contents.Append("protected ");
else if (fieldInfo.Access == AccessLevel.Private)
contents.Append("private ");
if (fieldInfo.IsStatic)
if (fieldInfo.IsConstexpr)
contents.Append("const ");
else if (fieldInfo.IsStatic)
contents.Append("static ");
string type;
@@ -1189,9 +1195,17 @@ namespace Flax.Build.Bindings
type = GenerateCSharpNativeToManaged(buildData, fieldInfo.Type, structureInfo);
contents.Append(type).Append(' ').Append(fieldInfo.Name);
// Static fields are using C++ static value accessed via getter function binding
if (fieldInfo.IsStatic)
if (fieldInfo.IsConstexpr)
{
// Compile-time constant
var defaultValue = GenerateCSharpDefaultValueNativeToManaged(buildData, fieldInfo.DefaultValue, structureInfo, fieldInfo.Type);
if (!string.IsNullOrEmpty(defaultValue))
contents.Append(" = ").Append(defaultValue);
contents.AppendLine(";");
}
else if (fieldInfo.IsStatic)
{
// Static fields are using C++ static value accessed via getter function binding
contents.AppendLine();
contents.AppendLine(indent + "{");
indent += " ";
@@ -1386,7 +1400,7 @@ namespace Flax.Build.Bindings
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(';'))
foreach (var code in injectCodeInfo.Code.Split(';'))
{
if (code.StartsWith("using"))
CSharpUsedNamespaces.Add(code.Substring(6));

View File

@@ -19,7 +19,7 @@ namespace Flax.Build.Bindings
partial class BindingsGenerator
{
private static readonly Dictionary<string, Type> TypeCache = new Dictionary<string, Type>();
private const int CacheVersion = 14;
private const int CacheVersion = 15;
internal static void Write(BinaryWriter writer, string e)
{

View File

@@ -1384,7 +1384,7 @@ namespace Flax.Build.Bindings
private static bool GenerateCppAutoSerializationSkip(BuildData buildData, ApiTypeInfo caller, MemberInfo memberInfo, TypeInfo typeInfo)
{
if (memberInfo.IsStatic)
if (memberInfo.IsStatic || memberInfo.IsConstexpr)
return true;
if (memberInfo.Access != AccessLevel.Public && !memberInfo.HasAttribute("Serialize"))
return true;
@@ -1691,7 +1691,7 @@ namespace Flax.Build.Bindings
// Fields
foreach (var fieldInfo in classInfo.Fields)
{
if (!useScripting || !useCSharp || fieldInfo.IsHidden)
if (!useScripting || !useCSharp || fieldInfo.IsHidden || fieldInfo.IsConstexpr)
continue;
if (fieldInfo.Getter != null)
GenerateCppWrapperFunction(buildData, contents, classInfo, fieldInfo.Getter, "{0}");
@@ -1853,6 +1853,9 @@ namespace Flax.Build.Bindings
// Fields
foreach (var fieldInfo in structureInfo.Fields)
{
if (fieldInfo.IsConstexpr)
continue;
// Static fields are using C++ static value accessed via getter function binding
if (fieldInfo.IsStatic)
{
@@ -1977,7 +1980,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < structureInfo.Fields.Count; i++)
{
var fieldInfo = structureInfo.Fields[i];
if (fieldInfo.IsReadOnly || fieldInfo.IsStatic || fieldInfo.Access == AccessLevel.Private)
if (fieldInfo.IsReadOnly || fieldInfo.IsStatic || fieldInfo.IsConstexpr || fieldInfo.Access == AccessLevel.Private)
continue;
if (i == 0)
contents.AppendLine($" if (name == TEXT(\"{fieldInfo.Name}\"))");
@@ -1993,7 +1996,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < structureInfo.Fields.Count; i++)
{
var fieldInfo = structureInfo.Fields[i];
if (fieldInfo.IsReadOnly || fieldInfo.IsStatic || fieldInfo.Access == AccessLevel.Private)
if (fieldInfo.IsReadOnly || fieldInfo.IsStatic || fieldInfo.IsConstexpr || fieldInfo.Access == AccessLevel.Private)
continue;
if (i == 0)
contents.AppendLine($" if (name == TEXT(\"{fieldInfo.Name}\"))");
@@ -2205,7 +2208,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < structureInfo.Fields.Count; i++)
{
var fieldInfo = structureInfo.Fields[i];
if (fieldInfo.IsStatic)
if (fieldInfo.IsStatic || fieldInfo.IsConstexpr)
continue;
var fieldType = fieldInfo.Type;
var fieldApiType = FindApiTypeInfo(buildData, fieldType, structureInfo);
@@ -2450,7 +2453,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < fields.Count; i++)
{
var fieldInfo = fields[i];
if (fieldInfo.IsStatic)
if (fieldInfo.IsStatic || fieldInfo.IsConstexpr)
continue;
if (fieldInfo.NoArray && fieldInfo.Type.IsArray)
@@ -2482,7 +2485,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < fields.Count; i++)
{
var fieldInfo = fields[i];
if (fieldInfo.IsStatic)
if (fieldInfo.IsStatic || fieldInfo.IsConstexpr)
continue;
CppNonPodTypesConvertingGeneration = true;
@@ -2531,7 +2534,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < fields.Count; i++)
{
var fieldInfo = fields[i];
if (fieldInfo.IsStatic)
if (fieldInfo.IsStatic || fieldInfo.IsConstexpr)
continue;
if (fieldInfo.NoArray && fieldInfo.Type.IsArray)
@@ -2566,7 +2569,7 @@ namespace Flax.Build.Bindings
for (var i = 0; i < fields.Count; i++)
{
var fieldInfo = fields[i];
if (fieldInfo.IsStatic)
if (fieldInfo.IsStatic || fieldInfo.IsConstexpr)
continue;
CppNonPodTypesConvertingGeneration = true;

View File

@@ -1155,6 +1155,11 @@ namespace Flax.Build.Bindings
desc.IsStatic = true;
context.Tokenizer.NextToken();
}
else if (!desc.IsConstexpr && token.Value == "constexpr")
{
desc.IsConstexpr = true;
context.Tokenizer.NextToken();
}
else if (!isMutable && token.Value == "mutable")
{
isMutable = true;

View File

@@ -12,6 +12,7 @@ namespace Flax.Build.Bindings
public string Name;
public string[] Comment;
public bool IsStatic;
public bool IsConstexpr;
public bool IsDeprecated;
public bool IsHidden;
public AccessLevel Access;
@@ -27,6 +28,7 @@ namespace Flax.Build.Bindings
writer.Write(Name);
BindingsGenerator.Write(writer, Comment);
writer.Write(IsStatic);
writer.Write(IsConstexpr);
writer.Write(IsDeprecated);
writer.Write(IsHidden);
writer.Write((byte)Access);
@@ -38,6 +40,7 @@ namespace Flax.Build.Bindings
Name = reader.ReadString();
Comment = BindingsGenerator.Read(reader, Comment);
IsStatic = reader.ReadBoolean();
IsConstexpr = reader.ReadBoolean();
IsDeprecated = reader.ReadBoolean();
IsHidden = reader.ReadBoolean();
Access = (AccessLevel)reader.ReadByte();