import com.intellij.psi.PsiElement import org.intellij.lang.annotations.Language import org.jetbrains.kotlin.idea.base.psi.kotlinFqName import org.jetbrains.kotlin.kdoc.psi.api.KDoc import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtModifierList import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.psi.KtProperty import kotlin.text.contains @Language("HTML") val htmlDescription = """ Checks if public API declaration has a missing KDoc """.trimIndent() val anyLanguageInspectionTemplate = localInspection { psiFile, inspection -> fun PsiElement.isPublic() = this.children .filterIsInstance() .firstOrNull() ?.text ?.contains("public") ?: false fun PsiElement.isOverride() = this.children .filterIsInstance() .firstOrNull() ?.text ?.contains("override") ?: false fun PsiElement.hasKdoc() = this.children .filterIsInstance() .isNotEmpty() val declarations = psiFile.descendantsOfType() + psiFile.descendantsOfType() + psiFile.descendantsOfType() + psiFile.descendantsOfType() declarations .filter { it.isPublic() } .filter { !it.isOverride() } .forEach { declaration -> if (!declaration.hasKdoc()) { inspection.registerProblem( declaration, "Missing KDoc for the public API declaration ${declaration.kotlinFqName}" ) } } } listOf( InspectionKts( id = "MissingKDocForPublicAPI", localTool = anyLanguageInspectionTemplate, name = "Missing KDoc for public API declaration", htmlDescription = htmlDescription, level = HighlightDisplayLevel.WARNING, ) )