1

別のセイロン クラスのメタ モデルに基づいてクラスを生成するコード ジェネレーターを作成したいと考えています。コンパイル時にコード ジェネレーターを実行したい。これを行うための最良の方法は何ですか。おそらくgradleまたはceylonビルドシステム用のプラグインを作成することでこれを達成できますが、より簡単なソリューションを望んでいます. 残念ながら、セイロンではコード ジェネレーターのサポートは見当たりません。また、セイロンでのコード ジェネレーターの計画はありますか?

メタモデルを使用して次のようなクラスを見るセイロン用の単純な Web フレームワークを作成することを考えているため、このコード ジェネレーターを作成したいと思います。

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

Spring MVC のようになる予定です。このフレームワークは、誰かが次のような AJAX 呼び出しを記述できるようにするコントローラー クラスから安らかな API を作成します。

$http.get("/Controller/doSomething");

GWTのようなことをして、もっと便利に、高レベルに、シンプルにしたい。次のようなクラスを自動的に生成するコード ジェネレーターを作成したいと考えています。

shared class RemoteController() {
    shared void doSomething() {
        $http.get("/Controller/doSomething");
    }
}

RemoteController は、ユーザーのブラウザーで javaScript として実行され、クライアント側の ceylon コードが次のような Ajax 呼び出しを実行できるようにします。

RemoteController().doSomething();

それは、サーバー上で Controller().doSomething() を呼び出すことになるので、「やった!」印刷されます。

4

1 に答える 1

4

AST トランスが提案されていますが、まだ設計の初期段階にあります。今のところ、コンパイル時のコード生成を行うには、独自のものを用意する必要があります。

実際にコードを生成するには、 と の使用をお勧めしceylon.astますceylon.formatter。ワークフローは大まかに次のようになります。

  1. ソースコードを分析 –
    • ceylon.ast( ceylon.ast.redhat::compileAnyCompilationUnit) で解析し、型チェックなしで解析するか、
    • ceylon.astまたは、コンパイラを使用して解析し、タイプチェッカーを実行してから( )に変換し、まもなくリリースされる 1.2.0ceylon.ast.redhat::anyCompilationUnitToCeylonの新しい更新フックを使用してタイプチェッカー情報を保持します。
  2. ソース コード AST を編集して新しいコードを追加するか (ceylon.ast.core::Editor新しいクラス定義を s に挿入するカスタムを使用)、または別のモジュールにあるCompilationUnit場合はまったく新しいコンパイル ユニットを作成します。RemoteController
  3. ceylon.astAST をコンパイラ AST に変換し、それをフィードしceylon.formatterて AST を再びコードに変換します (その例については、こちらを参照してください)。

または、これをビルド ステップに統合する場合はceylon.formatter、ステップ 3 の部分をスキップして、代わりに変換されたコンパイラ AST をタイプチェッカーと残りのコンパイラに直接フィードできます。

于 2015-11-07T23:44:08.600 に答える