2015-11-07 2 views
1

Я хочу написать генератор кода, который генерирует класс на основе метамодели другого класса ceylon. Я хочу, чтобы генератор кода работал во время компиляции. Для меня это лучший способ. Возможно, я мог бы это сделать, написав плагин для системы градации или системы построения цейлона, но я надеюсь на более простое решение. К сожалению, я не вижу поддержки для генераторов кода в цейлоне. Кроме того, существуют ли какие-либо планы для генераторов кода в цейлоне?Как написать генератор кода в Ceylon

Я хочу, чтобы написать этот генератор кода, потому что я думал о написании простой веб-основы для Цейлона, что смотреть на класс, как следующий, используя мета-модель: контроллер

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

я планирую для это похоже на Spring MVC. Эта структура сделает успокоительной API из класса контроллера, который позволяет кому-то написать вызов AJAX, как это:

$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.ast и ceylon.formatter. Рабочий будет примерно составлять:

  1. анализировать исходный код -
    • либо разобрать его с ceylon.ast (ceylon.ast.redhat::compileAnyCompilationUnit) и анализировать его без проверки типов,
    • или разобрать его с помощью компилятора, запустите проверки типов, то преобразовать его в ceylon.ast (ceylon.ast.redhat::anyCompilationUnitToCeylon), сохраняя информацию проверки типов, используя новый update hooks в ближайшее время предстоящего 1.2.0 выпуска
  2. редактировать исходный код AST, чтобы добавить новый код (с помощью пользовательского ceylon.ast.core::Editor, который вводит новые определения классов в CompilationUnit с), или, возможно, создавать совершенно новые единицы компиляции, если RemoteController живет в другом модуле
  3. преобразовать ceylon.ast АСТ в компилятор AST и кормить его в ceylon.formatter превратить AST в код еще раз (см here для примера, что)

в качестве альтернативы, если интегрировать это в ваш шаг сборки, вы можете пропустить ceylon.formatter часть шага 3 и вместо этого подавать преобразованный компилятор AST в файл typechecker и остальную часть компилятора напрямую.

+0

ОК.Я сделаю так, как вы предлагаете, и я сделаю это частью моей сборки. Однажды, цейлон получает генераторы кода, я переключусь на это. благодаря – jgleoj23