How to check member function for being @disable?

Uranuz via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Sep 12 21:58:38 PDT 2016


In my code I iterate in CT over class methods marked as @property 
and I have a probleme that one of methods is @disable. So I just 
want to skip @disable members. I found possible solution, but 
it's interesting to we if we have more clear and obvious way to 
test for @disable without using __traits( compile ) for it? 
@disable "looks" like attribute but seems that I cant't get it 
through __traits( getAttributes ) or __traits( 
getFunctionAttributes ). Maybe we could add something to test for 
@disable if it's not already exists?

void fillProperties(Ctrl)(Ctrl ctrl, IDirectiveStatement 
statement, Interpreter interp)
{
	import std.meta: Alias, AliasSeq;
	import std.traits;
	import std.conv;

	TDataNode[string] attrDict = getNamedAttributesValues(statement, 
interp);

	foreach(  memberName; AliasSeq!( __traits( allMembers, Ctrl ) )  
)
	{
		static if(  __traits( compiles, __traits(getOverloads, 
Ctrl.init, memberName) )  )
		{
			alias Overloads = AliasSeq!(__traits( getOverloads, Ctrl.init, 
memberName ));
			foreach( overload; Overloads )
			{

				static if( (functionAttributes!(overload) & 
FunctionAttribute.property) )
				{

					alias params = Parameters!(overload);
					static if( params.length == 1 )
					{

						alias propType = params[0];
						static if( __traits(compiles, mixin("{ ctrl."~memberName~" 
= propType.init; }") ) )
						{
							pragma( msg, memberName, ":  ",  typeof(&overload) );
							TDataNode attrValue = attrDict.get( memberName, 
TDataNode(null) );
							if( !attrValue.empty ) {
								mixin( "ctrl." ~ memberName ~ " = 
nodeToDValue!(propType)(attrValue);" );
							}
						}
					}
				}
			}
		}
	}
}


More information about the Digitalmars-d-learn mailing list