1

我想编写一个代码生成器,它根据另一个锡兰类的元模型生成一个类。我希望代码生成器在编译时运行。对我来说最好的方法是什么。我可能可以通过为 gradle 或 ceylon 构建系统编写插件来实现这一点,但我希望有一个更简单的解决方案。不幸的是,我没有看到锡兰对代码生成器的任何支持。另外,锡兰有代码生成器的计划吗?

我想编写这个代码生成器,因为我正在考虑为 ceylon 编写一个简单的 Web 框架,它使用元模型查看如下所示的类:控制器

shared class Controller() {
    shared void doSomething() => print("did it!");
}

我计划让它像 Spring MVC 一样。这个框架将从 Controller 类中创建一个宁静的 API,允许人们像这样编写 AJAX 调用:

$http.get("/Controller/doSomething");

我想通过 GWT 之类的东西让事情变得更方便、更高级、更简单。我想创建一个自动生成这样的类的代码生成器:

shared class RemoteController() {
    shared void doSomething() {
        $http.get("/Controller/doSomething");
    }
}

RemoteController 将作为 javaScript 在用户的浏览器中运行,并允许客户端 ceylon 代码执行 Ajax 调用,如下所示:

RemoteController().doSomething();

这最终会调用服务器上的 Controller().doSomething() 所以“做到了!” 将被打印。

4

1 回答 1

4

AST Transformers已被提出,但仍处于早期设计阶段。现在,要进行编译时代码生成,您必须自己组装一些东西。

要实际生成代码,我建议使用ceylon.astand ceylon.formatter。工作流程大致是:

  1. 分析源代码——
    • 要么用ceylon.ast( ceylon.ast.redhat::compileAnyCompilationUnit) 解析它并在不进行类型检查的情况下对其进行分析,
    • 或使用编译器解析它,运行类型检查器,然后将其转换为ceylon.ast( ),使用即将发布的 1.2.0 版本中ceylon.ast.redhat::anyCompilationUnitToCeylon的新更新挂钩保留类型检查器信息
  2. 编辑源代码 AST 以添加新代码(使用ceylon.ast.core::Editor将新类定义注入到s 中的自定义),或者如果它们位于不同的模块中CompilationUnit,则可能创建全新的编译单元RemoteController
  3. ceylon.astAST 转换为编译器 AST 并将其输入ceylon.formatter以再次将 AST 转换为代码(有关示例,请参见此处)

或者,如果您将其集成到构建步骤中,您可以跳过ceylon.formatter步骤 3 的部分,而是将转换后的编译器 AST 直接提供给类型检查器和编译器的其余部分。

于 2015-11-07T23:44:08.600 回答