[FIR] Use KlibBasedSymbolProvider in FirCommonSessionFactory

Unify logic of KLib resolving (Common and JS)

^KT-56354 Fixed
This commit is contained in:
Ivan Kochurkin
2023-03-01 14:20:49 +01:00
committed by Space Team
parent d829f8b684
commit de5b475f7a
17 changed files with 163 additions and 74 deletions
@@ -4,6 +4,7 @@
package org.jetbrains.kotlin.ir.backend.js.ic
import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver
import org.jetbrains.kotlin.backend.common.phaser.PhaseConfig
import org.jetbrains.kotlin.backend.common.serialization.cityHash64
import org.jetbrains.kotlin.config.CompilerConfiguration
@@ -12,7 +13,6 @@ import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.JsIrProgramFragment
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
import org.jetbrains.kotlin.konan.properties.propertyList
import org.jetbrains.kotlin.library.KLIB_PROPERTY_DEPENDS
import org.jetbrains.kotlin.library.KotlinLibrary
@@ -87,7 +87,7 @@ class CacheUpdater(
// libraries in topological order: [stdlib, ..., main]
val libraryDependencies = stopwatch.measure("Resolving and loading klib dependencies") {
val allResolvedDependencies = jsResolveLibraries(allModules, compilerConfiguration.resolverLogger)
val allResolvedDependencies = CommonJsKLibResolver.resolve(allModules, compilerConfiguration.resolverLogger)
val libraries = allResolvedDependencies.getFullList(TopologicalLibraryOrder).let { resolvedLibraries ->
val mainLibraryIndex = resolvedLibraries.indexOfLast {
@@ -1,9 +1,9 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.ir.backend.js
package org.jetbrains.kotlin.backend.common
import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.library.KotlinLibrary
@@ -15,7 +15,53 @@ import org.jetbrains.kotlin.library.metadata.resolver.KotlinLibraryResolver
import org.jetbrains.kotlin.library.metadata.resolver.impl.libraryResolver
import org.jetbrains.kotlin.util.Logger
class JsLibraryResolver(
object CommonJsKLibResolver {
fun resolve(libraries: Collection<String>, logger: Logger): KotlinLibraryResolveResult =
resolveWithoutDependencies(
libraries,
logger
).resolveWithDependencies()
fun resolveWithoutDependencies(
libraries: Collection<String>,
logger: Logger
): KLibResolution {
val unresolvedLibraries = libraries.map { UnresolvedLibrary(it, null) }
val libraryAbsolutePaths = libraries.map { File(it).absolutePath }
// Configure the resolver to only work with absolute paths for now.
val libraryResolver = KLibResolverHelper(
repositories = emptyList(),
directLibs = libraryAbsolutePaths,
distributionKlib = null,
localKotlinDir = null,
skipCurrentDir = false,
logger = logger
).libraryResolver()
return KLibResolution(
libraryResolver,
libraryResolver.resolveWithoutDependencies(
unresolvedLibraries = unresolvedLibraries,
noStdLib = true,
noDefaultLibs = true,
noEndorsedLibs = true
)
)
}
}
class KLibResolution(
private val libraryResolver: KotlinLibraryResolver<KotlinLibrary>,
val libraries: List<KotlinLibrary>
) {
fun resolveWithDependencies(): KotlinLibraryResolveResult {
return with(libraryResolver) {
libraries.resolveDependencies()
}
}
}
private class KLibResolverHelper(
repositories: List<String>,
directLibs: List<String>,
distributionKlib: String?,
@@ -33,49 +79,4 @@ class JsLibraryResolver(
) {
// Stick with the default KotlinLibrary for now.
override fun libraryComponentBuilder(file: File, isDefault: Boolean) = createKotlinLibraryComponents(file, isDefault)
}
// TODO: This is a temporary set of library resolver policies for js compiler.
fun jsResolveLibraries(libraries: Collection<String>, logger: Logger): KotlinLibraryResolveResult =
jsResolveLibrariesWithoutDependencies(
libraries,
logger
).resolveWithDependencies()
fun jsResolveLibrariesWithoutDependencies(
libraries: Collection<String>,
logger: Logger
): JsResolution {
val unresolvedLibraries = libraries.map { UnresolvedLibrary(it, null) }
val libraryAbsolutePaths = libraries.map { File(it).absolutePath }
// Configure the resolver to only work with absolute paths for now.
val libraryResolver = JsLibraryResolver(
repositories = emptyList(),
directLibs = libraryAbsolutePaths,
distributionKlib = null,
localKotlinDir = null,
skipCurrentDir = false,
logger = logger
).libraryResolver()
return JsResolution(
libraryResolver,
libraryResolver.resolveWithoutDependencies(
unresolvedLibraries = unresolvedLibraries,
noStdLib = true,
noDefaultLibs = true,
noEndorsedLibs = true
)
)
}
class JsResolution(
private val libraryResolver: KotlinLibraryResolver<KotlinLibrary>,
val libraries: List<KotlinLibrary>
) {
fun resolveWithDependencies(): KotlinLibraryResolveResult {
return with(libraryResolver) {
libraries.resolveDependencies()
}
}
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.KtVirtualFileSourceFile
import org.jetbrains.kotlin.analyzer.AbstractAnalyzerWithCompilerReport
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.analyzer.CompilationErrorException
import org.jetbrains.kotlin.backend.common.CommonJsKLibResolver
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
@@ -469,7 +470,7 @@ class ModulesStructure(
friendDependenciesPaths: Collection<String>,
) {
val allDependenciesResolution = jsResolveLibrariesWithoutDependencies(
val allDependenciesResolution = CommonJsKLibResolver.resolveWithoutDependencies(
dependencies,
compilerConfiguration.resolverLogger
)