Support for split-packages in Kotlin Native

See JetBrains/kotlin-native#2034
This commit is contained in:
Simon Ogorodnik
2018-09-11 03:02:31 +03:00
parent a2c5c515de
commit 7166c011bf
10 changed files with 45 additions and 25 deletions
@@ -23,13 +23,13 @@ import org.jetbrains.kotlin.idea.KotlinLanguage
import org.jetbrains.kotlin.idea.caches.project.LibraryInfo
import org.jetbrains.kotlin.idea.decompiler.textBuilder.LoggingErrorReporter
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.util.KonanFactories.DefaultPackageFragmentsFactory
import org.jetbrains.kotlin.konan.library.KonanLibrary
import org.jetbrains.kotlin.konan.library.KonanLibraryLayout
import org.jetbrains.kotlin.konan.library.KonanLibrarySource.KonanLibraryDir
import org.jetbrains.kotlin.konan.library.KonanLibrarySource.KonanLibraryFile
import org.jetbrains.kotlin.konan.library.MetadataReader
import org.jetbrains.kotlin.konan.library.createKonanLibrary
import org.jetbrains.kotlin.konan.util.KonanFactories.DefaultPackageFragmentsFactory
import org.jetbrains.kotlin.metadata.konan.KonanProtoBuf
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.resolve.CompilerDeserializationConfiguration
@@ -104,9 +104,10 @@ internal object CachingIdeMetadataReaderImpl : MetadataReader {
override fun loadSerializedPackageFragment(
libraryLayout: KonanLibraryLayout,
packageFqName: String
packageFqName: String,
partIndex: Int
): KonanProtoBuf.LinkDataPackageFragment =
cache.getCachedPackageFragment(libraryLayout.getVirtualFile(libraryLayout.packageFragmentFile(packageFqName)))
cache.getCachedPackageFragment(libraryLayout.getVirtualFile(libraryLayout.packageFragmentFile(packageFqName, partIndex)))
private fun KonanLibraryLayout.getVirtualFile(file: File): VirtualFile {
val source = this.source
@@ -6,7 +6,10 @@
package org.jetbrains.kotlin.ide.konan
import com.intellij.openapi.roots.libraries.PersistentLibraryKind
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.openapi.vfs.VirtualFileVisitor
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.caches.resolve.IdePlatformKindResolution
@@ -29,8 +32,11 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
override fun isLibraryFileForPlatform(virtualFile: VirtualFile): Boolean {
return if (virtualFile.isDirectory) {
virtualFile.findChild("linkdata")?.takeIf { it.isDirectory }
?.children?.any { it.extension == KLIB_METADATA_FILE_EXTENSION } == true
val dir = virtualFile.findChild("linkdata") ?: return false
// False means we hit .knm file
!VfsUtil.processFilesRecursively(dir) {
it.extension != KLIB_METADATA_FILE_EXTENSION
}
} else {
virtualFile.extension == KLIB_FILE_EXTENSION
}
@@ -101,10 +101,10 @@ sealed class FileWithMetadata {
open class Compatible(
val proto: KonanProtoBuf.LinkDataPackageFragment,
serializerProtocol: SerializerExtensionProtocol
serializerProtocol: SerializerExtensionProtocol // TODO: Is it required?
) : FileWithMetadata() {
val nameResolver = NameResolverImpl(proto.stringTable, proto.nameTable)
val packageFqName = FqName(nameResolver.getPackageFqName(proto.`package`.getExtension(serializerProtocol.packageFqName)))
val packageFqName = FqName(proto.fqName)
open val classesToDecompile: List<ProtoBuf.Class> =
proto.classes.classesList.filter { proto ->