K/N: Correct creation of module descriptors for K/N module
This commit is contained in:
committed by
Mikhail Glukhikh
parent
fbeff9245e
commit
2ff538fc87
@@ -6,9 +6,7 @@
|
|||||||
package org.jetbrains.konan
|
package org.jetbrains.konan
|
||||||
|
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.module.Module
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.roots.ModuleRootManager
|
|
||||||
import com.intellij.psi.PsiFileFactory
|
import com.intellij.psi.PsiFileFactory
|
||||||
import com.intellij.psi.SingleRootFileViewProvider
|
import com.intellij.psi.SingleRootFileViewProvider
|
||||||
import com.intellij.psi.impl.PsiFileFactoryImpl
|
import com.intellij.psi.impl.PsiFileFactoryImpl
|
||||||
@@ -61,21 +59,24 @@ fun <M : ModuleInfo> createDeclarationProviderFactory(
|
|||||||
moduleInfo
|
moduleInfo
|
||||||
)
|
)
|
||||||
|
|
||||||
fun Module.createResolvedModuleDescriptors(
|
fun ModuleInfo.createResolvedModuleDescriptors(
|
||||||
|
project: Project,
|
||||||
storageManager: StorageManager,
|
storageManager: StorageManager,
|
||||||
builtIns: KotlinBuiltIns,
|
builtIns: KotlinBuiltIns,
|
||||||
languageVersionSettings: LanguageVersionSettings
|
languageVersionSettings: LanguageVersionSettings
|
||||||
): KonanResolvedModuleDescriptors {
|
): KonanResolvedModuleDescriptors {
|
||||||
|
|
||||||
// This is to preserve "capabilities" from the original IntelliJ LibraryInfo:
|
// This is to preserve "capabilities" from the original IntelliJ LibraryInfo:
|
||||||
val libraryMap = mutableMapOf<String, LibraryInfo>()
|
val libraryMap =
|
||||||
ModuleRootManager.getInstance(this).orderEntries().forEachLibrary { intellijLibrary ->
|
this.dependencies().filterIsInstance<LibraryInfo>().flatMap { dependency ->
|
||||||
intellijLibrary.name?.let { name -> libraryMap[name] = LibraryInfo(project, intellijLibrary) }
|
dependency.getLibraryRoots().map { file ->
|
||||||
true
|
file to dependency
|
||||||
}
|
}
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
val resolvedLibraries =
|
val resolvedLibraries =
|
||||||
KonanPluginSearchPathResolver(project).libraryResolver(KONAN_CURRENT_ABI_VERSION).resolveWithDependencies(libraryMap.keys.toList())
|
KonanPluginSearchPathResolver(project).libraryResolver(KONAN_CURRENT_ABI_VERSION)
|
||||||
|
.resolveWithDependencies(libraryMap.keys.toList(), true, true)
|
||||||
|
|
||||||
return DefaultResolvedDescriptorsFactory.createResolved(
|
return DefaultResolvedDescriptorsFactory.createResolved(
|
||||||
resolvedLibraries,
|
resolvedLibraries,
|
||||||
@@ -84,7 +85,7 @@ fun Module.createResolvedModuleDescriptors(
|
|||||||
languageVersionSettings,
|
languageVersionSettings,
|
||||||
null
|
null
|
||||||
// This is to preserve "capabilities" from the original IntelliJ LibraryInfo:
|
// This is to preserve "capabilities" from the original IntelliJ LibraryInfo:
|
||||||
) { konanLibrary -> libraryMap[konanLibrary.pureName]?.capabilities ?: emptyMap() }
|
) { konanLibrary -> libraryMap[konanLibrary.libraryFile.path]?.capabilities ?: emptyMap() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private val KonanLibrary.pureName
|
private val KonanLibrary.pureName
|
||||||
|
|||||||
+9
-14
@@ -58,22 +58,17 @@ object NativeAnalyzerFacade : ResolverForModuleFactory() {
|
|||||||
languageVersionSettings
|
languageVersionSettings
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val moduleDescriptors = moduleContent.moduleInfo.createResolvedModuleDescriptors(
|
||||||
|
moduleContext.project,
|
||||||
|
moduleContext.storageManager,
|
||||||
|
moduleContext.module.builtIns,
|
||||||
|
languageVersionSettings
|
||||||
|
)
|
||||||
|
|
||||||
val packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
|
val packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
|
||||||
val module = (moduleContent.moduleInfo as? ModuleProductionSourceInfo)?.module
|
|
||||||
|
|
||||||
val fragmentProviders = mutableListOf(packageFragmentProvider)
|
val fragmentProviders = mutableListOf(packageFragmentProvider)
|
||||||
|
moduleDescriptors.resolvedDescriptors.mapTo(fragmentProviders) { it.packageFragmentProvider }
|
||||||
if (module != null) {
|
fragmentProviders.add(moduleDescriptors.forwardDeclarationsModule.packageFragmentProvider)
|
||||||
|
|
||||||
val moduleDescriptors = module.createResolvedModuleDescriptors(
|
|
||||||
moduleContext.storageManager,
|
|
||||||
moduleContext.module.builtIns,
|
|
||||||
languageVersionSettings
|
|
||||||
)
|
|
||||||
|
|
||||||
moduleDescriptors.resolvedDescriptors.mapTo(fragmentProviders) { it.packageFragmentProvider }
|
|
||||||
fragmentProviders.add(moduleDescriptors.forwardDeclarationsModule.packageFragmentProvider)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container)
|
return ResolverForModule(CompositePackageFragmentProvider(fragmentProviders), container)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user