https://issues.dlang.org/show_bug.cgi?id=15371

          Issue ID: 15371
           Summary: __traits(getMember) should bypass the protection
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: dmd
          Assignee: nob...@puremagic.com
          Reporter: bb.t...@gmx.com

"__traits(getMember,...)" should always work, whatever is the member protection
(as long as the symbol is a valid one).

The current limitation is problematic because it prevents to write functions
related to traits in a separate dedicated modules (e.g mylib.traits)

Every time a "__traits(getMember,...)" has to be used the only solution to make
it works with a private member is to write again and again the code (or to warp
the function in a mixin template).

Since there is also the traits verb "getProtection", it still would be possible
to respect the protection or not.

In case this wouldn't be clear, more concretly:

======================================
module mylib.traits;

mixin template ScopedReachability()
{
    bool isMemberReachableGood(T, string member)()
    if (is(T==class) || is(T==struct))
    {
        return __traits(compiles, __traits(getMember, T, member));
    }
}
bool isMemberReachableBad(T, string member)()
if (is(T==class) || is(T==struct))
{
     return __traits(compiles, __traits(getMember, T, member));
}

=====================================
module somemodule;

class Foo
{
private: 
    uint a,b,c;
public:
    this()
    {
        foreach(member; __traits(allMembers, Foo))
        static if (isMemberReachableBad!(Foo, member)) {/*a,b,c not detected*/}

        import mylib.traits;
        mixin ScopedReachability; // isMemberReachableGood is now a local func. 
        static if (isMemberReachableGood!(Foo, member)) {/*a,b,c detected*/} 
    }
}

=====================================

With a relaxed protection policy on the "getMember" verb, it would be possible
to write reusable functions related to traits. Actually the problem prevents a
lot of good template that would simplify the traits usage to be written.

=====================================

see also:

- https://issues.dlang.org/show_bug.cgi?id=15335
- http://forum.dlang.org/post/xrrptwihnvlxabswn...@forum.dlang.org

--

Reply via email to