From 5035de24ac70fcba244f93eec9bd71eb141ca411 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 20 Feb 2019 20:35:34 +0300 Subject: [PATCH] Code fragments: Use file scope as a fallback when a more specific one is not available --- .../caches/resolve/CodeFragmentAnalyzer.kt | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt index 4771f695099..f2e04e12655 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/CodeFragmentAnalyzer.kt @@ -17,8 +17,7 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.ClassDescriptorWithResolutionScopes +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.project.ResolveElementCache import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.psi.* @@ -29,10 +28,7 @@ import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfoAfter import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.ResolveSession -import org.jetbrains.kotlin.resolve.scopes.ExplicitImportsScope -import org.jetbrains.kotlin.resolve.scopes.ImportingScope -import org.jetbrains.kotlin.resolve.scopes.LexicalScope -import org.jetbrains.kotlin.resolve.scopes.utils.ErrorLexicalScope +import org.jetbrains.kotlin.resolve.scopes.* import org.jetbrains.kotlin.resolve.scopes.utils.addImportingScopes import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices @@ -134,7 +130,15 @@ class CodeFragmentAnalyzer( } } - val scopeWithImports = enrichScopeWithImports(scope ?: ErrorLexicalScope(), codeFragment) + if (scope == null) { + val containingKtFile = codeFragment.context?.containingFile as? KtFile + if (containingKtFile != null) { + bindingContext = resolveSession.bindingContext + scope = resolveSession.fileScopeProvider.getFileResolutionScope(containingKtFile) + } + } + + val scopeWithImports = enrichScopeWithImports(scope ?: createEmptyScope(resolveSession.moduleDescriptor), codeFragment) return ContextAnalysisResult(bindingContext, scopeWithImports, dataFlowInfo) } @@ -198,4 +202,8 @@ class CodeFragmentAnalyzer( ) } } -} + + private fun createEmptyScope(moduleDescriptor: ModuleDescriptor): LexicalScope { + return LexicalScope.Base(ImportingScope.Empty, moduleDescriptor) + } +} \ No newline at end of file