Jacob Carlborg wrote:
On 2012-04-06 14:38, Piotr Szturmaj wrote:

Do you mean return type? I think your syntax has some serious
disadvantages. Consider parameters and multiple attributes.

For return types I'd like to see something like this:

@return: not_null
@return: MyAttr("foo")
Foo bar(@custom int a) {}

This is similar to C#'s [return: MyAttr]. Alternatively it might be:

@return(not_null)
@return(MyAttr("foo"))

Hmm, or something like how Java does it. You attached this information
when you declare the attribute:

@Retention(RetentionPolicy.RUNTIME) // Make this annotation accessible
at runtime via reflection.
@Target({ElementType.METHOD}) // This annotation can only be applied to
class methods.

public @interface Tweezable {
}

Or with another syntax:

@attribute @target(type) struct not_null {}


I think that @target is a solution for simple types, but UDTs may use another one:

struct MyAttr
{
    template Attach(Symbol)
    {
        static if (!is(typeof(Symbol) == class) || !is(typeof(Symbol) : A))
static assert(0, "MyAttr must be attached to classes derived from class A");
    }
}

This allows more complex target checking possible. Besides above example, some attributes can be mutually exclusive and __traits(hasAttribute, ...) may be used to check that.

Reply via email to