From c0147860bd72714a83d37ab8c2b0b7c7d9194f77 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 12 Oct 2016 16:45:44 +0300 Subject: [PATCH] Allow multiple ClassDescriptorFactory instances in deserialization --- .../serialization/builtins/BuiltInsSerializerTest.kt | 4 +--- .../kotlin/serialization/builtins/LoadBuiltinsTest.java | 3 ++- .../load/kotlin/DeserializationComponentsForJava.kt | 2 +- .../org/jetbrains/kotlin/builtins/KotlinBuiltIns.java | 2 +- .../kotlin/builtins/builtInsPackageFragmentProvider.kt | 4 ++-- .../deserialization/ClassDescriptorFactory.kt | 6 ------ .../serialization/deserialization/ClassDeserializer.kt | 4 +++- .../kotlin/serialization/deserialization/context.kt | 2 +- .../descriptors/DeserializedPackageMemberScope.kt | 2 +- .../builtIns/KotlinBuiltInDeserializerForDecompiler.kt | 3 +-- .../classFile/DeserializerForClassfileDecompiler.kt | 9 ++++++--- .../js/KotlinJavaScriptDeserializerForDecompiler.kt | 2 +- .../js/kotlinJavascriptPackageFragmentProvider.kt | 2 +- 13 files changed, 21 insertions(+), 24 deletions(-) diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt index 55790dda73b..82a898d777b 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializerTest.kt @@ -20,7 +20,6 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.createBuiltInPackageFragmentProvider import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.TEST_PACKAGE_FQNAME -import org.jetbrains.kotlin.serialization.deserialization.ClassDescriptorFactory import org.jetbrains.kotlin.serialization.deserialization.PlatformDependentDeclarationFilter import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.test.KotlinTestUtils @@ -42,8 +41,7 @@ class BuiltInsSerializerTest : TestCaseWithTmpdir() { val module = KotlinTestUtils.createEmptyModule("", DefaultBuiltIns.Instance) val packageFragmentProvider = createBuiltInPackageFragmentProvider( - LockBasedStorageManager(), module, setOf(TEST_PACKAGE_FQNAME), ClassDescriptorFactory.EMPTY, - PlatformDependentDeclarationFilter.All + LockBasedStorageManager(), module, setOf(TEST_PACKAGE_FQNAME), emptyList(), PlatformDependentDeclarationFilter.All ) { val file = File(tmpdir, it) if (file.exists()) FileInputStream(file) else null diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java index f252796b243..1230a4d5b1b 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/LoadBuiltinsTest.java @@ -50,6 +50,7 @@ import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator; import java.io.File; import java.io.InputStream; +import java.util.Collections; import java.util.List; import java.util.regex.Pattern; @@ -112,7 +113,7 @@ public class LoadBuiltinsTest extends KotlinTestWithEnvironment { PackageFragmentProvider packageFragmentProvider = createBuiltInPackageFragmentProvider( storageManager, builtInsModule, BUILT_INS_PACKAGE_FQ_NAMES, - new BuiltInFictitiousFunctionClassFactory(storageManager, builtInsModule), + Collections.singletonList(new BuiltInFictitiousFunctionClassFactory(storageManager, builtInsModule)), PlatformDependentDeclarationFilter.All.INSTANCE, AdditionalClassPartsProvider.None.INSTANCE, new Function1() { diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt index a32acd884e7..1d942570a25 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializationComponentsForJava.kt @@ -44,7 +44,7 @@ class DeserializationComponentsForJava( components = DeserializationComponents( storageManager, moduleDescriptor, configuration, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, LocalClassifierTypeSettings.Default, errorReporter, lookupTracker, JavaFlexibleTypeDeserializer, - ClassDescriptorFactory.EMPTY, notFoundClasses, + emptyList(), notFoundClasses, additionalClassPartsProvider = jvmBuiltIns?.settings ?: AdditionalClassPartsProvider.None, platformDependentDeclarationFilter = jvmBuiltIns?.settings ?: PlatformDependentDeclarationFilter.NoPlatformDependent ) diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java index 5a95e9e8353..4f3388ba4e1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/KotlinBuiltIns.java @@ -86,7 +86,7 @@ public abstract class KotlinBuiltIns { PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider( storageManager, builtInsModule, BUILT_INS_PACKAGE_FQ_NAMES, - new BuiltInFictitiousFunctionClassFactory(storageManager, builtInsModule), + Collections.singletonList(new BuiltInFictitiousFunctionClassFactory(storageManager, builtInsModule)), getPlatformDependentDeclarationFilter(), getAdditionalClassPartsProvider(), new Function1() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt index f7d9812a690..eb6bda5b9b2 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt @@ -29,7 +29,7 @@ fun createBuiltInPackageFragmentProvider( storageManager: StorageManager, module: ModuleDescriptor, packageFqNames: Set, - classDescriptorFactory: ClassDescriptorFactory, + classDescriptorFactories: Iterable, platformDependentDeclarationFilter: PlatformDependentDeclarationFilter, additionalClassPartsProvider: AdditionalClassPartsProvider = AdditionalClassPartsProvider.None, loadResource: (String) -> InputStream? @@ -52,7 +52,7 @@ fun createBuiltInPackageFragmentProvider( ErrorReporter.DO_NOTHING, LookupTracker.DO_NOTHING, FlexibleTypeDeserializer.ThrowException, - classDescriptorFactory, + classDescriptorFactories, notFoundClasses, additionalClassPartsProvider = additionalClassPartsProvider, platformDependentDeclarationFilter = platformDependentDeclarationFilter diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDescriptorFactory.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDescriptorFactory.kt index cde4ff91f77..960ea4759a9 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDescriptorFactory.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDescriptorFactory.kt @@ -25,10 +25,4 @@ interface ClassDescriptorFactory { fun shouldCreateClass(packageFqName: FqName, name: Name): Boolean fun createClass(classId: ClassId): ClassDescriptor? - - object EMPTY : ClassDescriptorFactory { - override fun shouldCreateClass(packageFqName: FqName, name: Name): Boolean = false - - override fun createClass(classId: ClassId): ClassDescriptor? = null - } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt index cddc5987382..91279ad1066 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt @@ -32,7 +32,9 @@ class ClassDeserializer(private val components: DeserializationComponents) { private fun createClass(key: ClassKey): ClassDescriptor? { val classId = key.classId - components.fictitiousClassDescriptorFactory.createClass(classId)?.let { return it } + for (factory in components.fictitiousClassDescriptorFactories) { + factory.createClass(classId)?.let { return it } + } val (classData, sourceElement) = key.classDataWithSource ?: components.classDataFinder.findClassData(classId) ?: return null diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt index 5e318d0ae52..cb3baf8e999 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/context.kt @@ -36,7 +36,7 @@ class DeserializationComponents( val errorReporter: ErrorReporter, val lookupTracker: LookupTracker, val flexibleTypeDeserializer: FlexibleTypeDeserializer, - val fictitiousClassDescriptorFactory: ClassDescriptorFactory, + val fictitiousClassDescriptorFactories: Iterable, val notFoundClasses: NotFoundClasses, val additionalClassPartsProvider: AdditionalClassPartsProvider = AdditionalClassPartsProvider.None, val platformDependentDeclarationFilter: PlatformDependentDeclarationFilter = PlatformDependentDeclarationFilter.All diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt index c7065e639d8..f39059e6bfd 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedPackageMemberScope.kt @@ -45,7 +45,7 @@ open class DeserializedPackageMemberScope( = computeDescriptors(kindFilter, nameFilter, NoLookupLocation.WHEN_GET_ALL_DESCRIPTORS) override fun hasClass(name: Name) = - super.hasClass(name) || c.components.fictitiousClassDescriptorFactory.shouldCreateClass(packageFqName, name) + super.hasClass(name) || c.components.fictitiousClassDescriptorFactories.any { it.shouldCreateClass(packageFqName, name) } override fun createClassId(name: Name) = ClassId(packageFqName, name) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDeserializerForDecompiler.kt index 8460058c859..ca8792c71cb 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInDeserializerForDecompiler.kt @@ -51,8 +51,7 @@ class KotlinBuiltInDeserializerForDecompiler( storageManager, moduleDescriptor, DeserializationConfiguration.Default, BuiltInsClassDataFinder(proto, nameResolver), AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, BuiltInSerializerProtocol), packageFragmentProvider, ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG), - LookupTracker.DO_NOTHING, FlexibleTypeDeserializer.ThrowException, ClassDescriptorFactory.EMPTY, - notFoundClasses + LookupTracker.DO_NOTHING, FlexibleTypeDeserializer.ThrowException, emptyList(), notFoundClasses ) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt index 9ddc5e483aa..ac6d699f186 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/classFile/DeserializerForClassfileDecompiler.kt @@ -33,7 +33,10 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform import org.jetbrains.kotlin.serialization.ClassDataWithSource -import org.jetbrains.kotlin.serialization.deserialization.* +import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents +import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration +import org.jetbrains.kotlin.serialization.deserialization.NotFoundClasses import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil @@ -64,7 +67,7 @@ class DeserializerForClassfileDecompiler( deserializationComponents = DeserializationComponents( storageManager, moduleDescriptor, DeserializationConfiguration.Default, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG), - LookupTracker.DO_NOTHING, JavaFlexibleTypeDeserializer, ClassDescriptorFactory.EMPTY, notFoundClasses + LookupTracker.DO_NOTHING, JavaFlexibleTypeDeserializer, emptyList(), notFoundClasses ) } @@ -84,7 +87,7 @@ class DeserializerForClassfileDecompiler( val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(annotationData, strings) val membersScope = DeserializedPackageMemberScope( createDummyPackageFragment(packageFqName), packageProto, nameResolver, - JvmPackagePartSource(binaryClassForPackageClass!!), deserializationComponents + JvmPackagePartSource(binaryClassForPackageClass), deserializationComponents ) { emptyList() } return membersScope.getContributedDescriptors().toList() } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptDeserializerForDecompiler.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptDeserializerForDecompiler.kt index 1a0aff6a4fa..c76222fa8e4 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptDeserializerForDecompiler.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptDeserializerForDecompiler.kt @@ -65,7 +65,7 @@ class KotlinJavaScriptDeserializerForDecompiler( deserializationComponents = DeserializationComponents( storageManager, moduleDescriptor, DeserializationConfiguration.Default, classDataFinder, annotationAndConstantLoader, packageFragmentProvider, ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG), - LookupTracker.DO_NOTHING, DynamicTypeDeserializer, ClassDescriptorFactory.EMPTY, notFoundClasses + LookupTracker.DO_NOTHING, DynamicTypeDeserializer, emptyList(), notFoundClasses ) } diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt index 8776559f8b5..83158c8115a 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/kotlinJavascriptPackageFragmentProvider.kt @@ -50,7 +50,7 @@ fun createKotlinJavascriptPackageFragmentProvider( ErrorReporter.DO_NOTHING, LookupTracker.DO_NOTHING, DynamicTypeDeserializer, - ClassDescriptorFactory.EMPTY, + emptyList(), notFoundClasses )