[FE] Extract computation of sealed class inheritors into separate component

This is needed to provide more optimal provider in IDE plugin
This commit is contained in:
Dmitriy Novozhilov
2020-11-23 11:14:22 +03:00
committed by TeamCityServer
parent c0a1aecf9b
commit 6809adee9c
10 changed files with 87 additions and 43 deletions
@@ -103,6 +103,7 @@ private fun StorageComponentContainer.configurePlatformIndependentComponents() {
useImpl<ClassicTypeSystemContextForCS>()
useImpl<ClassicConstraintSystemUtilContext>()
useInstance(ProgressManagerBasedCancellationChecker)
useInstance(SealedClassInheritorsProviderImpl)
}
/**
@@ -48,4 +48,5 @@ interface LazyClassContext {
val kotlinTypeChecker: NewKotlinTypeChecker
val samConversionResolver: SamConversionResolver
val additionalClassPartsProvider: AdditionalClassPartsProvider
val sealedClassInheritorsProvider: SealedClassInheritorsProvider
}
@@ -85,6 +85,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
private WrappedTypeFactory wrappedTypeFactory;
private PlatformDiagnosticSuppressor platformDiagnosticSuppressor;
private SamConversionResolver samConversionResolver;
private SealedClassInheritorsProvider sealedClassInheritorsProvider;
private AdditionalClassPartsProvider additionalClassPartsProvider;
@@ -164,6 +165,11 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
this.additionalClassPartsProvider = additionalClassPartsProvider;
}
@Inject
public void setSealedClassInheritorsProvider(@NotNull SealedClassInheritorsProvider sealedClassInheritorsProvider) {
this.sealedClassInheritorsProvider = sealedClassInheritorsProvider;
}
// Only calls from injectors expected
@Deprecated
public ResolveSession(
@@ -513,4 +519,10 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
public AdditionalClassPartsProvider getAdditionalClassPartsProvider() {
return additionalClassPartsProvider;
}
@NotNull
@Override
public SealedClassInheritorsProvider getSealedClassInheritorsProvider() {
return sealedClassInheritorsProvider;
}
}
@@ -270,9 +270,8 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
)
);
// TODO: only consider classes from the same file, not the whole package fragment
boolean freedomForSealedInterfacesSupported = c.getLanguageVersionSettings().supportsFeature(LanguageFeature.FreedomForSealedClasses);
this.sealedSubclasses = storageManager.createLazyValue(() -> DescriptorUtilsKt.computeSealedSubclasses(this, freedomForSealedInterfacesSupported));
this.sealedSubclasses = storageManager.createLazyValue(() -> c.getSealedClassInheritorsProvider().computeSealedSubclasses(this, freedomForSealedInterfacesSupported));
}
private static boolean isIllegalInner(@NotNull DeclarationDescriptor descriptor) {
@@ -71,6 +71,7 @@ class LocalClassifierAnalyzer(
private val kotlinTypeChecker: NewKotlinTypeChecker,
private val samConversionResolver: SamConversionResolver,
private val additionalClassPartsProvider: AdditionalClassPartsProvider,
private val sealedClassInheritorsProvider: SealedClassInheritorsProvider
) {
fun processClassOrObject(
scope: LexicalWritableScope?,
@@ -107,6 +108,7 @@ class LocalClassifierAnalyzer(
kotlinTypeChecker,
samConversionResolver,
additionalClassPartsProvider,
sealedClassInheritorsProvider
),
analyzerServices
)
@@ -138,6 +140,7 @@ class LocalClassDescriptorHolder(
val kotlinTypeChecker: NewKotlinTypeChecker,
val samConversionResolver: SamConversionResolver,
val additionalClassPartsProvider: AdditionalClassPartsProvider,
val sealedClassInheritorsProvider: SealedClassInheritorsProvider
) {
// We do not need to synchronize here, because this code is used strictly from one thread
private var classDescriptor: ClassDescriptor? = null
@@ -181,6 +184,7 @@ class LocalClassDescriptorHolder(
override val samConversionResolver: SamConversionResolver = this@LocalClassDescriptorHolder.samConversionResolver
override val additionalClassPartsProvider: AdditionalClassPartsProvider =
this@LocalClassDescriptorHolder.additionalClassPartsProvider
override val sealedClassInheritorsProvider: SealedClassInheritorsProvider = this@LocalClassDescriptorHolder.sealedClassInheritorsProvider
},
containingDeclaration,
classOrObject.nameAsSafeName,