in build-logic/generatorlegacybuild/src/main/kotlin/karakum/common/ExtensionsCollector.kt [151:200]
override fun add(
functionName: String,
functionSignature: String,
parameters: String,
returnType: String,
docs: String?,
) {
require(returnType.isEmpty() || returnType.startsWith(":")) {
"Return type should start with colon: $returnType in $fullParentName$functionName"
}
require("<" !in functionSignature || parentTypeParameters == null) {
"Can't generate extension with parent type parameters and own generics."
}
val lastParameterType = parseLastParameterType(parameters)
val isAbortable = lastParameterType?.let { it in ABORTABLE_TYPES } == true
val externallyDefinedParametersCount = parameters.count(DEFINED_EXTERNALLY)
val parameterNames = parseParameterNames(parameters)
val parametersList = splitParameters(parameters)
// Generate many extensions if there are externally defined parameters
for (parametersToSkip in externallyDefinedParametersCount downTo 0) {
val comment = docs?.let { "$it\n" }.orEmpty()
val funTypeParameters = parentTypeParameters?.let { "<$it>" }.orEmpty()
val parametersSlice = parametersList.subList(0, parametersList.size - parametersToSkip)
val body = generateSuspendBody(
functionName,
parameterNames,
parametersToSkip,
returnType,
isAbortable
)
val isInline = CONTROLLER_INIT !in body
var newParameters = "(${parametersSlice.joinToString(",")})"
if (isInline) {
newParameters = newParameters.withNoInline(parameterNames)
}
val modifiers = if (isInline) "inline" else ""
val extension = """
${comment}suspend $modifiers $functionSignature $funTypeParameters $fullParentName$functionName$newParameters$returnType {
$body
}
""".trimIndent()
extensions.add(extension)
}
}