Refactor QualifiedExpressionResolver

- fix return types everywhere: Collection<DeclarationDescriptor> instead of
  Collection<? extends DeclarationDescriptor>
- delete useless LookupResult.EMPTY and merge LookupResult with
  SuccessfulLookupResult
- reformat, minor inlines, etc.
This commit is contained in:
Alexander Udalov
2014-09-09 16:15:14 +04:00
parent 5b1993f62a
commit 4d212be31f
4 changed files with 70 additions and 99 deletions
@@ -20,7 +20,6 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Collections2; import com.google.common.collect.Collections2;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import kotlin.jvm.KotlinSignature;
import org.jetbrains.annotations.Mutable; import org.jetbrains.annotations.Mutable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -52,19 +51,8 @@ public class QualifiedExpressionResolver {
EVERYTHING EVERYTHING
} }
@KotlinSignature("fun analyseImportReference(importDirective: JetImportDirective, scope: JetScope, trace: BindingTrace, module: ModuleDescriptor): Collection<out DeclarationDescriptor>")
@NotNull @NotNull
public Collection<? extends DeclarationDescriptor> analyseImportReference( public Collection<DeclarationDescriptor> processImportReference(
@NotNull JetImportDirective importDirective,
@NotNull JetScope scope,
@NotNull BindingTrace trace,
@NotNull ModuleDescriptor module
) {
return processImportReference(importDirective, scope, scope, Importer.DO_NOTHING, trace, module, LookupMode.EVERYTHING);
}
@NotNull
public Collection<? extends DeclarationDescriptor> processImportReference(
@NotNull JetImportDirective importDirective, @NotNull JetImportDirective importDirective,
@NotNull JetScope scope, @NotNull JetScope scope,
@NotNull JetScope scopeToCheckVisibility, @NotNull JetScope scopeToCheckVisibility,
@@ -82,17 +70,17 @@ public class QualifiedExpressionResolver {
return Collections.emptyList(); return Collections.emptyList();
} }
Collection<? extends DeclarationDescriptor> descriptors; Collection<DeclarationDescriptor> descriptors;
if (importedReference instanceof JetQualifiedExpression) { if (importedReference instanceof JetQualifiedExpression) {
//store result only when we find all descriptors, not only classes on the second phase //store result only when we find all descriptors, not only classes on the second phase
descriptors = lookupDescriptorsForQualifiedExpression( descriptors = lookupDescriptorsForQualifiedExpression(
(JetQualifiedExpression)importedReference, scope, scopeToCheckVisibility, trace, (JetQualifiedExpression) importedReference, scope, scopeToCheckVisibility, trace,
lookupMode, lookupMode == LookupMode.EVERYTHING); lookupMode, lookupMode == LookupMode.EVERYTHING);
} }
else { else {
assert importedReference instanceof JetSimpleNameExpression; assert importedReference instanceof JetSimpleNameExpression;
descriptors = lookupDescriptorsForSimpleNameReference( descriptors = lookupDescriptorsForSimpleNameReference(
(JetSimpleNameExpression)importedReference, scope, scopeToCheckVisibility, trace, (JetSimpleNameExpression) importedReference, scope, scopeToCheckVisibility, trace,
lookupMode, true, lookupMode == LookupMode.EVERYTHING); lookupMode, true, lookupMode == LookupMode.EVERYTHING);
} }
@@ -121,7 +109,7 @@ public class QualifiedExpressionResolver {
} }
private static boolean canImportMembersFrom( private static boolean canImportMembersFrom(
@NotNull Collection<? extends DeclarationDescriptor> descriptors, @NotNull Collection<DeclarationDescriptor> descriptors,
@NotNull JetSimpleNameExpression reference, @NotNull JetSimpleNameExpression reference,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull LookupMode lookupMode @NotNull LookupMode lookupMode
@@ -152,12 +140,11 @@ public class QualifiedExpressionResolver {
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull LookupMode lookupMode @NotNull LookupMode lookupMode
) { ) {
assert lookupMode == LookupMode.EVERYTHING; assert lookupMode == LookupMode.EVERYTHING;
if (descriptor instanceof PackageViewDescriptor) { if (descriptor instanceof PackageViewDescriptor) {
return true; return true;
} }
if (descriptor instanceof ClassDescriptor && !((ClassDescriptor)descriptor).getKind().isSingleton()) { if (descriptor instanceof ClassDescriptor && !((ClassDescriptor) descriptor).getKind().isSingleton()) {
return true; return true;
} }
trace.report(CANNOT_IMPORT_FROM_ELEMENT.on(reference, descriptor)); trace.report(CANNOT_IMPORT_FROM_ELEMENT.on(reference, descriptor));
@@ -165,7 +152,7 @@ public class QualifiedExpressionResolver {
} }
@NotNull @NotNull
public Collection<? extends DeclarationDescriptor> lookupDescriptorsForUserType( public Collection<DeclarationDescriptor> lookupDescriptorsForUserType(
@NotNull JetUserType userType, @NotNull JetUserType userType,
@NotNull JetScope outerScope, @NotNull JetScope outerScope,
@NotNull BindingTrace trace @NotNull BindingTrace trace
@@ -181,14 +168,15 @@ public class QualifiedExpressionResolver {
} }
JetUserType qualifier = userType.getQualifier(); JetUserType qualifier = userType.getQualifier();
if (qualifier == null) { if (qualifier == null) {
return lookupDescriptorsForSimpleNameReference(referenceExpression, outerScope, outerScope, trace, LookupMode.ONLY_CLASSES, false, true); return lookupDescriptorsForSimpleNameReference(referenceExpression, outerScope, outerScope, trace, LookupMode.ONLY_CLASSES,
false, true);
} }
Collection<? extends DeclarationDescriptor> declarationDescriptors = lookupDescriptorsForUserType(qualifier, outerScope, trace); Collection<DeclarationDescriptor> declarationDescriptors = lookupDescriptorsForUserType(qualifier, outerScope, trace);
return lookupSelectorDescriptors(referenceExpression, declarationDescriptors, trace, outerScope, LookupMode.ONLY_CLASSES, true); return lookupSelectorDescriptors(referenceExpression, declarationDescriptors, trace, outerScope, LookupMode.ONLY_CLASSES, true);
} }
@NotNull @NotNull
public Collection<? extends DeclarationDescriptor> lookupDescriptorsForQualifiedExpression( public Collection<DeclarationDescriptor> lookupDescriptorsForQualifiedExpression(
@NotNull JetQualifiedExpression importedReference, @NotNull JetQualifiedExpression importedReference,
@NotNull JetScope outerScope, @NotNull JetScope outerScope,
@NotNull JetScope scopeToCheckVisibility, @NotNull JetScope scopeToCheckVisibility,
@@ -197,7 +185,7 @@ public class QualifiedExpressionResolver {
boolean storeResult boolean storeResult
) { ) {
JetExpression receiverExpression = importedReference.getReceiverExpression(); JetExpression receiverExpression = importedReference.getReceiverExpression();
Collection<? extends DeclarationDescriptor> declarationDescriptors; Collection<DeclarationDescriptor> declarationDescriptors;
if (receiverExpression instanceof JetQualifiedExpression) { if (receiverExpression instanceof JetQualifiedExpression) {
declarationDescriptors = declarationDescriptors =
lookupDescriptorsForQualifiedExpression((JetQualifiedExpression) receiverExpression, outerScope, scopeToCheckVisibility, lookupDescriptorsForQualifiedExpression((JetQualifiedExpression) receiverExpression, outerScope, scopeToCheckVisibility,
@@ -215,7 +203,7 @@ public class QualifiedExpressionResolver {
return Collections.emptyList(); return Collections.emptyList();
} }
JetSimpleNameExpression selector = (JetSimpleNameExpression)selectorExpression; JetSimpleNameExpression selector = (JetSimpleNameExpression) selectorExpression;
JetSimpleNameExpression lastReference = JetPsiUtil.getLastReference(receiverExpression); JetSimpleNameExpression lastReference = JetPsiUtil.getLastReference(receiverExpression);
if (lastReference == null || !canImportMembersFrom(declarationDescriptors, lastReference, trace, lookupMode)) { if (lastReference == null || !canImportMembersFrom(declarationDescriptors, lastReference, trace, lookupMode)) {
return Collections.emptyList(); return Collections.emptyList();
@@ -225,19 +213,19 @@ public class QualifiedExpressionResolver {
} }
@NotNull @NotNull
private static Collection<? extends DeclarationDescriptor> lookupSelectorDescriptors( private static Collection<DeclarationDescriptor> lookupSelectorDescriptors(
@NotNull JetSimpleNameExpression selector, @NotNull JetSimpleNameExpression selector,
@NotNull Collection<? extends DeclarationDescriptor> declarationDescriptors, @NotNull Collection<DeclarationDescriptor> declarationDescriptors,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility, @NotNull JetScope scopeToCheckVisibility,
@NotNull LookupMode lookupMode, @NotNull LookupMode lookupMode,
boolean storeResult boolean storeResult
) { ) {
Set<SuccessfulLookupResult> results = Sets.newLinkedHashSet(); Set<LookupResult> results = Sets.newLinkedHashSet();
for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) { for (DeclarationDescriptor declarationDescriptor : declarationDescriptors) {
if (declarationDescriptor instanceof PackageViewDescriptor) { if (declarationDescriptor instanceof PackageViewDescriptor) {
addResult(results, lookupSimpleNameReference(selector, ((PackageViewDescriptor) declarationDescriptor).getMemberScope(), results.add(lookupSimpleNameReference(selector, ((PackageViewDescriptor) declarationDescriptor).getMemberScope(),
lookupMode, true)); lookupMode, true));
} }
if (declarationDescriptor instanceof ClassDescriptor) { if (declarationDescriptor instanceof ClassDescriptor) {
addResultsForClass(results, selector, lookupMode, (ClassDescriptor) declarationDescriptor); addResultsForClass(results, selector, lookupMode, (ClassDescriptor) declarationDescriptor);
@@ -247,7 +235,7 @@ public class QualifiedExpressionResolver {
} }
private static void addResultsForClass( private static void addResultsForClass(
@NotNull @Mutable Set<SuccessfulLookupResult> results, @NotNull @Mutable Set<LookupResult> results,
@NotNull JetSimpleNameExpression selector, @NotNull JetSimpleNameExpression selector,
@NotNull LookupMode lookupMode, @NotNull LookupMode lookupMode,
@NotNull ClassDescriptor descriptor @NotNull ClassDescriptor descriptor
@@ -255,9 +243,9 @@ public class QualifiedExpressionResolver {
JetScope scope = lookupMode == LookupMode.ONLY_CLASSES JetScope scope = lookupMode == LookupMode.ONLY_CLASSES
? descriptor.getUnsubstitutedInnerClassesScope() ? descriptor.getUnsubstitutedInnerClassesScope()
: descriptor.getDefaultType().getMemberScope(); : descriptor.getDefaultType().getMemberScope();
addResult(results, lookupSimpleNameReference(selector, scope, lookupMode, false)); results.add(lookupSimpleNameReference(selector, scope, lookupMode, false));
addResult(results, lookupSimpleNameReference(selector, descriptor.getStaticScope(), lookupMode, true)); results.add(lookupSimpleNameReference(selector, descriptor.getStaticScope(), lookupMode, true));
ClassDescriptor classObject = descriptor.getClassObjectDescriptor(); ClassDescriptor classObject = descriptor.getClassObjectDescriptor();
if (classObject != null) { if (classObject != null) {
@@ -265,16 +253,10 @@ public class QualifiedExpressionResolver {
} }
} }
private static void addResult(@NotNull Set<SuccessfulLookupResult> results, @NotNull LookupResult result) {
if (result != LookupResult.EMPTY) {
results.add((SuccessfulLookupResult) result);
}
}
@NotNull @NotNull
@SuppressWarnings("MethodMayBeStatic") @SuppressWarnings("MethodMayBeStatic")
public Collection<? extends DeclarationDescriptor> lookupDescriptorsForSimpleNameReference( public Collection<DeclarationDescriptor> lookupDescriptorsForSimpleNameReference(
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope outerScope, @NotNull JetScope outerScope,
@NotNull JetScope scopeToCheckVisibility, @NotNull JetScope scopeToCheckVisibility,
@@ -284,9 +266,8 @@ public class QualifiedExpressionResolver {
boolean storeResult boolean storeResult
) { ) {
LookupResult lookupResult = lookupSimpleNameReference(referenceExpression, outerScope, lookupMode, packageLevel); LookupResult lookupResult = lookupSimpleNameReference(referenceExpression, outerScope, lookupMode, packageLevel);
if (lookupResult == LookupResult.EMPTY) return Collections.emptyList(); return filterAndStoreResolutionResult(Collections.singletonList(lookupResult), referenceExpression, trace, scopeToCheckVisibility,
return filterAndStoreResolutionResult(Collections.singletonList((SuccessfulLookupResult) lookupResult), referenceExpression, trace, lookupMode, storeResult);
scopeToCheckVisibility, lookupMode, storeResult);
} }
@NotNull @NotNull
@@ -298,7 +279,7 @@ public class QualifiedExpressionResolver {
) { ) {
Name referencedName = referenceExpression.getReferencedNameAsName(); Name referencedName = referenceExpression.getReferencedNameAsName();
Set<DeclarationDescriptor> descriptors = Sets.newHashSet(); Collection<DeclarationDescriptor> descriptors = Sets.newLinkedHashSet();
PackageViewDescriptor packageDescriptor = outerScope.getPackage(referencedName); PackageViewDescriptor packageDescriptor = outerScope.getPackage(referencedName);
if (packageDescriptor != null) { if (packageDescriptor != null) {
descriptors.add(packageDescriptor); descriptors.add(packageDescriptor);
@@ -318,12 +299,13 @@ public class QualifiedExpressionResolver {
descriptors.add(localVariable); descriptors.add(localVariable);
} }
} }
return new SuccessfulLookupResult(descriptors, outerScope, packageLevel);
return new LookupResult(descriptors, outerScope, packageLevel);
} }
@NotNull @NotNull
private static Collection<? extends DeclarationDescriptor> filterAndStoreResolutionResult( private static Collection<DeclarationDescriptor> filterAndStoreResolutionResult(
@NotNull Collection<SuccessfulLookupResult> lookupResults, @NotNull Collection<LookupResult> lookupResults,
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility, @NotNull JetScope scopeToCheckVisibility,
@@ -335,18 +317,18 @@ public class QualifiedExpressionResolver {
} }
Collection<DeclarationDescriptor> descriptors = Sets.newLinkedHashSet(); Collection<DeclarationDescriptor> descriptors = Sets.newLinkedHashSet();
for (SuccessfulLookupResult lookupResult : lookupResults) { for (LookupResult lookupResult : lookupResults) {
descriptors.addAll(lookupResult.descriptors); descriptors.addAll(lookupResult.descriptors);
} }
Collection<JetScope> possibleResolutionScopes = Lists.newArrayList(); Collection<JetScope> possibleResolutionScopes = Lists.newArrayList();
for (SuccessfulLookupResult lookupResult : lookupResults) { for (LookupResult lookupResult : lookupResults) {
if (!lookupResult.descriptors.isEmpty()) { if (!lookupResult.descriptors.isEmpty()) {
possibleResolutionScopes.add(lookupResult.resolutionScope); possibleResolutionScopes.add(lookupResult.resolutionScope);
} }
} }
if (possibleResolutionScopes.isEmpty()) { if (possibleResolutionScopes.isEmpty()) {
for (SuccessfulLookupResult lookupResult : lookupResults) { for (LookupResult lookupResult : lookupResults) {
possibleResolutionScopes.add(lookupResult.resolutionScope); possibleResolutionScopes.add(lookupResult.resolutionScope);
} }
} }
@@ -358,24 +340,27 @@ public class QualifiedExpressionResolver {
else { else {
filteredDescriptors = Sets.newLinkedHashSet(); filteredDescriptors = Sets.newLinkedHashSet();
//functions and properties can be imported if lookupResult.packageLevel == true //functions and properties can be imported if lookupResult.packageLevel == true
for (SuccessfulLookupResult lookupResult : lookupResults) { for (LookupResult lookupResult : lookupResults) {
if (lookupResult.packageLevel) { if (lookupResult.packageLevel) {
filteredDescriptors.addAll(lookupResult.descriptors); filteredDescriptors.addAll(lookupResult.descriptors);
continue;
} }
filteredDescriptors.addAll(Collections2.filter(lookupResult.descriptors, CLASSIFIERS_AND_PACKAGE_VIEWS)); else {
filteredDescriptors.addAll(Collections2.filter(lookupResult.descriptors, CLASSIFIERS_AND_PACKAGE_VIEWS));
}
} }
} }
if (storeResult) { if (storeResult) {
storeResolutionResult(descriptors, filteredDescriptors, referenceExpression, possibleResolutionScopes, trace, storeResolutionResult(descriptors, filteredDescriptors, referenceExpression, possibleResolutionScopes, trace,
scopeToCheckVisibility); scopeToCheckVisibility);
} }
return filteredDescriptors; return filteredDescriptors;
} }
private static void storeResolutionResult( private static void storeResolutionResult(
@NotNull Collection<? extends DeclarationDescriptor> descriptors, @NotNull Collection<DeclarationDescriptor> descriptors,
@NotNull Collection<? extends DeclarationDescriptor> canBeImportedDescriptors, @NotNull Collection<DeclarationDescriptor> canBeImportedDescriptors,
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull Collection<JetScope> possibleResolutionScopes, @NotNull Collection<JetScope> possibleResolutionScopes,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@@ -412,7 +397,7 @@ public class QualifiedExpressionResolver {
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope); trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope);
if (descriptor instanceof DeclarationDescriptorWithVisibility) { if (descriptor instanceof DeclarationDescriptorWithVisibility) {
checkVisibility((DeclarationDescriptorWithVisibility)descriptor, trace, referenceExpression, scopeToCheckVisibility); checkVisibility((DeclarationDescriptorWithVisibility) descriptor, trace, referenceExpression, scopeToCheckVisibility);
} }
} }
@@ -434,23 +419,22 @@ public class QualifiedExpressionResolver {
* @return <code>true</code> if method has successfully resolved ambiguity * @return <code>true</code> if method has successfully resolved ambiguity
*/ */
private static boolean resolveClassPackageAmbiguity( private static boolean resolveClassPackageAmbiguity(
@NotNull Collection<? extends DeclarationDescriptor> filteredDescriptors, @NotNull Collection<DeclarationDescriptor> filteredDescriptors,
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope resolutionScope, @NotNull JetScope resolutionScope,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility @NotNull JetScope scopeToCheckVisibility
) { ) {
if (filteredDescriptors.size() == 2) { if (filteredDescriptors.size() == 2) {
PackageViewDescriptor packageView = null; PackageViewDescriptor packageView = null;
ClassDescriptor classDescriptor = null; ClassDescriptor classDescriptor = null;
for (DeclarationDescriptor filteredDescriptor : filteredDescriptors) { for (DeclarationDescriptor filteredDescriptor : filteredDescriptors) {
if (filteredDescriptor instanceof PackageViewDescriptor) { if (filteredDescriptor instanceof PackageViewDescriptor) {
packageView = (PackageViewDescriptor)filteredDescriptor; packageView = (PackageViewDescriptor) filteredDescriptor;
} }
else if (filteredDescriptor instanceof ClassDescriptor) { else if (filteredDescriptor instanceof ClassDescriptor) {
classDescriptor = (ClassDescriptor)filteredDescriptor; classDescriptor = (ClassDescriptor) filteredDescriptor;
} }
} }
@@ -480,19 +464,15 @@ public class QualifiedExpressionResolver {
} }
} }
private interface LookupResult { private static class LookupResult {
LookupResult EMPTY = new LookupResult() { private final Collection<DeclarationDescriptor> descriptors;
}; private final JetScope resolutionScope;
} private final boolean packageLevel;
private static class SuccessfulLookupResult implements LookupResult { public LookupResult(
final Collection<? extends DeclarationDescriptor> descriptors; @NotNull Collection<DeclarationDescriptor> descriptors,
final JetScope resolutionScope; @NotNull JetScope resolutionScope,
final boolean packageLevel; boolean packageLevel
private SuccessfulLookupResult(Collection<? extends DeclarationDescriptor> descriptors,
JetScope resolutionScope,
boolean packageLevel
) { ) {
this.descriptors = descriptors; this.descriptors = descriptors;
this.resolutionScope = resolutionScope; this.resolutionScope = resolutionScope;
@@ -29,7 +29,6 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -313,8 +312,7 @@ public class TypeResolver {
@Nullable @Nullable
public ClassifierDescriptor resolveClass(JetScope scope, JetUserType userType, BindingTrace trace) { public ClassifierDescriptor resolveClass(JetScope scope, JetUserType userType, BindingTrace trace) {
Collection<? extends DeclarationDescriptor> descriptors = qualifiedExpressionResolver.lookupDescriptorsForUserType(userType, scope, trace); for (DeclarationDescriptor descriptor : qualifiedExpressionResolver.lookupDescriptorsForUserType(userType, scope, trace)) {
for (DeclarationDescriptor descriptor : descriptors) {
if (descriptor instanceof ClassifierDescriptor) { if (descriptor instanceof ClassifierDescriptor) {
ImportsResolver.reportPlatformClassMappedToKotlin(moduleDescriptor, trace, userType, descriptor); ImportsResolver.reportPlatformClassMappedToKotlin(moduleDescriptor, trace, userType, descriptor);
return (ClassifierDescriptor) descriptor; return (ClassifierDescriptor) descriptor;
@@ -388,9 +388,9 @@ public class ElementResolver {
if (expression.getParent() instanceof JetUserType) { if (expression.getParent() instanceof JetUserType) {
JetUserType qualifier = ((JetUserType) expression.getParent()).getQualifier(); JetUserType qualifier = ((JetUserType) expression.getParent()).getQualifier();
if (qualifier != null) { if (qualifier != null) {
Collection<? extends DeclarationDescriptor> descriptors = qualifiedExpressionResolver JetScope resolutionScope = getExpressionResolutionScope(resolveSession, expression);
.lookupDescriptorsForUserType(qualifier, getExpressionResolutionScope(resolveSession, expression), trace); Collection<DeclarationDescriptor> descriptors =
qualifiedExpressionResolver.lookupDescriptorsForUserType(qualifier, resolutionScope, trace);
for (DeclarationDescriptor descriptor : descriptors) { for (DeclarationDescriptor descriptor : descriptors) {
if (descriptor instanceof LazyPackageDescriptor) { if (descriptor instanceof LazyPackageDescriptor) {
return ((LazyPackageDescriptor) descriptor).getMemberScope(); return ((LazyPackageDescriptor) descriptor).getMemberScope();
@@ -18,37 +18,23 @@ package org.jetbrains.jet.plugin.caches
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies import org.jetbrains.jet.plugin.project.ResolveSessionForBodies
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.plugin.stubindex.JetTopLevelObjectShortNameIndex import org.jetbrains.jet.plugin.stubindex.*
import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils import org.jetbrains.jet.lang.resolve.lazy.ResolveSessionUtils
import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.resolve.name.FqName
import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor import org.jetbrains.jet.lang.resolve.*
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.plugin.stubindex.JetTopLevelNonExtensionFunctionShortNameIndex
import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex
import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex
import org.jetbrains.jet.lang.psi.JetSimpleNameExpression
import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression
import org.jetbrains.jet.lang.types.JetType import org.jetbrains.jet.lang.types.JetType
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex
import org.jetbrains.jet.lang.resolve.scopes.JetScope import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.lang.psi.JetPsiFactory
import org.jetbrains.jet.lang.resolve.ImportPath
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver
import org.jetbrains.jet.lang.resolve.BindingTraceContext
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import java.util.HashSet 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.scopes.receivers.ExpressionReceiver
import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.jet.lang.resolve.bindingContextUtil.getDataFlowInfo
import org.jetbrains.jet.lang.resolve.QualifiedExpressionResolver.LookupMode
public class KotlinIndicesHelper(private val project: Project) { public class KotlinIndicesHelper(private val project: Project) {
public fun getTopLevelObjects(nameFilter: (String) -> Boolean, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<ClassDescriptor> { public fun getTopLevelObjects(nameFilter: (String) -> Boolean, resolveSession: ResolveSessionForBodies, scope: GlobalSearchScope): Collection<ClassDescriptor> {
@@ -174,7 +160,7 @@ public class KotlinIndicesHelper(private val project: Project) {
module: ModuleDescriptor, module: ModuleDescriptor,
bindingContext: BindingContext): List<CallableDescriptor> { bindingContext: BindingContext): List<CallableDescriptor> {
val importDirective = JetPsiFactory(receiverExpression).createImportDirective(callableFQN.asString()) val importDirective = JetPsiFactory(receiverExpression).createImportDirective(callableFQN.asString())
val declarationDescriptors = QualifiedExpressionResolver().analyseImportReference(importDirective, scope, BindingTraceContext(), module) val declarationDescriptors = analyzeImportReference(importDirective, scope, BindingTraceContext(), module)
val receiverValue = ExpressionReceiver(receiverExpression, receiverType) val receiverValue = ExpressionReceiver(receiverExpression, receiverType)
val dataFlowInfo = bindingContext.getDataFlowInfo(receiverExpression) val dataFlowInfo = bindingContext.getDataFlowInfo(receiverExpression)
@@ -206,7 +192,14 @@ public class KotlinIndicesHelper(private val project: Project) {
private fun findTopLevelCallables(fqName: FqName, context: JetExpression, jetScope: JetScope, resolveSession: ResolveSessionForBodies): Collection<CallableDescriptor> { private fun findTopLevelCallables(fqName: FqName, context: JetExpression, jetScope: JetScope, resolveSession: ResolveSessionForBodies): Collection<CallableDescriptor> {
val importDirective = JetPsiFactory(context.getProject()).createImportDirective(ImportPath(fqName, false)) val importDirective = JetPsiFactory(context.getProject()).createImportDirective(ImportPath(fqName, false))
val allDescriptors = QualifiedExpressionResolver().analyseImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor()) val allDescriptors = analyzeImportReference(importDirective, jetScope, BindingTraceContext(), resolveSession.getModuleDescriptor())
return allDescriptors.filterIsInstance(javaClass<CallableDescriptor>()).filter { it.getReceiverParameter() == null } return allDescriptors.filterIsInstance(javaClass<CallableDescriptor>()).filter { it.getReceiverParameter() == null }
} }
private fun analyzeImportReference(
importDirective: JetImportDirective, scope: JetScope, trace: BindingTrace, module: ModuleDescriptor
): Collection<DeclarationDescriptor> {
return QualifiedExpressionResolver().processImportReference(importDirective, scope, scope, Importer.DO_NOTHING, trace,
module, LookupMode.EVERYTHING)
}
} }