From f92d1125649276045965dff3d26f16da6419f1c2 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Mon, 6 Apr 2015 11:18:10 +0300 Subject: [PATCH] DirectoryBasedClassFinder: add DirectoryBasedKotlinJavaScriptMetaFileFinder and DirectoryBasedKotlinJavaScriptDataFinder --- .../textBuilder/DirectoryBasedClassFinder.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) 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 d7e8c057ef5..7798847b298 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 @@ -30,6 +30,9 @@ 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.LocalClassResolver +import org.jetbrains.kotlin.serialization.deserialization.NameResolver +import org.jetbrains.kotlin.serialization.js.KotlinJavascriptSerializationUtil +import org.jetbrains.kotlin.serialization.js.toClassData import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil class DirectoryBasedClassFinder( @@ -51,6 +54,19 @@ class DirectoryBasedClassFinder( } } +class DirectoryBasedKotlinJavaScriptMetaFileFinder( + val packageDirectory: VirtualFile, + val directoryPackageFqName: FqName, + val nameResolver: NameResolver +) { + fun findKotlinJavascriptMetaFile(classId: ClassId): VirtualFile? { + if (classId.getPackageFqName() != directoryPackageFqName) return null + + val targetName = classId.getRelativeClassName().pathSegments().joinToString(".", postfix = "." + KotlinJavascriptSerializationUtil.CLASS_METADATA_FILE_EXTENSION) + return packageDirectory.findChild(targetName) + } +} + class DirectoryBasedDataFinder( val classFinder: DirectoryBasedClassFinder, val log: Logger @@ -66,6 +82,18 @@ class DirectoryBasedDataFinder( } } +class DirectoryBasedKotlinJavaScriptDataFinder( + val classFinder: DirectoryBasedKotlinJavaScriptMetaFileFinder, + val log: Logger +) : ClassDataFinder { + override fun findClassData(classId: ClassId): ClassData? { + val file = classFinder.findKotlinJavascriptMetaFile(classId) ?: return null + + val content = file.contentsToByteArray(false) + return content.toClassData(classFinder.nameResolver) + } +} + object ResolveEverythingToKotlinAnyLocalClassResolver : LocalClassResolver { override fun resolveLocalClass(classId: ClassId): ClassDescriptor = KotlinBuiltIns.getInstance().getAny() }