From 24bd6ec7dee87855071ddb60ca299aa097e089a9 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 3 Sep 2014 14:23:00 +0400 Subject: [PATCH] Moved too specific function out of ExpressionTypingUtils (and refactored it) --- .../expressions/ExpressionTypingUtils.java | 41 ------------------- .../jet/plugin/caches/KotlinIndicesHelper.kt | 25 ++++++++++- 2 files changed, 24 insertions(+), 42 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 7aa35d4f809..9bb06e8bc54 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -43,7 +43,6 @@ import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintsUtil; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.util.CallMaker; -import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScope; @@ -62,7 +61,6 @@ import static org.jetbrains.jet.lang.diagnostics.Errors.*; import static org.jetbrains.jet.lang.psi.PsiPackage.JetPsiFactory; import static org.jetbrains.jet.lang.resolve.BindingContext.*; import static org.jetbrains.jet.lang.types.TypeUtils.noExpectedType; -import static org.jetbrains.jet.lang.resolve.bindingContextUtil.BindingContextUtilPackage.getDataFlowInfo; public class ExpressionTypingUtils { @@ -189,45 +187,6 @@ public class ExpressionTypingUtils { } } - /** - * Check that function or property with the given qualified name can be resolved in given scope and called on given receiver - * - * @param callableFQN - * @param scope - * @return - */ - @NotNull - public static List canFindSuitableCall( - @NotNull FqName callableFQN, - @NotNull JetExpression receiverExpression, - @NotNull JetType receiverType, - @NotNull JetScope scope, - @NotNull ModuleDescriptor module, - @NotNull BindingContext bindingContext - ) { - JetImportDirective importDirective = JetPsiFactory(receiverExpression).createImportDirective(callableFQN.asString()); - - Collection declarationDescriptors = new QualifiedExpressionResolver() - .analyseImportReference(importDirective, scope, new BindingTraceContext(), module); - - List callableExtensionDescriptors = new ArrayList(); - ReceiverValue receiverValue = new ExpressionReceiver(receiverExpression, receiverType); - - DataFlowInfo dataFlowInfo = getDataFlowInfo(bindingContext, receiverExpression); - - for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) { - if (declarationDescriptor instanceof CallableDescriptor) { - CallableDescriptor callableDescriptor = (CallableDescriptor) declarationDescriptor; - - if (checkIsExtensionCallable(receiverValue, callableDescriptor, bindingContext, dataFlowInfo)) { - callableExtensionDescriptors.add(callableDescriptor); - } - } - } - - return callableExtensionDescriptors; - } - /* * Checks if receiver declaration could be resolved to call expected receiver. */ diff --git a/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt b/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt index ed0ed2b421a..dc23dd9dd70 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt +++ b/idea/src/org/jetbrains/jet/plugin/caches/KotlinIndicesHelper.kt @@ -46,6 +46,9 @@ import com.intellij.openapi.project.Project import java.util.HashSet import org.jetbrains.jet.lang.descriptors.PropertyDescriptor import org.jetbrains.jet.plugin.stubindex.JetTopLevelNonExtensionPropertyShortNameIndex +import org.jetbrains.jet.lang.descriptors.ModuleDescriptor +import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver +import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo public class KotlinIndicesHelper(private val project: Project) { public fun getTopLevelObjects(nameFilter: (String) -> Boolean, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection { @@ -158,7 +161,27 @@ public class KotlinIndicesHelper(private val project: Project) { return allFqNames .filter { nameFilter(it.shortName().asString()) } .toSet() - .flatMap { ExpressionTypingUtils.canFindSuitableCall(it, receiverExpression, expressionType, jetScope, resolveSession.getModuleDescriptor(), context) } + .flatMap { findSuitableExtensions(it, receiverExpression, expressionType, jetScope, resolveSession.getModuleDescriptor(), context) } + } + + /** + * Check that function or property with the given qualified name can be resolved in given scope and called on given receiver + */ + private fun findSuitableExtensions(callableFQN: FqName, + receiverExpression: JetExpression, + receiverType: JetType, + scope: JetScope, + module: ModuleDescriptor, + bindingContext: BindingContext): List { + val importDirective = JetPsiFactory(receiverExpression).createImportDirective(callableFQN.asString()) + val declarationDescriptors = QualifiedExpressionResolver().analyseImportReference(importDirective, scope, BindingTraceContext(), module) + + val receiverValue = ExpressionReceiver(receiverExpression, receiverType) + val dataFlowInfo = bindingContext.getDataFlowInfo(receiverExpression) + + return declarationDescriptors + .filterIsInstance(javaClass()) + .filter { it.getReceiverParameter() != null && ExpressionTypingUtils.checkIsExtensionCallable(receiverValue, it, bindingContext, dataFlowInfo) } } public fun getClassDescriptors(nameFilter: (String) -> Boolean, analyzer: KotlinCodeAnalyzer, scope: GlobalSearchScope): Collection {