From 655d6d136e143e02644ad44663c0c67178b73e6a Mon Sep 17 00:00:00 2001 From: "Crom (Thibaut CHARLES)" Date: Sun, 28 Feb 2016 22:02:57 +0100 Subject: [PATCH 1/2] Convert struct members if public and not @("internal") --- luad/conversions/structs.d | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/luad/conversions/structs.d b/luad/conversions/structs.d index 6da6164..b95c0cb 100644 --- a/luad/conversions/structs.d +++ b/luad/conversions/structs.d @@ -12,9 +12,10 @@ import luad.c.all; import luad.stack; -private template isInternal(string field) +private template isInternal(T, string field) { - enum isInternal = field.length >= 2 && field[0..2] == "__"; + import std.traits : hasUDA; + enum isInternal = hasUDA!(mixin("T."~field), "internal") || field.length >= 2 && field[0..2] == "__"; } //TODO: ignore static fields, post-blits, destructors, etc? @@ -24,7 +25,8 @@ void pushStruct(T)(lua_State* L, ref T value) if (is(T == struct)) foreach(field; __traits(allMembers, T)) { - static if(!isInternal!field && + static if(__traits(getProtection, mixin("T."~field))=="public" && + !isInternal!(T, field) && field != "this" && field != "opAssign") { @@ -53,7 +55,11 @@ void fillStruct(T)(lua_State* L, int idx, ref T s) if(is(T == struct)) { foreach(field; __traits(allMembers, T)) { - static if(field != "this" && !isInternal!(field)) + static if( + field != "this" + && __traits(getProtection, mixin("T."~field))=="public" + && !isInternal!(T, field) + ) { static if(__traits(getOverloads, T, field).length == 0) { From b82afb2c1b6a4542c2674add3b2618930c6e7d5f Mon Sep 17 00:00:00 2001 From: "Crom (Thibaut CHARLES)" Date: Sun, 28 Feb 2016 23:00:20 +0100 Subject: [PATCH 2/2] @("internal") changed to @internal --- luad/all.d | 1 + luad/conversions/structs.d | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/luad/all.d b/luad/all.d index a92c9ae..082e866 100644 --- a/luad/all.d +++ b/luad/all.d @@ -8,3 +8,4 @@ module luad.all; public import luad.base, luad.table, luad.lfunction, luad.dynamic, luad.state, luad.lmodule; public import luad.conversions.functions : LuaVariableReturn, variableReturn; +public import luad.conversions.structs : internal; diff --git a/luad/conversions/structs.d b/luad/conversions/structs.d index b95c0cb..4662b49 100644 --- a/luad/conversions/structs.d +++ b/luad/conversions/structs.d @@ -12,10 +12,12 @@ import luad.c.all; import luad.stack; +enum internal; + private template isInternal(T, string field) { import std.traits : hasUDA; - enum isInternal = hasUDA!(mixin("T."~field), "internal") || field.length >= 2 && field[0..2] == "__"; + enum isInternal = hasUDA!(mixin("T."~field), internal) || field.length >= 2 && field[0..2] == "__"; } //TODO: ignore static fields, post-blits, destructors, etc?