2017-01-18 4 views
2

Рассмотрим этот код:Generic сборки добавление полей

http://try.haxe.org/#5AD6e

class Test 
{ 
    public static function main() 
    { 
     var foo = new FluentFoo(null, { bar: 1 }).hello(); 
    } 
} 

class Foo 
{ 
    public function new(options:{ bar:Int }) {} 

    public function hello() 
    { 
     trace("Hi there"); 
    } 
} 

class Fluent 
{ 
    private var parent:Null<Fluent>; 

    public function new(parent:Null<Fluent>) 
    { 
     this.parent = parent; 
    } 

    public function end() 
    { 
     if(parent != null) { 
      return parent; 
     } 

     throw 'Top level already reached'; 
    } 
} 

class FluentFoo extends Fluent 
{ 
    public var base:Foo; 

    public function new(parent:Null<Fluent>, options:{ bar:Int }) 
    { 
     super(parent); 

     base = new Foo(options); 
    } 

    public function hello() 
    { 
     base.hello(); 

     return this; 
    } 
} 

Я хочу, чтобы автоматически генерировать классы, такие как FluentFoo.

В pseudohaxe код:

import haxe.Constraints.Constructible; 

class Test 
{ 
    public static function main() 
    { 
     var foo = new Fluent<Foo>(null, { bar: 1 }).hello(); 
    } 
} 

class Foo 
{ 
    public function new(options:{ bar:Int }) {} 

    public function hello() 
    { 
     trace("Hi there"); 
    } 
} 

@:generic 
@:genericBuild(FluentMacro.build()) 
class Fluent<T:Constructible<Dynamic -> Void>> 
{ 
    private var parent:Null<Fluent>; 
    private var base:T; 

    public function new(parent:Null<Fluent>, options:Dynamic) 
    { 
     this.parent = parent; 
     this.base = new T(options); 
    } 

    public function end() 
    { 
     if(parent != null) { 
      return parent; 
     } 

     throw 'Top level already reached'; 
    } 
} 

class FluentMacro 
{ 
    public static function build() 
    { 
     //Get "T" public methods 
     //Add them to class calling this genericBuild method (in this example to Fluent_Foo) 
     //Modify them so they return "this" 
    } 
} 

Я знаю, что я не могу использовать @:build, как все, что я хотел бы получить от Context.getLocalType бы TInst(Fluent,[TInst(Fluent.T,[])]).

Однако, я не совсем понимаю Haxe руководство по родовым строит - они находятся под одной и той же секции «Тип здания макросов» как обычный @:build, но метод build ожидается возвращение ComplexType, а не массив полей. Возможно ли вообще добавить поля в @:genericBuild?

Спасибо

ответ

Смежные вопросы