I want to write a piece of code that reflects on the names of members of a passed struct, where some are depreacted.

https://run.dlang.io/is/P9EtRG

struct Foo
{
    string s;
    int ii;
    bool bbb;

    deprecated("Use `s`")
    string zzzz;
}

template longestMemberLength(T)
{
    enum longestMemberLength = ()
    {
        size_t maxLength;

foreach (immutable i, immutable name; __traits(allMembers, T))
        {
static if (!__traits(isDeprecated, __traits(getMember, T, name)))
            {
                maxLength = max(maxLength, name.length);
            }
        }

        return maxLength;
    }();
}

static assert (longestMemberLength!Foo == "bbb".length);

onlineapp.d(23): Deprecation: variable `onlineapp.Foo.zzzz` is deprecated - Use s

Is there any way to inspect the deprecated-ness of a member this way? I only have what __traits(allMembers) gives me.

Reply via email to