我想编写一个代码生成器,它根据另一个锡兰类的元模型生成一个类。我希望代码生成器在编译时运行。对我来说这是最好的方法。我可以通过为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(),所以“做到了!”会被打印出来。
答案 0 :(得分:4)
AST Transformers,但仍处于早期设计阶段。目前,要进行编译时代码生成,您必须自己设置一些东西。
要实际生成代码,我建议您使用ceylon.ast
和ceylon.formatter
。工作流程大致为:
ceylon.ast
(ceylon.ast.redhat::compileAnyCompilationUnit
)进行解析,并在没有类型检查的情况下对其进行分析,ceylon.ast
(ceylon.ast.redhat::anyCompilationUnitToCeylon
),在即将发布的1.2中使用新的update hooks保留类型检查器信息。 0发布ceylon.ast.core::Editor
s)的自定义CompilationUnit
,或者如果RemoteController
可能创建全新的编译单元生活在一个不同的模块中ceylon.ast
AST转换为编译器AST并将其反馈到ceylon.formatter
以再次将AST转换为代码(请参阅here以获取示例)或者,如果将其集成到构建步骤中,则可以跳过步骤3的ceylon.formatter
部分,而是将转换后的编译器AST直接输入到typechecker和其余编译器中。