FIR: get rid of lateinit var in FirBuiltinSymbolProvider for thread safety

This commit is contained in:
Ilya Kirillov
2021-03-29 15:07:32 +02:00
committed by teamcityserver
parent 863156679d
commit ba2315430b
@@ -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)
}
}
}