Add JvmBuiltIns.Kind instead of boolean flags in constructor
This commit is contained in:
@@ -13,12 +13,46 @@ import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.storage.getValue
|
||||
import org.jetbrains.kotlin.utils.sure
|
||||
|
||||
class JvmBuiltIns @JvmOverloads constructor(
|
||||
storageManager: StorageManager,
|
||||
loadBuiltInsFromCurrentClassLoader: Boolean = true,
|
||||
// TODO: change this value to loadBuiltInsFromCurrentClassLoader as soon as built-ins are loaded from module dependencies everywhere
|
||||
isFallback: Boolean = false
|
||||
) : KotlinBuiltIns(storageManager) {
|
||||
class JvmBuiltIns(storageManager: StorageManager, kind: Kind) : KotlinBuiltIns(storageManager) {
|
||||
/**
|
||||
* Where built-ins should be loaded from.
|
||||
*/
|
||||
enum class Kind {
|
||||
/**
|
||||
* Load built-ins from dependencies of the module that's being compiled. In this case, any request to a built-in class such as
|
||||
* `kotlin.String` would end up querying contents of the module and all its dependencies in order until the first one returns
|
||||
* anything, similarly to how it's done for normal (.class file-based) dependencies. If there's a class with FQ name `kotlin.String`
|
||||
* in module sources, it'll be returned in [KotlinBuiltIns.getString], otherwise it'll be loaded from the first dependency that
|
||||
* has the `kotlin/kotlin.kotlin_builtins` file where metadata of `kotlin.String` is located.
|
||||
*
|
||||
* If this mode is selected, the module should be injected after an instance of [JvmBuiltIns] is created via setting
|
||||
* [KotlinBuiltIns.builtInsModule] to point to the module that's being compiled.
|
||||
*
|
||||
* This mode is preferred and should be used in new code when possible.
|
||||
*/
|
||||
FROM_DEPENDENCIES,
|
||||
|
||||
/**
|
||||
* Load built-ins by looking up `.kotlin_builtins` resources in the class loader of the current compiler or IDE plugin.
|
||||
*
|
||||
* This mode is discouraged and should be avoided when possible. The reason is that in case versions of the compiler and the
|
||||
* standard library in compilation dependencies do not match, there can be tricky errors or even differences in behavior if
|
||||
* built-ins API has changed.
|
||||
*/
|
||||
FROM_CLASS_LOADER,
|
||||
|
||||
/**
|
||||
* Similarly to [FROM_CLASS_LOADER], load built-ins from the compiler class loader, but also mark the loaded package
|
||||
* fragments as "fallback" (`BuiltInsPackageFragment.isFallback`) to make the compiler report errors on any usages of elements
|
||||
* from these built-ins.
|
||||
*
|
||||
* This mode is useful as a "secondary" built-ins source to ensure there are at least some built-ins for the compiler frontend to
|
||||
* work correctly. Such fallback built-ins are usually placed at the end of the dependencies list, so that built-ins from the
|
||||
* standard library (which are present in >99% cases) would win in the resolution.
|
||||
*/
|
||||
FALLBACK,
|
||||
}
|
||||
|
||||
// Module containing JDK classes or having them among dependencies
|
||||
private var ownerModuleDescriptor: ModuleDescriptor? = null
|
||||
private var isAdditionalBuiltInsFeatureSupported: Boolean = true
|
||||
@@ -41,8 +75,11 @@ class JvmBuiltIns @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
init {
|
||||
if (loadBuiltInsFromCurrentClassLoader) {
|
||||
createBuiltInsModule(isFallback)
|
||||
when (kind) {
|
||||
Kind.FROM_DEPENDENCIES -> {
|
||||
}
|
||||
Kind.FROM_CLASS_LOADER -> createBuiltInsModule(false)
|
||||
Kind.FALLBACK -> createBuiltInsModule(true)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -57,7 +57,7 @@ class RuntimeModuleData private constructor(
|
||||
companion object {
|
||||
fun create(classLoader: ClassLoader): RuntimeModuleData {
|
||||
val storageManager = LockBasedStorageManager("RuntimeModuleData")
|
||||
val builtIns = JvmBuiltIns(storageManager, false)
|
||||
val builtIns = JvmBuiltIns(storageManager, JvmBuiltIns.Kind.FROM_DEPENDENCIES)
|
||||
val module = ModuleDescriptorImpl(Name.special("<runtime module for $classLoader>"), storageManager, builtIns)
|
||||
builtIns.builtInsModule = module
|
||||
|
||||
@@ -93,8 +93,8 @@ class RuntimeModuleData private constructor(
|
||||
RuntimeErrorReporter, LookupTracker.DO_NOTHING, ContractDeserializer.DEFAULT
|
||||
)
|
||||
val builtinsProvider = JvmBuiltInsPackageFragmentProvider(
|
||||
storageManager, reflectKotlinClassFinder, module, notFoundClasses, builtIns.settings, builtIns.settings,
|
||||
DeserializationConfiguration.Default
|
||||
storageManager, reflectKotlinClassFinder, module, notFoundClasses, builtIns.settings, builtIns.settings,
|
||||
DeserializationConfiguration.Default
|
||||
)
|
||||
|
||||
singleModuleClassResolver.resolver = javaDescriptorResolver
|
||||
|
||||
Reference in New Issue
Block a user