Refactor QualifiedExpressionResolver: pass descriptor to check for visibility instead of scope

This commit is contained in:
Pavel V. Talanov
2015-05-13 17:08:05 +03:00
parent 5e0cc18be2
commit be66ee7015
5 changed files with 29 additions and 30 deletions
@@ -33,7 +33,7 @@ public class ImportDirectiveProcessor(
public fun processImportReference( public fun processImportReference(
importDirective: JetImportDirective, importDirective: JetImportDirective,
scope: JetScope, scope: JetScope,
scopeToCheckVisibility: JetScope, shouldBeVisibleFrom: DeclarationDescriptor,
trace: BindingTrace, trace: BindingTrace,
lookupMode: QualifiedExpressionResolver.LookupMode lookupMode: QualifiedExpressionResolver.LookupMode
): JetScope { ): JetScope {
@@ -47,13 +47,13 @@ public class ImportDirectiveProcessor(
val descriptors = if (importedReference is JetQualifiedExpression) { val descriptors = if (importedReference is 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
qualifiedExpressionResolver.lookupDescriptorsForQualifiedExpression( qualifiedExpressionResolver.lookupDescriptorsForQualifiedExpression(
importedReference, scope, scopeToCheckVisibility, trace, lookupMode, lookupMode.isEverything() importedReference, scope, shouldBeVisibleFrom, trace, lookupMode, lookupMode.isEverything()
) )
} }
else { else {
assert(importedReference is JetSimpleNameExpression) assert(importedReference is JetSimpleNameExpression)
qualifiedExpressionResolver.lookupDescriptorsForSimpleNameReference( qualifiedExpressionResolver.lookupDescriptorsForSimpleNameReference(
importedReference as JetSimpleNameExpression, scope, scopeToCheckVisibility, trace, lookupMode, true, lookupMode.isEverything() importedReference as JetSimpleNameExpression, scope, shouldBeVisibleFrom, trace, lookupMode, true, lookupMode.isEverything()
) )
} }
@@ -75,11 +75,11 @@ public class QualifiedExpressionResolver {
public JetScope processImportReference( public JetScope processImportReference(
@NotNull JetImportDirective importDirective, @NotNull JetImportDirective importDirective,
@NotNull JetScope scope, @NotNull JetScope scope,
@NotNull JetScope scopeToCheckVisibility, @NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull LookupMode lookupMode @NotNull LookupMode lookupMode
) { ) {
return importDirectiveProcessor.processImportReference(importDirective, scope, scopeToCheckVisibility, trace, lookupMode); return importDirectiveProcessor.processImportReference(importDirective, scope, shouldBeVisibleFrom, trace, lookupMode);
} }
@NotNull @NotNull
@@ -104,13 +104,14 @@ public class QualifiedExpressionResolver {
// We do not want to resolve the last segment of a user type to a package // We do not want to resolve the last segment of a user type to a package
JetScope filteredScope = filterOutPackagesIfNeeded(outerScope, onlyClassifiers); JetScope filteredScope = filterOutPackagesIfNeeded(outerScope, onlyClassifiers);
DeclarationDescriptor shouldBeVisibleFrom = outerScope.getContainingDeclaration();
if (qualifier == null) { if (qualifier == null) {
return lookupDescriptorsForSimpleNameReference(referenceExpression, filteredScope, outerScope, trace, return lookupDescriptorsForSimpleNameReference(referenceExpression, filteredScope, shouldBeVisibleFrom, trace,
LookupMode.ONLY_CLASSES_AND_PACKAGES, LookupMode.ONLY_CLASSES_AND_PACKAGES,
false, true); false, true);
} }
Collection<DeclarationDescriptor> declarationDescriptors = lookupDescriptorsForUserType(qualifier, outerScope, trace, false); Collection<DeclarationDescriptor> declarationDescriptors = lookupDescriptorsForUserType(qualifier, outerScope, trace, false);
return lookupSelectorDescriptors(referenceExpression, declarationDescriptors, trace, filteredScope, return lookupSelectorDescriptors(referenceExpression, declarationDescriptors, trace, shouldBeVisibleFrom,
LookupMode.ONLY_CLASSES_AND_PACKAGES, true); LookupMode.ONLY_CLASSES_AND_PACKAGES, true);
} }
@@ -135,7 +136,7 @@ public class QualifiedExpressionResolver {
public Collection<DeclarationDescriptor> lookupDescriptorsForQualifiedExpression( public Collection<DeclarationDescriptor> lookupDescriptorsForQualifiedExpression(
@NotNull JetQualifiedExpression importedReference, @NotNull JetQualifiedExpression importedReference,
@NotNull JetScope outerScope, @NotNull JetScope outerScope,
@NotNull JetScope scopeToCheckVisibility, @NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull LookupMode lookupMode, @NotNull LookupMode lookupMode,
boolean storeResult boolean storeResult
@@ -144,14 +145,14 @@ public class QualifiedExpressionResolver {
Collection<DeclarationDescriptor> declarationDescriptors; Collection<DeclarationDescriptor> declarationDescriptors;
if (receiverExpression instanceof JetQualifiedExpression) { if (receiverExpression instanceof JetQualifiedExpression) {
declarationDescriptors = declarationDescriptors =
lookupDescriptorsForQualifiedExpression((JetQualifiedExpression) receiverExpression, outerScope, scopeToCheckVisibility, lookupDescriptorsForQualifiedExpression((JetQualifiedExpression) receiverExpression, outerScope, shouldBeVisibleFrom,
trace, lookupMode, storeResult); trace, lookupMode, storeResult);
} }
else { else {
assert receiverExpression instanceof JetSimpleNameExpression; assert receiverExpression instanceof JetSimpleNameExpression;
declarationDescriptors = declarationDescriptors =
lookupDescriptorsForSimpleNameReference((JetSimpleNameExpression) receiverExpression, outerScope, lookupDescriptorsForSimpleNameReference((JetSimpleNameExpression) receiverExpression, outerScope,
scopeToCheckVisibility, trace, lookupMode, true, storeResult); shouldBeVisibleFrom, trace, lookupMode, true, storeResult);
} }
JetExpression selectorExpression = importedReference.getSelectorExpression(); JetExpression selectorExpression = importedReference.getSelectorExpression();
@@ -166,7 +167,7 @@ public class QualifiedExpressionResolver {
return Collections.emptyList(); return Collections.emptyList();
} }
return lookupSelectorDescriptors(selector, declarationDescriptors, trace, scopeToCheckVisibility, lookupMode, storeResult); return lookupSelectorDescriptors(selector, declarationDescriptors, trace, shouldBeVisibleFrom, lookupMode, storeResult);
} }
@NotNull @NotNull
@@ -174,7 +175,7 @@ public class QualifiedExpressionResolver {
@NotNull JetSimpleNameExpression selector, @NotNull JetSimpleNameExpression selector,
@NotNull Collection<DeclarationDescriptor> declarationDescriptors, @NotNull Collection<DeclarationDescriptor> declarationDescriptors,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility, @NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull LookupMode lookupMode, @NotNull LookupMode lookupMode,
boolean storeResult boolean storeResult
) { ) {
@@ -188,7 +189,7 @@ public class QualifiedExpressionResolver {
addResultsForClass(results, selector, lookupMode, (ClassDescriptor) declarationDescriptor); addResultsForClass(results, selector, lookupMode, (ClassDescriptor) declarationDescriptor);
} }
} }
return filterAndStoreResolutionResult(results, selector, trace, scopeToCheckVisibility, lookupMode, storeResult); return filterAndStoreResolutionResult(results, selector, trace, shouldBeVisibleFrom, lookupMode, storeResult);
} }
private static void addResultsForClass( private static void addResultsForClass(
@@ -211,14 +212,14 @@ public class QualifiedExpressionResolver {
public Collection<DeclarationDescriptor> lookupDescriptorsForSimpleNameReference( public Collection<DeclarationDescriptor> lookupDescriptorsForSimpleNameReference(
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope outerScope, @NotNull JetScope outerScope,
@NotNull JetScope scopeToCheckVisibility, @NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull LookupMode lookupMode, @NotNull LookupMode lookupMode,
boolean packageLevel, boolean packageLevel,
boolean storeResult boolean storeResult
) { ) {
LookupResult lookupResult = lookupSimpleNameReference(referenceExpression, outerScope, lookupMode, packageLevel); LookupResult lookupResult = lookupSimpleNameReference(referenceExpression, outerScope, lookupMode, packageLevel);
return filterAndStoreResolutionResult(Collections.singletonList(lookupResult), referenceExpression, trace, scopeToCheckVisibility, return filterAndStoreResolutionResult(Collections.singletonList(lookupResult), referenceExpression, trace, shouldBeVisibleFrom,
lookupMode, storeResult); lookupMode, storeResult);
} }
@@ -260,7 +261,7 @@ public class QualifiedExpressionResolver {
@NotNull Collection<LookupResult> lookupResults, @NotNull Collection<LookupResult> lookupResults,
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility, @NotNull DeclarationDescriptor shouldBeVisibleFrom,
@NotNull LookupMode lookupMode, @NotNull LookupMode lookupMode,
boolean storeResult boolean storeResult
) { ) {
@@ -304,7 +305,7 @@ public class QualifiedExpressionResolver {
} }
storeResolutionResult(descriptors, filteredDescriptors, referenceExpression, possibleResolutionScopes, trace, storeResolutionResult(descriptors, filteredDescriptors, referenceExpression, possibleResolutionScopes, trace,
scopeToCheckVisibility); shouldBeVisibleFrom);
} }
return filteredDescriptors; return filteredDescriptors;
@@ -316,7 +317,7 @@ public class QualifiedExpressionResolver {
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull Collection<JetScope> possibleResolutionScopes, @NotNull Collection<JetScope> possibleResolutionScopes,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility @NotNull DeclarationDescriptor shouldBeVisibleFrom
) { ) {
assert canBeImportedDescriptors.size() <= descriptors.size(); assert canBeImportedDescriptors.size() <= descriptors.size();
assert !possibleResolutionScopes.isEmpty(); assert !possibleResolutionScopes.isEmpty();
@@ -324,7 +325,7 @@ public class QualifiedExpressionResolver {
JetScope resolutionScope = possibleResolutionScopes.iterator().next(); JetScope resolutionScope = possibleResolutionScopes.iterator().next();
// A special case - will fill all trace information // A special case - will fill all trace information
if (resolveClassPackageAmbiguity(canBeImportedDescriptors, referenceExpression, resolutionScope, trace, scopeToCheckVisibility)) { if (resolveClassPackageAmbiguity(canBeImportedDescriptors, referenceExpression, resolutionScope, trace, shouldBeVisibleFrom)) {
return; return;
} }
@@ -353,7 +354,7 @@ public class QualifiedExpressionResolver {
} }
if (descriptor instanceof DeclarationDescriptorWithVisibility) { if (descriptor instanceof DeclarationDescriptorWithVisibility) {
checkVisibility((DeclarationDescriptorWithVisibility) descriptor, trace, referenceExpression, scopeToCheckVisibility); checkVisibility((DeclarationDescriptorWithVisibility) descriptor, trace, referenceExpression, shouldBeVisibleFrom);
} }
} }
@@ -379,7 +380,7 @@ public class QualifiedExpressionResolver {
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope resolutionScope, @NotNull JetScope resolutionScope,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetScope scopeToCheckVisibility @NotNull DeclarationDescriptor shouldBeVisibleFrom
) { ) {
if (filteredDescriptors.size() == 2) { if (filteredDescriptors.size() == 2) {
PackageViewDescriptor packageView = null; PackageViewDescriptor packageView = null;
@@ -398,7 +399,7 @@ public class QualifiedExpressionResolver {
if (packageView.getFqName().equalsTo(DescriptorUtils.getFqName(classDescriptor))) { if (packageView.getFqName().equalsTo(DescriptorUtils.getFqName(classDescriptor))) {
trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, classDescriptor); trace.record(BindingContext.REFERENCE_TARGET, referenceExpression, classDescriptor);
trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope); trace.record(BindingContext.RESOLUTION_SCOPE, referenceExpression, resolutionScope);
checkVisibility(classDescriptor, trace, referenceExpression, scopeToCheckVisibility); checkVisibility(classDescriptor, trace, referenceExpression, shouldBeVisibleFrom);
return true; return true;
} }
} }
@@ -411,9 +412,9 @@ public class QualifiedExpressionResolver {
@NotNull DeclarationDescriptorWithVisibility descriptor, @NotNull DeclarationDescriptorWithVisibility descriptor,
@NotNull BindingTrace trace, @NotNull BindingTrace trace,
@NotNull JetSimpleNameExpression referenceExpression, @NotNull JetSimpleNameExpression referenceExpression,
@NotNull JetScope scopeToCheckVisibility @NotNull DeclarationDescriptor shouldBeVisibleFrom
) { ) {
if (!Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, scopeToCheckVisibility.getContainingDeclaration())) { if (!Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, shouldBeVisibleFrom)) {
Visibility visibility = descriptor.getVisibility(); Visibility visibility = descriptor.getVisibility();
if (PsiTreeUtil.getParentOfType(referenceExpression, JetImportDirective.class) != null && !visibility.mustCheckInImports()) { if (PsiTreeUtil.getParentOfType(referenceExpression, JetImportDirective.class) != null && !visibility.mustCheckInImports()) {
return; return;
@@ -101,7 +101,7 @@ class LazyImportResolver(
try { try {
val resolver = resolveSession.getQualifiedExpressionResolver() val resolver = resolveSession.getQualifiedExpressionResolver()
val directiveImportScope = resolver.processImportReference( val directiveImportScope = resolver.processImportReference(
directive, rootScope, packageView.getMemberScope(), traceForImportResolve, mode) directive, rootScope, packageView, traceForImportResolve, mode)
val descriptors = if (directive.isAllUnder()) emptyList() else directiveImportScope.getAllDescriptors() val descriptors = if (directive.isAllUnder()) emptyList() else directiveImportScope.getAllDescriptors()
if (mode == LookupMode.EVERYTHING) { if (mode == LookupMode.EVERYTHING) {
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.context.withModule
import org.jetbrains.kotlin.context.withProject import org.jetbrains.kotlin.context.withProject
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.di.InjectorForBodyResolve import org.jetbrains.kotlin.di.InjectorForBodyResolve
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -421,14 +420,13 @@ public abstract class ElementResolver protected(
val filePackage = resolveSession.getModuleDescriptor().getPackage(fqName) val filePackage = resolveSession.getModuleDescriptor().getPackage(fqName)
?: error("File package should be already resolved and be found") ?: error("File package should be already resolved and be found")
val scope = filePackage.getMemberScope()
val descriptors = if (element is JetDotQualifiedExpression) { val descriptors = if (element is JetDotQualifiedExpression) {
qualifiedExpressionResolver.lookupDescriptorsForQualifiedExpression( qualifiedExpressionResolver.lookupDescriptorsForQualifiedExpression(
element, rootPackage.getMemberScope(), scope, trace, QualifiedExpressionResolver.LookupMode.EVERYTHING, false) element, rootPackage.getMemberScope(), filePackage, trace, QualifiedExpressionResolver.LookupMode.EVERYTHING, false)
} }
else { else {
qualifiedExpressionResolver.lookupDescriptorsForSimpleNameReference( qualifiedExpressionResolver.lookupDescriptorsForSimpleNameReference(
element as JetSimpleNameExpression, rootPackage.getMemberScope(), scope, trace, QualifiedExpressionResolver.LookupMode.EVERYTHING, false, false) element as JetSimpleNameExpression, rootPackage.getMemberScope(), filePackage, trace, QualifiedExpressionResolver.LookupMode.EVERYTHING, false, false)
} }
return descriptors.firstIsInstanceOrNull<PackageViewDescriptor>()?.getMemberScope() return descriptors.firstIsInstanceOrNull<PackageViewDescriptor>()?.getMemberScope()
@@ -228,7 +228,7 @@ private class ResolutionFacadeImpl(private val project: Project, private val cac
val scope = JetModuleUtil.getImportsResolutionScope(moduleDescriptor, !isDefaultImport) val scope = JetModuleUtil.getImportsResolutionScope(moduleDescriptor, !isDefaultImport)
val resolver = resolveSession.getQualifiedExpressionResolver() val resolver = resolveSession.getQualifiedExpressionResolver()
return resolver.processImportReference( return resolver.processImportReference(
importDirective, scope, scope, BindingTraceContext(), QualifiedExpressionResolver.LookupMode.EVERYTHING).getAllDescriptors() importDirective, moduleDescriptor, scope, BindingTraceContext(), QualifiedExpressionResolver.LookupMode.EVERYTHING).getAllDescriptors()
} }
override fun <T> get(extension: CacheExtension<T>): T { override fun <T> get(extension: CacheExtension<T>): T {