FIR: get rid of lateinit var in FirBuiltinSymbolProvider for thread safety
This commit is contained in:
committed by
teamcityserver
parent
863156679d
commit
ba2315430b
+26
-17
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user