[Issue 15335] getSymbolsByUDA fails if type has private members
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Mon Nov 16 09:43:25 PST 2015
https://issues.dlang.org/show_bug.cgi?id=15335
bb.temp at gmx.com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |bb.temp at gmx.com
--- Comment #1 from bb.temp at gmx.com ---
I've encountered a similar issue yesterday. It looks like the only way to solve
this is to make `getSymbolsByUDA` a mixin template containing the current
function. Then when the template is mixed in the local scope, there's no more
fake warning in case when a private member is accessed (even in "friends"
classes or struct, so inside the same module.
For example in my case I finished with this:
---
mixin template ScopedReachability()
{
bool isMemberReachable(T, string member)()
if (is(T==class) || is(T==struct))
{
return __traits(compiles, __traits(getMember, T, member));
}
}
---
If I mix ScopedReachability where `isMemberReachable` has to be used it works.
Previously, calling the function template was leading to the same error message
that's reported here...
...So, back to real topic, by analogy:
---
mixin template ScopedgetSymbolsByUDA
{
template getSymbolsByUDA(alias symbol, alias attribute)
{
import std.typetuple : Filter, staticMap, TypeTuple;
static enum hasSpecificUDA(alias S) = hasUDA!(S, attribute);
alias StringToSymbol(alias Name) = Identity!(__traits(getMember,
symbol, Name));
alias getSymbolsByUDA = Filter!(hasSpecificUDA, TypeTuple!(symbol,
staticMap!(StringToSymbol, __traits(allMembers, symbol))));
}
}
---
should work. Instead of calling the template, you first mix
`ScopedgetSymbolsByUDA` and then you call the `getSymbolsByUDA` that's local.
Of course this is not a workaround that I propose here. I think this should be
done like this in phobos.
--
More information about the Digitalmars-d-bugs
mailing list