[FIR] Fix resolve for java synthetic properties in KDoc
^KT-62880 fixed
This commit is contained in:
+14
-1
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
|
||||
import kotlin.reflect.KClass
|
||||
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
|
||||
import org.jetbrains.kotlin.load.java.possibleGetMethodNames
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
|
||||
internal object KDocReferenceResolver {
|
||||
@@ -122,7 +123,7 @@ internal object KDocReferenceResolver {
|
||||
}
|
||||
|
||||
context(KtAnalysisSession)
|
||||
private fun resolveKdocFqName(fqName: FqName, contextElement: KtElement): Collection<ResolveResult> {
|
||||
private fun resolveKdocFqName(fqName: FqName, contextElement: KtElement, trySyntheticGetters: Boolean = true): Collection<ResolveResult> {
|
||||
getExtensionReceiverSymbolByThisQualifier(fqName, contextElement).ifNotEmpty { return this }
|
||||
|
||||
buildList {
|
||||
@@ -135,9 +136,21 @@ internal object KDocReferenceResolver {
|
||||
|
||||
AdditionalKDocResolutionProvider.resolveKdocFqName(fqName, contextElement).map { it.toResolveResult() }.ifNotEmpty { return this }
|
||||
|
||||
if (trySyntheticGetters) {
|
||||
getSymbolsFromSyntheticProperty(fqName, contextElement).ifNotEmpty { return this }
|
||||
}
|
||||
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
context(KtAnalysisSession)
|
||||
private fun getSymbolsFromSyntheticProperty(fqName: FqName, contextElement: KtElement): Collection<ResolveResult> {
|
||||
val getterNames = possibleGetMethodNames(fqName.shortNameOrSpecial())
|
||||
return getterNames.flatMap { getterName ->
|
||||
resolveKdocFqName(fqName.parent().child(getterName), contextElement, trySyntheticGetters = false)
|
||||
}
|
||||
}
|
||||
|
||||
context(KtAnalysisSession)
|
||||
private fun getExtensionReceiverSymbolByThisQualifier(fqName: FqName, contextElement: KtElement): Collection<ResolveResult> {
|
||||
val owner = contextElement.parentOfType<KtDeclaration>() ?: return emptyList()
|
||||
|
||||
+17
@@ -5,10 +5,14 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.references
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSyntheticJavaPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.idea.references.KDocReference
|
||||
import org.jetbrains.kotlin.idea.references.KtFirReference
|
||||
import org.jetbrains.kotlin.idea.references.getPsiDeclarations
|
||||
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
|
||||
|
||||
|
||||
@@ -18,4 +22,17 @@ internal class KtFirKDocReference(element: KDocName) : KDocReference(element), K
|
||||
val selectedFqName = element.getQualifiedNameAsFqName()
|
||||
return KDocReferenceResolver.resolveKdocFqName(selectedFqName, fullFqName, element)
|
||||
}
|
||||
|
||||
override fun getResolvedToPsi(
|
||||
analysisSession: KtAnalysisSession,
|
||||
referenceTargetSymbols: Collection<KtSymbol>,
|
||||
): Collection<PsiElement> = with(analysisSession) {
|
||||
referenceTargetSymbols.flatMap { symbol ->
|
||||
when (symbol) {
|
||||
is KtFirSyntheticJavaPropertySymbol -> listOfNotNull(symbol.javaGetterSymbol.psi, symbol.javaSetterSymbol?.psi)
|
||||
is KtFirSymbol<*> -> getPsiDeclarations(symbol)
|
||||
else -> listOfNotNull(symbol.psi)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+14
-17
@@ -13,9 +13,6 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.navigationTargetsProvider
|
||||
import org.jetbrains.kotlin.analysis.project.structure.KtModuleStructureInternals
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
|
||||
interface KtFirReference : KtReference, KtSymbolBasedReference {
|
||||
fun getResolvedToPsi(analysisSession: KtAnalysisSession, referenceTargetSymbols: Collection<KtSymbol>): Collection<PsiElement> =
|
||||
@@ -33,18 +30,18 @@ interface KtFirReference : KtReference, KtSymbolBasedReference {
|
||||
getResolvedToPsi(analysisSession, resolveToSymbols())
|
||||
}
|
||||
|
||||
private fun KtAnalysisSession.getPsiDeclarations(symbol: KtFirSymbol<*>): Collection<PsiElement> {
|
||||
val intersectionOverriddenSymbolsOrSingle = when {
|
||||
symbol.origin == KtSymbolOrigin.INTERSECTION_OVERRIDE && symbol is KtCallableSymbol -> symbol.getIntersectionOverriddenSymbols()
|
||||
else -> listOf(symbol)
|
||||
}
|
||||
return intersectionOverriddenSymbolsOrSingle.mapNotNull { it.findPsiForReferenceResolve() }
|
||||
}
|
||||
|
||||
private fun KtSymbol.findPsiForReferenceResolve(): PsiElement? {
|
||||
require(this is KtFirSymbol<*>)
|
||||
return firSymbol.fir.findReferencePsi()
|
||||
}
|
||||
|
||||
override val resolver get() = KtFirReferenceResolver
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtAnalysisSession.getPsiDeclarations(symbol: KtFirSymbol<*>): Collection<PsiElement> {
|
||||
val intersectionOverriddenSymbolsOrSingle = when {
|
||||
symbol.origin == KtSymbolOrigin.INTERSECTION_OVERRIDE && symbol is KtCallableSymbol -> symbol.getIntersectionOverriddenSymbols()
|
||||
else -> listOf(symbol)
|
||||
}
|
||||
return intersectionOverriddenSymbolsOrSingle.mapNotNull { it.findPsiForReferenceResolve() }
|
||||
}
|
||||
|
||||
private fun KtSymbol.findPsiForReferenceResolve(): PsiElement? {
|
||||
require(this is KtFirSymbol<*>)
|
||||
return firSymbol.fir.findReferencePsi()
|
||||
}
|
||||
|
||||
+24
@@ -1808,6 +1808,12 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/FunctionQualifiedWithKotlinSubclass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("NoSyntheticFieldInClass.kt")
|
||||
public void testNoSyntheticFieldInClass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/NoSyntheticFieldInClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("StaticFieldQualified.kt")
|
||||
public void testStaticFieldQualified() {
|
||||
@@ -1843,6 +1849,24 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex
|
||||
public void testStaticFunctionQualifiedWithKotlinSubclass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/StaticFunctionQualifiedWithKotlinSubclass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticFieldInAnnotationInterface.kt")
|
||||
public void testSyntheticFieldInAnnotationInterface() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticFieldInAnnotationInterface.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticFieldInClass.kt")
|
||||
public void testSyntheticFieldInClass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticFieldInClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticPropertyInKotlinSubclass.kt")
|
||||
public void testSyntheticPropertyInKotlinSubclass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticPropertyInKotlinSubclass.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+24
@@ -1692,6 +1692,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/FunctionQualifiedWithKotlinSubclass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("NoSyntheticFieldInClass.kt")
|
||||
public void testNoSyntheticFieldInClass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/NoSyntheticFieldInClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("StaticFieldQualified.kt")
|
||||
public void testStaticFieldQualified() {
|
||||
@@ -1727,6 +1733,24 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate
|
||||
public void testStaticFunctionQualifiedWithKotlinSubclass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/StaticFunctionQualifiedWithKotlinSubclass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticFieldInAnnotationInterface.kt")
|
||||
public void testSyntheticFieldInAnnotationInterface() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticFieldInAnnotationInterface.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticFieldInClass.kt")
|
||||
public void testSyntheticFieldInClass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticFieldInClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticPropertyInKotlinSubclass.kt")
|
||||
public void testSyntheticPropertyInKotlinSubclass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticPropertyInKotlinSubclass.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
+24
@@ -1808,6 +1808,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/FunctionQualifiedWithKotlinSubclass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("NoSyntheticFieldInClass.kt")
|
||||
public void testNoSyntheticFieldInClass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/NoSyntheticFieldInClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("StaticFieldQualified.kt")
|
||||
public void testStaticFieldQualified() {
|
||||
@@ -1843,6 +1849,24 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten
|
||||
public void testStaticFunctionQualifiedWithKotlinSubclass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/StaticFunctionQualifiedWithKotlinSubclass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticFieldInAnnotationInterface.kt")
|
||||
public void testSyntheticFieldInAnnotationInterface() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticFieldInAnnotationInterface.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticFieldInClass.kt")
|
||||
public void testSyntheticFieldInClass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticFieldInClass.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("SyntheticPropertyInKotlinSubclass.kt")
|
||||
public void testSyntheticPropertyInKotlinSubclass() {
|
||||
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/javaDeclarations/SyntheticPropertyInKotlinSubclass.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
|
||||
Reference in New Issue
Block a user