On Wednesday, 25 September 2019 at 05:57:19 UTC, Tobias Pankrath wrote:
Does your code work or does it not? I don't seem to unterstand neither what the question here is nor what the desired result is. Is the problem that the static reflections triggers the deprecation warning?

I added some deprecations in my project and am going through my templates trying to silence the warnings that suddenly popped up. This template works, but it triggers deprecation warnings when I am actively trying to avoid them.

getMember in _traits(isDeprecated, __traits(getMember, T, name)) causes a warning on deprecated symbols, which I wanted to avoid with isDeprecated, but I couldn't without first calling getMember to get the symbol to evaluate it. There's no way to combine isDeprecated with getMember without getting a warning.

I worked around the issue by using .tupleof instead of getMember, which breaks it for classes (.tupleof needs a `this` and SomeClass.init can't be it) but silences warnings for structs.

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

import std;

void main()
{
    static assert(longestMemberName!Foo == "bbb".length);
}

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

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

template longestMemberName(T)
if (is(T == struct))
{
    enum longestMemberName = ()
    {
        size_t maxLength;
        T thing;  // need a `this`

        foreach (immutable i, member; thing.tupleof)
        {
static if (!__traits(isDeprecated, thing.tupleof[i]) &&
                       !isType!(thing.tupleof[i]))
            {
enum name = __traits(identifier, thing.tupleof[i]);
                maxLength = max(maxLength, name.length);
            }
        }

        return maxLength;
    }();
}

Reply via email to