Генерация исходных файлов Kotlin с KotlinPoet
Используйте KotlinPoet внутри процессора KSP для генерации типобезопасного кода Kotlin.
«Генерация исходных файлов Kotlin с KotlinPoet» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое KotlinPoet
KotlinPoet — это API Kotlin от Square для программного создания исходных файлов .kt. Он создает хорошо отформатированный идиоматичный код Kotlin и естественным образом интегрируется с CodeGenerator KSP.
Добавление зависимости
Добавьте KotlinPoet в модуль процессора:
dependencies {
implementation("com.squareup:kotlinpoet:1.17.0")
implementation("com.squareup:kotlinpoet-ksp:1.17.0") // KSP extensions
}FileSpec: корень сгенерированного файла
FileSpec.builder(packageName, fileName) — это точка входа. Добавьте в него типы, функции и свойства, а затем запишите результат через CodeGenerator KSP:
val file = FileSpec.builder("com.example.generated", "MyFactory")
.addType( /* TypeSpec here */ )
.build()TypeSpec: определение класса
Используйте TypeSpec.classBuilder() для классов, objectBuilder() для объектов и interfaceBuilder() для интерфейсов. Объединяйте вызовы построителя в цепочку, чтобы добавлять функции, свойства и суперинтерфейсы:
val classSpec = TypeSpec.classBuilder("MyFactory")
.addModifiers(KModifier.PUBLIC)
.addFunction( /* FunSpec */ )
.build()FunSpec: генерация функции
FunSpec.builder(name) создает функцию. Используйте addParameter(), returns() и addStatement(), чтобы сформировать ее сигнатуру и тело:
val funSpec = FunSpec.builder("create")
.addParameter("name", String::class)
.returns(String::class)
.addStatement("return "Hello, %L!", name")
.build()PropertySpec: генерация свойства
Используйте PropertySpec.builder(name, type) для генерации свойств. Укажите KModifier.PRIVATE, KModifier.OVERRIDE или используйте mutable() для var:
val propSpec = PropertySpec.builder("tag", String::class)
.initializer("%S", "MyClass")
.addModifiers(KModifier.PRIVATE)
.build()Спецификаторы формата кода
KotlinPoet использует спецификаторы формата в addStatement() и initializer():
%L— литерал (без кавычек)%S— строковый литерал (в кавычках)%T— имя типа (импорты обрабатываются автоматически)%N— имя (спецификации или строки)
Автоматические импорты с помощью %T
Если вы используете %T с ClassName, KotlinPoet автоматически добавляет необходимый импорт. Вам никогда не придется записывать операторы импорта вручную:
val listType = ClassName("kotlin.collections", "List")
val funSpec = FunSpec.builder("items")
.returns(listType.parameterizedBy(String::class.asTypeName()))
.addStatement("return emptyList()")
.build()Запись в CodeGenerator KSP
Используйте связующий компонент kotlinpoet-ksp, чтобы записать сгенерированный FileSpec через CodeGenerator KSP и сохранить метаданные инкрементальной сборки:
file.writeTo(
codeGenerator = codeGenerator,
aggregating = false
)Генерация функций-расширений
Используйте FunSpec.builder(name).receiver(type), чтобы генерировать функции-расширения:
val extFun = FunSpec.builder("toJson")
.receiver(ClassName("com.example", "User"))
.returns(String::class)
.addStatement("return Gson().toJson(this)")
.build()Практический пример: генератор фабрик
Процессор KSP аннотирует классы данных с помощью @AutoFactory и использует KotlinPoet для генерации объекта-компаньона фабрики для каждого из них. Сгенерированный файл помещается в тот же пакет, что и исходный класс.
Тестирование сгенерированного кода
Используйте FileSpec.toString() KotlinPoet в модульных тестах, чтобы проверять текст сгенерированного исходного кода без записи на диск. Библиотека kotlin-compile-testing-ksp может компилировать и выполнять сгенерированный код в тестах.
Быстрая проверка
Какой спецификатор формата в KotlinPoet автоматически добавляет необходимый импорт для используемого класса?
Повторение: генерация исходных файлов Kotlin с помощью KotlinPoet
Ключевые выводы:
FileSpec→ файл верхнего уровня;TypeSpec→ class/object/interface;FunSpec→ функция;PropertySpec→ свойство- Используйте
%Tдля ссылок на типы — импорты добавляются автоматически - Записывайте результат с помощью
file.writeTo(codeGenerator)в процессорах KSP - Используйте
FileSpec.toString()для модульного тестирования сгенерированного вывода
Часто задаваемые вопросы
Урок «Генерация исходных файлов Kotlin с KotlinPoet» бесплатный?
Да — полный текст урока «Генерация исходных файлов Kotlin с KotlinPoet» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Генерация исходных файлов Kotlin с KotlinPoet»?
Используйте KotlinPoet внутри процессора KSP для генерации типобезопасного кода Kotlin. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Генерация исходных файлов Kotlin с KotlinPoet»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- KSP и KAPT: почему KSP быстрее
- Написание первого SymbolProcessor
- Генерация исходных файлов Kotlin с KotlinPoet
- Интеграция процессоров KSP в сборку Gradle