diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt index c2067764194..bd58301347b 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/ShortenReferences.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.Companion.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall @@ -64,6 +65,8 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT is KtDotQualifiedExpression -> receiver.selectorExpression as? KtNameReferenceExpression ?: return false else -> return false } + if (nameRef.name == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) return true + when (val targetDescriptor = bindingContext[BindingContext.REFERENCE_TARGET, nameRef]) { is ClassDescriptor -> { if (targetDescriptor.kind != ClassKind.OBJECT) return true @@ -100,9 +103,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT fun process(file: KtFile, startOffset: Int, endOffset: Int, additionalFilter: (PsiElement) -> FilterResult = { FilterResult.PROCESS }) { val documentManager = PsiDocumentManager.getInstance(file.project) val document = file.viewProvider.document!! - if (!documentManager.isCommitted(document)) { - throw IllegalStateException("Document should be committed to shorten references in range") - } + check(documentManager.isCommitted(document)) { "Document should be committed to shorten references in range" } val rangeMarker = document.createRangeMarker(startOffset, endOffset) rangeMarker.isGreedyToLeft = true @@ -198,7 +199,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT } // step 2: analyze collected elements with resolve and decide which can be shortened now and which need descriptors to be imported before shortening - val allElementsToAnalyze = visitors.flatMap { visitor -> visitor.getElementsToAnalyze().map { it.element } } + val allElementsToAnalyze = visitors.flatMap { visitor -> visitor.getElementsToAnalyze().map { it.element } }.toSet() val bindingContext = allowResolveInWriteAction { file.getResolutionFacade().analyze(allElementsToAnalyze, BodyResolveMode.PARTIAL_WITH_CFA) } @@ -387,7 +388,15 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT } } - override fun analyzeQualifiedElement(element: KtUserType, bindingContext: BindingContext): AnalyzeQualifiedElementResult { + override fun analyzeQualifiedElement(element: KtUserType, bindingContext: BindingContext): AnalyzeQualifiedElementResult = + mainAnalyzeQualifiedElement(element, bindingContext).let { + if (it is AnalyzeQualifiedElementResult.Skip && element.qualifier?.text == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) + AnalyzeQualifiedElementResult.ShortenNow + else + it + } + + private fun mainAnalyzeQualifiedElement(element: KtUserType, bindingContext: BindingContext): AnalyzeQualifiedElementResult { if (element.qualifier == null) return AnalyzeQualifiedElementResult.Skip val referenceExpression = element.referenceExpression ?: return AnalyzeQualifiedElementResult.Skip @@ -472,13 +481,19 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT override fun analyzeQualifiedElement( element: KtDotQualifiedExpression, bindingContext: BindingContext - ): AnalyzeQualifiedElementResult { - if (!canBePossibleToDropReceiver(element, bindingContext)) return AnalyzeQualifiedElementResult.Skip + ): AnalyzeQualifiedElementResult = if (element.receiverExpression.text == ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE) + AnalyzeQualifiedElementResult.ShortenNow + else + mainAnalyzeQualifiedElement(element, bindingContext) + private fun mainAnalyzeQualifiedElement( + element: KtDotQualifiedExpression, + bindingContext: BindingContext + ): AnalyzeQualifiedElementResult { if (PsiTreeUtil.getParentOfType( element, KtImportDirective::class.java, KtPackageDirective::class.java - ) != null + ) != null || !canBePossibleToDropReceiver(element, bindingContext) ) return AnalyzeQualifiedElementResult.Skip val selector = element.selectorExpression ?: return AnalyzeQualifiedElementResult.Skip diff --git a/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt b/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt index 57f3312d61b..6c5bb0ab497 100644 --- a/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt +++ b/idea/testData/shortenRefs/type/ClassSameNameAsPackage.kt @@ -1,4 +1,3 @@ -// todo must be: s: same -fun f(s: same.same) { +fun f(s: _Qfadj4tPV.same.same) { } \ No newline at end of file