Minor. Extract many properties to ImportResolutionComponents
This commit is contained in:
@@ -38,17 +38,12 @@ data class FileScopes(val lexicalScope: LexicalScope, val importingScope: Import
|
|||||||
|
|
||||||
class FileScopeFactory(
|
class FileScopeFactory(
|
||||||
private val topLevelDescriptorProvider: TopLevelDescriptorProvider,
|
private val topLevelDescriptorProvider: TopLevelDescriptorProvider,
|
||||||
private val storageManager: StorageManager,
|
|
||||||
private val moduleDescriptor: ModuleDescriptor,
|
|
||||||
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
|
|
||||||
private val bindingTrace: BindingTrace,
|
private val bindingTrace: BindingTrace,
|
||||||
private val platformToKotlinClassMap: PlatformToKotlinClassMap,
|
|
||||||
private val targetPlatform: TargetPlatform,
|
private val targetPlatform: TargetPlatform,
|
||||||
private val languageVersionSettings: LanguageVersionSettings,
|
private val components: ImportResolutionComponents
|
||||||
private val deprecationResolver: DeprecationResolver
|
|
||||||
) {
|
) {
|
||||||
private val defaultImports =
|
private val defaultImports =
|
||||||
targetPlatform.getDefaultImports(languageVersionSettings, includeLowPriorityImports = false).map(::DefaultImportImpl)
|
targetPlatform.getDefaultImports(components.languageVersionSettings, includeLowPriorityImports = false).map(::DefaultImportImpl)
|
||||||
|
|
||||||
private val defaultLowPriorityImports = targetPlatform.defaultLowPriorityImports.map(::DefaultImportImpl)
|
private val defaultLowPriorityImports = targetPlatform.defaultLowPriorityImports.map(::DefaultImportImpl)
|
||||||
|
|
||||||
@@ -63,7 +58,7 @@ class FileScopeFactory(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes {
|
fun createScopesForFile(file: KtFile, existingImports: ImportingScope? = null): FileScopes {
|
||||||
val packageView = moduleDescriptor.getPackage(file.packageFqName)
|
val packageView = components.moduleDescriptor.getPackage(file.packageFqName)
|
||||||
val packageFragment = topLevelDescriptorProvider.getPackageFragmentOrDiagnoseFailure(file.packageFqName, file)
|
val packageFragment = topLevelDescriptorProvider.getPackageFragmentOrDiagnoseFailure(file.packageFqName, file)
|
||||||
|
|
||||||
return FilesScopesBuilder(file, existingImports, packageFragment, packageView).result
|
return FilesScopesBuilder(file, existingImports, packageFragment, packageView).result
|
||||||
@@ -113,7 +108,7 @@ class FileScopeFactory(
|
|||||||
return DefaultImportResolvers(explicit, allUnder, lowPriority)
|
return DefaultImportResolvers(explicit, allUnder, lowPriority)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val defaultImportResolvers by storageManager.createLazyValue {
|
private val defaultImportResolvers by components.storageManager.createLazyValue {
|
||||||
createDefaultImportResolvers(emptyList(), emptyList())
|
createDefaultImportResolvers(emptyList(), emptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,9 +119,7 @@ class FileScopeFactory(
|
|||||||
packageFragment: PackageFragmentDescriptor?,
|
packageFragment: PackageFragmentDescriptor?,
|
||||||
excludedImports: List<FqName>? = null
|
excludedImports: List<FqName>? = null
|
||||||
) = LazyImportResolver(
|
) = LazyImportResolver(
|
||||||
storageManager, qualifiedExpressionResolver, moduleDescriptor, platformToKotlinClassMap, languageVersionSettings,
|
components, indexedImports, aliasImportNames concat excludedImports, trace, packageFragment
|
||||||
indexedImports, aliasImportNames concat excludedImports, trace, packageFragment,
|
|
||||||
deprecationResolver
|
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun createImportResolver(
|
private fun createImportResolver(
|
||||||
@@ -136,9 +129,7 @@ class FileScopeFactory(
|
|||||||
packageFragment: PackageFragmentDescriptor?,
|
packageFragment: PackageFragmentDescriptor?,
|
||||||
excludedImports: List<FqName>? = null
|
excludedImports: List<FqName>? = null
|
||||||
) = LazyImportResolverForKtImportDirective(
|
) = LazyImportResolverForKtImportDirective(
|
||||||
storageManager, qualifiedExpressionResolver, moduleDescriptor, platformToKotlinClassMap, languageVersionSettings,
|
components, indexedImports, aliasImportNames concat excludedImports, trace, packageFragment
|
||||||
indexedImports, aliasImportNames concat excludedImports, trace, packageFragment,
|
|
||||||
deprecationResolver
|
|
||||||
)
|
)
|
||||||
|
|
||||||
private inner class FilesScopesBuilder(
|
private inner class FilesScopesBuilder(
|
||||||
@@ -160,7 +151,7 @@ class FileScopeFactory(
|
|||||||
|
|
||||||
val lazyImportingScope = object : ImportingScope by ImportingScope.Empty {
|
val lazyImportingScope = object : ImportingScope by ImportingScope.Empty {
|
||||||
// avoid constructing the scope before we query it
|
// avoid constructing the scope before we query it
|
||||||
override val parent: ImportingScope by storageManager.createLazyValue {
|
override val parent: ImportingScope by components.storageManager.createLazyValue {
|
||||||
createImportingScope()
|
createImportingScope()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,7 +227,7 @@ class FileScopeFactory(
|
|||||||
"Default explicit imports in $debugName"
|
"Default explicit imports in $debugName"
|
||||||
)
|
)
|
||||||
|
|
||||||
scope = SubpackagesImportingScope(scope, moduleDescriptor, FqName.ROOT)
|
scope = SubpackagesImportingScope(scope, components.moduleDescriptor, FqName.ROOT)
|
||||||
|
|
||||||
scope = currentPackageScope(packageView, aliasImportNames, dummyContainerDescriptor, FilteringKind.VISIBLE_CLASSES, scope)
|
scope = currentPackageScope(packageView, aliasImportNames, dummyContainerDescriptor, FilteringKind.VISIBLE_CLASSES, scope)
|
||||||
|
|
||||||
|
|||||||
@@ -73,22 +73,28 @@ interface ImportForceResolver {
|
|||||||
fun forceResolveImport(importDirective: KtImportDirective)
|
fun forceResolveImport(importDirective: KtImportDirective)
|
||||||
}
|
}
|
||||||
|
|
||||||
open class LazyImportResolver<I : KtImportInfo>(
|
class ImportResolutionComponents(
|
||||||
val storageManager: StorageManager,
|
val storageManager: StorageManager,
|
||||||
private val qualifiedExpressionResolver: QualifiedExpressionResolver,
|
val qualifiedExpressionResolver: QualifiedExpressionResolver,
|
||||||
val moduleDescriptor: ModuleDescriptor,
|
val moduleDescriptor: ModuleDescriptor,
|
||||||
private val platformToKotlinClassMap: PlatformToKotlinClassMap,
|
val platformToKotlinClassMap: PlatformToKotlinClassMap,
|
||||||
val languageVersionSettings: LanguageVersionSettings,
|
val languageVersionSettings: LanguageVersionSettings,
|
||||||
val indexedImports: IndexedImports<I>,
|
|
||||||
excludedImportNames: Collection<FqName>,
|
|
||||||
protected val traceForImportResolve: BindingTrace,
|
|
||||||
private val packageFragment: PackageFragmentDescriptor?,
|
|
||||||
val deprecationResolver: DeprecationResolver
|
val deprecationResolver: DeprecationResolver
|
||||||
|
)
|
||||||
|
|
||||||
|
open class LazyImportResolver<I : KtImportInfo>(
|
||||||
|
internal val components: ImportResolutionComponents,
|
||||||
|
val indexedImports: IndexedImports<I>,
|
||||||
|
val excludedImportNames: Collection<FqName>,
|
||||||
|
val traceForImportResolve: BindingTrace,
|
||||||
|
val packageFragment: PackageFragmentDescriptor?
|
||||||
) {
|
) {
|
||||||
private val importedScopesProvider = storageManager.createMemoizedFunctionWithNullableValues { directive: KtImportInfo ->
|
private val importedScopesProvider = with(components) {
|
||||||
qualifiedExpressionResolver.processImportReference(
|
storageManager.createMemoizedFunctionWithNullableValues { directive: KtImportInfo ->
|
||||||
directive, moduleDescriptor, traceForImportResolve, excludedImportNames, packageFragment
|
qualifiedExpressionResolver.processImportReference(
|
||||||
)
|
directive, moduleDescriptor, traceForImportResolve, excludedImportNames, packageFragment
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <D : DeclarationDescriptor> selectSingleFromImports(
|
fun <D : DeclarationDescriptor> selectSingleFromImports(
|
||||||
@@ -106,14 +112,14 @@ open class LazyImportResolver<I : KtImportInfo>(
|
|||||||
}
|
}
|
||||||
return target
|
return target
|
||||||
}
|
}
|
||||||
return storageManager.compute(::compute)
|
return components.storageManager.compute(::compute)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun <D : DeclarationDescriptor> collectFromImports(
|
fun <D : DeclarationDescriptor> collectFromImports(
|
||||||
name: Name,
|
name: Name,
|
||||||
descriptorsSelector: (ImportingScope, Name) -> Collection<D>
|
descriptorsSelector: (ImportingScope, Name) -> Collection<D>
|
||||||
): Collection<D> {
|
): Collection<D> {
|
||||||
return storageManager.compute {
|
return components.storageManager.compute {
|
||||||
var descriptors: Collection<D>? = null
|
var descriptors: Collection<D>? = null
|
||||||
for (directive in indexedImports.importsForName(name)) {
|
for (directive in indexedImports.importsForName(name)) {
|
||||||
val descriptorsForImport = descriptorsSelector(getImportScope(directive), name)
|
val descriptorsForImport = descriptorsSelector(getImportScope(directive), name)
|
||||||
@@ -143,42 +149,28 @@ open class LazyImportResolver<I : KtImportInfo>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
class LazyImportResolverForKtImportDirective(
|
class LazyImportResolverForKtImportDirective(
|
||||||
storageManager: StorageManager,
|
components: ImportResolutionComponents,
|
||||||
qualifiedExpressionResolver: QualifiedExpressionResolver,
|
|
||||||
moduleDescriptor: ModuleDescriptor,
|
|
||||||
platformToKotlinClassMap: PlatformToKotlinClassMap,
|
|
||||||
languageVersionSettings: LanguageVersionSettings,
|
|
||||||
indexedImports: IndexedImports<KtImportDirective>,
|
indexedImports: IndexedImports<KtImportDirective>,
|
||||||
excludedImportNames: Collection<FqName>,
|
excludedImportNames: Collection<FqName>,
|
||||||
traceForImportResolve: BindingTrace,
|
traceForImportResolve: BindingTrace,
|
||||||
packageFragment: PackageFragmentDescriptor?,
|
packageFragment: PackageFragmentDescriptor?
|
||||||
deprecationResolver: DeprecationResolver
|
|
||||||
) : LazyImportResolver<KtImportDirective>(
|
) : LazyImportResolver<KtImportDirective>(
|
||||||
storageManager,
|
components, indexedImports, excludedImportNames, traceForImportResolve, packageFragment
|
||||||
qualifiedExpressionResolver,
|
|
||||||
moduleDescriptor,
|
|
||||||
platformToKotlinClassMap,
|
|
||||||
languageVersionSettings,
|
|
||||||
indexedImports,
|
|
||||||
excludedImportNames,
|
|
||||||
traceForImportResolve,
|
|
||||||
packageFragment,
|
|
||||||
deprecationResolver
|
|
||||||
), ImportForceResolver {
|
), ImportForceResolver {
|
||||||
|
|
||||||
private val forceResolveImportDirective = storageManager.createMemoizedFunction { directive: KtImportDirective ->
|
private val forceResolveImportDirective = components.storageManager.createMemoizedFunction { directive: KtImportDirective ->
|
||||||
val scope = getImportScope(directive)
|
val scope = getImportScope(directive)
|
||||||
if (scope is LazyExplicitImportScope) {
|
if (scope is LazyExplicitImportScope) {
|
||||||
val allDescriptors = scope.storeReferencesToDescriptors()
|
val allDescriptors = scope.storeReferencesToDescriptors()
|
||||||
PlatformClassesMappedToKotlinChecker.checkPlatformClassesMappedToKotlin(
|
PlatformClassesMappedToKotlinChecker.checkPlatformClassesMappedToKotlin(
|
||||||
platformToKotlinClassMap, traceForImportResolve, directive, allDescriptors
|
components.platformToKotlinClassMap, traceForImportResolve, directive, allDescriptors
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
Unit
|
Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
private val forceResolveNonDefaultImportsTask: NotNullLazyValue<Unit> = storageManager.createLazyValue {
|
private val forceResolveNonDefaultImportsTask: NotNullLazyValue<Unit> = components.storageManager.createLazyValue {
|
||||||
val explicitClassImports = HashMultimap.create<String, KtImportDirective>()
|
val explicitClassImports = HashMultimap.create<String, KtImportDirective>()
|
||||||
for (importInfo in indexedImports.imports) {
|
for (importInfo in indexedImports.imports) {
|
||||||
forceResolveImport(importInfo)
|
forceResolveImport(importInfo)
|
||||||
@@ -249,12 +241,12 @@ class LazyImportScope(
|
|||||||
private fun LazyImportResolver<*>.isClassifierVisible(descriptor: ClassifierDescriptor): Boolean {
|
private fun LazyImportResolver<*>.isClassifierVisible(descriptor: ClassifierDescriptor): Boolean {
|
||||||
if (filteringKind == FilteringKind.ALL) return true
|
if (filteringKind == FilteringKind.ALL) return true
|
||||||
|
|
||||||
if (deprecationResolver.isHiddenInResolution(descriptor)) return false
|
if (components.deprecationResolver.isHiddenInResolution(descriptor)) return false
|
||||||
|
|
||||||
val visibility = (descriptor as DeclarationDescriptorWithVisibility).visibility
|
val visibility = (descriptor as DeclarationDescriptorWithVisibility).visibility
|
||||||
val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES
|
val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES
|
||||||
if (!visibility.mustCheckInImports()) return includeVisible
|
if (!visibility.mustCheckInImports()) return includeVisible
|
||||||
return Visibilities.isVisibleIgnoringReceiver(descriptor, moduleDescriptor) == includeVisible
|
return Visibilities.isVisibleIgnoringReceiver(descriptor, components.moduleDescriptor) == includeVisible
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
|
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
|
||||||
@@ -295,9 +287,9 @@ class LazyImportScope(
|
|||||||
// we do not perform any filtering by visibility here because all descriptors from both visible/invisible filter scopes are to be added anyway
|
// we do not perform any filtering by visibility here because all descriptors from both visible/invisible filter scopes are to be added anyway
|
||||||
if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf()
|
if (filteringKind == FilteringKind.INVISIBLE_CLASSES) return listOf()
|
||||||
|
|
||||||
val storageManager = importResolver.storageManager
|
val storageManager = importResolver.components.storageManager
|
||||||
if (secondaryImportResolver != null) {
|
if (secondaryImportResolver != null) {
|
||||||
assert(storageManager === secondaryImportResolver.storageManager) { "Multiple storage managers are not supported" }
|
assert(storageManager === secondaryImportResolver.components.storageManager) { "Multiple storage managers are not supported" }
|
||||||
}
|
}
|
||||||
|
|
||||||
return storageManager.compute {
|
return storageManager.compute {
|
||||||
|
|||||||
Reference in New Issue
Block a user