Why can we not use __traits across protection?

Atila Neves atila.neves at gmail.com
Wed Apr 3 09:19:57 UTC 2019


On Tuesday, 2 April 2019 at 14:56:38 UTC, Alex wrote:
> Module X:
>
> class x
> {
>    private int x;
> }
>
> Module Y:
>
> import X;
>
> moduleName!(x.x);
>
> or
>
> __traits(getProtection, x.x);
>
> Deprecation: `X.x.x.x` is not visible from module `Y`
> Error: class `X.x.x` member `x` is not accessible
>
> My use case is a little more complicated but I have two issues.

__traits(getProtection, __traits(getMember, x, "x")) works. You 
just can't spell "x.x" anywhere.

>
> 1: I have to import the module even though the type passed is 
> valid(I'm using templates which are passed the type with a 
> module import and I'd expect the module import to be "passed" 
> along with the type so that I don't have to import it to use 
> __traits or reflection.

I used to think this but it's not actually needed.


> 2. If a member is protected then __traits and others fails. 
> This makes absolutely no sense. Protection is used for run 
> time, not compile time. What is strange is private methods give 
> a deprecation warning but private fields give a deprecation 
> error.

See above.




More information about the Digitalmars-d mailing list