diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/shortenRefs/FirShortenRefsTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/shortenRefs/FirShortenRefsTestGenerated.java index f7579af856f..e6cfd7cab8a 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/shortenRefs/FirShortenRefsTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/shortenRefs/FirShortenRefsTestGenerated.java @@ -101,6 +101,11 @@ public class FirShortenRefsTestGenerated extends AbstractFirShortenRefsTest { runTest("idea/testData/shortenRefsFir/calls/notImportedTopLevelFunctionNoArgs.kt"); } + @TestMetadata("notImportedTopLevelProperty.kt") + public void testNotImportedTopLevelProperty() throws Exception { + runTest("idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt"); + } + @TestMetadata("notImportedTopLevelTypeConstructorNoArgs.kt") public void testNotImportedTopLevelTypeConstructorNoArgs() throws Exception { runTest("idea/testData/shortenRefsFir/calls/notImportedTopLevelTypeConstructorNoArgs.kt"); diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt index aaa8490f330..6bf5c513789 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.transformers.resolveToPackageOrClass import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.getFunctions +import org.jetbrains.kotlin.fir.scopes.getProperties import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractStarImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitSimpleImportingScope import org.jetbrains.kotlin.fir.scopes.impl.FirPackageMemberScope @@ -120,8 +121,8 @@ private class FirShorteningContext(val firResolveState: FirModuleResolveState) { return scopes.flatMap { it.getFunctions(name) } } - fun findSinglePropertyInScopesByName(scopes: List, name: Name): FirVariableSymbol<*>? { - return scopes.asSequence().mapNotNull { it.getSinglePropertyByName(name) }.singleOrNull() + fun findPropertiesInScopes(scopes: List, name: Name): List> { + return scopes.flatMap { it.getProperties(name) } } private fun FirScope.findFirstClassifierByName(name: Name): FirClassifierSymbol<*>? { @@ -136,10 +137,6 @@ private class FirShorteningContext(val firResolveState: FirModuleResolveState) { return element } - @OptIn(ExperimentalStdlibApi::class) - private fun FirScope.getSinglePropertyByName(name: Name): FirVariableSymbol<*>? = - buildList { processPropertiesByName(name, this::add) }.singleOrNull() - @OptIn(ExperimentalStdlibApi::class) fun findScopesAtPosition(position: KtElement, newImports: List): List? { val towerDataContext = firResolveState.getTowerDataContextForElement(position) ?: return null @@ -316,11 +313,15 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort val propertyId = (resolvedNamedReference.resolvedSymbol as? FirCallableSymbol<*>)?.callableId ?: return val scopes = shorteningContext.findScopesAtPosition(qualifiedProperty, namesToImport) ?: return - val singleAvailableProperty = shorteningContext.findSinglePropertyInScopesByName(scopes, propertyId.callableName) + val singleAvailableProperty = shorteningContext.findPropertiesInScopes(scopes, propertyId.callableName) - if (singleAvailableProperty?.callableId == propertyId) { - addElementToShorten(ShortenQualifier(qualifiedProperty)) + val propertyToShorten = when { + singleAvailableProperty.isEmpty() -> ShortenQualifier(qualifiedProperty, propertyId.asImportableFqName()) + singleAvailableProperty.all { it.callableId == propertyId } -> ShortenQualifier(qualifiedProperty) + else -> findFakePackageToShorten(qualifiedProperty) } + + propertyToShorten?.let(::addElementToShorten) } private fun processFunctionCall(functionCall: FirFunctionCall) { diff --git a/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.dependency.kt b/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.dependency.kt new file mode 100644 index 00000000000..3fcd35e8e91 --- /dev/null +++ b/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.dependency.kt @@ -0,0 +1,3 @@ +package dependency + +val topLevelProperty = 10 \ No newline at end of file diff --git a/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt b/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt new file mode 100644 index 00000000000..d42f2ec64ed --- /dev/null +++ b/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt @@ -0,0 +1,6 @@ +// FIR_COMPARISON +package test + +fun usage() { + dependency.topLevelProperty +} \ No newline at end of file diff --git a/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt.after b/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt.after new file mode 100644 index 00000000000..2716c1f2d7b --- /dev/null +++ b/idea/testData/shortenRefsFir/calls/notImportedTopLevelProperty.kt.after @@ -0,0 +1,8 @@ +// FIR_COMPARISON +package test + +import dependency.topLevelProperty + +fun usage() { + topLevelProperty +} \ No newline at end of file diff --git a/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt b/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt index 58fa8373070..827424ae3ed 100644 --- a/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt +++ b/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt @@ -3,14 +3,19 @@ package test class Test +val property: Int = 10 + fun test() {} fun usage() { class Test + val property: String = "" + fun test() {} + _root_ide_package_.test.property _root_ide_package_.test.test() _root_ide_package_.test.Test val t: _root_ide_package_.test.Test diff --git a/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt.after b/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt.after index 6a5a5f26126..5acf8b63fec 100644 --- a/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt.after +++ b/idea/testData/shortenRefsFir/fakeRootPackage/rootPackageShortenFakeRootPackage.kt.after @@ -3,14 +3,19 @@ package test class Test +val property: Int = 10 + fun test() {} fun usage() { class Test + val property: String = "" + fun test() {} + test.property test.test() test.Test val t: test.Test