DIP6: Attributes

grauzone none at example.net
Sun Aug 2 20:59:16 PDT 2009


Ary Borenszweig wrote:
> http://www.prowiki.org/wiki4d/wiki.cgi?LanguageDevel/DIPs/DIP6

The next step would be to introduce user defined annotations. I propose 
this:

//--------------

//declaring a user defined annotation type
@annotation
struct MyAnnotation {
	int x;
	char[] y;
	SubAnnotation sub;
}
struct SubAnnotation {
	int x;
}

//use the annotation on SomeType
@MyAnnotation(123, "456", SubAnnotation(789))
class SomeType {
}

//reading user defined annotations
void foo() {
	foreach (t; __traits(getAnnotations, SomeType) {
		//t is a value of the annotation type
		//SomeType is only annotated with MyAnnotation
		static assert(is(typeof(t) == MyAnnotation));
		//can read out the annotation values
		assert(t.y == "456");
	}
}
//--------------


Using @annotation introduces the annotated type name into the 
annotation's namespace. This automatically means the type can be used as 
annotation.

The annotation declaration is parsed as if you'd define a compile time 
constant using the expression following the @, e.g. "const c = 
MyAnnotation(123, [...]);"
This means the @ is actually just followed by an expression, that 
actually uses opCall() (in this case opCall is autogenerated by the 
compiler). The expression is evaluated using CTFE.

Note that compile time annotations (like @override, @property) still can 
collide with user defined types, but only if those types are marked by 
@annotation. (Actually, compile time annotations can be normal types 
declared in object.d.)

__traits(getAnnotations, SomeType) returns a tuple containing the values 
of all annotations applied to a type. In other words, the result of the 
CTFE execution of each annotation.


Any thoughts?

PS: I wouldn't use annotations for all attribute keywords (like 
override, final, pure, ...). Some keywords should be left as they are. 
Only seldom used and/or new keywords should be introduced as annotations 
(for example deprecated or __gshared [there's a type on the DIP page btw.]).

PPS: shoudl annotations follow the normal D attribute syntax? E.g. allow 
this:
@someannotation declaration;
@someannotation {
	declaration1;
	declaration2;
}
@someannotation:
	declaration1;
	declaration2;



More information about the Digitalmars-d mailing list