如何在Ceylon中编写代码生成器

时间:2015-11-07 22:22:57

标签: code-generation ceylon

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

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

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

我计划它像Spring MVC。这个框架将从Controller类创建一个restful 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(),所以“做到了!”会被打印出来。

1 个答案:

答案 0 :(得分:4)

已提出

AST Transformers,但仍处于早期设计阶段。目前,要进行编译时代码生成,您必须自己设置一些东西。

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

  1. 分析源代码 -
    • 要么使用ceylon.astceylon.ast.redhat::compileAnyCompilationUnit)进行解析,并在没有类型检查的情况下对其进行分析,
    • 或使用编译器解析它,运行类型检查程序,然后将其转换为ceylon.astceylon.ast.redhat::anyCompilationUnitToCeylon),在即将发布的1.2中使用新的update hooks保留类型检查器信息。 0发布
  2. 编辑源代码AST以添加新代码(使用将新类定义注入ceylon.ast.core::Editor s)的自定义CompilationUnit,或者如果RemoteController可能创建全新的编译单元生活在一个不同的模块中
  3. ceylon.ast AST转换为编译器AST并将其反馈到ceylon.formatter以再次将AST转换为代码(请参阅here以获取示例)
  4. 或者,如果将其集成到构建步骤中,则可以跳过步骤3的ceylon.formatter部分,而是将转换后的编译器AST直接输入到typechecker和其余编译器中。