UDA for module declaration.

IgorStepanov via Digitalmars-d digitalmars-d at puremagic.com
Tue Sep 16 17:46:04 PDT 2014


Why not subj?
D allows annotate with UDA the most of named symbols.
There are three category of named symbols, which cannot be 
annotated: module declarations, function arguments and enum 
members.
Enum members are trivial symbols and annotation possibility for 
them probably does not make sense.
However, annotation unpossibility for module declaration and 
function arguments looks strange.

Why all this talk?
I've created pull request for dmd, which allows UDA for modules 
(https://github.com/D-Programming-Language/dmd/pull/3947) and 
Walter says that I should open topic in n.g. and justify the 
usefulness of this enhancement.

I will give a few examples when UDA can be used for modules and 
arguments:

First example: in ORM framework, like hibernate, I want to add 
posibility to put the module in correspondence to DB scheme:

@Sheme("STOCK") module Stock;

@Entity("WAYBILLS") class Waybill //STOCK.WAYBILLS
{
....
}

@Entity("ITEMS") class Item //STOCK.ITEMS
{
....
}

***************************************************
The second example is a Web MVC framework

@BindModule("forum") module dlang.engine.controllers.forum;

@BindPath("/")
class MainController : AbstractController!(MainController)
{
     @BindMethod("/newpost")
     View newPost(Request req,
                  @BindParam("tid") int threadID,
                  @BindParam("author") string author,
                  @BindParam("subj")   string subject,
                  @BindParam("msg")    string message)
     {
         ///
         return new TemplateView(model, 
"/dlang/templates/forum/newpost.tmpl");
     }
}

***************************************************
The third example is a my runtime reflection implementation:

I've created generator which walking down the scope symbol, and 
store runtime data, if symbol is annotated with a special UDA.
For example, if class Annotated with @reflect!all, generator will 
save information about all class members into special place. 
However, if local scope symbol is not annotated, information 
about its members will not saved:

@reflect!all class Foo
{
    int a;
    class Bar
    {
       int b;
    }
}
In this example, information for Foo will be saved (that Foo 
contains "a" and class "Bar"), but information about Bar members 
will not be saved.
Thus I want to be able to annotate module that the generator will 
keep information about its members.

Destroy.


More information about the Digitalmars-d mailing list