【问题标题】:How can I write a code generator in Ceylon如何在 Ceylon 编写代码生成器
【发布时间】:2015-11-07 22:22:56
【问题描述】:

我想编写一个代码生成器,它根据另一个锡兰类的元模型生成一个类。我希望代码生成器在编译时运行。对我来说最好的方法是什么。我可能可以通过为 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 在用户的浏览器中运行,并允许客户端锡兰代码执行 Ajax 调用,如下所示:

RemoteController().doSomething();

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

【问题讨论】:

    标签: code-generation ceylon


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的。我会按照你的建议去做,并将其作为我构建的一部分。有一次,锡兰获得了代码生成器,我将切换到它。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2012-03-03
    • 2012-05-23
    • 2018-11-18
    • 2014-05-29
    相关资源
    最近更新 更多