Refactor initialization of JvmBuiltIns instance

Use lazy val instead of lateinit var + implicit dependency on the code in
KotlinBuiltIns constructor
This commit is contained in:
Alexander Udalov
2016-11-07 18:46:57 +03:00
parent 5adb22ed65
commit 5cd9e11f44
4 changed files with 39 additions and 28 deletions
@@ -498,6 +498,10 @@ open class JvmBuiltInsSettings(
private val ClassDescriptor.isAny: Boolean get() = fqNameUnsafe == KotlinBuiltIns.FQ_NAMES.any private val ClassDescriptor.isAny: Boolean get() = fqNameUnsafe == KotlinBuiltIns.FQ_NAMES.any
private class FallbackBuiltIns private constructor() : KotlinBuiltIns(LockBasedStorageManager()) { private class FallbackBuiltIns private constructor() : KotlinBuiltIns(LockBasedStorageManager()) {
init {
createBuiltInsModule()
}
companion object { companion object {
private val initializer = BuiltInsInitializer { private val initializer = BuiltInsInitializer {
FallbackBuiltIns() FallbackBuiltIns()
@@ -20,8 +20,10 @@ import org.jetbrains.kotlin.builtins.JvmBuiltInClassDescriptorFactory
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.load.kotlin.JvmBuiltInsSettings import org.jetbrains.kotlin.load.kotlin.JvmBuiltInsSettings
import org.jetbrains.kotlin.serialization.deserialization.AdditionalClassPartsProvider
import org.jetbrains.kotlin.serialization.deserialization.PlatformDependentDeclarationFilter import org.jetbrains.kotlin.serialization.deserialization.PlatformDependentDeclarationFilter
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.storage.getValue
import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.sure
class JvmBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManager) { class JvmBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManager) {
@@ -35,21 +37,21 @@ class JvmBuiltIns(storageManager: StorageManager) : KotlinBuiltIns(storageManage
this.isAdditionalBuiltInsFeatureSupported = isAdditionalBuiltInsFeatureSupported this.isAdditionalBuiltInsFeatureSupported = isAdditionalBuiltInsFeatureSupported
} }
lateinit var settings: JvmBuiltInsSettings val settings: JvmBuiltInsSettings by storageManager.createLazyValue {
private set JvmBuiltInsSettings(
// Here we know order in which KotlinBuiltIns constructor calls these methods
override fun getPlatformDependentDeclarationFilter(): PlatformDependentDeclarationFilter {
settings = JvmBuiltInsSettings(
builtInsModule, storageManager, builtInsModule, storageManager,
{ ownerModuleDescriptor.sure { "JvmBuiltins has not been initialized properly" } }, { ownerModuleDescriptor.sure { "JvmBuiltins has not been initialized properly" } },
{ isAdditionalBuiltInsFeatureSupported } { isAdditionalBuiltInsFeatureSupported }
) )
return settings
} }
override fun getAdditionalClassPartsProvider() = settings init {
createBuiltInsModule()
}
override fun getPlatformDependentDeclarationFilter(): PlatformDependentDeclarationFilter = settings
override fun getAdditionalClassPartsProvider(): AdditionalClassPartsProvider = settings
override fun getClassDescriptorFactories() = override fun getClassDescriptorFactories() =
super.getClassDescriptorFactories() + JvmBuiltInClassDescriptorFactory(storageManager, builtInsModule) super.getClassDescriptorFactories() + JvmBuiltInClassDescriptorFactory(storageManager, builtInsModule)
@@ -19,6 +19,10 @@ package org.jetbrains.kotlin.builtins
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
class DefaultBuiltIns private constructor() : KotlinBuiltIns(LockBasedStorageManager()) { class DefaultBuiltIns private constructor() : KotlinBuiltIns(LockBasedStorageManager()) {
init {
createBuiltInsModule()
}
companion object { companion object {
private val initializer = BuiltInsInitializer { private val initializer = BuiltInsInitializer {
DefaultBuiltIns() DefaultBuiltIns()
@@ -66,7 +66,7 @@ public abstract class KotlinBuiltIns {
BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("internal")) BUILT_INS_PACKAGE_FQ_NAME.child(Name.identifier("internal"))
); );
private final ModuleDescriptorImpl builtInsModule; private ModuleDescriptorImpl builtInsModule;
private final NotNullLazyValue<Primitives> primitives; private final NotNullLazyValue<Primitives> primitives;
private final NotNullLazyValue<PackageFragments> packageFragments; private final NotNullLazyValue<PackageFragments> packageFragments;
@@ -78,24 +78,6 @@ public abstract class KotlinBuiltIns {
protected KotlinBuiltIns(@NotNull StorageManager storageManager) { protected KotlinBuiltIns(@NotNull StorageManager storageManager) {
this.storageManager = storageManager; this.storageManager = storageManager;
builtInsModule = new ModuleDescriptorImpl(BUILTINS_MODULE_NAME, storageManager, this);
PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider(
storageManager, builtInsModule, BUILT_INS_PACKAGE_FQ_NAMES,
getClassDescriptorFactories(),
getPlatformDependentDeclarationFilter(),
getAdditionalClassPartsProvider(),
new Function1<String, InputStream>() {
@Override
public InputStream invoke(String path) {
ClassLoader classLoader = KotlinBuiltIns.class.getClassLoader();
return classLoader != null ? classLoader.getResourceAsStream(path) : ClassLoader.getSystemResourceAsStream(path);
}
}
);
builtInsModule.initialize(packageFragmentProvider);
builtInsModule.setDependencies(builtInsModule);
this.packageFragments = storageManager.createLazyValue(new Function0<PackageFragments>() { this.packageFragments = storageManager.createLazyValue(new Function0<PackageFragments>() {
@Override @Override
@@ -136,6 +118,25 @@ public abstract class KotlinBuiltIns {
}); });
} }
protected void createBuiltInsModule() {
builtInsModule = new ModuleDescriptorImpl(BUILTINS_MODULE_NAME, storageManager, this);
PackageFragmentProvider packageFragmentProvider = BuiltInsPackageFragmentProviderKt.createBuiltInPackageFragmentProvider(
storageManager, builtInsModule, BUILT_INS_PACKAGE_FQ_NAMES,
getClassDescriptorFactories(),
getPlatformDependentDeclarationFilter(),
getAdditionalClassPartsProvider(),
new Function1<String, InputStream>() {
@Override
public InputStream invoke(String path) {
ClassLoader classLoader = KotlinBuiltIns.class.getClassLoader();
return classLoader != null ? classLoader.getResourceAsStream(path) : ClassLoader.getSystemResourceAsStream(path);
}
}
);
builtInsModule.initialize(packageFragmentProvider);
builtInsModule.setDependencies(builtInsModule);
}
@NotNull @NotNull
protected AdditionalClassPartsProvider getAdditionalClassPartsProvider() { protected AdditionalClassPartsProvider getAdditionalClassPartsProvider() {
return AdditionalClassPartsProvider.None.INSTANCE; return AdditionalClassPartsProvider.None.INSTANCE;