From 0d78c8acb509ee97bc06b7a0430b2d6630d784d5 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 5 Aug 2015 13:03:09 +0300 Subject: [PATCH] Refactor: Make ResolutionFacade.resolveImportReference an utility --- .../idea/caches/resolve/ResolutionFacade.kt | 3 --- .../caches/resolve/ResolutionFacadeImpl.kt | 12 ++---------- .../idea/caches/resolve/resolutionApi.kt | 18 +++++++++++++++++- .../kotlin/idea/core/KotlinIndicesHelper.kt | 16 +++++++++------- .../quickfix/ReplaceWithAnnotationAnalyzer.kt | 3 ++- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacade.kt index b2d2fe6c3bd..9a229dc7d66 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacade.kt @@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.JetFile @@ -37,8 +36,6 @@ public interface ResolutionFacade { public fun getFileTopLevelScope(file: JetFile): JetScope - public fun resolveImportReference(moduleDescriptor: ModuleDescriptor, fqName: FqName): Collection - public fun findModuleDescriptor(element: JetElement): ModuleDescriptor public fun getFrontendService(element: PsiElement, serviceClass: Class): T diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt index 2ef77066954..26ce153823b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt @@ -28,12 +28,11 @@ import org.jetbrains.kotlin.container.getService import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.idea.project.ResolveElementCache -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.JetFile -import org.jetbrains.kotlin.psi.JetPsiFactory -import org.jetbrains.kotlin.resolve.* +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.CompositeBindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.scopes.JetScope @@ -91,13 +90,6 @@ private class ResolutionFacadeImpl( return getLazyResolveSession(file).getFileScopeProvider().getFileScope(file) } - override fun resolveImportReference(moduleDescriptor: ModuleDescriptor, fqName: FqName): Collection { - val importDirective = JetPsiFactory(project).createImportDirective(ImportPath(fqName, false)) - val qualifiedExpressionResolver = this.frontendService(moduleDescriptor) - return qualifiedExpressionResolver.processImportReference( - importDirective, moduleDescriptor, BindingTraceContext(), QualifiedExpressionResolver.LookupMode.EVERYTHING).getAllDescriptors() - } - private val analysisResults = CachedValuesManager.getManager(project).createCachedValue( { val resolverProvider = moduleResolverProvider diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt index f2062b89ba9..887dda47cef 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.caches.resolve +import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -24,7 +25,11 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetElement import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.psi.JetPsiFactory import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.BindingTraceContext +import org.jetbrains.kotlin.resolve.ImportPath +import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode public fun JetElement.getResolutionFacade(): ResolutionFacade { @@ -37,7 +42,7 @@ public fun JetDeclaration.resolveToDescriptor(): DeclarationDescriptor { public fun JetFile.resolveImportReference(fqName: FqName): Collection { val facade = getResolutionFacade() - return facade.resolveImportReference(facade.findModuleDescriptor(this), fqName) + return facade.resolveImportReference(project, facade.findModuleDescriptor(this), fqName) } //NOTE: the difference between analyze and analyzeFully is 'intentionally' unclear @@ -67,6 +72,17 @@ public fun JetElement.analyzeFullyAndGetResult(vararg extraFiles: JetFile): Anal return KotlinCacheService.getInstance(getProject()).getResolutionFacade(listOf(this) + extraFiles.toList()).analyzeFullyAndGetResult(listOf(this)) } +public fun ResolutionFacade.resolveImportReference( + project: Project, + moduleDescriptor: ModuleDescriptor, + fqName: FqName +): Collection { + val importDirective = JetPsiFactory(project).createImportDirective(ImportPath(fqName, false)) + val qualifiedExpressionResolver = this.frontendService(moduleDescriptor) + return qualifiedExpressionResolver.processImportReference( + importDirective, moduleDescriptor, BindingTraceContext(), QualifiedExpressionResolver.LookupMode.EVERYTHING).getAllDescriptors() +} + //NOTE: idea default API returns module search scope for file under module but not in source or production source (for example, test data ) // this scope can't be used to search for kotlin declarations in index in order to resolve in that case // see com.intellij.psi.impl.file.impl.ResolveScopeManagerImpl.getInherentResolveScope diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt index cb95b00d092..1f23a417dfa 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/KotlinIndicesHelper.kt @@ -23,8 +23,8 @@ import com.intellij.psi.search.PsiShortNamesCache import com.intellij.psi.stubs.StringStubIndexExtension import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.frontendService +import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.stubindex.* @@ -32,9 +32,11 @@ import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance import org.jetbrains.kotlin.idea.util.substituteExtensionIfCallable import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.resolve.* -import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.LookupMode +import org.jetbrains.kotlin.psi.JetCallableDeclaration +import org.jetbrains.kotlin.psi.JetFile +import org.jetbrains.kotlin.psi.JetNamedDeclaration +import org.jetbrains.kotlin.psi.JetSimpleNameExpression +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager @@ -67,7 +69,7 @@ public class KotlinIndicesHelper( declarations.addTopLevelNonExtensionCallablesByName(JetPropertyShortNameIndex.getInstance(), name) return declarations.flatMap { if (it.getContainingJetFile().isCompiled()) { //TODO: it's temporary while resolveToDescriptor does not work for compiled declarations - resolutionFacade.resolveImportReference(moduleDescriptor, it.getFqName()!!).filterIsInstance() + resolutionFacade.resolveImportReference(project, moduleDescriptor, it.getFqName()!!).filterIsInstance() } else { (resolutionFacade.resolveToDescriptor(it) as? CallableDescriptor).singletonOrEmptyList() @@ -169,7 +171,7 @@ public class KotlinIndicesHelper( for (declaration in declarations) { if (declaration.getContainingJetFile().isCompiled()) { //TODO: it's temporary while resolveToDescriptor does not work for compiled declarations - for (descriptor in resolutionFacade.resolveImportReference(moduleDescriptor, declaration.getFqName()!!)) { + for (descriptor in resolutionFacade.resolveImportReference(project, moduleDescriptor, declaration.getFqName()!!)) { if (descriptor is CallableDescriptor && descriptor.getExtensionReceiverParameter() != null) { processDescriptor(descriptor) } @@ -212,7 +214,7 @@ public class KotlinIndicesHelper( } private fun findTopLevelCallables(fqName: FqName): Collection { - return resolutionFacade.resolveImportReference(moduleDescriptor, fqName) + return resolutionFacade.resolveImportReference(project, moduleDescriptor, fqName) .filterIsInstance() .filter { it.getExtensionReceiverParameter() == null } } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithAnnotationAnalyzer.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithAnnotationAnalyzer.kt index 1ef6355d220..e02fdc4fccb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithAnnotationAnalyzer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceWithAnnotationAnalyzer.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.caches.resolve.resolveImportReference import org.jetbrains.kotlin.idea.core.asExpression import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.core.replaced @@ -91,7 +92,7 @@ object ReplaceWithAnnotationAnalyzer { .filter { it.isSafe() } .mapTo(LinkedHashSet()) { it.toSafe() } - val explicitlyImportedSymbols = importFqNames.flatMap { resolutionFacade.resolveImportReference(symbolDescriptor.module, it) } + val explicitlyImportedSymbols = importFqNames.flatMap { resolutionFacade.resolveImportReference(project, symbolDescriptor.module, it) } val symbolScope = getResolutionScope(symbolDescriptor) val scope = ChainedScope(symbolDescriptor, "ReplaceWith resolution scope", ExplicitImportsScope(explicitlyImportedSymbols), symbolScope)