diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java index 993fc8c23f3..4f8642c2368 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/DeserializedDescriptorResolver.java @@ -26,8 +26,8 @@ import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.scopes.ChainedScope; import org.jetbrains.kotlin.resolve.scopes.JetScope; import org.jetbrains.kotlin.serialization.ClassData; +import org.jetbrains.kotlin.serialization.ClassDataWithSource; import org.jetbrains.kotlin.serialization.PackageData; -import org.jetbrains.kotlin.serialization.deserialization.ClassDataProvider; import org.jetbrains.kotlin.serialization.deserialization.DeserializationComponents; import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPackageMemberScope; @@ -63,8 +63,10 @@ public final class DeserializedDescriptorResolver { if (data != null) { ClassData classData = JvmProtoBufUtil.readClassDataFrom(data); KotlinJvmBinarySourceElement sourceElement = new KotlinJvmBinarySourceElement(kotlinClass); - ClassDataProvider classDataProvider = new ClassDataProvider(classData, sourceElement); - return components.getClassDeserializer().deserializeClass(kotlinClass.getClassId(), classDataProvider); + return components.getClassDeserializer().deserializeClass( + kotlinClass.getClassId(), + new ClassDataWithSource(classData, sourceElement) + ); } return null; } diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JavaClassDataFinder.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JavaClassDataFinder.kt index d75f34adf01..717f7146b7a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JavaClassDataFinder.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/JavaClassDataFinder.kt @@ -16,23 +16,22 @@ package org.jetbrains.kotlin.load.kotlin -import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.serialization.ClassDataWithSource import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.ClassDataProvider import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil public class JavaClassDataFinder( private val kotlinClassFinder: KotlinClassFinder, private val deserializedDescriptorResolver: DeserializedDescriptorResolver ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassDataProvider? { + override fun findClassData(classId: ClassId): ClassDataWithSource? { val kotlinJvmBinaryClass = kotlinClassFinder.findKotlinClass(classId) ?: return null assert(kotlinJvmBinaryClass.getClassId() == classId) { "Class with incorrect id found: expected $classId, actual ${kotlinJvmBinaryClass.getClassId()}" } val data = deserializedDescriptorResolver.readData(kotlinJvmBinaryClass, DeserializedDescriptorResolver.KOTLIN_CLASS) ?: return null val classData = JvmProtoBufUtil.readClassDataFrom(data) - return ClassDataProvider(classData, KotlinJvmBinarySourceElement(kotlinJvmBinaryClass)) + return ClassDataWithSource(classData, KotlinJvmBinarySourceElement(kotlinJvmBinaryClass)) } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoDatas.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoDatas.kt index 4b4c1cea76f..3727876918c 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoDatas.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/ProtoDatas.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.serialization +import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.serialization.deserialization.NameResolver data class ClassData( @@ -23,6 +24,11 @@ data class ClassData( val classProto: ProtoBuf.Class ) +data class ClassDataWithSource( + val classData: ClassData, + val sourceElement: SourceElement = SourceElement.NO_SOURCE +) + data class PackageData( val nameResolver: NameResolver, val packageProto: ProtoBuf.Package diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder.java b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder.java index ba9d6817c32..b0f28dcf1e3 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder.java @@ -19,8 +19,9 @@ package org.jetbrains.kotlin.serialization.deserialization; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.name.ClassId; +import org.jetbrains.kotlin.serialization.ClassDataWithSource; public interface ClassDataFinder { @Nullable - ClassDataProvider findClassData(@NotNull ClassId classId); + ClassDataWithSource findClassData(@NotNull ClassId classId); } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataProvider.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataProvider.kt deleted file mode 100644 index bc2e34af41b..00000000000 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataProvider.kt +++ /dev/null @@ -1,25 +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.SourceElement -import org.jetbrains.kotlin.serialization.ClassData - -public class ClassDataProvider( - public val classData: ClassData, - public val sourceElement: SourceElement = SourceElement.NO_SOURCE -) \ No newline at end of file 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 c4a51691857..42925ba0155 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt @@ -18,50 +18,52 @@ package org.jetbrains.kotlin.serialization.deserialization import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.serialization.ClassDataWithSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor public class ClassDeserializer(private val components: DeserializationComponents) { private val classes: (ClassKey) -> ClassDescriptor? = components.storageManager.createMemoizedFunctionWithNullableValues { key -> createClass(key) } - // Additional ClassData parameter is needed to avoid calling ClassDataFinder#findClassData() if it is already computed at call site - public fun deserializeClass(classId: ClassId, classDataProvider: ClassDataProvider? = null): ClassDescriptor? = - classes(ClassKey(classId, classDataProvider)) + // Additional ClassDataWithSource parameter is needed to avoid calling ClassDataFinder#findClassData() + // if it is already computed at the call site + public fun deserializeClass(classId: ClassId, classDataWithSource: ClassDataWithSource? = null): ClassDescriptor? = + classes(ClassKey(classId, classDataWithSource)) private fun createClass(key: ClassKey): ClassDescriptor? { val classId = key.classId components.fictitiousClassDescriptorFactory.createClass(classId)?.let { return it } - val classDataProvider = key.classDataProvider - ?: components.classDataFinder.findClassData(classId) - ?: return null - val (nameResolver, classProto) = classDataProvider.classData + val (classData, sourceElement) = key.classDataWithSource + ?: components.classDataFinder.findClassData(classId) + ?: return null + val (nameResolver, classProto) = classData - val outerContext = if (classId.isNestedClass()) { - val outerClass = deserializeClass(classId.getOuterClassId()) as? DeserializedClassDescriptor ?: return null + val outerContext = if (classId.isNestedClass) { + val outerClass = deserializeClass(classId.outerClassId) as? DeserializedClassDescriptor ?: return null // Find the outer class first and check if he knows anything about the nested class we're looking for - if (!outerClass.hasNestedClass(classId.getShortClassName())) return null + if (!outerClass.hasNestedClass(classId.shortClassName)) return null outerClass.c } else { - val fragments = components.packageFragmentProvider.getPackageFragments(classId.getPackageFqName()) + val fragments = components.packageFragmentProvider.getPackageFragments(classId.packageFqName) assert(fragments.size() == 1) { "There should be exactly one package: $fragments, class id is $classId" } val fragment = fragments.single() if (fragment is DeserializedPackageFragment) { // Similarly, verify that the containing package has information about this class - if (!fragment.hasTopLevelClass(classId.getShortClassName())) return null + if (!fragment.hasTopLevelClass(classId.shortClassName)) return null } components.createContext(fragment, nameResolver) } - return DeserializedClassDescriptor(outerContext, classProto, nameResolver, classDataProvider.sourceElement) + return DeserializedClassDescriptor(outerContext, classProto, nameResolver, sourceElement) } - private data class ClassKey(val classId: ClassId, classDataProvider: ClassDataProvider?) { + private data class ClassKey(val classId: ClassId, classDataWithSource: ClassDataWithSource?) { // This property is not declared in the constructor because it shouldn't participate in equals/hashCode - val classDataProvider: ClassDataProvider? = classDataProvider + val classDataWithSource: ClassDataWithSource? = classDataWithSource } } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt index b56d4efce70..b8e09f042b0 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt @@ -19,6 +19,7 @@ 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 @@ -28,7 +29,7 @@ public open class ResourceLoadingClassDataFinder( private val serializedResourcePaths: SerializedResourcePaths, private val loadResource: (path: String) -> InputStream? ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassDataProvider? { + override fun findClassData(classId: ClassId): ClassDataWithSource? { val packageFragment = packageFragmentProvider.getPackageFragments(classId.getPackageFqName()).singleOrNull() as? DeserializedPackageFragment ?: return null @@ -38,6 +39,6 @@ public open class ResourceLoadingClassDataFinder( packageFragment.nameResolver, ProtoBuf.Class.parseFrom(stream, serializedResourcePaths.extensionRegistry) ) - return ClassDataProvider(classData) + return ClassDataWithSource(classData) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt index 456dd40b482..596e61d43f2 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt @@ -220,8 +220,8 @@ private class ClassClsStubBuilder( } private fun createNestedClassStub(classBody: StubElement, nestedClassId: ClassId) { - val classDataProvider = c.components.classDataFinder.findClassData(nestedClassId)!! - val (nameResolver, classProto) = classDataProvider.classData + val classDataWithSource = c.components.classDataFinder.findClassData(nestedClassId)!! + val (nameResolver, classProto) = classDataWithSource.classData createClassStub(classBody, classProto, nestedClassId, c.child(nameResolver)) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DirectoryBasedClassFinder.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DirectoryBasedClassFinder.kt index f62f01a70c1..acb14260aec 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DirectoryBasedClassFinder.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/textBuilder/DirectoryBasedClassFinder.kt @@ -27,8 +27,8 @@ import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.ClassDataWithSource import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.deserialization.ClassDataProvider import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolver import org.jetbrains.kotlin.serialization.deserialization.NameResolver import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil @@ -71,7 +71,7 @@ class DirectoryBasedDataFinder( val classFinder: DirectoryBasedClassFinder, val log: Logger ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassDataProvider? { + override fun findClassData(classId: ClassId): ClassDataWithSource? { val binaryClass = classFinder.findKotlinClass(classId) ?: return null val data = binaryClass.getClassHeader().annotationData if (data == null) { @@ -80,7 +80,7 @@ class DirectoryBasedDataFinder( } val classData = JvmProtoBufUtil.readClassDataFrom(data) - return ClassDataProvider(classData) + return ClassDataWithSource(classData) } } @@ -88,12 +88,12 @@ class DirectoryBasedKotlinJavaScriptDataFinder( val classFinder: DirectoryBasedKotlinJavaScriptMetaFileFinder, val log: Logger ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassDataProvider? { + override fun findClassData(classId: ClassId): ClassDataWithSource? { val file = classFinder.findKotlinJavascriptMetaFile(classId) ?: return null val content = file.contentsToByteArray(false) val classData = content.toClassData(classFinder.nameResolver) - return ClassDataProvider(classData) + return ClassDataWithSource(classData) } }