Avatar ·

Как использовать @link и @code в KDoc (Kotlin) для правильного документирования кода?

Всем привет! Я недавно начал изучать Kotlin и пытаюсь документировать свои функции с помощью KDoc. Прочитал, что можно использовать теги `@link` и `@code`, но у меня никак не получается заставить их работать корректно. Вот пример моей функции: ```kotlin /** * Вычисляет сумму двух чисел. * Использует @link Calculator для вычислений. * @param a первое число типа @code Int. * @param b второе число типа @code Int. * @return результат типа @code Int. */ fun add(a: Int, b: Int): Int { return a + b } ``` Проблема в том, что в сгенерированной документации (например, в Dokka) я вижу просто текст `@link Calculator` и `@code Int`, а не форматированные ссылки или моноширинный текст. Я ожидал, что `@link` создаст кликабельную ссылку на класс `Calculator`, а `@code` выделит `Int` как код. Я пробовал разные варианты: писал `{@link Calculator}`, `[Calculator]`, но ничего не работает. В официальной документации по KDoc написано, что поддерживаются теги `@link` и `@code`, но примеров их использования почти нет. Может быть, я неправильно синтаксис использую? Или для `@link` нужно указывать полный путь к классу? Подскажите, пожалуйста, как правильно оформлять ссылки на другие классы и выделять код в KDoc? Буду очень благодарен за примеры с пояснениями. <<>>

Правильное использование @link и @code в KDoc

Ваша проблема очень распространена среди новичков в Kotlin. Дело в том, что синтаксис KDoc отличается от JavaDoc, и теги @link и @code требуют специального форматирования с фигурными скобками. Давайте разберемся по порядку.

Как работает @code

Тег @code в KDoc работает только внутри фигурных скобок. Правильный синтаксис: {@code текст}. Без скобок он не будет обработан. Вот исправленный пример:

/**
 * Вычисляет сумму двух чисел.
 * @param a первое число типа {@code Int}.
 * @param b второе число типа {@code Int}.
 * @return результат типа {@code Int}.
 */
fun add(a: Int, b: Int): Int {
    return a + b
}

Теперь слово Int будет отображаться моноширинным шрифтом в документации.

Как работает @link

С @link ситуация аналогичная — нужны фигурные скобки. Но есть важные нюансы:

  • Ссылка на класс в том же пакете: {@link Calculator}
  • Ссылка на класс из другого пакета: {@link com.example.utils.Calculator}
  • Ссылка на метод или свойство: {@link Calculator#calculate} или {@link Calculator#calculate(int, int)}
  • Ссылка с кастомным текстом: {@link Calculator Калькулятор} — отобразится как "Калькулятор", но будет ссылкой на класс Calculator

Пример правильного использования:

/**
 * Вычисляет сумму двух чисел, используя {@link Calculator}.
 * Для получения результата вызовите {@link Calculator#compute(int, int)}.
 * 
 * @param a первое число типа {@code Int}
 * @param b второе число типа {@code Int}
 * @return результат типа {@code Int}
 */
fun add(a: Int, b: Int): Int {
    val calc = Calculator()
    return calc.compute(a, b)
}

Альтернативный синтаксис с квадратными скобками

В KDoc также поддерживается Markdown-подобный синтаксис для ссылок:

  • [Calculator] — автоматическая ссылка на класс Calculator (работает, если класс видим в контексте)
  • [Calculator][com.example.Calculator] — явное указание полного имени
  • [текст ссылки][Calculator] — кастомный текст

Этот синтаксис короче и часто удобнее. Пример:

/**
 * Использует [Calculator] для вычислений.
 * Смотрите также [Calculator.compute].
 */

Проверка через Dokka

Чтобы убедиться, что всё работает, сгенерируйте документацию с помощью Dokka. Добавьте в build.gradle.kts:

plugins {
    id("org.jetbrains.dokka") version "1.9.10"
}

tasks.dokkaHtml {
    outputDirectory.set(buildDir.resolve("dokka"))
}

Затем выполните ./gradlew dokkaHtml и откройте сгенерированные HTML-файлы. Вы увидите, что {@code Int} отображается моноширинным шрифтом, а {@link Calculator} — кликабельной ссылкой.

Полный исправленный пример

/**
 * Вычисляет сумму двух чисел, используя {@link Calculator}.
 * 
 * Пример использования:
 * {@code
 *   val result = add(5, 3)
 *   println(result) // 8
 * }
 * 
 * @param a первое слагаемое типа {@code Int}
 * @param b второе слагаемое типа {@code Int}
 * @return сумма {@code a + b} типа {@code Int}
 */
fun add(a: Int, b: Int): Int {
    return a + b
}

Теперь ваша документация будет выглядеть профессионально и информативно!

<<>>

Дополнительные советы по KDoc и форматированию

Хочу добавить несколько практических замечаний к первому ответу.

Используйте Markdown для простого форматирования

В KDoc поддерживается базовая разметка Markdown, которая часто удобнее тегов:

  • Жирный текст: **текст**
  • Курсив: *текст*
  • Код внутри строки: обратные кавычки `Int` — это аналог {@code Int}
  • Блок кода: тройные обратные кавычки ```kotlin ... ```

Пример:

/**
 * Вычисляет **сумму** двух чисел.
 * 
 * Пример:
 * ```kotlin
 * val result = add(5, 3)
 * ```
 * 
 * @param a первое число типа `Int`
 * @param b второе число типа `Int`
 */

Ссылки на внешние ресурсы

Если нужно сослаться на сайт, используйте стандартную Markdown-ссылку:

/**
 * Документация по Kotlin: [Kotlin Docs](https://kotlinlang.org/docs/home.html)
 */

Автоматическая генерация ссылок

В IntelliJ IDEA и Dokka ссылки на классы и функции внутри проекта часто подхватываются автоматически. Если написать [Calculator], IDE сама предложит создать ссылку. Но для гарантии лучше использовать полный синтаксис {@link} или явные квадратные скобки.

Проверка в IDE

В IntelliJ IDEA вы можете навести курсор на KDoc-комментарий и нажать Ctrl+Q (или Cmd+J на macOS), чтобы увидеть предварительный просмотр документации. Это поможет сразу заметить, правильно ли обработались теги.

Надеюсь, эти дополнения помогут вам создавать качественную документацию на Kotlin!