Skip to content

Commit

Permalink
[K2] Update Analysis API to 2.0.20-dev-4579 and replace the Kt pref…
Browse files Browse the repository at this point in the history
  • Loading branch information
vmishenev committed May 30, 2024
1 parent 1f213f6 commit 5ee7a67
Show file tree
Hide file tree
Showing 12 changed files with 309 additions and 307 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 9,9 @@ import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.dokka.analysis.java.parsers.JavadocParser
import org.jetbrains.dokka.model.doc.DocumentationNode
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaNamedSymbol
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection
Expand All @@ -23,18 23,18 @@ import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType
import org.jetbrains.kotlin.psi.psiUtil.isPropertyParameter
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly

internal fun KtAnalysisSession.getJavaDocDocumentationFrom(
symbol: KtSymbol,
internal fun KaSession.getJavaDocDocumentationFrom(
symbol: KaSymbol,
javadocParser: JavadocParser
): DocumentationNode? {
if (symbol.origin == KtSymbolOrigin.JAVA) {
if (symbol.origin == KaSymbolOrigin.JAVA) {
return (symbol.psi as? PsiNamedElement)?.let {
javadocParser.parseDocumentation(it)
}
} else if (symbol.origin == KtSymbolOrigin.SOURCE && symbol is KtCallableSymbol) {
} else if (symbol.origin == KaSymbolOrigin.SOURCE && symbol is KaCallableSymbol) {
// Note: javadocParser searches in overridden JAVA declarations for JAVA method, not Kotlin
symbol.getAllOverriddenSymbols().forEach { overrider ->
if (overrider.origin == KtSymbolOrigin.JAVA)
if (overrider.origin == KaSymbolOrigin.JAVA)
return@getJavaDocDocumentationFrom (overrider.psi as? PsiNamedElement)?.let {
javadocParser.parseDocumentation(it)
}
Expand All @@ -43,14 43,14 @@ internal fun KtAnalysisSession.getJavaDocDocumentationFrom(
return null
}

internal fun KtAnalysisSession.getKDocDocumentationFrom(symbol: KtSymbol, logger: DokkaLogger) = findKDoc(symbol)?.let { kDocContent ->
internal fun KaSession.getKDocDocumentationFrom(symbol: KaSymbol, logger: DokkaLogger) = findKDoc(symbol)?.let { kDocContent ->

val ktElement = symbol.psi
val kdocLocation = ktElement?.containingFile?.name?.let {
val name = when(symbol) {
is KtCallableSymbol -> symbol.callableIdIfNonLocal?.toString()
is KtClassOrObjectSymbol -> symbol.classIdIfNonLocal?.toString()
is KtNamedSymbol -> symbol.name.asString()
is KaCallableSymbol -> symbol.callableIdIfNonLocal?.toString()
is KaClassOrObjectSymbol -> symbol.classIdIfNonLocal?.toString()
is KaNamedSymbol -> symbol.name.asString()
else -> null
}?.replace('/', '.') // replace to be compatible with K1

Expand All @@ -76,7 76,7 @@ internal data class KDocContent(
val sections: List<KDocSection>
)

internal fun KtAnalysisSession.findKDoc(symbol: KtSymbol): KDocContent? {
internal fun KaSession.findKDoc(symbol: KtSymbol): KDocContent? {
// Dokka's HACK: primary constructors can be generated
// so [KtSymbol.psi] is undefined for [KtSymbolOrigin.SOURCE_MEMBER_GENERATED] origin
// we need to get psi of a containing class
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 8,7 @@ import com.intellij.psi.PsiElement
import org.jetbrains.dokka.analysis.kotlin.symbols.translators.getDRIFromSymbol
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
Expand All @@ -35,7 35,7 @@ internal inline fun DRI?.ifUnresolved(action: () -> Unit): DRI? = this ?: run {
*
* @return [DRI] or null if the [link] is unresolved
*/
internal fun KtAnalysisSession.resolveKDocTextLinkToDRI(link: String, context: PsiElement? = null): DRI? {
internal fun KaSession.resolveKDocTextLinkToDRI(link: String, context: PsiElement? = null): DRI? {
val kDocLink = createKDocLink(link, context)
return kDocLink?.let { resolveKDocLinkToDRI(it) }
}
Expand All @@ -44,14 44,14 @@ internal fun KtAnalysisSession.resolveKDocTextLinkToDRI(link: String, context: P
* If the [link] is ambiguous, i.e. leads to more than one declaration,
* it returns deterministically any declaration.
*
* @return [KtSymbol] or null if the [link] is unresolved
* @return [KaSymbol] or null if the [link] is unresolved
*/
internal fun KtAnalysisSession.resolveKDocTextLinkToSymbol(link: String, context: PsiElement? = null): KtSymbol? {
internal fun KaSession.resolveKDocTextLinkToSymbol(link: String, context: PsiElement? = null): KaSymbol? {
val kDocLink = createKDocLink(link, context)
return kDocLink?.let { resolveToSymbol(it) }
}

private fun KtAnalysisSession.createKDocLink(link: String, context: PsiElement? = null): KDocLink? {
private fun KaSession.createKDocLink(link: String, context: PsiElement? = null): KDocLink? {
val psiFactory = context?.let { KtPsiFactory.contextual(it) } ?: KtPsiFactory(this.useSiteModule.project)
val kDoc = psiFactory.createComment(
"""
Expand All @@ -70,13 70,13 @@ private fun KtAnalysisSession.createKDocLink(link: String, context: PsiElement?
*
* @return [DRI] or null if the [link] is unresolved
*/
internal fun KtAnalysisSession.resolveKDocLinkToDRI(link: KDocLink): DRI? {
internal fun KaSession.resolveKDocLinkToDRI(link: KDocLink): DRI? {
val linkedSymbol = resolveToSymbol(link)
return if (linkedSymbol == null) null
else getDRIFromSymbol(linkedSymbol)
}

private fun KtAnalysisSession.resolveToSymbol(kDocLink: KDocLink): KtSymbol? {
private fun KaSession.resolveToSymbol(kDocLink: KDocLink): KaSymbol? {
val lastNameSegment = kDocLink.children.filterIsInstance<KDocName>().lastOrNull()
return lastNameSegment?.mainReference?.resolveToSymbols()?.sortedWith(linkCandidatesComparator)?.firstOrNull()
}
Expand All @@ -86,12 86,12 @@ private fun KtAnalysisSession.resolveToSymbol(kDocLink: KDocLink): KtSymbol? {
*
* TODO KT-64190
*/
private var linkCandidatesComparator: Comparator<KtSymbol> = compareBy{
private var linkCandidatesComparator: Comparator<KaSymbol> = compareBy{
when(it) {
is KtClassifierSymbol -> 1
is KtPackageSymbol -> 2
is KtFunctionSymbol -> 3
is KtVariableSymbol-> 4
is KaClassifierSymbol -> 1
is KaPackageSymbol -> 2
is KaFunctionSymbol -> 3
is KaVariableSymbol-> 4
else -> 5
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 7,22 @@ package org.jetbrains.dokka.analysis.kotlin.symbols.kdoc
import org.jetbrains.dokka.analysis.kotlin.symbols.plugin.SymbolsAnalysisPlugin
import org.jetbrains.dokka.analysis.markdown.jb.MarkdownParser
import org.jetbrains.dokka.model.doc.DocumentationNode
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KaPossibleMemberSymbol
import org.jetbrains.kotlin.builtins.StandardNames

private const val ENUM_ENTRIES_TEMPLATE_PATH = "/dokka/docs/kdoc/EnumEntries.kt.template"
private const val ENUM_VALUEOF_TEMPLATE_PATH = "/dokka/docs/kdoc/EnumValueOf.kt.template"
private const val ENUM_VALUES_TEMPLATE_PATH = "/dokka/docs/kdoc/EnumValues.kt.template"

internal fun KtAnalysisSession.hasGeneratedKDocDocumentation(symbol: KtSymbol): Boolean =
internal fun KaSession.hasGeneratedKDocDocumentation(symbol: KaSymbol): Boolean =
getDocumentationTemplatePath(symbol) != null

private fun KtAnalysisSession.getDocumentationTemplatePath(symbol: KtSymbol): String? =
private fun KaSession.getDocumentationTemplatePath(symbol: KaSymbol): String? =
when (symbol) {
is KtPropertySymbol -> if (isEnumEntriesProperty(symbol)) ENUM_ENTRIES_TEMPLATE_PATH else null
is KtFunctionSymbol -> {
is KaPropertySymbol -> if (isEnumEntriesProperty(symbol)) ENUM_ENTRIES_TEMPLATE_PATH else null
is KaFunctionSymbol -> {
when {
isEnumValuesMethod(symbol) -> ENUM_VALUES_TEMPLATE_PATH
isEnumValueOfMethod(symbol) -> ENUM_VALUEOF_TEMPLATE_PATH
Expand All @@ -33,25 33,25 @@ private fun KtAnalysisSession.getDocumentationTemplatePath(symbol: KtSymbol): St
else -> null
}

private fun KtAnalysisSession.isEnumSpecialMember(symbol: KtPossibleMemberSymbol): Boolean =
symbol.origin == KtSymbolOrigin.SOURCE_MEMBER_GENERATED
&& (symbol.getContainingSymbol() as? KtClassOrObjectSymbol)?.classKind == KtClassKind.ENUM_CLASS
private fun KaSession.isEnumSpecialMember(symbol: KaPossibleMemberSymbol): Boolean =
symbol.origin == KaSymbolOrigin.SOURCE_MEMBER_GENERATED
&& (symbol.getContainingSymbol() as? KaClassOrObjectSymbol)?.classKind == KaClassKind.ENUM_CLASS

private fun KtAnalysisSession.isEnumEntriesProperty(symbol: KtPropertySymbol): Boolean =
private fun KaSession.isEnumEntriesProperty(symbol: KaPropertySymbol): Boolean =
symbol.name == StandardNames.ENUM_ENTRIES && isEnumSpecialMember(symbol)

private fun KtAnalysisSession.isEnumValuesMethod(symbol: KtFunctionSymbol): Boolean =
private fun KaSession.isEnumValuesMethod(symbol: KaFunctionSymbol): Boolean =
symbol.name == StandardNames.ENUM_VALUES && isEnumSpecialMember(symbol)

private fun KtAnalysisSession.isEnumValueOfMethod(symbol: KtFunctionSymbol): Boolean =
private fun KaSession.isEnumValueOfMethod(symbol: KaFunctionSymbol): Boolean =
symbol.name == StandardNames.ENUM_VALUE_OF && isEnumSpecialMember(symbol)

internal fun KtAnalysisSession.getGeneratedKDocDocumentationFrom(symbol: KtSymbol): DocumentationNode? {
internal fun KaSession.getGeneratedKDocDocumentationFrom(symbol: KaSymbol): DocumentationNode? {
val templatePath = getDocumentationTemplatePath(symbol) ?: return null
return loadTemplate(templatePath)
}

private fun KtAnalysisSession.loadTemplate(filePath: String): DocumentationNode? {
private fun KaSession.loadTemplate(filePath: String): DocumentationNode? {
val kdoc = loadContent(filePath) ?: return null
val externalDriProvider = { link: String ->
resolveKDocTextLinkToDRI(link)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 11,7 @@ import org.jetbrains.dokka.analysis.java.util.from
import org.jetbrains.dokka.analysis.kotlin.symbols.translators.getDRIFromClassLike
import org.jetbrains.dokka.links.DRI
import org.jetbrains.dokka.model.*
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.KaSession
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.dokka.analysis.kotlin.internal.ClassHierarchy
Expand All @@ -36,7 36,7 @@ internal class SymbolFullClassHierarchyBuilder(context: DokkaContext) : FullClas
return map
}

private fun KtAnalysisSession.collectSupertypesFromKtType(
private fun KaSession.collectSupertypesFromKtType(
driWithKType: Pair<DRI, KtType>,
supersMap: MutableMap<DRI, Supertypes>
) {
Expand Down Expand Up @@ -125,7 125,7 @@ internal class SymbolFullClassHierarchyBuilder(context: DokkaContext) : FullClas
return hierarchy
}

private fun KtAnalysisSession.collectSupertypesWithKindFromKtType(
private fun KaSession.collectSupertypesWithKindFromKtType(
typeTranslator: TypeTranslator,
typeConstructorWithKindWithKType: Pair<TypeConstructorWithKind, KtType>,
supersMap: MutableMap<DRI, SuperclassesWithKind>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 27,7 @@ import org.jetbrains.dokka.plugability.query
import org.jetbrains.dokka.plugability.querySingle
import org.jetbrains.dokka.utilities.DokkaLogger
import org.jetbrains.kotlin.analysis.api.analyze
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolOrigin
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.idea.KotlinLanguage
Expand Down Expand Up @@ -101,19 102,20 @@ private class SymbolSampleAnalysisEnvironment(
private inline fun <reified PSI : PsiElement> KtSymbol.kotlinAndJavaSourcePsiSafe(): PSI? {
// TODO: support Java sources after KT-53669
val sourcePsi = when (origin) {
KtSymbolOrigin.SOURCE -> this.psi
KtSymbolOrigin.JAVA -> this.psi

KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> null
KtSymbolOrigin.LIBRARY -> null
KtSymbolOrigin.SAM_CONSTRUCTOR -> null
KtSymbolOrigin.INTERSECTION_OVERRIDE -> null
KtSymbolOrigin.SUBSTITUTION_OVERRIDE -> null
KtSymbolOrigin.DELEGATED -> null
KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY -> null
KtSymbolOrigin.PROPERTY_BACKING_FIELD -> null
KtSymbolOrigin.PLUGIN -> null
KtSymbolOrigin.JS_DYNAMIC -> null
KaSymbolOrigin.SOURCE -> this.psi
KaSymbolOrigin.JAVA -> this.psi

KaSymbolOrigin.SOURCE_MEMBER_GENERATED -> null
KaSymbolOrigin.LIBRARY -> null
KaSymbolOrigin.SAM_CONSTRUCTOR -> null
KaSymbolOrigin.INTERSECTION_OVERRIDE -> null
KaSymbolOrigin.SUBSTITUTION_OVERRIDE -> null
KaSymbolOrigin.DELEGATED -> null
KaSymbolOrigin.JAVA_SYNTHETIC_PROPERTY -> null
KaSymbolOrigin.PROPERTY_BACKING_FIELD -> null
KaSymbolOrigin.PLUGIN -> null
KaSymbolOrigin.JS_DYNAMIC -> null
KaSymbolOrigin.NATIVE_FORWARD_DECLARATION -> null
}

return sourcePsi as? PSI
Expand Down
Loading

0 comments on commit 5ee7a67

Please sign in to comment.