From 0c81173b71dcbbbaade762d488764813f981289a Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Thu, 5 Sep 2019 17:08:36 +0700 Subject: [PATCH] idea-core.Utils: add extension to `FqName` to support root prefix --- .../src/org/jetbrains/kotlin/idea/core/Utils.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt index 2a53166632b..cbacdaba8a3 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt @@ -17,10 +17,12 @@ import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstanceToExpression import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.parentOrNull import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace +import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext @@ -158,6 +160,19 @@ fun FqName.quoteSegmentsIfNeeded(): String { fun FqName.quoteIfNeeded() = FqName(quoteSegmentsIfNeeded()) +fun FqName.withRootPrefixIfNeeded(targetElement: KtElement? = null) = + if (canAddRootPrefix() && targetElement?.canAddRootPrefix() != false) + FqName(QualifiedExpressionResolver.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE_WITH_DOT + asString()) + else + this + +fun FqName.canAddRootPrefix(): Boolean = + !asString().startsWith(QualifiedExpressionResolver.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE_WITH_DOT) && !thisOrParentIsRoot() + +fun FqName.thisOrParentIsRoot(): Boolean = parentOrNull()?.isRoot != false + +fun KtElement.canAddRootPrefix(): Boolean = getParentOfTypes2() == null + fun isEnumCompanionPropertyWithEntryConflict(element: PsiElement, expectedName: String): Boolean { if (element !is KtProperty) return false