Moved too specific function out of ExpressionTypingUtils (and refactored it)

This commit is contained in:
Valentin Kipyatkov
2014-09-03 14:23:00 +04:00
parent 855cc2443f
commit 24bd6ec7de
2 changed files with 24 additions and 42 deletions
@@ -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<CallableDescriptor> 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<? extends DeclarationDescriptor> declarationDescriptors = new QualifiedExpressionResolver()
.analyseImportReference(importDirective, scope, new BindingTraceContext(), module);
List<CallableDescriptor> callableExtensionDescriptors = new ArrayList<CallableDescriptor>();
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.
*/
@@ -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<ClassDescriptor> {
@@ -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<CallableDescriptor> {
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<CallableDescriptor>())
.filter { it.getReceiverParameter() != null && ExpressionTypingUtils.checkIsExtensionCallable(receiverValue, it, bindingContext, dataFlowInfo) }
}
public fun getClassDescriptors(nameFilter: (String) -> Boolean, analyzer: KotlinCodeAnalyzer, scope: GlobalSearchScope): Collection<ClassDescriptor> {