inspections/MissingKDocForPublicAPI.inspection.kts (57 lines of code) (raw):
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 = """
<html>
<body>
Checks if public API declaration has a missing KDoc
</body>
</html>
""".trimIndent()
val anyLanguageInspectionTemplate = localInspection { psiFile, inspection ->
fun PsiElement.isPublic() = this.children
.filterIsInstance<KtModifierList>()
.firstOrNull()
?.text
?.contains("public")
?: false
fun PsiElement.isOverride() = this.children
.filterIsInstance<KtModifierList>()
.firstOrNull()
?.text
?.contains("override")
?: false
fun PsiElement.hasKdoc() = this.children
.filterIsInstance<KDoc>()
.isNotEmpty()
val declarations =
psiFile.descendantsOfType<KtClass>() + psiFile.descendantsOfType<KtFunction>() + psiFile.descendantsOfType<KtProperty>() + psiFile.descendantsOfType<KtObjectDeclaration>()
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,
)
)