DirectoryBasedClassFinder: add DirectoryBasedKotlinJavaScriptMetaFileFinder and DirectoryBasedKotlinJavaScriptDataFinder

This commit is contained in:
Michael Nedzelsky
2015-04-06 11:18:10 +03:00
parent 7a01ba7d7a
commit f92d112564
@@ -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()
}