dokka icon indicating copy to clipboard operation
dokka copied to clipboard

Support documenting context parameters

Open whyoleg opened this issue 9 months ago • 1 comments

Currently it's possible to document function parameters via @param and receiver of function/property via @receiver:

/**
 * @receiver documentation for receiver of type [String]
 * @param number documentation for parameter with name [number]
 */
fun String.test(number: Int)

The same should be possible for context parameters.

There are two options on how it could work:

  1. new tag @context - context parameters have a separate tag, similar to receiver. As context parameters have different meaning, and most likely should be represented in different section of documentation - separate from Parameters section, it might make sense to have separate tag. In this case receiver, function parameters and context parameters will have three different tags.
/**
 * @context scope documentation for context parameter
 * @receiver documentation for receiver of type [String]
 * @param number documentation for parameter with name [number]
 */
context(scope: Scope)
fun String.test(number: Int)
  1. reusing @param - context parameters are treated similar to ordinary parameters. But it's still make sense to show them separately in documentation.
/**
 * @param scope documentation for context parameter
 * @receiver documentation for receiver of type [String]
 * @param number documentation for parameter with name [number]
 */
context(scope: Scope)
fun String.test(number: Int)

Bonus (questionable) option: use @param for referencing both context parameters, function parameters and receiver. In KDoc it's possible to use [this] to reference receiver of function/property in the way it's possible to reference named parameters in documentation:

/**
 * when calling function, [this] should be longer than [number] symbols
 */
fun String.test(number: Int)

With this possibility in mind, it could be possible to replace @receiver tag with @param this:

/**
 * @param scope documentation for context parameter
 * @param this documentation for receiver of type [String]
 * @param number documentation for parameter with name [number]
 */
context(scope: Scope)
fun String.test(number: Int)

Or with brackets:

/**
 * @param[scope] documentation for context parameter
 * @param[this] documentation for receiver of type [String]
 * @param[number] documentation for parameter with name [number]
 */
context(scope: Scope)
fun String.test(number: Int)

In this case @receiver tag could be deprecated (or gradually phased out) and both referencing and documenting receiver will have same syntax

whyoleg avatar Mar 18 '25 14:03 whyoleg

After an internal discussion, it should be supported in the same way as ordinary parameters, so via @param xxx. The behavior inside AA will be aligned/implemented in https://youtrack.jetbrains.com/issue/KT-76607

whyoleg avatar Nov 04 '25 15:11 whyoleg