override fun add()

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)
        }
    }