From 812273cb2bc9684fda88904a3b67154c30b19620 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 4 Jun 2015 14:33:50 +0300 Subject: [PATCH] Fix a problem when invoking completion outside of source roots could lead to declarations from index being analyzed in a wrong resolution facade --- .../kotlin/idea/caches/resolve/ResolutionFacade.kt | 13 +++++++++++++ .../kotlin/idea/completion/AllClassesCompletion.kt | 3 ++- .../kotlin/idea/completion/CompletionSession.kt | 7 +++++-- .../jetbrains/kotlin/idea/quickfix/AutoImportFix.kt | 3 ++- 4 files changed, 22 insertions(+), 4 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 6c6fb041334..b8cdcca5c79 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.caches.resolve +import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -42,4 +43,16 @@ public trait ResolutionFacade { public fun findModuleDescriptor(element: JetElement): ModuleDescriptor public fun get(extension: CacheExtension): T + + companion object { + //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 + public fun getResolveScope(file: JetFile): GlobalSearchScope { + return when (file.getModuleInfo()) { + is ModuleSourceInfo -> file.getResolveScope() + else -> GlobalSearchScope.EMPTY_SCOPE + } + } + } } diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt index 648f2f9f501..5695484ee29 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/AllClassesCompletion.kt @@ -46,7 +46,8 @@ class AllClassesCompletion(val parameters: CompletionParameters, val filteredBuiltIns = builtIns.filter { kindFilter(it.getKind()) && prefixMatcher.prefixMatches(it.getName().asString()) } result.addDescriptorElements(filteredBuiltIns, suppressAutoInsertion = true) - val helper = KotlinIndicesHelper(scope.getProject(), resolutionFacade, bindingContext, scope, moduleDescriptor, visibilityFilter) + val project = parameters.getOriginalFile().getProject() + val helper = KotlinIndicesHelper(project, resolutionFacade, bindingContext, scope, moduleDescriptor, visibilityFilter) result.addDescriptorElements(helper.getClassDescriptors({ prefixMatcher.prefixMatches(it) }, kindFilter), suppressAutoInsertion = true) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index c87d312ea8d..2bae535f0c1 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -43,7 +43,10 @@ import org.jetbrains.kotlin.idea.util.makeNotNullable import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptorKindExclude import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.isAncestor +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf +import org.jetbrains.kotlin.psi.psiUtil.prevLeaf import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.resolve.calls.callUtil.getCall @@ -157,7 +160,7 @@ abstract class CompletionSessionBase(protected val configuration: CompletionSess protected val project: Project = position.getProject() - protected val originalSearchScope: GlobalSearchScope = parameters.getOriginalFile().getResolveScope() + protected val originalSearchScope: GlobalSearchScope = ResolutionFacade.getResolveScope(parameters.getOriginalFile() as JetFile) // we need to exclude the original file from scope because our resolve session is built with this file replaced by synthetic one protected val searchScope: GlobalSearchScope = object : DelegatingGlobalSearchScope(originalSearchScope) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt index dc824fbc903..c528b5863ca 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AutoImportFix.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.JetBundle import org.jetbrains.kotlin.idea.actions.JetAddImportAction +import org.jetbrains.kotlin.idea.caches.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper import org.jetbrains.kotlin.idea.core.isVisible @@ -116,7 +117,7 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction