diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt index 68000decfb4..232f16c02a8 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolProvider.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.* import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies +import org.jetbrains.kotlin.descriptors.isEmpty import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -127,6 +128,11 @@ internal class KtFe10SymbolProvider( .mapNotNull { it.toKtSymbol(analysisContext) as? KtCallableSymbol } } + override fun getPackageSymbolIfPackageExists(packageFqName: FqName): KtPackageSymbol? { + if (analysisContext.resolveSession.packageFragmentProvider.isEmpty(packageFqName)) return null + return KtFe10PackageSymbol(packageFqName, analysisContext) + } + override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtLocalVariableSymbol { return KtFe10PsiLocalVariableSymbol(psi, analysisContext) } diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index ec06f5cf0a9..b9d5dfc260c 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1040,6 +1040,252 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte } } + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc") + @TestDataPath("$PROJECT_ROOT") + public class KDoc { + @Test + public void testAllFilesPresentInKDoc() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/localContext") + @TestDataPath("$PROJECT_ROOT") + public class LocalContext { + @Test + public void testAllFilesPresentInLocalContext() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/localContext"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedCallableName.kt") + public void testLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedClassName.kt") + public void testLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedCallableName.kt") + public void testNonLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedClassName.kt") + public void testNonLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("SelfLocalMethod.kt") + public void testSelfLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfLocalProperty.kt") + public void testSelfLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt"); + } + + @Test + @TestMetadata("SelfNonLocalMethod.kt") + public void testSelfNonLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfNonLocalProperty.kt") + public void testSelfNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingLocalMethod.kt") + public void testSiblingLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt"); + } + + @Test + @TestMetadata("SiblingLocalProperty.kt") + public void testSiblingLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingNonLocalProperty.kt") + public void testSiblingNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/parameters") + @TestDataPath("$PROJECT_ROOT") + public class Parameters { + @Test + public void testAllFilesPresentInParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/parameters"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("ClassPrimaryConstructorParameter.kt") + public void testClassPrimaryConstructorParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt"); + } + + @Test + @TestMetadata("ClassPrimaryConstructorValParameter.kt") + public void testClassPrimaryConstructorValParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt"); + } + + @Test + @TestMetadata("ClassTypeParameter.kt") + public void testClassTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt"); + } + + @Test + @TestMetadata("ConstructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt"); + } + + @Test + @TestMetadata("FunctionTypeParameter.kt") + public void testFunctionTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt"); + } + + @Test + @TestMetadata("FunctionValueParameter.kt") + public void testFunctionValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified") + @TestDataPath("$PROJECT_ROOT") + public class Qualified { + @Test + public void testAllFilesPresentInQualified() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile") + @TestDataPath("$PROJECT_ROOT") + public class FromOtherFile { + @Test + public void testAllFilesPresentInFromOtherFile() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromOtherByShortName.kt") + public void testEnumEntryFromOtherByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromOtherFileByFullName.kt") + public void testEnumEntryFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByFullName.kt") + public void testNestedClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByShortName.kt") + public void testNestedClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByFullName.kt") + public void testTopLevelClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByShortName.kt") + public void testTopLevelClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromOtherFileByFullName.kt") + public void testTopLevelFunctionFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib") + @TestDataPath("$PROJECT_ROOT") + public class Stdlib { + @Test + public void testAllFilesPresentInStdlib() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByFullName.kt") + public void testEnumEntryFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByShortName.kt") + public void testEnumEntryFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByFullName.kt") + public void testTopLevelClassFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByShortName.kt") + public void testTopLevelClassFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByFullName.kt") + public void testTopLevelFunctionFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/referenceResolve/nestedTypes") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt index e8c52076dd0..64dbd2a2059 100644 --- a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt +++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtMainModu import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder @@ -28,6 +29,8 @@ import kotlin.io.path.nameWithoutExtension object AnalysisApiFe10TestConfigurator : AnalysisApiTestConfigurator() { override val analyseInDependentSession: Boolean get() = false + override val frontendKind: FrontendKind get() = FrontendKind.Fe10 + override val testPrefix: String get() = "descriptors" diff --git a/analysis/analysis-api-fir/build.gradle.kts b/analysis/analysis-api-fir/build.gradle.kts index 295161d923f..1aa17454b57 100644 --- a/analysis/analysis-api-fir/build.gradle.kts +++ b/analysis/analysis-api-fir/build.gradle.kts @@ -90,3 +90,7 @@ val generateCode by tasks.registering(NoDebugJavaExec::class) { val compileKotlin by tasks compileKotlin.dependsOn(generateCode) + +tasks.withType().configureEach { + kotlinOptions.freeCompilerArgs += "-Xcontext-receivers" +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt new file mode 100644 index 00000000000..fdc6620a631 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt @@ -0,0 +1,176 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.references + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.psi.KtDeclaration + +internal object KDocReferenceResolver { + + context(KtAnalysisSession) + internal fun resolveKdocFqName(fqName: FqName, owner: KtDeclaration?): Collection = buildSet { + collectSymbolsByFullyQualifiedName(fqName) + + if (owner != null) { + collectSymbolsFromPositionScopes(owner, fqName) + val ownerSymbol = owner.getSymbol() + + val pathSegments = fqName.pathSegments() + if (pathSegments.size == 1) { + val singleSegment = pathSegments.single() + when { + owner is KtConstructorSymbol -> { + collectConstructorParameterSymbols(owner, singleSegment) + } + + ownerSymbol is KtNamedClassOrObjectSymbol -> { + collectPrimaryConstructorParameterSymbols(ownerSymbol, singleSegment) + } + } + } + } + } + + context(KtAnalysisSession) + private fun MutableCollection.collectPrimaryConstructorParameterSymbols(owner: KtNamedClassOrObjectSymbol, name: Name) { + val primaryConstructor = owner.getDeclaredMemberScope().getConstructors().firstOrNull { it.isPrimary } ?: return + collectConstructorParameterSymbols(primaryConstructor, name) + } + + context(KtAnalysisSession) + private fun MutableCollection.collectSymbolsFromPositionScopes(owner: KtDeclaration, fqName: FqName) { + val initialScope = owner.containingKtFile.getScopeContextForPosition(owner).scopes + + val scope = fqName.pathSegments() + .dropLast(1) + .fold(initialScope) { currentScope, fqNamePart -> + currentScope + .getClassifierSymbols { it == fqNamePart } + .mapNotNull { (it as? KtSymbolWithMembers)?.getDeclaredMemberScope() } + .toList() + .asCompositeScope() + } + + val shortName = fqName.shortName() + addAll(scope.getCallableSymbols { it == shortName }) + addAll(scope.getClassifierSymbols { it == shortName }) + } + + context(KtAnalysisSession, MutableCollection) + private fun collectConstructorParameterSymbols(owner: KtFunctionLikeSymbol, name: Name) { + for (valueParameter in owner.valueParameters) { + if (valueParameter.name == name) { + add(valueParameter) + } + } + } + + context(KtAnalysisSession) + private fun MutableCollection.collectSymbolsByFullyQualifiedName(fqName: FqName) { + generateNameInterpretations(fqName).forEach { interpretation -> + collectSymbolsByFqNameInterpretation(interpretation) + } + } + + context(KtAnalysisSession) + private fun MutableCollection.collectSymbolsByFqNameInterpretation( + interpretation: FqNameInterpretation, + ) { + when (interpretation) { + is FqNameInterpretation.FqNameInterpretationAsCallableId -> { + collectSymbolsByFqNameInterpretationAsCallableId(interpretation.callableId) + } + + is FqNameInterpretation.FqNameInterpretationAsClassId -> { + collectSymbolsByClassId(interpretation.classId) + } + + is FqNameInterpretation.FqNameInterpretationAsPackage -> { + collectSymbolsByPackage(interpretation.packageFqName) + } + } + } + + context(KtAnalysisSession) + private fun MutableCollection.collectSymbolsByPackage(packageFqName: FqName) { + getPackageSymbolIfPackageExists(packageFqName)?.let(::add) + } + + context(KtAnalysisSession, MutableCollection) + private fun collectSymbolsByClassId(classId: ClassId) { + classId.getCorrespondingToplevelClassOrObjectSymbol()?.let(::add) + } + + context(KtAnalysisSession) + private fun MutableCollection.collectSymbolsByFqNameInterpretationAsCallableId(callableId: CallableId) { + when (val classId = callableId.classId) { + null -> { + addAll(callableId.packageName.getContainingCallableSymbolsWithName(callableId.callableName)) + } + + else -> { + classId.getCorrespondingToplevelClassOrObjectSymbol() + ?.getDeclaredMemberScope() + ?.getCallableSymbols { it == callableId.callableName } + ?.let(::addAll) + } + } + } + + + private fun generateNameInterpretations(fqName: FqName): Sequence = sequence { + val parts = fqName.pathSegments() + if (parts.isEmpty()) { + yield(FqNameInterpretation.create(packageParts = emptyList(), classParts = emptyList(), callable = null)) + return@sequence + } + for (lastPackagePartIndexExclusive in 0..parts.size) { + yield( + FqNameInterpretation.create( + packageParts = parts.subList(0, lastPackagePartIndexExclusive), + classParts = parts.subList(lastPackagePartIndexExclusive, parts.size), + callable = null, + ) + ) + + if (lastPackagePartIndexExclusive <= parts.size - 1) { + yield( + FqNameInterpretation.create( + packageParts = parts.subList(0, lastPackagePartIndexExclusive), + classParts = parts.subList(lastPackagePartIndexExclusive, parts.size - 1), + callable = parts.last(), + ) + ) + } + } + } +} + +private sealed class FqNameInterpretation { + + data class FqNameInterpretationAsPackage(val packageFqName: FqName) : FqNameInterpretation() + data class FqNameInterpretationAsClassId(val classId: ClassId) : FqNameInterpretation() + data class FqNameInterpretationAsCallableId(val callableId: CallableId) : FqNameInterpretation() + + companion object { + fun create(packageParts: List, classParts: List, callable: Name?): FqNameInterpretation { + val packageName = FqName.fromSegments(packageParts.map { it.asString() }) + val relativeClassName = FqName.fromSegments(classParts.map { it.asString() }) + + return when { + classParts.isEmpty() && callable == null -> FqNameInterpretationAsPackage(packageName) + callable == null -> FqNameInterpretationAsClassId(ClassId(packageName, relativeClassName, false)) + else -> FqNameInterpretationAsCallableId(CallableId(packageName, relativeClassName.takeUnless { it.isRoot }, callable)) + } + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KotlinFirReferenceContributor.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KotlinFirReferenceContributor.kt index 912d5a28a69..46d78fb2ee8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KotlinFirReferenceContributor.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KotlinFirReferenceContributor.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.references +import org.jetbrains.kotlin.analysis.api.fir.references.KtFirKDocReference import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.resolve.references.ReferenceAccess @@ -18,6 +19,7 @@ class KotlinFirReferenceContributor : KotlinReferenceProviderContributor { registerProvider(factory = ::KtFirArrayAccessReference) registerProvider(factory = ::KtFirConstructorDelegationReference) registerProvider(factory = ::KtFirCollectionLiteralReference) + registerProvider(factory = ::KtFirKDocReference) registerMultiProvider { nameReferenceExpression -> when (nameReferenceExpression.readWriteAccess(useResolveForReadWrite = true)) { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirKDocReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirKDocReference.kt new file mode 100644 index 00000000000..cb527f19252 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirKDocReference.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.references + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.utils.printer.parentOfType +import org.jetbrains.kotlin.idea.references.KDocReference +import org.jetbrains.kotlin.idea.references.KtFirReference +import org.jetbrains.kotlin.kdoc.psi.impl.KDocName +import org.jetbrains.kotlin.psi.KtDeclaration + + +internal class KtFirKDocReference(element: KDocName) : KDocReference(element), KtFirReference { + override fun KtAnalysisSession.resolveToSymbols(): Collection { + val owner = element.parentOfType() + return KDocReferenceResolver.resolveKdocFqName(element.getQualifiedNameAsFqName(), owner) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt index 67190ae5a9b..a49b2f8b7e5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt @@ -169,6 +169,10 @@ internal class KtFirSymbolProvider( return firs.asSequence().map { firSymbol -> firSymbolBuilder.buildSymbol(firSymbol) } } + override fun getPackageSymbolIfPackageExists(packageFqName: FqName): KtPackageSymbol? { + return firSymbolBuilder.createPackageSymbolIfOneExists(packageFqName) + } + override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol = KtFirPackageSymbol(FqName.ROOT, firResolveSession.project, token) override fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtLocalVariableSymbol { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java index 8b86b3cb77c..1d23a0ba73e 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1040,6 +1040,252 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex } } + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc") + @TestDataPath("$PROJECT_ROOT") + public class KDoc { + @Test + public void testAllFilesPresentInKDoc() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/localContext") + @TestDataPath("$PROJECT_ROOT") + public class LocalContext { + @Test + public void testAllFilesPresentInLocalContext() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/localContext"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedCallableName.kt") + public void testLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedClassName.kt") + public void testLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedCallableName.kt") + public void testNonLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedClassName.kt") + public void testNonLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("SelfLocalMethod.kt") + public void testSelfLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfLocalProperty.kt") + public void testSelfLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt"); + } + + @Test + @TestMetadata("SelfNonLocalMethod.kt") + public void testSelfNonLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfNonLocalProperty.kt") + public void testSelfNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingLocalMethod.kt") + public void testSiblingLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt"); + } + + @Test + @TestMetadata("SiblingLocalProperty.kt") + public void testSiblingLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingNonLocalProperty.kt") + public void testSiblingNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/parameters") + @TestDataPath("$PROJECT_ROOT") + public class Parameters { + @Test + public void testAllFilesPresentInParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/parameters"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("ClassPrimaryConstructorParameter.kt") + public void testClassPrimaryConstructorParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt"); + } + + @Test + @TestMetadata("ClassPrimaryConstructorValParameter.kt") + public void testClassPrimaryConstructorValParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt"); + } + + @Test + @TestMetadata("ClassTypeParameter.kt") + public void testClassTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt"); + } + + @Test + @TestMetadata("ConstructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt"); + } + + @Test + @TestMetadata("FunctionTypeParameter.kt") + public void testFunctionTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt"); + } + + @Test + @TestMetadata("FunctionValueParameter.kt") + public void testFunctionValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified") + @TestDataPath("$PROJECT_ROOT") + public class Qualified { + @Test + public void testAllFilesPresentInQualified() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile") + @TestDataPath("$PROJECT_ROOT") + public class FromOtherFile { + @Test + public void testAllFilesPresentInFromOtherFile() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromOtherByShortName.kt") + public void testEnumEntryFromOtherByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromOtherFileByFullName.kt") + public void testEnumEntryFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByFullName.kt") + public void testNestedClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByShortName.kt") + public void testNestedClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByFullName.kt") + public void testTopLevelClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByShortName.kt") + public void testTopLevelClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromOtherFileByFullName.kt") + public void testTopLevelFunctionFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib") + @TestDataPath("$PROJECT_ROOT") + public class Stdlib { + @Test + public void testAllFilesPresentInStdlib() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByFullName.kt") + public void testEnumEntryFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByShortName.kt") + public void testEnumEntryFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByFullName.kt") + public void testTopLevelClassFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByShortName.kt") + public void testTopLevelClassFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByFullName.kt") + public void testTopLevelFunctionFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/referenceResolve/nestedTypes") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java index bbf99c7f18a..ac64c23ddee 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java @@ -930,6 +930,252 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate } } + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc") + @TestDataPath("$PROJECT_ROOT") + public class KDoc { + @Test + public void testAllFilesPresentInKDoc() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors"); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/localContext") + @TestDataPath("$PROJECT_ROOT") + public class LocalContext { + @Test + public void testAllFilesPresentInLocalContext() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/localContext"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors"); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedCallableName.kt") + public void testLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedClassName.kt") + public void testLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedCallableName.kt") + public void testNonLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedClassName.kt") + public void testNonLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("SelfLocalMethod.kt") + public void testSelfLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfLocalProperty.kt") + public void testSelfLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt"); + } + + @Test + @TestMetadata("SelfNonLocalMethod.kt") + public void testSelfNonLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfNonLocalProperty.kt") + public void testSelfNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingLocalMethod.kt") + public void testSiblingLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt"); + } + + @Test + @TestMetadata("SiblingLocalProperty.kt") + public void testSiblingLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingNonLocalProperty.kt") + public void testSiblingNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/parameters") + @TestDataPath("$PROJECT_ROOT") + public class Parameters { + @Test + public void testAllFilesPresentInParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/parameters"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors"); + } + + @Test + @TestMetadata("ClassPrimaryConstructorParameter.kt") + public void testClassPrimaryConstructorParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt"); + } + + @Test + @TestMetadata("ClassPrimaryConstructorValParameter.kt") + public void testClassPrimaryConstructorValParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt"); + } + + @Test + @TestMetadata("ClassTypeParameter.kt") + public void testClassTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt"); + } + + @Test + @TestMetadata("ConstructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt"); + } + + @Test + @TestMetadata("FunctionTypeParameter.kt") + public void testFunctionTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt"); + } + + @Test + @TestMetadata("FunctionValueParameter.kt") + public void testFunctionValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified") + @TestDataPath("$PROJECT_ROOT") + public class Qualified { + @Test + public void testAllFilesPresentInQualified() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors"); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile") + @TestDataPath("$PROJECT_ROOT") + public class FromOtherFile { + @Test + public void testAllFilesPresentInFromOtherFile() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors"); + } + + @Test + @TestMetadata("EnumEntryFromOtherByShortName.kt") + public void testEnumEntryFromOtherByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromOtherFileByFullName.kt") + public void testEnumEntryFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByFullName.kt") + public void testNestedClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByShortName.kt") + public void testNestedClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByFullName.kt") + public void testTopLevelClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByShortName.kt") + public void testTopLevelClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromOtherFileByFullName.kt") + public void testTopLevelFunctionFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib") + @TestDataPath("$PROJECT_ROOT") + public class Stdlib { + @Test + public void testAllFilesPresentInStdlib() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), null, true, "withErrors"); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByFullName.kt") + public void testEnumEntryFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByShortName.kt") + public void testEnumEntryFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByFullName.kt") + public void testTopLevelClassFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByShortName.kt") + public void testTopLevelClassFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByFullName.kt") + public void testTopLevelFunctionFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/referenceResolve/nestedTypes") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 74d878b57d5..17e518c6bdc 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1040,6 +1040,252 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten } } + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc") + @TestDataPath("$PROJECT_ROOT") + public class KDoc { + @Test + public void testAllFilesPresentInKDoc() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/localContext") + @TestDataPath("$PROJECT_ROOT") + public class LocalContext { + @Test + public void testAllFilesPresentInLocalContext() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/localContext"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedCallableName.kt") + public void testLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedClassName.kt") + public void testLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedCallableName.kt") + public void testNonLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedClassName.kt") + public void testNonLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("SelfLocalMethod.kt") + public void testSelfLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfLocalProperty.kt") + public void testSelfLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt"); + } + + @Test + @TestMetadata("SelfNonLocalMethod.kt") + public void testSelfNonLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfNonLocalProperty.kt") + public void testSelfNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingLocalMethod.kt") + public void testSiblingLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt"); + } + + @Test + @TestMetadata("SiblingLocalProperty.kt") + public void testSiblingLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingNonLocalProperty.kt") + public void testSiblingNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/parameters") + @TestDataPath("$PROJECT_ROOT") + public class Parameters { + @Test + public void testAllFilesPresentInParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/parameters"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("ClassPrimaryConstructorParameter.kt") + public void testClassPrimaryConstructorParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt"); + } + + @Test + @TestMetadata("ClassPrimaryConstructorValParameter.kt") + public void testClassPrimaryConstructorValParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt"); + } + + @Test + @TestMetadata("ClassTypeParameter.kt") + public void testClassTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt"); + } + + @Test + @TestMetadata("ConstructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt"); + } + + @Test + @TestMetadata("FunctionTypeParameter.kt") + public void testFunctionTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt"); + } + + @Test + @TestMetadata("FunctionValueParameter.kt") + public void testFunctionValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified") + @TestDataPath("$PROJECT_ROOT") + public class Qualified { + @Test + public void testAllFilesPresentInQualified() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile") + @TestDataPath("$PROJECT_ROOT") + public class FromOtherFile { + @Test + public void testAllFilesPresentInFromOtherFile() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromOtherByShortName.kt") + public void testEnumEntryFromOtherByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromOtherFileByFullName.kt") + public void testEnumEntryFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByFullName.kt") + public void testNestedClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByShortName.kt") + public void testNestedClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByFullName.kt") + public void testTopLevelClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByShortName.kt") + public void testTopLevelClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromOtherFileByFullName.kt") + public void testTopLevelFunctionFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib") + @TestDataPath("$PROJECT_ROOT") + public class Stdlib { + @Test + public void testAllFilesPresentInStdlib() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByFullName.kt") + public void testEnumEntryFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByShortName.kt") + public void testEnumEntryFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByFullName.kt") + public void testTopLevelClassFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByShortName.kt") + public void testTopLevelClassFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByFullName.kt") + public void testTopLevelFunctionFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/referenceResolve/nestedTypes") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibraryBinaryTestConfigurator.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibraryBinaryTestConfigurator.kt index d8466291d68..37f5fcae61d 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibraryBinaryTestConfigurator.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibraryBinaryTestConfigurator.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModule import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.model.TestModule @@ -28,6 +29,7 @@ import org.jetbrains.kotlin.test.services.TestServices object AnalysisApiFirLibraryBinaryTestConfigurator : AnalysisApiTestConfigurator() { override val analyseInDependentSession: Boolean get() = false + override val frontendKind: FrontendKind get() = FrontendKind.Fir override fun configureTest( builder: TestConfigurationBuilder, diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt index 2df10afec58..be9a64f3a5a 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/test/configurators/library/AnalysisApiFirLibrarySourceTestConfigurator.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.analysis.test.framework.services.libraries.CompiledL import org.jetbrains.kotlin.analysis.test.framework.services.libraries.compiledLibraryProvider import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.model.TestModule @@ -32,6 +33,7 @@ import org.jetbrains.kotlin.test.services.TestServices object AnalysisApiFirLibrarySourceTestConfigurator : AnalysisApiTestConfigurator() { override val analyseInDependentSession: Boolean get() = false + override val frontendKind: FrontendKind get() = FrontendKind.Fir override fun configureTest( builder: TestConfigurationBuilder, diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt index b6c80b6ee42..fd49cd97a0a 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/references/AbstractReferenceResolveTest.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.components.RendererModifier import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.TestReferenceResolveResultRenderer.renderResolvedTo import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.test.framework.AnalysisApiTestDirectives import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedSingleModuleTest import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.utils.unwrapMultiReferences @@ -30,11 +31,17 @@ abstract class AbstractReferenceResolveTest : AbstractAnalysisApiBasedSingleModu +ConfigurationDirectives.WITH_STDLIB } useDirectives(Directives) + forTestsMatching("analysis/analysis-api/testData/referenceResolve/kDoc/*") { + defaultDirectives { + +AnalysisApiTestDirectives.DISABLE_DEPENDED_MODE + +AnalysisApiTestDirectives.IGNORE_FE10 + } + } } } override fun doTestByFileStructure(ktFiles: List, module: TestModule, testServices: TestServices) { - val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.first { it.name == "main.kt" } + val mainKtFile = ktFiles.singleOrNull() ?: ktFiles.firstOrNull { it.name == "main.kt" } ?: ktFiles.first() val caretPosition = testServices.expressionMarkerProvider.getCaretPosition(mainKtFile) val ktReferences = findReferencesAtCaret(mainKtFile, caretPosition) if (ktReferences.isEmpty()) { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index bd396dd47cd..e92fc791c3b 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1040,6 +1040,252 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate } } + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc") + @TestDataPath("$PROJECT_ROOT") + public class KDoc { + @Test + public void testAllFilesPresentInKDoc() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/localContext") + @TestDataPath("$PROJECT_ROOT") + public class LocalContext { + @Test + public void testAllFilesPresentInLocalContext() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/localContext"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedCallableName.kt") + public void testLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("LocalSemiFullQualifiedClassName.kt") + public void testLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedCallableName.kt") + public void testNonLocalSemiFullQualifiedCallableName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt"); + } + + @Test + @TestMetadata("NonLocalSemiFullQualifiedClassName.kt") + public void testNonLocalSemiFullQualifiedClassName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt"); + } + + @Test + @TestMetadata("SelfLocalMethod.kt") + public void testSelfLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfLocalProperty.kt") + public void testSelfLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt"); + } + + @Test + @TestMetadata("SelfNonLocalMethod.kt") + public void testSelfNonLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt"); + } + + @Test + @TestMetadata("SelfNonLocalProperty.kt") + public void testSelfNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingLocalMethod.kt") + public void testSiblingLocalMethod() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt"); + } + + @Test + @TestMetadata("SiblingLocalProperty.kt") + public void testSiblingLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt"); + } + + @Test + @TestMetadata("SiblingNonLocalProperty.kt") + public void testSiblingNonLocalProperty() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/parameters") + @TestDataPath("$PROJECT_ROOT") + public class Parameters { + @Test + public void testAllFilesPresentInParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/parameters"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("ClassPrimaryConstructorParameter.kt") + public void testClassPrimaryConstructorParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt"); + } + + @Test + @TestMetadata("ClassPrimaryConstructorValParameter.kt") + public void testClassPrimaryConstructorValParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt"); + } + + @Test + @TestMetadata("ClassTypeParameter.kt") + public void testClassTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt"); + } + + @Test + @TestMetadata("ConstructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt"); + } + + @Test + @TestMetadata("FunctionTypeParameter.kt") + public void testFunctionTypeParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt"); + } + + @Test + @TestMetadata("FunctionValueParameter.kt") + public void testFunctionValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified") + @TestDataPath("$PROJECT_ROOT") + public class Qualified { + @Test + public void testAllFilesPresentInQualified() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile") + @TestDataPath("$PROJECT_ROOT") + public class FromOtherFile { + @Test + public void testAllFilesPresentInFromOtherFile() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromOtherByShortName.kt") + public void testEnumEntryFromOtherByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromOtherFileByFullName.kt") + public void testEnumEntryFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByFullName.kt") + public void testNestedClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("NestedClassFromOtherFileByShortName.kt") + public void testNestedClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByFullName.kt") + public void testTopLevelClassFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromOtherFileByShortName.kt") + public void testTopLevelClassFromOtherFileByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromOtherFileByFullName.kt") + public void testTopLevelFunctionFromOtherFileByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib") + @TestDataPath("$PROJECT_ROOT") + public class Stdlib { + @Test + public void testAllFilesPresentInStdlib() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib"), Pattern.compile("^([^.]+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByFullName.kt") + public void testEnumEntryFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("EnumEntryFromStdlibByShortName.kt") + public void testEnumEntryFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByFullName.kt") + public void testTopLevelClassFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelClassFromStdlibByShortName.kt") + public void testTopLevelClassFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByFullName.kt") + public void testTopLevelFunctionFromStdlibByFullName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt"); + } + + @Test + @TestMetadata("TopLevelFunctionFromStdlibByShortName.kt") + public void testTopLevelFunctionFromStdlibByShortName() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt"); + } + } + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/referenceResolve/nestedTypes") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt index bbeed343407..6d158153494 100644 --- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtMod import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.services.TestModuleStructure @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.test.services.TestServices object StandaloneModeConfigurator : AnalysisApiTestConfigurator() { override val analyseInDependentSession: Boolean get() = false + override val frontendKind: FrontendKind get() = FrontendKind.Fir override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { AnalysisApiFirSourceTestConfigurator(analyseInDependentSession = false).configureTest(builder, disposable) diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt index 16f8e0eb08b..a05826b70e2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbolProvider.kt @@ -51,6 +51,8 @@ public abstract class KtSymbolProvider : KtAnalysisSessionComponent() { public abstract fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol public abstract fun getDestructuringDeclarationEntrySymbol(psi: KtDestructuringDeclarationEntry): KtLocalVariableSymbol + public abstract fun getPackageSymbolIfPackageExists(packageFqName: FqName): KtPackageSymbol? + public abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? public abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence @@ -126,6 +128,13 @@ public interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn { public fun KtFile.getFileSymbol(): KtFileSymbol = withValidityAssertion { analysisSession.symbolProvider.getFileSymbol(this) } + /** + * Returns [KtPackageSymbol] corresponding to [packageFqName] if corresponding package is exists and visible from current uses-site scope, + * `null` otherwise + */ + public fun getPackageSymbolIfPackageExists(packageFqName: FqName): KtPackageSymbol? = + withValidityAssertion { analysisSession.symbolProvider.getPackageSymbolIfPackageExists(packageFqName) } + /** * @return symbol with specified [this@getClassOrObjectSymbolByClassId] or `null` in case such symbol is not found */ diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt new file mode 100644 index 00000000000..b5731a0d00e --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.kt @@ -0,0 +1,14 @@ +class C { + class X { + class YY { + fun aa() {} + } + } + + /** + * [X.YY.aa] + */ + fun g() { + + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.txt new file mode 100644 index 00000000000..6a286ba519d --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedCallableName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in C.X.YY) fun aa() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt new file mode 100644 index 00000000000..afbebf92907 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.kt @@ -0,0 +1,17 @@ +// COMPILATION_ERRORS +fun f() { + class C { + class X { + class YY { + fun aa() {} + } + } + + /** + * [X.YY] + */ + fun g() { + + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.txt new file mode 100644 index 00000000000..4ed325a4dcc --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/LocalSemiFullQualifiedClassName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : f.C.X) class YY diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt new file mode 100644 index 00000000000..3aed6a5caa4 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.kt @@ -0,0 +1,17 @@ +// COMPILATION_ERRORS +fun f() { + class C { + class X { + class YY { + fun aa() {} + } + } + + /** + * [X.YY.aa] + */ + fun g() { + + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.txt new file mode 100644 index 00000000000..31b96793aea --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedCallableName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : f.C.X.YY) fun aa() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt new file mode 100644 index 00000000000..28ee3f29a51 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.kt @@ -0,0 +1,14 @@ +class C { + class X { + class YY { + fun aa() {} + } + } + + /** + * [X.YY] + */ + fun g() { + + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.txt new file mode 100644 index 00000000000..2b1a5908f8f --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/NonLocalSemiFullQualifiedClassName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in C.X) class YY diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt new file mode 100644 index 00000000000..3d1e89c3549 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.kt @@ -0,0 +1,10 @@ +fun f() { + class C { + /** + * [aa] + */ + fun aa() {} + + fun bb() {} + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.txt new file mode 100644 index 00000000000..b8eb844cf78 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalMethod.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : f.C) fun aa() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt new file mode 100644 index 00000000000..c400f352bd0 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.kt @@ -0,0 +1,10 @@ +fun f() { + class C { + /** + * [aa] + */ + val aa: Int = 1 + + val bb: Int = 10 + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.txt new file mode 100644 index 00000000000..9f172d20219 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfLocalProperty.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : f.C) val aa: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt new file mode 100644 index 00000000000..5231538610f --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.kt @@ -0,0 +1,8 @@ +class C { + /** + * [aa] + */ + fun aa(){} + + fun bb(){} +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.txt new file mode 100644 index 00000000000..a71279e6fe7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalMethod.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in C) fun aa() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt new file mode 100644 index 00000000000..4a1784237f4 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.kt @@ -0,0 +1,8 @@ +class C { + /** + * [aa] + */ + val aa: Int = 1 + + val bb: Int = 10 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.txt new file mode 100644 index 00000000000..6d00de1f072 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SelfNonLocalProperty.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in C) val aa: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt new file mode 100644 index 00000000000..2e894296616 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.kt @@ -0,0 +1,10 @@ +fun f() { + class C { + /** + * [bb] + */ + fun aa() {} + + fun bb() {} + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.txt new file mode 100644 index 00000000000..755e552dab1 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalMethod.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : f.C) fun bb() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt new file mode 100644 index 00000000000..7ab0a1f9b54 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.kt @@ -0,0 +1,10 @@ +fun f() { + class C { + /** + * [bb] + */ + fun aa() {} + + val bb: Int = 10 + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.txt new file mode 100644 index 00000000000..ce5410c3465 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingLocalProperty.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in : f.C) val bb: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt new file mode 100644 index 00000000000..c37d9ea6a5e --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.kt @@ -0,0 +1,8 @@ +class C { + /** + * [bb] + */ + fun aa(){} + + val bb: Int = 10 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.txt new file mode 100644 index 00000000000..1a3b51f21b0 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/localContext/SiblingNonLocalProperty.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in C) val bb: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt new file mode 100644 index 00000000000..8bc03d24dab --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.kt @@ -0,0 +1,4 @@ +/** + * [aa] + */ +class C(aa: Int) diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.txt new file mode 100644 index 00000000000..2c2c3dc3db5 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorParameter.txt @@ -0,0 +1,2 @@ +Resolved to: +0: aa: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt new file mode 100644 index 00000000000..11c329e0359 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.kt @@ -0,0 +1,4 @@ +/** + * [aa] + */ +class C(val aa: Int) diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.txt new file mode 100644 index 00000000000..489b68ad2d6 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassPrimaryConstructorValParameter.txt @@ -0,0 +1,3 @@ +Resolved to: +0: (in C) val aa: kotlin.Int +1: aa: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt new file mode 100644 index 00000000000..6ea0f234469 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.kt @@ -0,0 +1,4 @@ +/** + * [AA] + */ +class C() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.txt new file mode 100644 index 00000000000..69d39cb7705 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ClassTypeParameter.txt @@ -0,0 +1,2 @@ +Resolved to: +0: AA diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt new file mode 100644 index 00000000000..71928943479 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.kt @@ -0,0 +1,11 @@ +// TODO +// UNRESOLVED_REFERENCE + + +class C { + /** + * [aa] + */ + constructor(aa: Int){} +} + diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.txt new file mode 100644 index 00000000000..2c2c3dc3db5 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/ConstructorValueParameter.txt @@ -0,0 +1,2 @@ +Resolved to: +0: aa: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt new file mode 100644 index 00000000000..f1ea59b67c0 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.kt @@ -0,0 +1,6 @@ +/** + * [AA] + */ +fun x() { + +} diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.txt new file mode 100644 index 00000000000..69d39cb7705 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionTypeParameter.txt @@ -0,0 +1,2 @@ +Resolved to: +0: AA diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt new file mode 100644 index 00000000000..1a7c07613f0 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.kt @@ -0,0 +1,6 @@ +/** + * [aa] + */ +fun x(aa: Int) { + +} diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.txt new file mode 100644 index 00000000000..2c2c3dc3db5 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/parameters/FunctionValueParameter.txt @@ -0,0 +1,2 @@ +Resolved to: +0: aa: kotlin.Int diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt new file mode 100644 index 00000000000..c92ae157363 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.kt @@ -0,0 +1,15 @@ +// FILE: a.kt + +import b.* + +/** + * [E.AA] + */ +fun x() {} + +// FILE: b.kt +package b + +enum class E { + AA, BB +} diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.txt new file mode 100644 index 00000000000..450610a0d13 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherByShortName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b.E) AA diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt new file mode 100644 index 00000000000..55606d05375 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.kt @@ -0,0 +1,12 @@ +// FILE: a.kt +/** + * [b.E.AA] + */ +fun x() {} + +// FILE: b.kt +package b + +enum class E { + AA, BB +} diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.txt new file mode 100644 index 00000000000..450610a0d13 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/EnumEntryFromOtherFileByFullName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b.E) AA diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt new file mode 100644 index 00000000000..dcec8983f7d --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.kt @@ -0,0 +1,12 @@ +// FILE: a.kt +/** + * [b.B.XX] + */ +fun x() {} + +// FILE: b.kt +package b + +class B { + class XX +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.txt new file mode 100644 index 00000000000..7f61c62d843 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByFullName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b.B) class XX diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt new file mode 100644 index 00000000000..7016ff03aed --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.kt @@ -0,0 +1,15 @@ +// FILE: a.kt + +import b.* + +/** + * [B.XX] + */ +fun x() {} + +// FILE: b.kt +package b + +class B { + class XX +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.txt new file mode 100644 index 00000000000..7f61c62d843 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/NestedClassFromOtherFileByShortName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b.B) class XX diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt new file mode 100644 index 00000000000..16aae7d40f1 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.kt @@ -0,0 +1,12 @@ +// FILE: a.kt +/** + * [b.BB] + */ +fun x() {} + +// FILE: b.kt +package b + +class BB { + class XX +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.txt new file mode 100644 index 00000000000..26a997f8f0c --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByFullName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b) class BB diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt new file mode 100644 index 00000000000..6680546dca9 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.kt @@ -0,0 +1,14 @@ +// FILE: a.kt +import b.* + +/** + * [BB] + */ +fun x() {} + +// FILE: b.kt +package b + +class BB { + class XX +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.txt new file mode 100644 index 00000000000..26a997f8f0c --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelClassFromOtherFileByShortName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b) class BB diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt new file mode 100644 index 00000000000..7ec4505126d --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.kt @@ -0,0 +1,10 @@ +// FILE: a.kt +/** + * [b.bb] + */ +fun x() {} + +// FILE: b.kt +package b + +fun bb(){} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.txt new file mode 100644 index 00000000000..798a9a6fafa --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromOtherFileByFullName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b) fun bb() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt new file mode 100644 index 00000000000..7c055c8cb77 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.kt @@ -0,0 +1,11 @@ +// FILE: a.kt +import b.* +/** + * [bb] + */ +fun x() {} + +// FILE: b.kt +package b + +fun bb(){} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.txt new file mode 100644 index 00000000000..798a9a6fafa --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/fromOtherFile/TopLevelFunctionFromStdlibByShortName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in b) fun bb() diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt new file mode 100644 index 00000000000..485e233132e --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.kt @@ -0,0 +1,4 @@ +/** + * [kotlin.LazyThreadSafetyMode.PUBLICATION] + */ +fun x() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.txt new file mode 100644 index 00000000000..2f7f19e864b --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByFullName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in kotlin.LazyThreadSafetyMode) PUBLICATION diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt new file mode 100644 index 00000000000..ebd1dfa1356 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.kt @@ -0,0 +1,6 @@ +import kotlin.LazyThreadSafetyMode + +/** + * [LazyThreadSafetyMode.PUBLICATION] + */ +fun x() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.txt new file mode 100644 index 00000000000..2f7f19e864b --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/EnumEntryFromStdlibByShortName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in kotlin.LazyThreadSafetyMode) PUBLICATION diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt new file mode 100644 index 00000000000..1b99538ae3b --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.kt @@ -0,0 +1,4 @@ +/** + * [kotlin.collections.AbstractCollection] + */ +fun x() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.txt new file mode 100644 index 00000000000..cdfb041156c --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByFullName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in kotlin.collections) abstract class AbstractCollection : kotlin.collections.Collection diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt new file mode 100644 index 00000000000..bd55746207a --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.kt @@ -0,0 +1,6 @@ +import kotlin.collections.AbstractCollection + +/** + * [AbstractCollection] + */ +fun x() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.txt new file mode 100644 index 00000000000..cdfb041156c --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelClassFromStdlibByShortName.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in kotlin.collections) abstract class AbstractCollection : kotlin.collections.Collection diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt new file mode 100644 index 00000000000..2400552486d --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.kt @@ -0,0 +1,4 @@ +/** + * [kotlin.collections.listOf] + */ +fun x() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.txt new file mode 100644 index 00000000000..6c6c1703ba7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByFullName.txt @@ -0,0 +1,4 @@ +Resolved to: +0: (in kotlin.collections) fun listOf(element: T): kotlin.collections.List +1: (in kotlin.collections) fun listOf(vararg elements: T): kotlin.collections.List +2: (in kotlin.collections) inline fun listOf(): kotlin.collections.List diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt new file mode 100644 index 00000000000..622eeb3073a --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.kt @@ -0,0 +1,6 @@ +import kotlin.collections.listOf + +/** + * [listOf] + */ +fun x() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.txt new file mode 100644 index 00000000000..6c6c1703ba7 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/qualified/stdlib/TopLevelFunctionFromStdlibByShortName.txt @@ -0,0 +1,4 @@ +Resolved to: +0: (in kotlin.collections) fun listOf(element: T): kotlin.collections.List +1: (in kotlin.collections) fun listOf(vararg elements: T): kotlin.collections.List +2: (in kotlin.collections) inline fun listOf(): kotlin.collections.List diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/AnalysisApiTestDirectives.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/AnalysisApiTestDirectives.kt index 715d31e5225..bafb2dfb4a7 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/AnalysisApiTestDirectives.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/AnalysisApiTestDirectives.kt @@ -9,4 +9,5 @@ import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer object AnalysisApiTestDirectives : SimpleDirectivesContainer() { val DISABLE_DEPENDED_MODE by directive("Analysis in dependent mode should not be run in this test") + val IGNORE_FE10 by directive("FE10 Analysis API implementation test should mot be run") } \ No newline at end of file diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt index 55150325b08..d09c589947f 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt @@ -18,7 +18,9 @@ import org.jetbrains.kotlin.analysis.test.framework.project.structure.ktModulePr import org.jetbrains.kotlin.analysis.test.framework.services.ExpressionMarkerProvider import org.jetbrains.kotlin.analysis.test.framework.services.ExpressionMarkersSourceFilePreprocessor import org.jetbrains.kotlin.analysis.test.framework.services.SubstitutionParser +import org.jetbrains.kotlin.analysis.test.framework.services.libraries.CompilerExecutor import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.analysis.test.framework.utils.SkipTestException import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.psi.KtElement @@ -104,6 +106,8 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() { useDirectives(*AbstractKotlinCompilerTest.defaultDirectiveContainers.toTypedArray()) useDirectives(JvmEnvironmentConfigurationDirectives) + useDirectives(CompilerExecutor.Directives) + useSourcePreprocessor(::ExpressionMarkersSourceFilePreprocessor) useAdditionalService { ExpressionMarkerProvider() } @@ -131,6 +135,10 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() { return } + if (configurator.frontendKind == FrontendKind.Fe10 && isFe10DisabledForTheTest()) { + return + } + doTestByFileStructure(moduleStructure, testServices) } @@ -160,6 +168,9 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() { private fun isDependentModeDisabledForTheTest(): Boolean = AnalysisApiTestDirectives.DISABLE_DEPENDED_MODE in testServices.moduleStructure.allDirectives + private fun isFe10DisabledForTheTest(): Boolean = + AnalysisApiTestDirectives.IGNORE_FE10 in testServices.moduleStructure.allDirectives + protected fun analyseForTest(contextElement: KtElement, action: KtAnalysisSession.() -> R): R { return if (configurator.analyseInDependentSession) { val originalContainingFile = contextElement.containingKtFile diff --git a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt index 259eb849fe1..19c3efff852 100644 --- a/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt +++ b/analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/test/configurators/AnalysisApiTestConfigurator.kt @@ -28,6 +28,8 @@ import kotlin.reflect.KClass abstract class AnalysisApiTestConfigurator { open val testPrefix: String? get() = null + abstract val frontendKind: FrontendKind + abstract val analyseInDependentSession: Boolean abstract fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt index a2ad8334b9c..73aa6dad4d1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/FirLowLevelCompilerBasedTestConfigurator.kt @@ -28,10 +28,12 @@ import org.jetbrains.kotlin.analysis.test.framework.base.registerAnalysisApiBase import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtLibraryModuleImpl import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtSourceModuleByCompilerConfiguration import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.platform.TargetPlatform object FirLowLevelCompilerBasedTestConfigurator : AnalysisApiTestConfigurator() { override val analyseInDependentSession: Boolean get() = false + override val frontendKind: FrontendKind get() = FrontendKind.Fir override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { builder.apply { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt index 70255b70da7..42f759c161d 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirSourceTestConfigurator.kt @@ -18,12 +18,15 @@ import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtMainModu import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.services.TestModuleStructure import org.jetbrains.kotlin.test.services.TestServices class AnalysisApiFirSourceTestConfigurator(override val analyseInDependentSession: Boolean) : AnalysisApiTestConfigurator() { + override val frontendKind: FrontendKind get() = FrontendKind.Fir + override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { builder.apply { usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/test/configurators/AnalysisApiSymbolLightClassesDecompiledTestConfigurator.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/test/configurators/AnalysisApiSymbolLightClassesDecompiledTestConfigurator.kt index 2f6a423b027..fb30f1743be 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/test/configurators/AnalysisApiSymbolLightClassesDecompiledTestConfigurator.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/test/configurators/AnalysisApiSymbolLightClassesDecompiledTestConfigurator.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.fir.test.configurators.library.Analysis import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.services.TestModuleStructure @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.test.services.TestServices object AnalysisApiSymbolLightClassesDecompiledTestConfigurator : AnalysisApiTestConfigurator() { override val analyseInDependentSession: Boolean get() = false + override val frontendKind: FrontendKind get() = FrontendKind.Fir override fun configureTest(builder: TestConfigurationBuilder, disposable: Disposable) { AnalysisApiFirLibraryBinaryTestConfigurator.configureTest(builder, disposable) diff --git a/compiler/psi/src/org/jetbrains/kotlin/kdoc/psi/impl/KDocName.kt b/compiler/psi/src/org/jetbrains/kotlin/kdoc/psi/impl/KDocName.kt index 13b559dc8fb..1a28a1890c7 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/kdoc/psi/impl/KDocName.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/kdoc/psi/impl/KDocName.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.kdoc.psi.api.KDoc import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import com.intellij.openapi.util.TextRange import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.psiUtil.getChildOfType /** @@ -58,4 +59,8 @@ class KDocName(node: ASTNode) : KtElementImpl(node) { val nameAsList = listOf(getNameText()) return if (qualifier != null) qualifier.getQualifiedName() + nameAsList else nameAsList } + + fun getQualifiedNameAsFqName(): FqName { + return FqName.fromSegments(getQualifiedName()) + } }