2015-11-07 53 views
1

我想编写一个代码生成器,它根据另一个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(),以便“做到了!”将被打印。

回答

4

AST Transformers已被提出,但仍处于设计初期阶段。现在,为了编译时生成代码,你必须自己创建一些东西。

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

  1. 分析源代码 -
    • 或者与ceylon.astceylon.ast.redhat::compileAnyCompilationUnit)分析它并分析它没有类型检查,
    • 或使用编译器分析它,运行typechecker,然后将其转换为ceylon.astceylon.ast.redhat::anyCompilationUnitToCeylon),使用保持在很快即将发布1.2.0新update hooks的typechecker信息
  2. 编辑源代码的AST,以添加新的代码(使用自定义ceylon.ast.core::Editor是注入新的类定义为CompilationUnit S),或者创造全新的编译单元,如果RemoteController生活在不同的模块
  3. 转换ceylon.ast AST到编译器AST和饲料成ceylon.formatter再次开启AST为代码(见here对于这样一个例子)

另外,如果你融入您的构建步骤,您可以跳过步骤3的ceylon.formatter部分而是将转换后的编译器AST直接提供给类型检查器和编译器的其余部分。

+0

好的。我会照你的建议去做,我会把它做成我的构建的一部分。一旦,锡兰获得代码生成器我会切换到。谢谢 – jgleoj23