如何在Ceylon中编写代码生成器
问题描述:
我想编写一个代码生成器,它根据另一个ceylon类的元模型生成一个类。我希望代码生成器在编译时运行。我做这件事的最好方法是什么?我大概可以通过编写gradle或ceylon构建系统的插件来实现这一点,但我希望能有一个更简单的解决方案。不幸的是,我没有看到锡兰的代码生成器的任何支持。另外,锡兰的代码生成器有没有计划?如何在Ceylon中编写代码生成器
我想是因为我在考虑写锡兰一个简单的web框架看像下面的使用元模型类编写代码生成器: 控制器
shared class Controller() {
shared void doSomething() => print("did it!");
}
我规划它就像Spring MVC一样。这一框架将使从控制器类,允许人写的AJAX调用这样一个RESTful API:
$http.get("/Controller/doSomething");
我想使事情变得更加方便,高层次,简单的通过执行类似GWT。我想创建一个代码生成器自动生成这样一个类:
shared class RemoteController() {
shared void doSomething() {
$http.get("/Controller/doSomething");
}
}
的RemoteController会在用户的浏览器,如JavaScript中运行,并允许客户端锡兰代码做一个Ajax调用是这样的:
RemoteController().doSomething();
这将最终调用服务器上的Controller()。doSomething(),以便“做到了!”将被打印。
答
AST Transformers已被提出,但仍处于设计初期阶段。现在,为了编译时生成代码,你必须自己创建一些东西。
要实际生成代码,我建议使用ceylon.ast
和ceylon.formatter
。所述工作流将大致是:
- 分析源代码 -
- 或者与
ceylon.ast
(ceylon.ast.redhat::compileAnyCompilationUnit
)分析它并分析它没有类型检查, - 或使用编译器分析它,运行typechecker,然后将其转换为
ceylon.ast
(ceylon.ast.redhat::anyCompilationUnitToCeylon
),使用保持在很快即将发布1.2.0新update hooks的typechecker信息
- 或者与
- 编辑源代码的AST,以添加新的代码(使用自定义
ceylon.ast.core::Editor
是注入新的类定义为CompilationUnit
S),或者创造全新的编译单元,如果RemoteController
生活在不同的模块 - 转换
ceylon.ast
AST到编译器AST和饲料成ceylon.formatter
再次开启AST为代码(见here对于这样一个例子)
另外,如果你融入您的构建步骤,您可以跳过步骤3的ceylon.formatter
部分而是将转换后的编译器AST直接提供给类型检查器和编译器的其余部分。
好的。我会照你的建议去做,我会把它做成我的构建的一部分。一旦,锡兰获得代码生成器我会切换到。谢谢 – jgleoj23