[API Usage] Use type refinements in overrides-related facilities

This commit is contained in:
Denis Zharkov
2019-07-01 15:36:24 +03:00
committed by Dmitry Savvinov
parent 694f521bfd
commit b7e011a29b
22 changed files with 165 additions and 60 deletions
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInsPackageFragmentImpl
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
class JvmBuiltInsPackageFragmentProvider(
storageManager: StorageManager,
@@ -25,7 +26,8 @@ class JvmBuiltInsPackageFragmentProvider(
notFoundClasses: NotFoundClasses,
additionalClassPartsProvider: AdditionalClassPartsProvider,
platformDependentDeclarationFilter: PlatformDependentDeclarationFilter,
deserializationConfiguration: DeserializationConfiguration
deserializationConfiguration: DeserializationConfiguration,
kotlinTypeChecker: NewKotlinTypeChecker
) : AbstractDeserializedPackageFragmentProvider(storageManager, finder, moduleDescriptor) {
init {
components = DeserializationComponents(
@@ -46,7 +48,8 @@ class JvmBuiltInsPackageFragmentProvider(
notFoundClasses,
ContractDeserializer.DEFAULT,
additionalClassPartsProvider, platformDependentDeclarationFilter,
BuiltInSerializerProtocol.extensionRegistry
BuiltInSerializerProtocol.extensionRegistry,
kotlinTypeChecker
)
}
@@ -42,18 +42,20 @@ public final class DescriptorResolverUtils {
@NotNull
public static <D extends CallableMemberDescriptor> Collection<D> resolveOverridesForNonStaticMembers(
@NotNull Name name, @NotNull Collection<D> membersFromSupertypes, @NotNull Collection<D> membersFromCurrent,
@NotNull ClassDescriptor classDescriptor, @NotNull ErrorReporter errorReporter
) {
return resolveOverrides(name, membersFromSupertypes, membersFromCurrent, classDescriptor, errorReporter, false);
@NotNull Name name, @NotNull Collection<D> membersFromSupertypes, @NotNull Collection<D> membersFromCurrent,
@NotNull ClassDescriptor classDescriptor, @NotNull ErrorReporter errorReporter,
@NotNull OverridingUtil overridingUtil
) {
return resolveOverrides(name, membersFromSupertypes, membersFromCurrent, classDescriptor, errorReporter, overridingUtil, false);
}
@NotNull
public static <D extends CallableMemberDescriptor> Collection<D> resolveOverridesForStaticMembers(
@NotNull Name name, @NotNull Collection<D> membersFromSupertypes, @NotNull Collection<D> membersFromCurrent,
@NotNull ClassDescriptor classDescriptor, @NotNull ErrorReporter errorReporter
) {
return resolveOverrides(name, membersFromSupertypes, membersFromCurrent, classDescriptor, errorReporter, true);
@NotNull Name name, @NotNull Collection<D> membersFromSupertypes, @NotNull Collection<D> membersFromCurrent,
@NotNull ClassDescriptor classDescriptor, @NotNull ErrorReporter errorReporter,
@NotNull OverridingUtil overridingUtil
) {
return resolveOverrides(name, membersFromSupertypes, membersFromCurrent, classDescriptor, errorReporter, overridingUtil, true);
}
@NotNull
@@ -63,11 +65,12 @@ public final class DescriptorResolverUtils {
@NotNull Collection<D> membersFromCurrent,
@NotNull ClassDescriptor classDescriptor,
@NotNull final ErrorReporter errorReporter,
@NotNull OverridingUtil overridingUtil,
final boolean isStaticContext
) {
final Set<D> result = new LinkedHashSet<D>();
OverridingUtil.generateOverridesInFunctionGroup(
overridingUtil.generateOverridesInFunctionGroup(
name, membersFromSupertypes, membersFromCurrent, classDescriptor,
new NonReportingOverrideStrategy() {
@Override
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
import java.util.*
class JavaResolverComponents(
@@ -64,7 +65,8 @@ class JavaResolverComponents(
val annotationTypeQualifierResolver: AnnotationTypeQualifierResolver,
val signatureEnhancement: SignatureEnhancement,
val javaClassesTracker: JavaClassesTracker,
val settings: JavaResolverSettings
val settings: JavaResolverSettings,
val kotlinTypeChecker: NewKotlinTypeChecker
) {
fun replace(
javaResolverCache: JavaResolverCache = this.javaResolverCache
@@ -73,7 +75,8 @@ class JavaResolverComponents(
signaturePropagator, errorReporter, javaResolverCache,
javaPropertyInitializerEvaluator, samConversionResolver, sourceElementFactory,
moduleClassResolver, packagePartProvider, supertypeLoopChecker, lookupTracker, module, reflectionTypes,
annotationTypeQualifierResolver, signatureEnhancement, javaClassesTracker, settings
annotationTypeQualifierResolver, signatureEnhancement, javaClassesTracker, settings,
kotlinTypeChecker
)
}
@@ -57,6 +57,7 @@ import org.jetbrains.kotlin.storage.NotNullLazyValue
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.types.refinement.TypeRefinement
import org.jetbrains.kotlin.utils.SmartSet
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
@@ -280,7 +281,8 @@ class LazyJavaClassMemberScope(
// Merge functions with same signatures
val mergedFunctionFromSuperTypes = resolveOverridesForNonStaticMembers(
name, functionsFromSupertypes, emptyList(), ownerDescriptor, ErrorReporter.DO_NOTHING
name, functionsFromSupertypes, emptyList(), ownerDescriptor, ErrorReporter.DO_NOTHING,
c.components.kotlinTypeChecker.overridingUtil
)
// add declarations
@@ -309,7 +311,8 @@ class LazyJavaClassMemberScope(
) {
val additionalOverrides = resolveOverridesForNonStaticMembers(
name, functionsFromSupertypes, result, ownerDescriptor, c.components.errorReporter
name, functionsFromSupertypes, result, ownerDescriptor, c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
)
if (!isSpecialBuiltinName) {
@@ -451,7 +454,12 @@ class LazyJavaClassMemberScope(
result.addAll(
resolveOverridesForNonStaticMembers(
name, propertiesFromSupertypes + propertiesOverridesFromSuperTypes, result, ownerDescriptor, c.components.errorReporter
name,
propertiesFromSupertypes + propertiesOverridesFromSuperTypes,
result,
ownerDescriptor,
c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
)
)
}
@@ -64,7 +64,14 @@ class LazyJavaStaticClassScope(
override fun computeNonDeclaredFunctions(result: MutableCollection<SimpleFunctionDescriptor>, name: Name) {
val functionsFromSupertypes = getStaticFunctionsFromJavaSuperClasses(name, ownerDescriptor)
result.addAll(resolveOverridesForStaticMembers(name, functionsFromSupertypes, result, ownerDescriptor, c.components.errorReporter))
result.addAll(resolveOverridesForStaticMembers(
name,
functionsFromSupertypes,
result,
ownerDescriptor,
c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
))
if (jClass.isEnum) {
when (name) {
@@ -81,13 +88,23 @@ class LazyJavaStaticClassScope(
if (result.isNotEmpty()) {
result.addAll(
resolveOverridesForStaticMembers(name, propertiesFromSupertypes, result, ownerDescriptor, c.components.errorReporter)
resolveOverridesForStaticMembers(
name,
propertiesFromSupertypes,
result,
ownerDescriptor,
c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
)
)
} else {
result.addAll(propertiesFromSupertypes.groupBy {
it.realOriginal
}.flatMap {
resolveOverridesForStaticMembers(name, it.value, result, ownerDescriptor, c.components.errorReporter)
resolveOverridesForStaticMembers(
name, it.value, result, ownerDescriptor, c.components.errorReporter,
c.components.kotlinTypeChecker.overridingUtil
)
})
}
}
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil
import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.checker.NewKotlinTypeChecker
// This class is needed only for easier injection: exact types of needed components are specified in the constructor here.
// Otherwise injector generator is not smart enough to deduce, for example, which package fragment provider DeserializationComponents needs
@@ -39,7 +40,8 @@ class DeserializationComponentsForJava(
notFoundClasses: NotFoundClasses,
errorReporter: ErrorReporter,
lookupTracker: LookupTracker,
contractDeserializer: ContractDeserializer
contractDeserializer: ContractDeserializer,
kotlinTypeChecker: NewKotlinTypeChecker
) {
val components: DeserializationComponents
@@ -52,7 +54,8 @@ class DeserializationComponentsForJava(
emptyList(), notFoundClasses, contractDeserializer,
additionalClassPartsProvider = jvmBuiltIns?.settings ?: AdditionalClassPartsProvider.None,
platformDependentDeclarationFilter = jvmBuiltIns?.settings ?: PlatformDependentDeclarationFilter.NoPlatformDependent,
extensionRegistryLite = JvmProtoBufUtil.EXTENSION_REGISTRY
extensionRegistryLite = JvmProtoBufUtil.EXTENSION_REGISTRY,
kotlinTypeChecker = kotlinTypeChecker
)
}
}