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

org.toilelibre.libe.domaindrivendesignktrules.ActionOnlyHasOnePublicMethod.kt Maven / Gradle / Ivy

package org.toilelibre.libe.domaindrivendesignktrules

import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.psiUtil.isPublic
import org.toilelibre.libe.domaindrivendesignktrules.SomeHelpers.annotationNames
import org.toilelibre.libe.domaindrivendesignktrules.SomeHelpers.isNotAClass
import org.toilelibre.libe.domaindrivendesignktrules.SomeHelpers.methods

class ActionOnlyHasOnePublicMethod : Rule("only-one-public-method-in-action") {

    override fun beforeVisitChildNodes(
        node: ASTNode,
        autoCorrect: Boolean,
        emit: EmitFunction
    ) {
        if (node.isNotAClass()) return

        val classInformation = node.psi as KtClass

        val methods = classInformation.methods +
            classInformation.companionObjects.flatMap { it.methods }

        if (!classInformation.annotationNames.contains("Action")) return

        val publicMethods = methods.filter { it.isPublic }
        val publicMethodsCount = publicMethods.size
        val nonPublicMethodsCount = (methods - publicMethods).size

        if (publicMethodsCount > 1 || nonPublicMethodsCount > 0) {
            emit.problemWith(
                node.startOffset,
                classInformation.fqName.toString(),
                publicMethodsCount,
                nonPublicMethodsCount
            )
        }
    }

    private fun EmitFunction.problemWith(
        startOffset: Int,
        className: String,
        publicMethodsCount: Int,
        nonPublicMethodsCount: Int
    ) =
        this(
            startOffset,
            "Action $className should have one public method (found $publicMethodsCount), " +
                "and no private method (found $nonPublicMethodsCount)",
            false
        )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy