[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.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
|
||||||
import org.jetbrains.kotlin.utils.threadLocal
|
import org.jetbrains.kotlin.utils.threadLocal
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
@@ -439,7 +440,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||||
isLocal: Boolean = false,
|
isLocal: Boolean = false,
|
||||||
containingClass: ConeClassLikeLookupTag? = null,
|
containingClass: ConeClassLikeLookupTag? = null,
|
||||||
): IrSimpleFunction {
|
): IrSimpleFunction = convertCatching(function) {
|
||||||
val simpleFunction = function as? FirSimpleFunction
|
val simpleFunction = function as? FirSimpleFunction
|
||||||
val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL
|
val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL
|
||||||
val updatedOrigin = when {
|
val updatedOrigin = when {
|
||||||
@@ -505,7 +506,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
fun createIrAnonymousInitializer(
|
fun createIrAnonymousInitializer(
|
||||||
anonymousInitializer: FirAnonymousInitializer,
|
anonymousInitializer: FirAnonymousInitializer,
|
||||||
irParent: IrClass
|
irParent: IrClass
|
||||||
): IrAnonymousInitializer {
|
): IrAnonymousInitializer = convertCatching(anonymousInitializer) {
|
||||||
return anonymousInitializer.convertWithOffsets { startOffset, endOffset ->
|
return anonymousInitializer.convertWithOffsets { startOffset, endOffset ->
|
||||||
symbolTable.declareAnonymousInitializer(startOffset, endOffset, IrDeclarationOrigin.DEFINED, irParent.descriptor).apply {
|
symbolTable.declareAnonymousInitializer(startOffset, endOffset, IrDeclarationOrigin.DEFINED, irParent.descriptor).apply {
|
||||||
this.parent = irParent
|
this.parent = irParent
|
||||||
@@ -539,7 +540,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
irParent: IrClass,
|
irParent: IrClass,
|
||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||||
isLocal: Boolean = false
|
isLocal: Boolean = false
|
||||||
): IrConstructor {
|
): IrConstructor = convertCatching(constructor) {
|
||||||
val isPrimary = constructor.isPrimary
|
val isPrimary = constructor.isPrimary
|
||||||
classifierStorage.preCacheTypeParameters(constructor)
|
classifierStorage.preCacheTypeParameters(constructor)
|
||||||
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
|
val signature = if (isLocal) null else signatureComposer.composeSignature(constructor)
|
||||||
@@ -595,7 +596,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
endOffset: Int,
|
endOffset: Int,
|
||||||
isLocal: Boolean = false,
|
isLocal: Boolean = false,
|
||||||
containingClass: ConeClassLikeLookupTag? = null,
|
containingClass: ConeClassLikeLookupTag? = null,
|
||||||
): IrSimpleFunction {
|
): IrSimpleFunction = convertCatching(propertyAccessor ?: property) {
|
||||||
val prefix = if (isSetter) "set" else "get"
|
val prefix = if (isSetter) "set" else "get"
|
||||||
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter, containingClass)
|
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter, containingClass)
|
||||||
val containerSource = (correspondingProperty as? IrProperty)?.containerSource
|
val containerSource = (correspondingProperty as? IrProperty)?.containerSource
|
||||||
@@ -667,7 +668,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
isFinal: Boolean,
|
isFinal: Boolean,
|
||||||
firInitializerExpression: FirExpression?,
|
firInitializerExpression: FirExpression?,
|
||||||
type: IrType? = null
|
type: IrType? = null
|
||||||
): IrField {
|
): IrField = convertCatching(property) {
|
||||||
val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType()
|
val inferredType = type ?: firInitializerExpression!!.typeRef.toIrType()
|
||||||
return symbolTable.declareField(
|
return symbolTable.declareField(
|
||||||
startOffset, endOffset, origin, descriptor, inferredType
|
startOffset, endOffset, origin, descriptor, inferredType
|
||||||
@@ -748,7 +749,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
|
||||||
isLocal: Boolean = false,
|
isLocal: Boolean = false,
|
||||||
containingClass: ConeClassLikeLookupTag? = null,
|
containingClass: ConeClassLikeLookupTag? = null,
|
||||||
): IrProperty {
|
): IrProperty = convertCatching(property) {
|
||||||
classifierStorage.preCacheTypeParameters(property)
|
classifierStorage.preCacheTypeParameters(property)
|
||||||
if (property.delegate != null) {
|
if (property.delegate != null) {
|
||||||
val delegateReference = (property.delegate as? FirQualifiedAccess)?.calleeReference as? FirResolvedNamedReference
|
val delegateReference = (property.delegate as? FirQualifiedAccess)?.calleeReference as? FirResolvedNamedReference
|
||||||
@@ -882,7 +883,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
private fun createIrField(
|
private fun createIrField(
|
||||||
field: FirField,
|
field: FirField,
|
||||||
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
|
origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
|
||||||
): IrField {
|
): IrField = convertCatching(field) {
|
||||||
val type = field.returnTypeRef.toIrType()
|
val type = field.returnTypeRef.toIrType()
|
||||||
return field.convertWithOffsets { startOffset, endOffset ->
|
return field.convertWithOffsets { startOffset, endOffset ->
|
||||||
irFactory.createField(
|
irFactory.createField(
|
||||||
@@ -907,7 +908,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
useStubForDefaultValueStub: Boolean = true,
|
useStubForDefaultValueStub: Boolean = true,
|
||||||
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
|
typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT,
|
||||||
skipDefaultParameter: Boolean = false,
|
skipDefaultParameter: Boolean = false,
|
||||||
): IrValueParameter {
|
): IrValueParameter = convertCatching(valueParameter) {
|
||||||
val origin = IrDeclarationOrigin.DEFINED
|
val origin = IrDeclarationOrigin.DEFINED
|
||||||
val type = valueParameter.returnTypeRef.toIrType()
|
val type = valueParameter.returnTypeRef.toIrType()
|
||||||
val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset ->
|
val irParameter = valueParameter.convertWithOffsets { startOffset, endOffset ->
|
||||||
@@ -954,7 +955,11 @@ class Fir2IrDeclarationStorage(
|
|||||||
isVar, isConst, isLateinit
|
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()
|
val type = variable.returnTypeRef.toIrType()
|
||||||
// Some temporary variables are produced in RawFirBuilder, but we consistently use special names for them.
|
// Some temporary variables are produced in RawFirBuilder, but we consistently use special names for them.
|
||||||
val origin = when {
|
val origin = when {
|
||||||
@@ -975,7 +980,10 @@ class Fir2IrDeclarationStorage(
|
|||||||
return irVariable
|
return irVariable
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createIrLocalDelegatedProperty(property: FirProperty, irParent: IrDeclarationParent): IrLocalDelegatedProperty {
|
fun createIrLocalDelegatedProperty(
|
||||||
|
property: FirProperty,
|
||||||
|
irParent: IrDeclarationParent
|
||||||
|
): IrLocalDelegatedProperty = convertCatching(property) {
|
||||||
val type = property.returnTypeRef.toIrType()
|
val type = property.returnTypeRef.toIrType()
|
||||||
val origin = IrDeclarationOrigin.DEFINED
|
val origin = IrDeclarationOrigin.DEFINED
|
||||||
val irProperty = property.convertWithOffsets { startOffset, endOffset ->
|
val irProperty = property.convertWithOffsets { startOffset, endOffset ->
|
||||||
@@ -1256,4 +1264,12 @@ class Fir2IrDeclarationStorage(
|
|||||||
Name.identifier("valueOf") to IrSyntheticBodyKind.ENUM_VALUEOF
|
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