diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index 1d40a61664f..d9e8871f3a2 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -17,8 +17,11 @@ package org.jetbrains.kotlin.idea.codeInsight -import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.CallType import org.jetbrains.kotlin.idea.util.ShadowedDeclarationsFilter import org.jetbrains.kotlin.idea.util.getImplicitReceiversWithInstance @@ -44,8 +47,7 @@ import java.util.LinkedHashSet public class ReferenceVariantsHelper( private val context: BindingContext, - private val moduleDescriptor: ModuleDescriptor, - private val project: Project, + private val resolutionFacade: ResolutionFacade, private val visibilityFilter: (DeclarationDescriptor) -> Boolean ) { public data class ReceiversData( @@ -68,7 +70,7 @@ public class ReferenceVariantsHelper( = getReferenceVariantsNoVisibilityFilter(expression, kindFilter, useRuntimeReceiverType, nameFilter) .filter(visibilityFilter) - variants = ShadowedDeclarationsFilter(context, moduleDescriptor, project).filter(variants, expression) + variants = ShadowedDeclarationsFilter(context, resolutionFacade).filter(variants, expression) if (filterOutJavaGettersAndSetters) { val accessorMethodsToRemove = HashSet() diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt index 21048a3115a..45fb2781ce5 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/resolve/ResolutionFacade.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.resolve +import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -26,6 +27,8 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode public interface ResolutionFacade { + public val project: Project + public fun analyze(element: JetElement, bodyResolveMode: BodyResolveMode = BodyResolveMode.FULL): BindingContext public fun analyzeFullyAndGetResult(elements: Collection): AnalysisResult diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index a0c90ad30df..8baadc2acd2 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -16,14 +16,15 @@ package org.jetbrains.kotlin.idea.util -import com.intellij.openapi.project.Project import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.frontend.di.createContainerForMacros import org.jetbrains.kotlin.idea.imports.importableFqName +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade +import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo +import org.jetbrains.kotlin.resolve.calls.CallResolver import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext @@ -39,10 +40,9 @@ import java.util.HashSet public class ShadowedDeclarationsFilter( private val bindingContext: BindingContext, - private val moduleDescriptor: ModuleDescriptor, - private val project: Project + private val resolutionFacade: ResolutionFacade ) { - private val psiFactory = JetPsiFactory(project) + private val psiFactory = JetPsiFactory(resolutionFacade.project) private val dummyExpressionFactory = DummyExpressionFactory(psiFactory) public fun filter(declarations: Collection, expression: JetSimpleNameExpression): Collection { @@ -165,7 +165,7 @@ public class ShadowedDeclarationsFilter( val context = BasicCallResolutionContext.create(bindingTrace, resolutionScope, newCall, TypeUtils.NO_EXPECTED_TYPE, dataFlowInfo, ContextDependency.INDEPENDENT, CheckArgumentTypesMode.CHECK_VALUE_ARGUMENTS, CallChecker.DoNothing, false) - val callResolver = createContainerForMacros(project, moduleDescriptor).callResolver + val callResolver = resolutionFacade.frontendService(calleeExpression) val results = if (isFunction) callResolver.resolveFunctionCall(context) else callResolver.resolveSimpleProperty(context) val resultingDescriptors = results.getResultingCalls().map { it.getResultingDescriptor() } val resultingOriginals = resultingDescriptors.mapTo(HashSet()) { it.getOriginal() } 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 ec764c4220c..9e18f56eeb3 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 @@ -38,7 +38,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.ResolveSession private class ResolutionFacadeImpl( - private val project: Project, + override val project: Project, computeModuleResolverProvider: () -> CachedValueProvider.Result ) : ResolutionFacade { private val resolverCache = SynchronizedCachedValue(project, computeModuleResolverProvider, trackValue = false) 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 251bde55379..91d2d84b07b 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 @@ -137,7 +137,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC protected val isVisibleFilter: (DeclarationDescriptor) -> Boolean = { isVisibleDescriptor(it) } - protected val referenceVariantsHelper: ReferenceVariantsHelper = ReferenceVariantsHelper(bindingContext, moduleDescriptor, project, isVisibleFilter) + protected val referenceVariantsHelper: ReferenceVariantsHelper = ReferenceVariantsHelper(bindingContext, resolutionFacade, isVisibleFilter) protected val receiversData: ReferenceVariantsHelper.ReceiversData? = nameExpression?.let { referenceVariantsHelper.getReferenceVariantsReceivers(it) } @@ -296,7 +296,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC } private fun Collection.filterShadowedNonImported(): Collection { - return ShadowedDeclarationsFilter(bindingContext, moduleDescriptor, project).filterNonImported(this, referenceVariants, nameExpression!!) + return ShadowedDeclarationsFilter(bindingContext, resolutionFacade).filterNonImported(this, referenceVariants, nameExpression!!) } protected fun addAllClasses(kindFilter: (ClassKind) -> Boolean) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/PackageDirectiveCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/PackageDirectiveCompletion.kt index 907701e62d1..abd4e953c9b 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/PackageDirectiveCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/PackageDirectiveCompletion.kt @@ -23,8 +23,6 @@ import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.patterns.PlatformPatterns import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper -import org.jetbrains.kotlin.idea.references.JetSimpleNameReference -import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetPackageDirective import org.jetbrains.kotlin.psi.JetSimpleNameExpression @@ -53,9 +51,8 @@ object PackageDirectiveCompletion { val resolutionFacade = expression.getResolutionFacade() val bindingContext = resolutionFacade.analyze(expression) - val moduleDescriptor = resolutionFacade.findModuleDescriptor(file) - val variants = ReferenceVariantsHelper(bindingContext, moduleDescriptor, file.getProject(), { true }).getPackageReferenceVariants(expression, prefixMatcher.asNameFilter()) + val variants = ReferenceVariantsHelper(bindingContext, resolutionFacade, { true }).getPackageReferenceVariants(expression, prefixMatcher.asNameFilter()) for (variant in variants) { val lookupElement = LookupElementFactory(resolutionFacade, listOf()).createLookupElement(variant, false) if (!lookupElement.getLookupString().contains(DUMMY_IDENTIFIER)) { diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt index 84cd625f00d..5b5151faca1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor -import org.jetbrains.kotlin.analyzer.analyzeInContext import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor @@ -25,6 +24,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.frontend.di.createContainerForMacros import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.core.getResolutionScope @@ -77,12 +77,13 @@ class UsePropertyAccessSyntaxIntention : JetSelfTargetingOffsetIndependentIntent val callee = callExpression.getCalleeExpression() as? JetSimpleNameExpression ?: return null - val bindingContext = callExpression.analyze(BodyResolveMode.PARTIAL) + val resolutionFacade = callExpression.getResolutionFacade() + val bindingContext = resolutionFacade.analyze(callExpression, BodyResolveMode.PARTIAL) val resolvedCall = callExpression.getResolvedCall(bindingContext) ?: return null if (!resolvedCall.getStatus().isSuccess()) return null val function = resolvedCall.getResultingDescriptor() as? FunctionDescriptor ?: return null - val resolutionScope = callExpression.getResolutionScope(bindingContext, callExpression.getResolutionFacade()) + val resolutionScope = callExpression.getResolutionScope(bindingContext, resolutionFacade) val property = findSyntheticProperty(function, resolutionScope) ?: return null val moduleDescriptor = callExpression.getResolutionFacade().findModuleDescriptor(callExpression) diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/JetFunctionParameterInfoHandler.java b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/JetFunctionParameterInfoHandler.java index fc232fc297f..01bf92079bd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/JetFunctionParameterInfoHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/JetFunctionParameterInfoHandler.java @@ -35,10 +35,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; -import org.jetbrains.kotlin.idea.resolve.ResolutionFacade; import org.jetbrains.kotlin.idea.caches.resolve.ResolvePackage; import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper; import org.jetbrains.kotlin.idea.core.CorePackage; +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade; import org.jetbrains.kotlin.lexer.JetTokens; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; @@ -386,7 +386,6 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith ResolutionFacade resolutionFacade = ResolvePackage.getResolutionFacade(callNameExpression.getContainingJetFile()); final BindingContext bindingContext = resolutionFacade.analyze(callNameExpression, BodyResolveMode.FULL); - ModuleDescriptor moduleDescriptor = resolutionFacade.findModuleDescriptor(callNameExpression); JetScope scope = bindingContext.get(BindingContext.RESOLUTION_SCOPE, callNameExpression); final DeclarationDescriptor placeDescriptor; @@ -413,7 +412,7 @@ public class JetFunctionParameterInfoHandler implements ParameterInfoHandlerWith return name.equals(refName); } }; - Collection variants = new ReferenceVariantsHelper(bindingContext, moduleDescriptor, file.getProject(), visibilityFilter).getReferenceVariants( + Collection variants = new ReferenceVariantsHelper(bindingContext, resolutionFacade, visibilityFilter).getReferenceVariants( callNameExpression, new DescriptorKindFilter(DescriptorKindFilter.FUNCTIONS_MASK | DescriptorKindFilter.CLASSIFIERS_MASK, Collections.emptyList()), nameFilter, false, false);