[FIR IDE] Refactor functions for qualifiers traversing in KtFirReferenceShortener

The code is more coherent when `qualifiedTypesWithSelf` and
`qualifiedExpressionsWithSelf` both do not contain unqualified psi
elements
This commit is contained in:
Roman Golyshev
2021-09-06 14:58:24 +03:00
parent 7a37a7b2a0
commit 90c88273c3
@@ -335,7 +335,7 @@ private class ElementsToShortenCollector(
private fun findTypeToShorten(wholeClassifierId: ClassId, wholeTypeElement: KtUserType): ElementToShorten? { private fun findTypeToShorten(wholeClassifierId: ClassId, wholeTypeElement: KtUserType): ElementToShorten? {
val positionScopes = shorteningContext.findScopesAtPosition(wholeTypeElement, namesToImport, towerContextProvider) ?: return null val positionScopes = shorteningContext.findScopesAtPosition(wholeTypeElement, namesToImport, towerContextProvider) ?: return null
val allClassIds = wholeClassifierId.outerClassesWithSelf val allClassIds = wholeClassifierId.outerClassesWithSelf
val allQualifiedTypeElements = wholeTypeElement.qualifiersWithSelf.takeWhile { it.qualifier != null } val allQualifiedTypeElements = wholeTypeElement.qualifiedTypesWithSelf
return findClassifierElementsToShorten( return findClassifierElementsToShorten(
positionScopes, positionScopes,
allClassIds, allClassIds,
@@ -346,8 +346,7 @@ private class ElementsToShortenCollector(
} }
private fun findFakePackageToShorten(typeElement: KtUserType): ShortenType? { private fun findFakePackageToShorten(typeElement: KtUserType): ShortenType? {
val deepestTypeWithQualifier = typeElement.qualifiersWithSelf.takeWhile { it.qualifier != null }.lastOrNull() val deepestTypeWithQualifier = typeElement.qualifiedTypesWithSelf.last()
?: error("Type element should have at least one qualifier, instead it was ${typeElement.text}")
return if (deepestTypeWithQualifier.hasFakeRootPrefix()) ShortenType(deepestTypeWithQualifier) else null return if (deepestTypeWithQualifier.hasFakeRootPrefix()) ShortenType(deepestTypeWithQualifier) else null
} }
@@ -372,7 +371,7 @@ private class ElementsToShortenCollector(
val positionScopes: List<FirScope> = val positionScopes: List<FirScope> =
shorteningContext.findScopesAtPosition(wholeQualifierElement, namesToImport, towerContextProvider) ?: return null shorteningContext.findScopesAtPosition(wholeQualifierElement, namesToImport, towerContextProvider) ?: return null
val allClassIds: Sequence<ClassId> = wholeClassQualifier.outerClassesWithSelf val allClassIds: Sequence<ClassId> = wholeClassQualifier.outerClassesWithSelf
val allQualifiers: Sequence<KtDotQualifiedExpression> = wholeQualifierElement.qualifiersWithSelf val allQualifiers: Sequence<KtDotQualifiedExpression> = wholeQualifierElement.qualifiedExpressionsWithSelf
return findClassifierElementsToShorten( return findClassifierElementsToShorten(
positionScopes, positionScopes,
allClassIds, allClassIds,
@@ -538,7 +537,7 @@ private class ElementsToShortenCollector(
} }
private fun findFakePackageToShorten(wholeQualifiedExpression: KtDotQualifiedExpression): ShortenQualifier? { private fun findFakePackageToShorten(wholeQualifiedExpression: KtDotQualifiedExpression): ShortenQualifier? {
val deepestQualifier = wholeQualifiedExpression.qualifiersWithSelf.last() val deepestQualifier = wholeQualifiedExpression.qualifiedExpressionsWithSelf.last()
return if (deepestQualifier.hasFakeRootPrefix()) ShortenQualifier(deepestQualifier) else null return if (deepestQualifier.hasFakeRootPrefix()) ShortenQualifier(deepestQualifier) else null
} }
@@ -561,10 +560,21 @@ private class ElementsToShortenCollector(
private val ClassId.outerClassesWithSelf: Sequence<ClassId> private val ClassId.outerClassesWithSelf: Sequence<ClassId>
get() = generateSequence(this) { it.outerClassId } get() = generateSequence(this) { it.outerClassId }
private val KtUserType.qualifiersWithSelf: Sequence<KtUserType> /**
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<KtUserType>
get() {
require(qualifier != null) {
"Type element should have at least one qualifier, instead it was $text"
}
private val KtDotQualifiedExpression.qualifiersWithSelf: Sequence<KtDotQualifiedExpression> return generateSequence(this) { it.qualifier }.takeWhile { it.qualifier != null }
}
private val KtDotQualifiedExpression.qualifiedExpressionsWithSelf: Sequence<KtDotQualifiedExpression>
get() = generateSequence(this) { it.receiverExpression as? KtDotQualifiedExpression } get() = generateSequence(this) { it.receiverExpression as? KtDotQualifiedExpression }
} }