/
SynheticElementDocumentationProvider.kt
41 lines (34 loc) · 2.11 KB
/
SynheticElementDocumentationProvider.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package org.jetbrains.dokka.base.translators.psi
import com.intellij.psi.*
import com.intellij.psi.javadoc.PsiDocComment
import org.jetbrains.dokka.analysis.DokkaResolutionFacade
import org.jetbrains.dokka.base.translators.psi.parsers.JavadocParser
import org.jetbrains.dokka.model.doc.DocumentationNode
private const val ENUM_VALUEOF_TEMPLATE_PATH = "/dokka/docs/javadoc/EnumValueOf.java.template"
private const val ENUM_VALUES_TEMPLATE_PATH = "/dokka/docs/javadoc/EnumValues.java.template"
internal class SyntheticElementDocumentationProvider(
private val javadocParser: JavadocParser,
private val resolutionFacade: DokkaResolutionFacade
) {
fun isDocumented(psiElement: PsiElement): Boolean = psiElement is PsiMethod
&& (psiElement.isSyntheticEnumValuesMethod() || psiElement.isSyntheticEnumValueOfMethod())
fun getDocumentation(psiElement: PsiElement): DocumentationNode? {
val psiMethod = psiElement as? PsiMethod ?: return null
val templatePath = when {
psiMethod.isSyntheticEnumValuesMethod() -> ENUM_VALUES_TEMPLATE_PATH
psiMethod.isSyntheticEnumValueOfMethod() -> ENUM_VALUEOF_TEMPLATE_PATH
else -> return null
}
val docComment = loadSyntheticDoc(psiElement, templatePath) ?: return null
return javadocParser.parseDocComment(docComment, psiElement)
}
private fun loadSyntheticDoc(psiElement: PsiElement, path: String): PsiDocComment? {
val containingClassName = (psiElement as? PsiMember)?.containingClass?.name ?: return null
val template = javaClass.getResource(path)?.readText() ?: return null
val text = template.replace("<ClassName>", containingClassName)
return JavaPsiFacade.getElementFactory(resolutionFacade.project).createDocCommentFromText(text)
}
}
private fun PsiMethod.isSyntheticEnumValuesMethod() = this.isSyntheticEnumFunction() && this.name == "values"
private fun PsiMethod.isSyntheticEnumValueOfMethod() = this.isSyntheticEnumFunction() && this.name == "valueOf"
private fun PsiMethod.isSyntheticEnumFunction() = this is SyntheticElement && this.containingClass?.isEnum == true