Idea to verify virtual/final methods

Jacob Carlborg doob at me.com
Tue Jun 4 04:45:21 PDT 2013


On 2013-06-04 13:13, bearophile wrote:

> If there are some things that don't give you enough static introspection
> to perform that, then it's worth adding that missing static
> introspection to D language.

It actually works. My mistake. Here's a version that works with modules 
as well:

void checkVirtual (alias T) ()
{
     static if (is(T == class))
     {
         foreach (m ; __traits(derivedMembers, T))
         {
             alias TypeTuple!(__traits(getAttributes, mixin("T." ~ m))) 
attrs;
             enum methodName = T.stringof ~ "." ~ m.stringof;

             static if (staticIndexOf!(virtual, attrs) != -1)
             {
                 static if (!__traits(isVirtualMethod, mixin("T." ~ m)))
                     static assert (false, "Method " ~ methodName ~ " 
marked as @virtual is not virtual");
             }

             else
             {
                 static if (__traits(isVirtualMethod, mixin("T." ~ m)))
                     static assert (false, "Method " ~ methodName ~ " is 
virtual but not marked as @virtual");
             }
         }
     }

     else
     {
         foreach (m ; __traits(allMembers, T))
         {
             mixin("alias " ~ m ~ " member;");
             static if (is(member == class))
                 checkVirtual!(member);
         }
     }

}

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list