Fix visibility checker for import.
This commit is contained in:
@@ -117,14 +117,14 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
|
||||
importDirective: JetImportDirective,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
trace: BindingTrace,
|
||||
shouldBeVisibleFrom: DeclarationDescriptor // todo
|
||||
packageFragmentForVisibilityCheck: PackageFragmentDescriptor?
|
||||
): JetScope {
|
||||
val importedReference = importDirective.importedReference ?: return JetScope.Empty
|
||||
val path = importedReference.asQualifierPartList(trace)
|
||||
val lastPart = path.lastOrNull() ?: return JetScope.Empty
|
||||
|
||||
if (importDirective.isAllUnder) {
|
||||
val packageOrClassDescriptor = resolveToPackageOrClass(path, moduleDescriptor, trace, shouldBeVisibleFrom,
|
||||
val packageOrClassDescriptor = resolveToPackageOrClass(path, moduleDescriptor, trace, packageFragmentForVisibilityCheck,
|
||||
scopeForFirstPart = null, inImport = true) ?: return JetScope.Empty
|
||||
if (packageOrClassDescriptor is ClassDescriptor && packageOrClassDescriptor.kind.isSingleton) {
|
||||
trace.report(Errors.CANNOT_IMPORT_MEMBERS_FROM_SINGLETON.on(lastPart.expression, packageOrClassDescriptor)) // todo report on star
|
||||
@@ -136,12 +136,12 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
|
||||
else {
|
||||
val aliasName = JetPsiUtil.getAliasName(importDirective)
|
||||
if (aliasName == null) { // import kotlin.
|
||||
resolveToPackageOrClass(path, moduleDescriptor, trace, shouldBeVisibleFrom, scopeForFirstPart = null, inImport = true)
|
||||
resolveToPackageOrClass(path, moduleDescriptor, trace, packageFragmentForVisibilityCheck, scopeForFirstPart = null, inImport = true)
|
||||
return JetScope.Empty
|
||||
}
|
||||
|
||||
val packageOrClassDescriptor = resolveToPackageOrClass(path.subList(0, path.size() - 1), moduleDescriptor,
|
||||
trace, shouldBeVisibleFrom, scopeForFirstPart = null, inImport = true)
|
||||
trace, packageFragmentForVisibilityCheck, scopeForFirstPart = null, inImport = true)
|
||||
?: return JetScope.Empty
|
||||
val descriptors = SmartList<DeclarationDescriptor>()
|
||||
|
||||
@@ -167,7 +167,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
|
||||
else -> throw IllegalStateException("Should be class or package: $packageOrClassDescriptor")
|
||||
}
|
||||
if (descriptors.isNotEmpty()) {
|
||||
storageResult(trace, lastPart.expression, descriptors, shouldBeVisibleFrom, inImport = true, isQualifier = false)
|
||||
storageResult(trace, lastPart.expression, descriptors, packageFragmentForVisibilityCheck, inImport = true, isQualifier = false)
|
||||
}
|
||||
else {
|
||||
tryResolveDescriptorsWhichCannotBeImported(trace, moduleDescriptor, packageOrClassDescriptor, lastPart)
|
||||
@@ -249,7 +249,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
|
||||
path: List<QualifierPart>,
|
||||
moduleDescriptor: ModuleDescriptor,
|
||||
trace: BindingTrace,
|
||||
shouldBeVisibleFrom: DeclarationDescriptor,
|
||||
shouldBeVisibleFrom: DeclarationDescriptor?,
|
||||
scopeForFirstPart: LexicalScope?,
|
||||
inImport: Boolean
|
||||
): DeclarationDescriptor? {
|
||||
|
||||
@@ -60,10 +60,13 @@ public class FileScopeProviderImpl(
|
||||
val packageFragment = topLevelDescriptorProvider.getPackageFragment(file.getPackageFqName())
|
||||
.sure { "Could not find fragment ${file.getPackageFqName()} for file ${file.getName()}" }
|
||||
|
||||
val aliasImportResolver = LazyImportResolver(storageManager, qualifiedExpressionResolver, this, moduleDescriptor, AliasImportsIndexed(imports), bindingTrace)
|
||||
val allUnderImportResolver = LazyImportResolver(storageManager, qualifiedExpressionResolver, this, moduleDescriptor, AllUnderImportsIndexed(imports), bindingTrace)
|
||||
val defaultAliasImportResolver = LazyImportResolver(storageManager, qualifiedExpressionResolver, this, moduleDescriptor, AliasImportsIndexed(defaultImports), tempTrace)
|
||||
val defaultAllUnderImportResolver = LazyImportResolver(storageManager, qualifiedExpressionResolver, this, moduleDescriptor, AllUnderImportsIndexed(defaultImports), tempTrace)
|
||||
fun createImportResolver(indexedImports: IndexedImports, trace: BindingTrace)
|
||||
= LazyImportResolver(storageManager, qualifiedExpressionResolver, this, moduleDescriptor, indexedImports, trace, packageFragment)
|
||||
|
||||
val aliasImportResolver = createImportResolver(AliasImportsIndexed(imports), bindingTrace)
|
||||
val allUnderImportResolver = createImportResolver(AllUnderImportsIndexed(imports), bindingTrace)
|
||||
val defaultAliasImportResolver = createImportResolver(AliasImportsIndexed(defaultImports), tempTrace)
|
||||
val defaultAllUnderImportResolver = createImportResolver(AllUnderImportsIndexed(defaultImports), tempTrace)
|
||||
|
||||
val scopeChain = ArrayList<JetScope>()
|
||||
|
||||
|
||||
@@ -70,7 +70,8 @@ class LazyImportResolver(
|
||||
val fileScopeProvider: FileScopeProvider,
|
||||
val moduleDescriptor: ModuleDescriptor,
|
||||
val indexedImports: IndexedImports,
|
||||
private val traceForImportResolve: BindingTrace
|
||||
private val traceForImportResolve: BindingTrace,
|
||||
private val packageFragment: PackageFragmentDescriptor
|
||||
) {
|
||||
private val importedScopesProvider = storageManager.createMemoizedFunction {
|
||||
directive: JetImportDirective -> ImportDirectiveResolveCache(directive)
|
||||
@@ -99,9 +100,8 @@ class LazyImportResolver(
|
||||
directiveUnderResolve = directive
|
||||
|
||||
try {
|
||||
// todo use packageViewFragment for visibility
|
||||
val directiveImportScope = qualifiedExpressionResolver.processImportReference(
|
||||
directive, moduleDescriptor, traceForImportResolve, moduleDescriptor)
|
||||
directive, moduleDescriptor, traceForImportResolve, packageFragment)
|
||||
val descriptors = if (directive.isAllUnder()) emptyList() else directiveImportScope.getAllDescriptors()
|
||||
|
||||
PlatformTypesMappedToKotlinChecker.checkPlatformTypesMappedToKotlin(moduleDescriptor, traceForImportResolve, directive, descriptors)
|
||||
|
||||
Reference in New Issue
Block a user