Minor. Extract many properties to ImportResolutionComponents

This commit is contained in:
Denis Zharkov
2018-07-19 17:28:50 +03:00
parent 0b2fde3886
commit 4e7718bfff
2 changed files with 37 additions and 54 deletions
@@ -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 {