From ba2315430bd067526152f92c6b7f796070b1fa0e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 29 Mar 2021 15:07:32 +0200 Subject: [PATCH] FIR: get rid of lateinit var in FirBuiltinSymbolProvider for thread safety --- .../impl/FirBuiltinSymbolProvider.kt | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt index e5787cde08f..c712e0996ee 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.caches.createCacheWithPostCompute import org.jetbrains.kotlin.fir.caches.firCachesFactory import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildRegularClass @@ -39,7 +38,6 @@ import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerial import org.jetbrains.kotlin.serialization.deserialization.getName import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.util.OperatorNameConventions -import org.jetbrains.kotlin.utils.addToStdlib.getOrPut import java.io.InputStream //TODO make thread safe @@ -257,23 +255,11 @@ open class FirBuiltinSymbolProvider( } private inner class BuiltInsPackageFragment(stream: InputStream, val fqName: FqName) { - lateinit var version: BuiltInsBinaryVersion - val packageProto: ProtoBuf.PackageFragment = run { + private val binaryVersionAndPackageFragment = BinaryVersionAndPackageFragment.createFromStream(stream) - version = BuiltInsBinaryVersion.readFrom(stream) - - if (!version.isCompatible()) { - // TODO: report a proper diagnostic - throw UnsupportedOperationException( - "Kotlin built-in definition format version is not supported: " + - "expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + - "Please update Kotlin", - ) - } - - ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) - } + val version: BuiltInsBinaryVersion get() = binaryVersionAndPackageFragment.version + val packageProto: ProtoBuf.PackageFragment get() = binaryVersionAndPackageFragment.packageFragment private val nameResolver = NameResolverImpl(packageProto.strings, packageProto.qualifiedNames) @@ -327,3 +313,26 @@ open class FirBuiltinSymbolProvider( } } } + +private data class BinaryVersionAndPackageFragment( + val version: BuiltInsBinaryVersion, + val packageFragment: ProtoBuf.PackageFragment, +) { + companion object { + fun createFromStream(stream: InputStream): BinaryVersionAndPackageFragment { + val version = BuiltInsBinaryVersion.readFrom(stream) + + if (!version.isCompatible()) { + // TODO: report a proper diagnostic + throw UnsupportedOperationException( + "Kotlin built-in definition format version is not supported: " + + "expected ${BuiltInsBinaryVersion.INSTANCE}, actual $version. " + + "Please update Kotlin", + ) + } + + val packageFragment = ProtoBuf.PackageFragment.parseFrom(stream, BuiltInSerializerProtocol.extensionRegistry) + return BinaryVersionAndPackageFragment(version, packageFragment) + } + } +}