More correct detection of Kotlin/Native stdlib by open IDEA projects
This commit is contained in:
committed by
Mikhail Glukhikh
parent
e8f238d53c
commit
fbeff9245e
+15
-31
@@ -5,29 +5,23 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.ide.konan
|
package org.jetbrains.kotlin.ide.konan
|
||||||
|
|
||||||
import com.intellij.openapi.module.Module
|
|
||||||
import com.intellij.openapi.module.ModuleManager
|
|
||||||
import com.intellij.openapi.project.ProjectManager
|
|
||||||
import com.intellij.openapi.roots.ModuleRootManager
|
|
||||||
import com.intellij.openapi.roots.libraries.PersistentLibraryKind
|
import com.intellij.openapi.roots.libraries.PersistentLibraryKind
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.util.io.exists
|
|
||||||
import org.jetbrains.konan.KONAN_CURRENT_ABI_VERSION
|
import org.jetbrains.konan.KONAN_CURRENT_ABI_VERSION
|
||||||
import org.jetbrains.kotlin.ide.konan.analyzer.NativeAnalyzerFacade
|
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.caches.resolve.IdePlatformKindResolution
|
import org.jetbrains.kotlin.caches.resolve.IdePlatformKindResolution
|
||||||
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
|
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
||||||
import org.jetbrains.kotlin.context.ProjectContext
|
import org.jetbrains.kotlin.context.ProjectContext
|
||||||
|
import org.jetbrains.kotlin.ide.konan.analyzer.NativeAnalyzerFacade
|
||||||
import org.jetbrains.kotlin.idea.caches.project.LibraryInfo
|
import org.jetbrains.kotlin.idea.caches.project.LibraryInfo
|
||||||
|
import org.jetbrains.kotlin.idea.caches.project.getModuleInfosFromIdeaModel
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
|
import org.jetbrains.kotlin.idea.caches.resolve.PlatformAnalysisSettings
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
import org.jetbrains.kotlin.konan.library.KONAN_STDLIB_NAME
|
||||||
import org.jetbrains.kotlin.konan.library.createKonanLibrary
|
import org.jetbrains.kotlin.konan.library.createKonanLibrary
|
||||||
import org.jetbrains.kotlin.konan.utils.KonanFactories.DefaultDeserializedDescriptorFactory
|
import org.jetbrains.kotlin.konan.utils.KonanFactories.DefaultDeserializedDescriptorFactory
|
||||||
import java.nio.file.Path
|
import org.jetbrains.kotlin.resolve.konan.platform.KonanPlatform
|
||||||
import java.nio.file.Paths
|
|
||||||
|
|
||||||
class NativePlatformKindResolution : IdePlatformKindResolution {
|
class NativePlatformKindResolution : IdePlatformKindResolution {
|
||||||
|
|
||||||
@@ -47,38 +41,28 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
|
|||||||
createKotlinNativeBuiltIns(projectContext)
|
createKotlinNativeBuiltIns(projectContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
val Module.isKotlinNativeModule: Boolean
|
|
||||||
get() {
|
|
||||||
val settings = KotlinFacetSettingsProvider.getInstance(project).getInitializedSettings(this)
|
|
||||||
return settings.platform.isKotlinNative
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun createKotlinNativeBuiltIns(projectContext: ProjectContext): KotlinBuiltIns {
|
private fun createKotlinNativeBuiltIns(projectContext: ProjectContext): KotlinBuiltIns {
|
||||||
|
|
||||||
// TODO: It depends on a random project's stdlib, propagate the actual project here.
|
// TODO: It depends on a random project's stdlib, propagate the actual project here.
|
||||||
val stdlib: Pair<Path, LibraryInfo>? = ProjectManager.getInstance().openProjects.asSequence().mapNotNull { project ->
|
fun findStdlib(): Pair<String, LibraryInfo>? {
|
||||||
|
getModuleInfosFromIdeaModel(projectContext.project, KonanPlatform).forEach { module ->
|
||||||
ModuleManager.getInstance(project).modules.asSequence().filter { it.isKotlinNativeModule }.mapNotNull { module ->
|
module.dependencies().forEach { dependency ->
|
||||||
|
(dependency as? LibraryInfo)?.getLibraryRoots()?.forEach { path ->
|
||||||
var result: Pair<Path, LibraryInfo>? = null
|
if (path.endsWith(KONAN_STDLIB_NAME)) {
|
||||||
|
return path to dependency
|
||||||
ModuleRootManager.getInstance(module).orderEntries().forEachLibrary { library ->
|
}
|
||||||
if (library.name == KONAN_STDLIB_NAME) {
|
|
||||||
val libraryInfo = LibraryInfo(project, library)
|
|
||||||
val path = libraryInfo.getLibraryRoots().firstOrNull()?.let { Paths.get(it) }?.takeIf { it.exists() }
|
|
||||||
if (path != null) result = path to libraryInfo
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result == null
|
|
||||||
}
|
}
|
||||||
result
|
|
||||||
}
|
}
|
||||||
}.flatten().firstOrNull()
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
val stdlib: Pair<String, LibraryInfo>? = findStdlib()
|
||||||
|
|
||||||
if (stdlib != null) {
|
if (stdlib != null) {
|
||||||
|
|
||||||
val (path, libraryInfo) = stdlib
|
val (path, libraryInfo) = stdlib
|
||||||
val library = createKonanLibrary(path.File(), KONAN_CURRENT_ABI_VERSION)
|
val library = createKonanLibrary(File(path), KONAN_CURRENT_ABI_VERSION)
|
||||||
|
|
||||||
val builtInsModule = DefaultDeserializedDescriptorFactory.createDescriptorAndNewBuiltIns(
|
val builtInsModule = DefaultDeserializedDescriptorFactory.createDescriptorAndNewBuiltIns(
|
||||||
library,
|
library,
|
||||||
|
|||||||
Reference in New Issue
Block a user