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

org.toilelibre.libe.domaindrivendesignktrules.NoForeignInfraUsageInInfra.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.toilelibre.libe.domaindrivendesignktrules.SomeHelpers.annotationNames
import org.toilelibre.libe.domaindrivendesignktrules.SomeHelpers.imports
import org.toilelibre.libe.domaindrivendesignktrules.SomeHelpers.isNotAClass

class NoForeignInfraUsageInInfra : Rule("no-foreign-infra-usage-in-infra") {

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

        val classInformation = node.psi as KtClass

        val className = classInformation.fqName.toString()
        val packageName = classInformation.fqName?.parent().toString()

        val imports = classInformation.imports.values

        if (classInformation.isData() || classInformation.isEnum()) return

        if (className.endsWith("ITConfiguration") || className.endsWith("IT") || className.endsWith("Test")) return

        if (!packageName.contains(".infra.")) return

        if (classInformation.annotationNames.contains("Configuration")) return

        val wrongImports = imports.filter { import ->
            import.contains(".infra.") &&
                !(import.contains(".infra.tools")) &&
                !import.startsWith(packageName)
        }

        if (wrongImports.isNotEmpty()) {
            emit.problemWith(node.startOffset, className, wrongImports)
        }
    }

    private fun EmitFunction.problemWith(startOffset: Int, className: String, wrongImports: List) =
        this(
            startOffset,
            "This class : $className is in infra package and uses at least one class from " +
                "another infra package : $wrongImports",
            false
        )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy