[nem-en] [macro] building event member

Sergey Shishmintzev sergey.shishmintzev at gmail.com
Thu Mar 8 20:48:03 CET 2007


// Code:
[Nemerle.MacroUsage (Nemerle.MacroPhase.BeforeInheritance,
                     Nemerle.MacroTargets.Field,
                     Inherited = false, AllowMultiple = true)]
macro ModelAccessor (current_type : TypeBuilder, pf : ParsedField,
params _ : list [PExpr])
{
    mutable attributes = [];
    def propAttrs = Modifiers (NemerleAttributes.None, attributes);
    def x = <[ decl: ..$propAttrs event $(pf.Name+"Changed" : dyn) :
Handler; ]>;
    x.Attributes = NemerleAttributes.Public;
    current_type.Define(x);
}
// Usage:
public class Model1
{
  public delegate Handler(_ : object) : void;
  [ModelAccessor]
  private mutable field1 : bool;
  [ModelAccessor]
  private mutable field2 : bool;
}

Problem:
// ncc's messages:
positive/macroprog.n:267:4:267:17: error: field `Model1._N_1790'
redefined in `Model1'
positive/macroprog.n:265:4:265:17: error:   first definition here as
field `Model1._N_1790'
positive/macroprog.n:267:4:267:17: error: redefinition of method
Model1.add_(value : Model1.Handler) : void
positive/macroprog.n:267:4:267:17: error: redefinition of method
Model1.remove_(value : Model1.Handler) : void

I can suggest add Parsetree.Splicable.Combine { names :
list[Splicable] } (or { n1 : Splicable; n2 : Splicabel }) option and
use it to build add_*/remove_* names. But I unsure.

-- 
Serg



More information about the devel-en mailing list