From 5a00a97cf197f178689667a9834a4dec7528ebdf Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 1 Feb 2017 11:18:01 +0300 Subject: [PATCH] Extract common parts from deserialization of built-ins and JS --- .../builtins/BuiltInsPackageFragment.kt | 41 ++++++------------ .../DeserializedPackageFragmentImpl.kt | 42 +++++++++++++++++++ .../ProtoBasedClassDataFinder.kt} | 6 +-- .../KotlinBuiltInDeserializerForDecompiler.kt | 4 +- .../builtIns/KotlinBuiltInStubBuilder.kt | 4 +- ...tlinJavaScriptDeserializerForDecompiler.kt | 4 +- .../js/KotlinJavaScriptStubBuilder.kt | 4 +- .../js/KotlinJavascriptClassDataFinder.kt | 42 ------------------- .../js/KotlinJavascriptPackageFragment.kt | 20 ++------- ...kotlinJavascriptPackageFragmentProvider.kt | 2 +- 10 files changed, 69 insertions(+), 100 deletions(-) create mode 100644 core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt rename core/{descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt => deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt} (87%) delete mode 100644 js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsPackageFragment.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsPackageFragment.kt index f572400f5ab..ba12612978b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsPackageFragment.kt @@ -19,10 +19,7 @@ package org.jetbrains.kotlin.builtins import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.deserialization.ClassDeserializer -import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment -import org.jetbrains.kotlin.serialization.deserialization.NameResolverImpl -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope +import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl import org.jetbrains.kotlin.storage.StorageManager import java.io.InputStream @@ -31,31 +28,17 @@ class BuiltInsPackageFragment( storageManager: StorageManager, module: ModuleDescriptor, inputStream: InputStream -) : DeserializedPackageFragment(fqName, storageManager, module) { - private val proto = inputStream.use { stream -> - val version = BuiltInsBinaryVersion.readFrom(stream) +) : DeserializedPackageFragmentImpl(fqName, storageManager, module, inputStream.use { stream -> + val version = BuiltInsBinaryVersion.readFrom(stream) - if (!version.isCompatible()) { - // TODO: report a proper diagnostic - throw UnsupportedOperationException( - "Kotlin built-in definition format version is not supported: " + - "expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + - "Please update Kotlin" - ) - } - - ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) + if (!version.isCompatible()) { + // TODO: report a proper diagnostic + throw UnsupportedOperationException( + "Kotlin built-in definition format version is not supported: " + + "expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + + "Please update Kotlin" + ) } - private val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames) - - override val classDataFinder = BuiltInsClassDataFinder(proto, nameResolver) - - override fun computeMemberScope() = - DeserializedPackageMemberScope( - this, proto.`package`, nameResolver, containerSource = null, components = components, - classNames = { classDataFinder.allClassIds.filter { classId -> - !classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST - }.map { it.shortClassName } } - ) -} + ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) +}) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt new file mode 100644 index 00000000000..4c7ab49c9ec --- /dev/null +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragmentImpl.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.serialization.deserialization + +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.ProtoBuf +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope +import org.jetbrains.kotlin.storage.StorageManager + +abstract class DeserializedPackageFragmentImpl( + fqName: FqName, + storageManager: StorageManager, + module: ModuleDescriptor, + protected val proto: ProtoBuf.PackageFragment +) : DeserializedPackageFragment(fqName, storageManager, module) { + protected val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames) + + override val classDataFinder = ProtoBasedClassDataFinder(proto, nameResolver) + + override fun computeMemberScope() = + DeserializedPackageMemberScope( + this, proto.`package`, nameResolver, containerSource = null, components = components, + classNames = { classDataFinder.allClassIds.filter { classId -> + !classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST + }.map { it.shortClassName } } + ) +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt similarity index 87% rename from core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt rename to core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt index 90d3bb38c00..51712eba6a7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ProtoBasedClassDataFinder.kt @@ -14,17 +14,15 @@ * limitations under the License. */ -package org.jetbrains.kotlin.builtins +package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.serialization.ClassData import org.jetbrains.kotlin.serialization.ClassDataWithSource import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.NameResolver -class BuiltInsClassDataFinder( +class ProtoBasedClassDataFinder( proto: ProtoBuf.PackageFragment, private val nameResolver: NameResolver ) : ClassDataFinder { 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 e28888275b8..07b37b97db8 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 @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.idea.decompiler.builtIns import com.intellij.openapi.diagnostic.Logger import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol -import org.jetbrains.kotlin.builtins.BuiltInsClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.DeclarationDescriptor @@ -46,7 +46,7 @@ class KotlinBuiltInDeserializerForDecompiler( val notFoundClasses = NotFoundClasses(storageManager, moduleDescriptor) deserializationComponents = DeserializationComponents( - storageManager, moduleDescriptor, DeserializationConfiguration.Default, BuiltInsClassDataFinder(proto, nameResolver), + storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver), AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, BuiltInSerializerProtocol), packageFragmentProvider, ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG), LookupTracker.DO_NOTHING, FlexibleTypeDeserializer.ThrowException, emptyList(), notFoundClasses diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt index 5820cdfb4a5..fa405e30738 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/builtIns/KotlinBuiltInStubBuilder.kt @@ -21,7 +21,7 @@ import com.intellij.psi.impl.compiled.ClassFileStubBuilder import com.intellij.psi.stubs.PsiFileStub import com.intellij.util.indexing.FileContent import org.jetbrains.kotlin.builtins.BuiltInSerializerProtocol -import org.jetbrains.kotlin.builtins.BuiltInsClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder import org.jetbrains.kotlin.idea.decompiler.common.AnnotationLoaderForStubBuilderImpl import org.jetbrains.kotlin.idea.decompiler.stubBuilder.* import org.jetbrains.kotlin.psi.stubs.KotlinStubVersions @@ -45,7 +45,7 @@ class KotlinBuiltInStubBuilder : ClsStubBuilder() { val packageFqName = file.packageFqName val nameResolver = file.nameResolver val components = ClsStubBuilderComponents( - BuiltInsClassDataFinder(file.proto, nameResolver), + ProtoBasedClassDataFinder(file.proto, nameResolver), AnnotationLoaderForStubBuilderImpl(BuiltInSerializerProtocol), virtualFile ) 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 d9dd4fb3c2f..ade73e8fb4a 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 @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.decompiler.js import com.intellij.openapi.diagnostic.Logger import org.jetbrains.kotlin.builtins.DefaultBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.decompiler.textBuilder.DeserializerForDecompilerBase import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter @@ -32,7 +33,6 @@ import org.jetbrains.kotlin.serialization.deserialization.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.serialization.js.DynamicTypeDeserializer import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol -import org.jetbrains.kotlin.serialization.js.KotlinJavascriptClassDataFinder // TODO: deduplicate with KotlinBuiltInDeserializerForDecompiler class KotlinJavaScriptDeserializerForDecompiler( @@ -49,7 +49,7 @@ class KotlinJavaScriptDeserializerForDecompiler( val notFoundClasses = NotFoundClasses(storageManager, moduleDescriptor) deserializationComponents = DeserializationComponents( - storageManager, moduleDescriptor, DeserializationConfiguration.Default, KotlinJavascriptClassDataFinder(proto, nameResolver), + storageManager, moduleDescriptor, DeserializationConfiguration.Default, ProtoBasedClassDataFinder(proto, nameResolver), AnnotationAndConstantLoaderImpl(moduleDescriptor, notFoundClasses, JsSerializerProtocol), packageFragmentProvider, ResolveEverythingToKotlinAnyLocalClassifierResolver(builtIns), LoggingErrorReporter(LOG), LookupTracker.DO_NOTHING, DynamicTypeDeserializer, emptyList(), notFoundClasses diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt index b48b27c6b0f..c7b9c2a10c2 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/js/KotlinJavaScriptStubBuilder.kt @@ -20,13 +20,13 @@ import com.intellij.psi.compiled.ClsStubBuilder import com.intellij.psi.impl.compiled.ClassFileStubBuilder import com.intellij.psi.stubs.PsiFileStub import com.intellij.util.indexing.FileContent +import org.jetbrains.kotlin.serialization.deserialization.ProtoBasedClassDataFinder import org.jetbrains.kotlin.idea.decompiler.common.AnnotationLoaderForStubBuilderImpl import org.jetbrains.kotlin.idea.decompiler.stubBuilder.* import org.jetbrains.kotlin.psi.stubs.KotlinStubVersions import org.jetbrains.kotlin.serialization.deserialization.ProtoContainer import org.jetbrains.kotlin.serialization.deserialization.TypeTable import org.jetbrains.kotlin.serialization.js.JsSerializerProtocol -import org.jetbrains.kotlin.serialization.js.KotlinJavascriptClassDataFinder // TODO: deduplicate code with KotlinBuiltInStubBuilder class KotlinJavaScriptStubBuilder : ClsStubBuilder() { @@ -46,7 +46,7 @@ class KotlinJavaScriptStubBuilder : ClsStubBuilder() { val packageFqName = file.packageFqName val nameResolver = file.nameResolver val components = ClsStubBuilderComponents( - KotlinJavascriptClassDataFinder(file.proto, nameResolver), + ProtoBasedClassDataFinder(file.proto, nameResolver), AnnotationLoaderForStubBuilderImpl(JsSerializerProtocol), virtualFile ) diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt deleted file mode 100644 index 7c5071abda5..00000000000 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.kotlin.serialization.js - -import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.serialization.ClassData -import org.jetbrains.kotlin.serialization.ClassDataWithSource -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.NameResolver - -class KotlinJavascriptClassDataFinder( - proto: ProtoBuf.PackageFragment, - private val nameResolver: NameResolver -) : ClassDataFinder { - private val classIdToProto = - proto.class_List.associateBy { klass -> - nameResolver.getClassId(klass.fqName) - } - - internal val allClassIds: Collection get() = classIdToProto.keys - - override fun findClassData(classId: ClassId): ClassDataWithSource? { - val classProto = classIdToProto[classId] ?: return null - return ClassDataWithSource(ClassData(nameResolver, classProto), SourceElement.NO_SOURCE) - } -} diff --git a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt index defd5b73bd8..720e140a92a 100644 --- a/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptPackageFragment.kt @@ -20,15 +20,12 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer -import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragment -import org.jetbrains.kotlin.serialization.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedSimpleFunctionDescriptor import org.jetbrains.kotlin.storage.StorageManager @@ -38,11 +35,10 @@ class KotlinJavascriptPackageFragment( fqName: FqName, storageManager: StorageManager, module: ModuleDescriptor, - private val proto: ProtoBuf.PackageFragment, - private val nameResolver: NameResolver -) : DeserializedPackageFragment(fqName, storageManager, module) { + proto: ProtoBuf.PackageFragment +) : DeserializedPackageFragmentImpl(fqName, storageManager, module, proto) { private val fileMap: Map by storageManager.createLazyValue { - proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) -> + this.proto.getExtension(JsProtoBuf.packageFragmentFiles).fileList.withIndex().associate { (index, file) -> (if (file.hasId()) file.id else index) to FileHolder(file.annotationList) } } @@ -51,14 +47,6 @@ class KotlinJavascriptPackageFragment( AnnotationDeserializer(module, components.notFoundClasses) } - override val classDataFinder = KotlinJavascriptClassDataFinder(proto, nameResolver) - - override fun computeMemberScope(): DeserializedPackageMemberScope = - DeserializedPackageMemberScope( - this, proto.`package`, nameResolver, containerSource = null, components = components, - classNames = { classDataFinder.allClassIds.filterNot(ClassId::isNestedClass).map { it.shortClassName } } - ) - fun getContainingFileAnnotations(descriptor: DeclarationDescriptor): List { if (DescriptorUtils.getParentOfType(descriptor, PackageFragmentDescriptor::class.java) != this) { throw IllegalArgumentException("Provided descriptor $descriptor does not belong to this package $this") 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 a3dcaed6d06..17f231eb915 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 @@ -37,7 +37,7 @@ fun createKotlinJavascriptPackageFragmentProvider( proto.class_Count > 0 -> nameResolver.getClassId(proto.class_OrBuilderList.first().fqName).packageFqName else -> throw IllegalStateException("Invalid library part: either a Package or a Class must be present") } - KotlinJavascriptPackageFragment(fqName, storageManager, module, proto, nameResolver) + KotlinJavascriptPackageFragment(fqName, storageManager, module, proto) } val provider = PackageFragmentProviderImpl(packageFragments)