0Pricing
Kotlin Academy · Урок

Генерация исходных файлов 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 — локальная установка не требуется.

Все уроки этого курса

  1. KSP и KAPT: почему KSP быстрее
  2. Написание первого SymbolProcessor
  3. Генерация исходных файлов Kotlin с KotlinPoet
  4. Интеграция процессоров KSP в сборку Gradle
← Назад к Kotlin Academy