Сперва в общих чертах опишу принцип работы генератора, а потом перейду непосредственно к ответам на вопросы.
Генератору на вход подаются корни генерации, а также информация об отношениях контейнер-объект. Генератор на основе этих данных выдает классы на Котлине, где исходные сеттеры и геттеры слиты в свойства, созданы билдеры на основе этих свойств, подставлены типы, а также сгенерированы функции, позволяющие описывать вложенность объектов.
Немного раскрою термины и укажу примеры.
Корень генерации — такой класс, для наследников которого, а также него самого должны быть созданы классы-аналоги (например, javafx.scene.Node).
Отношение контейнер-объект — такая пара классов, что экземпляр одного класса можно «положить» в экземпляр другого (например, Node -> Pane в javafx).
Билдер — функция, позволяющая за один вызов создать и настроить объект. Создается она с использованием таких фич языка, как именованные аргументы и параметры по умолчанию.
Функции, позволяющие описывать вложенность объектов — это те же билдеры, но они уже являются методами контейнеров. Отличия от обычных билдеров заключаются в расширенном наборе параметров и умении класть объекты в контейнер.
Это я описал для лучшего понимания того, что вообще генератор делает.
Теперь к вопросам. Пока эксперименты проводились только с классом View в качестве корня генерации, но другие классы тоже можно пробовать, метод такой:
1) в корни добавляете интересующие классы
2) запускаете генерацию
3) компилируете сгенерированные исходники
4) в коде получаете экземпляр класса Abc
5а) либо передаете его в конструктор классу kotlin.dsl.Abc и настраиваете через свойства или with
5б) либо с помощью функции ниже начинаете строить объект
public fun Abc.dsl(init: kotlin.dsl.Abc.() -> Unit) {
kotlin.dsl.Abc(this).init()
}
Генератору на вход подаются корни генерации, а также информация об отношениях контейнер-объект. Генератор на основе этих данных выдает классы на Котлине, где исходные сеттеры и геттеры слиты в свойства, созданы билдеры на основе этих свойств, подставлены типы, а также сгенерированы функции, позволяющие описывать вложенность объектов.
Немного раскрою термины и укажу примеры.
Корень генерации — такой класс, для наследников которого, а также него самого должны быть созданы классы-аналоги (например, javafx.scene.Node).
Отношение контейнер-объект — такая пара классов, что экземпляр одного класса можно «положить» в экземпляр другого (например, Node -> Pane в javafx).
Билдер — функция, позволяющая за один вызов создать и настроить объект. Создается она с использованием таких фич языка, как именованные аргументы и параметры по умолчанию.
Функции, позволяющие описывать вложенность объектов — это те же билдеры, но они уже являются методами контейнеров. Отличия от обычных билдеров заключаются в расширенном наборе параметров и умении класть объекты в контейнер.
Это я описал для лучшего понимания того, что вообще генератор делает.
Теперь к вопросам. Пока эксперименты проводились только с классом View в качестве корня генерации, но другие классы тоже можно пробовать, метод такой:
1) в корни добавляете интересующие классы
2) запускаете генерацию
3) компилируете сгенерированные исходники
4) в коде получаете экземпляр класса
Abc
5а) либо передаете его в конструктор классу
kotlin.dsl.Abc
и настраиваете через свойства илиwith
5б) либо с помощью функции ниже начинаете строить объект
Пример:
Вроде все должно получиться, и ActionBar, и support-классы, и фрагменты. Если что, пишите, будем разбираться :)
Например, с помощью такого DSL интерфейс можно описывать следующим образом:
Более крупные примеры можно посмотреть здесь.