All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.dailystudio.devbricksx.ksp.helper.DaoExtensionMethodWrapperUtils.kt Maven / Gradle / Ivy

package com.dailystudio.devbricksx.ksp.helper

import com.google.devtools.ksp.isConstructor
import com.google.devtools.ksp.symbol.KSClassDeclaration
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
import com.squareup.kotlinpoet.*
import com.squareup.kotlinpoet.ksp.toTypeName

object DaoExtensionMethodWrapperUtils {

    fun handleMethodsInDaoExtension(typeOfFuncCaller: ClassName,
                                    symbolOfDaoExtension: KSClassDeclaration,
                                    classBuilder: TypeSpec.Builder) {
        symbolOfDaoExtension.getAllFunctions().forEach {
            if (!validForWrap(it)) {
                return@forEach
            }

            wrapMethod(it, typeOfFuncCaller, classBuilder)
        }
    }

    private fun wrapMethod(func: KSFunctionDeclaration,
                           typeOfFuncCaller: ClassName,
                           classBuilder: TypeSpec.Builder) {
        val nameOfFunc = func.simpleName.getShortName()
        val nameOfPropOfFuncCaller: String =
            typeOfFuncCaller.simpleName.lowerCamelCaseName()
        val returnType = func.returnType?.toTypeName() ?: UNIT
        val hasReturn = (returnType != UNIT)

        val methodBuilder = FunSpec.builder(nameOfFunc)
            .addModifiers(KModifier.PUBLIC, KModifier.OPEN)
            .returns(returnType)

        val strOfFunCallBuilder = StringBuilder()

        for ((i, param) in func.parameters.withIndex()) {
            val nameOfParam = param.name?.getShortName()?: continue
            val typeOfParam = param.type.toTypeName()
            val isVararg = param.isVararg

            val paramBuilder = ParameterSpec.builder(nameOfParam, typeOfParam)
            if (isVararg) {
                paramBuilder.addModifiers(KModifier.VARARG)
            }

            if (param.isVararg) {
                strOfFunCallBuilder.append('*')
            }
            methodBuilder.addParameter(paramBuilder.build())

            strOfFunCallBuilder.append(nameOfParam)
            if (i < func.parameters.size - 1) {
                strOfFunCallBuilder.append(", ")
            }
        }

        if (hasReturn) {
            methodBuilder.addStatement(
                """
                    return %N.%N(%L)
                """.trimIndent(),
                nameOfPropOfFuncCaller,
                nameOfFunc,
                strOfFunCallBuilder.toString()
            )
        } else {
            methodBuilder.addStatement(
                """
                    %N.%N(%L)
                """.trimIndent(),
                nameOfPropOfFuncCaller,
                nameOfFunc,
                strOfFunCallBuilder.toString()
            )
        }

        classBuilder.addFunction(methodBuilder.build())
    }

    fun validForWrap(func: KSFunctionDeclaration): Boolean {
        return if (func.isConstructor()) {
            false
        } else {
            val nameOfFunc = func.simpleName.getShortName()
            val nameOfFuncToSkip = arrayOf(
                "equals",
                "hashCode",
                "toString",
            )

            !(nameOfFuncToSkip.contains(nameOfFunc))
        }
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy