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 01d902b2c18..7d4c176abcc 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,22 +16,23 @@ 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.deserialization.ClassDataFinder -import org.jetbrains.kotlin.serialization.ClassData +import org.jetbrains.kotlin.serialization.deserialization.ClassDataProvider import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil -import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader public class JavaClassDataFinder( private val kotlinClassFinder: KotlinClassFinder, private val deserializedDescriptorResolver: DeserializedDescriptorResolver ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassData? { + override fun findClassData(classId: ClassId): ClassDataProvider? { 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, KotlinClassHeader.Kind.CLASS) ?: return null - return JvmProtoBufUtil.readClassDataFrom(data) + val classData = JvmProtoBufUtil.readClassDataFrom(data) + return ClassDataProvider(classData) } } 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 a6067d65ec0..ba9d6817c32 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder.java +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataFinder.java @@ -19,9 +19,8 @@ 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.ClassData; public interface ClassDataFinder { @Nullable - ClassData findClassData(@NotNull ClassId classId); + ClassDataProvider 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 new file mode 100644 index 00000000000..bc2e34af41b --- /dev/null +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDataProvider.kt @@ -0,0 +1,25 @@ +/* + * 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 22e680678a8..21cb090e754 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt @@ -33,7 +33,11 @@ public class ClassDeserializer(private val components: DeserializationComponents val classId = key.classId components.fictitiousClassDescriptorFactory.createClass(classId)?.let { return it } - val classData = key.classData ?: components.classDataFinder.findClassData(classId) ?: return null + var classData = key.classData ?: run { + val classDataProvider = components.classDataFinder.findClassData(classId) + classDataProvider?.classData + } ?: return null + val outerContext = if (classId.isNestedClass()) { val outerClass = deserializeClass(classId.getOuterClassId()) as? DeserializedClassDescriptor ?: return null 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 a7ba2d90484..b56d4efce70 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ResourceLoadingClassDataFinder.kt @@ -28,15 +28,16 @@ public open class ResourceLoadingClassDataFinder( private val serializedResourcePaths: SerializedResourcePaths, private val loadResource: (path: String) -> InputStream? ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassData? { + override fun findClassData(classId: ClassId): ClassDataProvider? { val packageFragment = packageFragmentProvider.getPackageFragments(classId.getPackageFqName()).singleOrNull() as? DeserializedPackageFragment ?: return null val stream = loadResource(serializedResourcePaths.getClassMetadataPath(classId)) ?: return null - return ClassData( + val classData = ClassData( packageFragment.nameResolver, ProtoBuf.Class.parseFrom(stream, serializedResourcePaths.extensionRegistry) ) + return ClassDataProvider(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 f5a992ebeb1..6b21b477777 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,7 +220,8 @@ private class ClassClsStubBuilder( } private fun createNestedClassStub(classBody: StubElement, nestedClassId: ClassId) { - val classData = c.components.classDataFinder.findClassData(nestedClassId)!! + val classDataProvider = c.components.classDataFinder.findClassData(nestedClassId)!! + val classData = classDataProvider.classData createClassStub(classBody, classData.getClassProto(), nestedClassId, c.child(classData.getNameResolver())) } } 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 7798847b298..f62f01a70c1 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.ClassData 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,14 +71,16 @@ class DirectoryBasedDataFinder( val classFinder: DirectoryBasedClassFinder, val log: Logger ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassData? { + override fun findClassData(classId: ClassId): ClassDataProvider? { val binaryClass = classFinder.findKotlinClass(classId) ?: return null val data = binaryClass.getClassHeader().annotationData if (data == null) { log.error("Annotation data missing for ${binaryClass.getClassId()}") return null } - return JvmProtoBufUtil.readClassDataFrom(data) + + val classData = JvmProtoBufUtil.readClassDataFrom(data) + return ClassDataProvider(classData) } } @@ -86,11 +88,12 @@ class DirectoryBasedKotlinJavaScriptDataFinder( val classFinder: DirectoryBasedKotlinJavaScriptMetaFileFinder, val log: Logger ) : ClassDataFinder { - override fun findClassData(classId: ClassId): ClassData? { + override fun findClassData(classId: ClassId): ClassDataProvider? { val file = classFinder.findKotlinJavascriptMetaFile(classId) ?: return null val content = file.contentsToByteArray(false) - return content.toClassData(classFinder.nameResolver) + val classData = content.toClassData(classFinder.nameResolver) + return ClassDataProvider(classData) } }