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;
}();
}