[FIR2IR] Add handling exceptions from Fir2Ir and reporting declaration where converter failed
This commit is contained in:
committed by
TeamCityServer
parent
ea2783eace
commit
13dfa5a886
+26
-10
@@ -51,6 +51,7 @@ import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
|
||||
import org.jetbrains.kotlin.utils.threadLocal
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
@@ -439,7 +440,7 @@ class Fir2IrDeclarationStorage(
|
||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||
isLocal: Boolean = false,
|
||||
containingClass: ConeClassLikeLookupTag? = null,
|
||||
): IrSimpleFunction {
|
||||
): IrSimpleFunction = convertCatching(function) {
|
||||
val simpleFunction = function as? FirSimpleFunction
|
||||
val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL
|
||||
val updatedOrigin = when {
|
||||
@@ -505,7 +506,7 @@ class Fir2IrDeclarationStorage(
|
||||
fun createIrAnonymousInitializer(
|
||||
anonymousInitializer: FirAnonymousInitializer,
|
||||
irParent: IrClass
|
||||
): IrAnonymousInitializer {
|
||||
): IrAnonymousInitializer = convertCatching(anonymousInitializer) {
|
||||
return anonymousInitializer.convertWithOffsets { startOffset, endOffset ->
|
||||
symbolTable.declareAnonymousInitializer(startOffset, endOffset, IrDeclarationOrigin.DEFINED, irParent.descriptor).apply {
|
||||
this.parent = irParent
|
||||
@@ -539,7 +540,7 @@ class Fir2IrDeclarationStorage(
|
||||
irParent: IrClass,
|
||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||
isLocal: Boolean = false
|
||||
): IrConstructor {
|
||||
): IrConstructor = convertCatching(constructor) {
|
||||
val isPrimary = constructor.isPrimary
|
||||
classifierStorage.preCacheTypeParameters(constructor)
|
||||
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
|
||||
@@ -595,7 +596,7 @@ class Fir2IrDeclarationStorage(
|
||||
endOffset: Int,
|
||||
isLocal: Boolean = false,
|
||||
containingClass: ConeClassLikeLookupTag? = null,
|
||||
): IrSimpleFunction {
|
||||
): IrSimpleFunction = convertCatching(propertyAccessor ?: property) {
|
||||
val prefix = if (isSetter) "set" else "get"
|
||||
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter, containingClass)
|
||||
val containerSource = (correspondingProperty as? IrProperty)?.containerSource
|
||||
@@ -667,7 +668,7 @@ class Fir2IrDeclarationStorage(
|
||||
isFinal: Boolean,
|
||||
firInitializerExpression: FirExpression?,
|
||||
type: IrType? = null
|
||||
): IrField {
|
||||
): IrField = convertCatching(property) {
|
||||
val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType()
|
||||
return symbolTable.declareField(
|
||||
startOffset, endOffset, origin, descriptor, inferredType
|
||||
@@ -748,7 +749,7 @@ class Fir2IrDeclarationStorage(
|
||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||
isLocal: Boolean = false,
|
||||
containingClass: ConeClassLikeLookupTag? = null,
|
||||
): IrProperty {
|
||||
): IrProperty = convertCatching(property) {
|
||||
classifierStorage.preCacheTypeParameters(property)
|
||||
if (property.delegate != null) {
|
||||
val delegateReference = (property.delegate as? FirQualifiedAccess)?.calleeReference as? FirResolvedNamedReference
|
||||
@@ -882,7 +883,7 @@ class Fir2IrDeclarationStorage(
|
||||
private fun createIrField(
|
||||
field: FirField,
|
||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
|
||||
): IrField {
|
||||
): IrField = convertCatching(field) {
|
||||
val type = field.returnTypeRef.toIrType()
|
||||
return field.convertWithOffsets { startOffset, endOffset ->
|
||||
irFactory.createField(
|
||||
@@ -907,7 +908,7 @@ class Fir2IrDeclarationStorage(
|
||||
useStubForDefaultValueStub: Boolean = true,
|
||||
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
|
||||
skipDefaultParameter: Boolean = false,
|
||||
): IrValueParameter {
|
||||
): IrValueParameter = convertCatching(valueParameter) {
|
||||
val origin = IrDeclarationOrigin.DEFINED
|
||||
val type = valueParameter.returnTypeRef.toIrType()
|
||||
val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset ->
|
||||
@@ -954,7 +955,11 @@ class Fir2IrDeclarationStorage(
|
||||
isVar, isConst, isLateinit
|
||||
)
|
||||
|
||||
fun createIrVariable(variable: FirVariable<*>, irParent: IrDeclarationParent, givenOrigin: IrDeclarationOrigin? = null): IrVariable {
|
||||
fun createIrVariable(
|
||||
variable: FirVariable<*>,
|
||||
irParent: IrDeclarationParent,
|
||||
givenOrigin: IrDeclarationOrigin? = null
|
||||
): IrVariable = convertCatching(variable) {
|
||||
val type = variable.returnTypeRef.toIrType()
|
||||
// Some temporary variables are produced in RawFirBuilder, but we consistently use special names for them.
|
||||
val origin = when {
|
||||
@@ -975,7 +980,10 @@ class Fir2IrDeclarationStorage(
|
||||
return irVariable
|
||||
}
|
||||
|
||||
fun createIrLocalDelegatedProperty(property: FirProperty, irParent: IrDeclarationParent): IrLocalDelegatedProperty {
|
||||
fun createIrLocalDelegatedProperty(
|
||||
property: FirProperty,
|
||||
irParent: IrDeclarationParent
|
||||
): IrLocalDelegatedProperty = convertCatching(property) {
|
||||
val type = property.returnTypeRef.toIrType()
|
||||
val origin = IrDeclarationOrigin.DEFINED
|
||||
val irProperty = property.convertWithOffsets { startOffset, endOffset ->
|
||||
@@ -1256,4 +1264,12 @@ class Fir2IrDeclarationStorage(
|
||||
Name.identifier("valueOf") to IrSyntheticBodyKind.ENUM_VALUEOF
|
||||
)
|
||||
}
|
||||
|
||||
private inline fun <R> convertCatching(element: FirElement, block: () -> R): R {
|
||||
try {
|
||||
return block()
|
||||
} catch (e: Throwable) {
|
||||
throw KotlinExceptionWithAttachments("Exception was thrown during transformation of ${element.render()}", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user