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 92475e51f95..323c7db2df9 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 @@ -335,7 +335,7 @@ private class ElementsToShortenCollector( private fun findTypeToShorten(wholeClassifierId: ClassId, wholeTypeElement: KtUserType): ElementToShorten? { val positionScopes = shorteningContext.findScopesAtPosition(wholeTypeElement, namesToImport, towerContextProvider) ?: return null val allClassIds = wholeClassifierId.outerClassesWithSelf - val allQualifiedTypeElements = wholeTypeElement.qualifiersWithSelf.takeWhile { it.qualifier != null } + val allQualifiedTypeElements = wholeTypeElement.qualifiedTypesWithSelf return findClassifierElementsToShorten( positionScopes, allClassIds, @@ -346,8 +346,7 @@ private class ElementsToShortenCollector( } private fun findFakePackageToShorten(typeElement: KtUserType): ShortenType? { - val deepestTypeWithQualifier = typeElement.qualifiersWithSelf.takeWhile { it.qualifier != null }.lastOrNull() - ?: error("Type element should have at least one qualifier, instead it was ${typeElement.text}") + val deepestTypeWithQualifier = typeElement.qualifiedTypesWithSelf.last() return if (deepestTypeWithQualifier.hasFakeRootPrefix()) ShortenType(deepestTypeWithQualifier) else null } @@ -372,7 +371,7 @@ private class ElementsToShortenCollector( val positionScopes: List = shorteningContext.findScopesAtPosition(wholeQualifierElement, namesToImport, towerContextProvider) ?: return null val allClassIds: Sequence = wholeClassQualifier.outerClassesWithSelf - val allQualifiers: Sequence = wholeQualifierElement.qualifiersWithSelf + val allQualifiers: Sequence = wholeQualifierElement.qualifiedExpressionsWithSelf return findClassifierElementsToShorten( positionScopes, allClassIds, @@ -538,7 +537,7 @@ private class ElementsToShortenCollector( } private fun findFakePackageToShorten(wholeQualifiedExpression: KtDotQualifiedExpression): ShortenQualifier? { - val deepestQualifier = wholeQualifiedExpression.qualifiersWithSelf.last() + val deepestQualifier = wholeQualifiedExpression.qualifiedExpressionsWithSelf.last() return if (deepestQualifier.hasFakeRootPrefix()) ShortenQualifier(deepestQualifier) else null } @@ -561,10 +560,21 @@ private class ElementsToShortenCollector( private val ClassId.outerClassesWithSelf: Sequence get() = generateSequence(this) { it.outerClassId } - private val KtUserType.qualifiersWithSelf: Sequence - get() = generateSequence(this) { it.qualifier } + /** + * Note: The resulting sequence does not contain non-qualified types! + * + * For type `A.B.C.D` it will return sequence of [`A.B.C.D`, `A.B.C`, `A.B`] (**without** `A`). + */ + private val KtUserType.qualifiedTypesWithSelf: Sequence + get() { + require(qualifier != null) { + "Type element should have at least one qualifier, instead it was $text" + } - private val KtDotQualifiedExpression.qualifiersWithSelf: Sequence + return generateSequence(this) { it.qualifier }.takeWhile { it.qualifier != null } + } + + private val KtDotQualifiedExpression.qualifiedExpressionsWithSelf: Sequence get() = generateSequence(this) { it.receiverExpression as? KtDotQualifiedExpression } }