From f5d106a68f566a27772a3e68393493eea06ef61f Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 6 Apr 2017 18:11:47 +0300 Subject: [PATCH] Refactoring: Drop obsolete KotlinFileReferencesResolver class --- .../jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 4 + .../KotlinFileReferencesResolver.kt | 92 ------------------- .../copy/PlainTextPasteImportResolver.kt | 2 +- .../kotlin/idea/quickfix/ImportFix.kt | 6 +- .../KotlinChangeSignatureUsageProcessor.kt | 15 ++- .../extractionEngine/ExtractionData.kt | 5 +- 6 files changed, 18 insertions(+), 106 deletions(-) delete mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/KotlinFileReferencesResolver.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index eb483ca7658..ca7b4f279ca 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -533,3 +533,7 @@ fun KtDeclaration.hasBody() = when (this) { is KtProperty -> hasBody() else -> false } + + +fun KtExpression.referenceExpression(): KtReferenceExpression? = + (if (this is KtCallExpression) calleeExpression else this) as? KtReferenceExpression \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/KotlinFileReferencesResolver.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/KotlinFileReferencesResolver.kt deleted file mode 100644 index ece2b73a042..00000000000 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/KotlinFileReferencesResolver.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.idea.codeInsight - -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.BindingContext -import java.util.* - -object KotlinFileReferencesResolver { - fun resolve( - element: KtElement, - resolveQualifiers: Boolean = true, - resolveShortNames: Boolean = true - ): Map { - return (element.containingFile as? KtFile)?.let { file -> - resolve(file, listOf(element), resolveQualifiers, resolveShortNames) - } ?: Collections.emptyMap() - } - - fun resolve( - file: KtFile, - elements: Iterable? = null, - resolveQualifiers: Boolean = true, - resolveShortNames: Boolean = true - ): Map { - val visitor = ResolveAllReferencesVisitor(file, resolveQualifiers, resolveShortNames) - if (elements != null) { - elements.forEach { it.accept(visitor) } - } - else { - file.accept(visitor) - } - return visitor.result - } - - private class ResolveAllReferencesVisitor(file: KtFile, val resolveQualifiers: Boolean, val resolveShortNames: Boolean) : KtTreeVisitorVoid() { - private val resolutionFacade = file.getResolutionFacade() - private val resolveMap = LinkedHashMap() - - val result: Map = resolveMap - - override fun visitUserType(userType: KtUserType) { - if (resolveQualifiers) { - userType.acceptChildren(this) - } - - if (resolveShortNames || userType.qualifier != null) { - val referenceExpression = userType.referenceExpression - if (referenceExpression != null) { - resolveMap[referenceExpression] = resolutionFacade.analyze(referenceExpression) - } - } - } - - override fun visitQualifiedExpression(expression: KtQualifiedExpression) { - val receiverExpression = expression.receiverExpression - if (resolveQualifiers || resolutionFacade.analyze(expression)[BindingContext.QUALIFIER, receiverExpression] == null) { - receiverExpression.accept(this) - } - - val referenceExpression = expression.selectorExpression?.referenceExpression() - if (referenceExpression != null) { - resolveMap[referenceExpression] = resolutionFacade.analyze(referenceExpression) - } - expression.selectorExpression?.accept(this) - } - - override fun visitSimpleNameExpression(expression: KtSimpleNameExpression) { - if (resolveShortNames) { - resolveMap[expression] = resolutionFacade.analyze(expression) - } - } - } -} - -fun KtExpression.referenceExpression(): KtReferenceExpression? = - (if (this is KtCallExpression) calleeExpression else this) as? KtReferenceExpression diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt index fb3e98876a3..cc345cd6f3d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/PlainTextPasteImportResolver.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully import org.jetbrains.kotlin.idea.caches.resolve.getJavaMemberDescriptor import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor -import org.jetbrains.kotlin.idea.codeInsight.referenceExpression import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport import org.jetbrains.kotlin.idea.references.mainReference @@ -33,6 +32,7 @@ import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.psi.KtDotQualifiedExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtImportDirective +import org.jetbrains.kotlin.psi.psiUtil.referenceExpression import java.util.* diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt index 7ce52dbf7b4..7a73f5d7331 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ImportFix.kt @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolveScope import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.codeInsight.referenceExpression import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.imports.canBeReferencedViaImport @@ -60,10 +59,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.KtPsiUtil.isSelectorInQualified -import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType -import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.isImportDirectiveExpression +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoBefore import org.jetbrains.kotlin.resolve.calls.callUtil.getParentCall diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt index b7ad0775095..db54a97d3ec 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt @@ -43,10 +43,10 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.analysis.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.codeInsight.KotlinFileReferencesResolver import org.jetbrains.kotlin.idea.core.compareDescriptors import org.jetbrains.kotlin.idea.refactoring.* import org.jetbrains.kotlin.idea.refactoring.changeSignature.usages.* +import org.jetbrains.kotlin.idea.refactoring.rename.noReceivers import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOptions @@ -701,9 +701,14 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { callable: PsiElement, newReceiverInfo: KotlinParameterInfo?) { if (newReceiverInfo != null && (callable is KtNamedFunction) && callable.bodyExpression != null) { - val noReceiverRefToContext = KotlinFileReferencesResolver.resolve(callable, true, true).filter { - val resolvedCall = it.key.getResolvedCall(it.value) - resolvedCall != null && resolvedCall.dispatchReceiver == null && resolvedCall.extensionReceiver == null + val originalContext = callable.analyzeFully() + + val noReceiverRefs = ArrayList() + callable.forEachDescendantOfType { + val resolvedCall = it.getResolvedCall(originalContext) ?: return@forEachDescendantOfType + if (resolvedCall.noReceivers()) { + noReceiverRefs += it + } } val psiFactory = KtPsiFactory(callable.project) @@ -715,7 +720,7 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { val originalOffset = callable.bodyExpression!!.textOffset val newBody = functionWithReceiver.bodyExpression ?: return - for ((originalRef, originalContext) in noReceiverRefToContext.entries) { + for (originalRef in noReceiverRefs) { val newRef = newBody .findElementAt(originalRef.textOffset - originalOffset) ?.getNonStrictParentOfType() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt index 9d0d38f23ed..1e3750a2ef2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.codeInsight.KotlinFileReferencesResolver import org.jetbrains.kotlin.idea.core.compareDescriptors import org.jetbrains.kotlin.idea.refactoring.introduce.ExtractableSubstringInfo import org.jetbrains.kotlin.idea.refactoring.introduce.extractableSubstringInfo @@ -196,10 +195,10 @@ data class ExtractionData( val newReferences = body.collectDescendantsOfType { it.resolveResult != null } + val context = body.analyze() + val referencesInfo = ArrayList() - val refToContextMap = KotlinFileReferencesResolver.resolve(body) for (newRef in newReferences) { - val context = refToContextMap[newRef] ?: continue val originalResolveResult = newRef.resolveResult ?: continue val smartCast: KotlinType?