Usability of "allMembers and derivedMembers traits now only return visible symbols"

Andrej Mitrovic via Digitalmars-d digitalmars-d at puremagic.com
Tue Aug 30 17:16:51 PDT 2016


On 8/31/16, Ali Çehreli via Digitalmars-d <digitalmars-d at puremagic.com> wrote:
> v2.071.2-b3 is bringing a change for this bug:
>
>    https://issues.dlang.org/show_bug.cgi?id=15907

PSA: If all one cares about are UDAs for fields and not functions then
.tupleof is still a viable workaround. Working example:

-----
import getSymbols;

enum UDA;

struct S
{
    @UDA float visible;

    float dont_care;

    private @UDA int invisible;
}

void main()
{
    static assert(getSymbolsByUDA!(S, UDA).length == 2);
    static assert(getSymbolsByUDA!(S, UDA).stringof == "tuple(visible,
invisible)");
}
-----

-----
module getSymbols;

import std.meta : AliasSeq;
import std.traits : staticIndexOf;

template getSymbolsByUDA ( T, alias uda )
{
    alias getSymbolsByUDA = getSymbolsByUDAImpl!(T, uda);
}

template getSymbolsByUDAImpl ( T, alias uda, size_t idx = 0 )
{
    static if (idx + 1 < T.tupleof.length)
    {
        static if (hasUDA!(T.tupleof[idx], uda))
            alias Field = AliasSeq!(T.tupleof[idx]);
        else
            alias Field = AliasSeq!();

        alias getSymbolsByUDAImpl = AliasSeq!(Field,
            getSymbolsByUDAImpl!(T, uda, idx + 1));
    }
    else
    {
        static if (hasUDA!(T.tupleof[idx], uda))
            alias getSymbolsByUDAImpl = AliasSeq!(T.tupleof[idx]);
        else
            alias getSymbolsByUDAImpl = AliasSeq!();
    }
}

template hasUDA ( alias field, alias uda )
{
    enum hasUDA = staticIndexOf!(uda, __traits(getAttributes, field)) != -1;
}
-----

This is the reason msgpack-d still works and wasn't broken by the change.



More information about the Digitalmars-d mailing list