[Analysis API] resolve [this] in KDoc to extension receiver

^KT-62407 fixed
This commit is contained in:
Ilya Kirillov
2023-10-06 23:03:30 +02:00
committed by Space Team
parent a5a8f6736b
commit c32e7c723d
13 changed files with 258 additions and 0 deletions
@@ -1593,6 +1593,46 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier")
@TestDataPath("$PROJECT_ROOT")
public class ThisQualifier {
@Test
public void testAllFilesPresentInThisQualifier() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
}
@Test
@TestMetadata("thisQualifierOnClass.kt")
public void testThisQualifierOnClass() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnClass.kt");
}
@Test
@TestMetadata("thisQualifierOnFunction.kt")
public void testThisQualifierOnFunction() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunction.kt");
}
@Test
@TestMetadata("thisQualifierOnFunctionNoExtensionReceiver.kt")
public void testThisQualifierOnFunctionNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunctionNoExtensionReceiver.kt");
}
@Test
@TestMetadata("thisQualifierOnProperty.kt")
public void testThisQualifierOnProperty() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnProperty.kt");
}
@Test
@TestMetadata("thisQualifierOnPropertyNoExtensionReceiver.kt")
public void testThisQualifierOnPropertyNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnPropertyNoExtensionReceiver.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/withErrors")
@TestDataPath("$PROJECT_ROOT")
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.components.KtScopeContext
import org.jetbrains.kotlin.analysis.api.components.KtScopeKind
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
@@ -19,6 +20,7 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
import kotlin.reflect.KClass
import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.analysis.utils.printer.parentOfType
internal object KDocReferenceResolver {
@@ -77,11 +79,24 @@ internal object KDocReferenceResolver {
context(KtAnalysisSession)
private fun resolveKdocFqName(fqName: FqName, contextElement: KtElement): Collection<KtSymbol> {
getExtensionReceiverSymbolByThisQualifier(fqName, contextElement).ifNotEmpty { return this }
(getSymbolsFromScopes(fqName, contextElement) + listOfNotNull(getPackageSymbolIfPackageExists(fqName))).ifNotEmpty { return this }
getNonImportedSymbolsByFullyQualifiedName(fqName).ifNotEmpty { return this }
return emptyList()
}
context(KtAnalysisSession)
fun getExtensionReceiverSymbolByThisQualifier(fqName: FqName, contextElement: KtElement): Collection<KtSymbol> {
val owner = contextElement.parentOfType<KtDeclaration>() ?: return emptyList()
if (fqName.pathSegments().singleOrNull()?.asString() == "this") {
if (owner is KtCallableDeclaration && owner.receiverTypeReference != null) {
val symbol = owner.getSymbol() as? KtCallableSymbol ?: return emptyList()
return listOfNotNull(symbol.receiverParameter)
}
}
return emptyList()
}
context(KtAnalysisSession)
private fun getSymbolsFromScopes(fqName: FqName, contextElement: KtElement): Collection<KtSymbol> {
getSymbolsFromParentMemberScopes(fqName, contextElement).ifNotEmpty { return this }
@@ -1593,6 +1593,46 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier")
@TestDataPath("$PROJECT_ROOT")
public class ThisQualifier {
@Test
public void testAllFilesPresentInThisQualifier() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
}
@Test
@TestMetadata("thisQualifierOnClass.kt")
public void testThisQualifierOnClass() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnClass.kt");
}
@Test
@TestMetadata("thisQualifierOnFunction.kt")
public void testThisQualifierOnFunction() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunction.kt");
}
@Test
@TestMetadata("thisQualifierOnFunctionNoExtensionReceiver.kt")
public void testThisQualifierOnFunctionNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunctionNoExtensionReceiver.kt");
}
@Test
@TestMetadata("thisQualifierOnProperty.kt")
public void testThisQualifierOnProperty() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnProperty.kt");
}
@Test
@TestMetadata("thisQualifierOnPropertyNoExtensionReceiver.kt")
public void testThisQualifierOnPropertyNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnPropertyNoExtensionReceiver.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/withErrors")
@TestDataPath("$PROJECT_ROOT")
@@ -1476,6 +1476,46 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate
}
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier")
@TestDataPath("$PROJECT_ROOT")
public class ThisQualifier {
@Test
public void testAllFilesPresentInThisQualifier() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors");
}
@Test
@TestMetadata("thisQualifierOnClass.kt")
public void testThisQualifierOnClass() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnClass.kt");
}
@Test
@TestMetadata("thisQualifierOnFunction.kt")
public void testThisQualifierOnFunction() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunction.kt");
}
@Test
@TestMetadata("thisQualifierOnFunctionNoExtensionReceiver.kt")
public void testThisQualifierOnFunctionNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunctionNoExtensionReceiver.kt");
}
@Test
@TestMetadata("thisQualifierOnProperty.kt")
public void testThisQualifierOnProperty() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnProperty.kt");
}
@Test
@TestMetadata("thisQualifierOnPropertyNoExtensionReceiver.kt")
public void testThisQualifierOnPropertyNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnPropertyNoExtensionReceiver.kt");
}
}
}
@Nested
@@ -1593,6 +1593,46 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier")
@TestDataPath("$PROJECT_ROOT")
public class ThisQualifier {
@Test
public void testAllFilesPresentInThisQualifier() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
}
@Test
@TestMetadata("thisQualifierOnClass.kt")
public void testThisQualifierOnClass() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnClass.kt");
}
@Test
@TestMetadata("thisQualifierOnFunction.kt")
public void testThisQualifierOnFunction() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunction.kt");
}
@Test
@TestMetadata("thisQualifierOnFunctionNoExtensionReceiver.kt")
public void testThisQualifierOnFunctionNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunctionNoExtensionReceiver.kt");
}
@Test
@TestMetadata("thisQualifierOnProperty.kt")
public void testThisQualifierOnProperty() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnProperty.kt");
}
@Test
@TestMetadata("thisQualifierOnPropertyNoExtensionReceiver.kt")
public void testThisQualifierOnPropertyNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnPropertyNoExtensionReceiver.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/withErrors")
@TestDataPath("$PROJECT_ROOT")
@@ -1593,6 +1593,46 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier")
@TestDataPath("$PROJECT_ROOT")
public class ThisQualifier {
@Test
public void testAllFilesPresentInThisQualifier() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier"), Pattern.compile("^([^.]+)\\.kt$"), null, true);
}
@Test
@TestMetadata("thisQualifierOnClass.kt")
public void testThisQualifierOnClass() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnClass.kt");
}
@Test
@TestMetadata("thisQualifierOnFunction.kt")
public void testThisQualifierOnFunction() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunction.kt");
}
@Test
@TestMetadata("thisQualifierOnFunctionNoExtensionReceiver.kt")
public void testThisQualifierOnFunctionNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnFunctionNoExtensionReceiver.kt");
}
@Test
@TestMetadata("thisQualifierOnProperty.kt")
public void testThisQualifierOnProperty() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnProperty.kt");
}
@Test
@TestMetadata("thisQualifierOnPropertyNoExtensionReceiver.kt")
public void testThisQualifierOnPropertyNoExtensionReceiver() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/kDoc/thisQualifier/thisQualifierOnPropertyNoExtensionReceiver.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/withErrors")
@TestDataPath("$PROJECT_ROOT")
@@ -0,0 +1,9 @@
// UNRESOLVED_REFERENCE
/**
* [th<caret>is]
*/
class A {
}
@@ -0,0 +1,8 @@
/**
* [th<caret>is]
*/
fun AAA.foo() {
}
class AAA
@@ -0,0 +1,2 @@
Resolved to:
0: extension receiver with type AAA
@@ -0,0 +1,8 @@
// UNRESOLVED_REFERENCE
/**
* [th<caret>is]
*/
fun foo() {
}
@@ -0,0 +1,7 @@
/**
* [th<caret>is]
*/
val AAA.foo
get() = 1
class AAA
@@ -0,0 +1,2 @@
Resolved to:
0: extension receiver with type AAA
@@ -0,0 +1,7 @@
// UNRESOLVED_REFERENCE
/**
* [th<caret>is]
*/
val foo
get() = 1