From 24642a7c9f4101f3723d41445a222a8e1ecf0d4c Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Fri, 30 Apr 2021 19:42:17 +0300 Subject: [PATCH] Add `KtTypeElement.unwrapNullability()` extension function Replace similar functions with its usage --- .../psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 8 ++++++++ .../api/fir/components/KtFirReferenceShortener.kt | 6 ++---- .../kotlin/idea/references/FirReferenceResolveHelper.kt | 7 ++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index 269f211c79c..7f8e6c7e08a 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -676,3 +676,11 @@ fun getTrailingCommaByElementsList(elementList: PsiElement?): PsiElement? { val KtNameReferenceExpression.isUnderscoreInBackticks get() = getReferencedName() == "`_`" + +tailrec fun KtTypeElement.unwrapNullability(): KtTypeElement? { + return when (this) { + is KtNullableType -> this.innerType?.unwrapNullability() + is KtDefinitelyNotNullType -> this.innerType?.unwrapNullability() + else -> this + } +} \ No newline at end of file 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 07e0e918ed9..802792d36ed 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 @@ -57,6 +57,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector +import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability internal class KtFirReferenceShortener( override val analysisSession: KtFirAnalysisSession, @@ -218,7 +219,7 @@ private class ElementsToShortenCollector(private val shorteningContext: FirShort val wholeTypeReference = resolvedTypeRef.psi as? KtTypeReference ?: return val wholeClassifierId = resolvedTypeRef.type.lowerBoundIfFlexible().classId ?: return - val wholeTypeElement = wholeTypeReference.typeElement.unwrapNullable() as? KtUserType ?: return + val wholeTypeElement = wholeTypeReference.typeElement?.unwrapNullability() as? KtUserType ?: return if (wholeTypeElement.qualifier == null) return @@ -456,9 +457,6 @@ private fun CallableId.asImportableFqName(): FqName? = if (classId == null) pack private fun KtElement.getDotQualifiedExpressionForSelector(): KtDotQualifiedExpression? = getQualifiedExpressionForSelector() as? KtDotQualifiedExpression -private tailrec fun KtTypeElement?.unwrapNullable(): KtTypeElement? = - if (this is KtNullableType) this.innerType.unwrapNullable() else this - private fun KtDotQualifiedExpression.deleteQualifier(): KtExpression? { val selectorExpression = selectorExpression ?: return null return this.replace(selectorExpression) as KtExpression diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 9f44feb50ca..44713ccc8a6 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -41,6 +41,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector +import org.jetbrains.kotlin.psi.psiUtil.unwrapNullability import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult internal object FirReferenceResolveHelper { @@ -420,7 +421,7 @@ internal object FirReferenceResolveHelper { // FIXME make it work with generics in functional types (like () -> AA.BB) val wholeType = when (val psi = wholeTypeFir.psi) { is KtUserType -> psi - is KtTypeReference -> psi.typeElement?.unwrapNullable() as? KtUserType + is KtTypeReference -> psi.typeElement?.unwrapNullability() as? KtUserType else -> null } ?: return null @@ -447,9 +448,5 @@ internal object FirReferenceResolveHelper { return qualifierIndex } - private tailrec fun KtTypeElement.unwrapNullable(): KtTypeElement? { - return if (this is KtNullableType) innerType?.unwrapNullable() else this - } - private val syntheticTokenTypes = TokenSet.create(KtTokens.ELVIS, KtTokens.EXCLEXCL) }