From 996c5848c2d0b526dfcfbea31c0f254c60e4f2a4 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 17 Feb 2016 14:26:38 +0300 Subject: [PATCH] Simplify deserialization components for built-ins and JS --- .../builtins/BuiltInsClassDataFinder.kt | 41 ++++++++++++++++++ .../builtins/BuiltinsPackageFragment.kt | 15 +++---- .../builtInsPackageFragmentProvider.kt | 2 +- .../DeserializedClassDataFinder.kt | 30 +++++++++++++ .../DeserializedPackageFragment.kt | 13 ++---- .../ResourceLoadingClassDataFinder.kt | 43 ------------------- .../js/KotlinJavascriptClassDataFinder.kt | 36 ++++++++++++++++ .../js/KotlinJavascriptPackageFragment.kt | 14 +++--- ...kotlinJavascriptPackageFragmentProvider.kt | 2 +- 9 files changed, 125 insertions(+), 71 deletions(-) create mode 100644 core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt create mode 100644 core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedClassDataFinder.kt delete mode 100644 core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt create mode 100644 js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt new file mode 100644 index 00000000000..018f7556812 --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltInsClassDataFinder.kt @@ -0,0 +1,41 @@ +/* + * 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.builtins + +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.serialization.ClassData +import org.jetbrains.kotlin.serialization.ClassDataWithSource +import org.jetbrains.kotlin.serialization.builtins.BuiltInsProtoBuf +import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder +import org.jetbrains.kotlin.serialization.deserialization.NameResolver + +class BuiltInsClassDataFinder( + private val proto: BuiltInsProtoBuf.BuiltIns, + private val nameResolver: NameResolver +) : ClassDataFinder { + private val classIdToProto = + proto.classList.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)) + } +} diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt index f1b0fe28836..6328c01f173 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/BuiltinsPackageFragment.kt @@ -30,8 +30,8 @@ class BuiltinsPackageFragment( storageManager: StorageManager, module: ModuleDescriptor, loadResource: (path: String) -> InputStream? -) : DeserializedPackageFragment(fqName, storageManager, module, BuiltInsSerializedResourcePaths, loadResource) { - private val builtinsMessage = run { +) : DeserializedPackageFragment(fqName, storageManager, module, loadResource) { + private val proto = run { val stream = loadResourceSure(BuiltInsSerializedResourcePaths.getBuiltInsFilePath(fqName)) val version = BuiltInsBinaryVersion.readFrom(stream) @@ -47,16 +47,13 @@ class BuiltinsPackageFragment( BuiltInsProtoBuf.BuiltIns.parseFrom(stream, BuiltInsSerializedResourcePaths.extensionRegistry) } - override val nameResolver = NameResolverImpl(builtinsMessage.strings, builtinsMessage.qualifiedNames) + private val nameResolver = NameResolverImpl(proto.strings, proto.qualifiedNames) - override val classIdToProto = - builtinsMessage.classList.associateBy { klass -> - nameResolver.getClassId(klass.fqName) - } + override val classDataFinder = BuiltInsClassDataFinder(proto, nameResolver) override fun computeMemberScope() = DeserializedPackageMemberScope( - this, builtinsMessage.`package`, nameResolver, packagePartSource = null, components = components, - classNames = { classIdToProto.keys.filter { classId -> !classId.isNestedClass }.map { it.shortClassName } } + this, proto.`package`, nameResolver, packagePartSource = null, components = components, + classNames = { classDataFinder.allClassIds.filter { classId -> !classId.isNestedClass }.map { it.shortClassName } } ) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt b/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt index 8a836f0a70e..92467800714 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/builtins/builtInsPackageFragmentProvider.kt @@ -43,7 +43,7 @@ fun createBuiltInPackageFragmentProvider( val components = DeserializationComponents( storageManager, module, - ResourceLoadingClassDataFinder(provider, BuiltInsSerializedResourcePaths, loadResource), + DeserializedClassDataFinder(provider), AnnotationAndConstantLoaderImpl(module, BuiltInSerializerProtocol), provider, localClassResolver, diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedClassDataFinder.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedClassDataFinder.kt new file mode 100644 index 00000000000..710e007c9a4 --- /dev/null +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedClassDataFinder.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2015 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.PackageFragmentProvider +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.serialization.ClassDataWithSource + +class DeserializedClassDataFinder(private val packageFragmentProvider: PackageFragmentProvider) : ClassDataFinder { + override fun findClassData(classId: ClassId): ClassDataWithSource? { + val packageFragment = + packageFragmentProvider.getPackageFragments(classId.packageFqName).singleOrNull() + as? DeserializedPackageFragment ?: return null + return packageFragment.classDataFinder.findClassData(classId) + } +} diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt index dc58a778a83..d069b4e14ff 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializedPackageFragment.kt @@ -18,11 +18,8 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.serialization.ProtoBuf -import org.jetbrains.kotlin.serialization.SerializedResourcePaths import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.getValue @@ -33,14 +30,8 @@ abstract class DeserializedPackageFragment( fqName: FqName, protected val storageManager: StorageManager, module: ModuleDescriptor, - protected val serializedResourcePaths: SerializedResourcePaths, - private val loadResource: (path: String) -> InputStream? + protected val loadResource: (path: String) -> InputStream? ) : PackageFragmentDescriptorImpl(module, fqName) { - - abstract val nameResolver: NameResolver - - abstract val classIdToProto: Map? - // component dependency cycle @set:Inject lateinit var components: DeserializationComponents @@ -49,6 +40,8 @@ abstract class DeserializedPackageFragment( computeMemberScope() } + abstract val classDataFinder: ClassDataFinder + protected abstract fun computeMemberScope(): DeserializedPackageMemberScope override fun getMemberScope() = deserializedMemberScope diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt deleted file mode 100644 index 5a89620e58c..00000000000 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2010-2015 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.PackageFragmentProvider -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.SerializedResourcePaths -import java.io.InputStream - -class ResourceLoadingClassDataFinder( - private val packageFragmentProvider: PackageFragmentProvider, - private val serializedResourcePaths: SerializedResourcePaths, - private val loadResource: (path: String) -> InputStream? -) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassDataWithSource? { - val packageFragment = packageFragmentProvider.getPackageFragments(classId.packageFqName).singleOrNull() - as? DeserializedPackageFragment ?: return null - - val classProto = packageFragment.classIdToProto?.get(classId) ?: run { - val stream = loadResource(serializedResourcePaths.getClassMetadataPath(classId)) ?: return null - ProtoBuf.Class.parseFrom(stream, serializedResourcePaths.extensionRegistry) - } - - return ClassDataWithSource(ClassData(packageFragment.nameResolver, classProto)) - } -} 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 new file mode 100644 index 00000000000..6452ab4fb0c --- /dev/null +++ b/js/js.serializer/src/org/jetbrains/kotlin/serialization/js/KotlinJavascriptClassDataFinder.kt @@ -0,0 +1,36 @@ +/* + * 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.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 +import java.io.InputStream + +class KotlinJavascriptClassDataFinder( + private val nameResolver: NameResolver, + private val loadResource: (path: String) -> InputStream? +) : ClassDataFinder { + override fun findClassData(classId: ClassId): ClassDataWithSource? { + val stream = loadResource(KotlinJavascriptSerializedResourcePaths.getClassMetadataPath(classId)) ?: return null + val classProto = ProtoBuf.Class.parseFrom(stream, KotlinJavascriptSerializedResourcePaths.extensionRegistry) + return ClassDataWithSource(ClassData(nameResolver, classProto)) + } +} 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 3cafa2fe438..8e55aa08d1f 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 @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.serialization.js import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.serialization.ProtoBuf @@ -32,14 +31,15 @@ class KotlinJavascriptPackageFragment( storageManager: StorageManager, module: ModuleDescriptor, loadResource: (path: String) -> InputStream? -) : DeserializedPackageFragment(fqName, storageManager, module, KotlinJavascriptSerializedResourcePaths, loadResource) { - override val nameResolver = NameResolverImpl.read(loadResourceSure(serializedResourcePaths.getStringTableFilePath(fqName))) +) : DeserializedPackageFragment(fqName, storageManager, module, loadResource) { + private val nameResolver = + NameResolverImpl.read(loadResourceSure(KotlinJavascriptSerializedResourcePaths.getStringTableFilePath(fqName))) - override val classIdToProto: Map? get() = null + override val classDataFinder = KotlinJavascriptClassDataFinder(nameResolver, loadResource) override fun computeMemberScope(): DeserializedPackageMemberScope { - val packageStream = loadResourceSure(serializedResourcePaths.getPackageFilePath(fqName)) - val packageProto = ProtoBuf.Package.parseFrom(packageStream, serializedResourcePaths.extensionRegistry) + val packageStream = loadResourceSure(KotlinJavascriptSerializedResourcePaths.getPackageFilePath(fqName)) + val packageProto = ProtoBuf.Package.parseFrom(packageStream, KotlinJavascriptSerializedResourcePaths.extensionRegistry) return DeserializedPackageMemberScope( this, packageProto, nameResolver, packagePartSource = null, components = components, classNames = { loadClassNames() } ) @@ -47,7 +47,7 @@ class KotlinJavascriptPackageFragment( private fun loadClassNames(): Collection { val classesStream = loadResourceSure(KotlinJavascriptSerializedResourcePaths.getClassesInPackageFilePath(fqName)) - val classesProto = JsProtoBuf.Classes.parseFrom(classesStream, serializedResourcePaths.extensionRegistry) + val classesProto = JsProtoBuf.Classes.parseFrom(classesStream, KotlinJavascriptSerializedResourcePaths.extensionRegistry) return classesProto.classNameList?.map { id -> nameResolver.getName(id) } ?: listOf() } } 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 93726a044a9..2acf77ab3f7 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 @@ -41,7 +41,7 @@ fun createKotlinJavascriptPackageFragmentProvider( val components = DeserializationComponents( storageManager, module, - ResourceLoadingClassDataFinder(provider, KotlinJavascriptSerializedResourcePaths, loadResource), + DeserializedClassDataFinder(provider), AnnotationAndConstantLoaderImpl(module, JsSerializerProtocol), provider, localClassResolver,