Как построить реферат с помощью макроса Haxe? - PullRequest
1 голос
/ 24 февраля 2020

Я не смог найти ни одного примера кода или учебника, который бы создавал тезисы с макросами.

//Class code ReflectionClassInfo.hx
@:build(ReflectionClassInfoMacro.build())
abstract ReflectionClassInfo({}) from ({}) to ({}) {}

//Driver code
var r=new ReflectionClassInfo();
//Immeditately makes the compiler complain about there is no constructor

Как исправить ошибку компилятора?

1 Ответ

4 голосов
/ 25 февраля 2020

Важно понимать, что между макросами сборки для классов и тезисов нет никакой разницы. В обоих случаях они создают поля, что означает, что они должны возвращать массив haxe.macro.Expr.Field. Поэтому любая документация или пример кода, который относится к одному, относится и к другому.

Самый простой / читаемый способ исправить ошибку компилятора в вашем примере - использовать reification класса , так что конструктор может быть объявлен с обычным синтаксисом Haxe:

import haxe.macro.Context;
import haxe.macro.Expr.Field;

class Macro {
    public static function build():Array<Field> {
        var fields = Context.getBuildFields();
        fields = fields.concat((macro class {
            public function new() {
                this = {};
            }
        }).fields);
        return fields;
    }
}
class Main {
    static function main() {
        new Abstract(); // compiles
    }
}

@:build(Macro.build())
abstract Abstract({}) from {} to {} {}
...