[FIR2IR] Unify utilities for rethrowing exceptions with attachments
This commit is contained in:
committed by
Space Team
parent
88206ca151
commit
e4537cb9f0
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.backend
|
package org.jetbrains.kotlin.fir.backend
|
||||||
|
|
||||||
|
import com.intellij.openapi.progress.ProcessCanceledException
|
||||||
import com.intellij.psi.PsiCompiledElement
|
import com.intellij.psi.PsiCompiledElement
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.tree.IElementType
|
import com.intellij.psi.tree.IElementType
|
||||||
@@ -45,6 +46,7 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
|||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
|
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
||||||
@@ -67,6 +69,7 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
|
|||||||
import org.jetbrains.kotlin.types.ConstantValueKind
|
import org.jetbrains.kotlin.types.ConstantValueKind
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
|
||||||
import kotlin.contracts.ExperimentalContracts
|
import kotlin.contracts.ExperimentalContracts
|
||||||
import kotlin.contracts.contract
|
import kotlin.contracts.contract
|
||||||
|
|
||||||
@@ -918,3 +921,16 @@ val incOrDeclSourceKindToIrStatementOrigin = mapOf(
|
|||||||
KtFakeSourceElementKind.DesugaredPrefixIncSecondGetReference to IrStatementOrigin.PREFIX_INCR,
|
KtFakeSourceElementKind.DesugaredPrefixIncSecondGetReference to IrStatementOrigin.PREFIX_INCR,
|
||||||
KtFakeSourceElementKind.DesugaredPrefixDecSecondGetReference to IrStatementOrigin.PREFIX_DECR
|
KtFakeSourceElementKind.DesugaredPrefixDecSecondGetReference to IrStatementOrigin.PREFIX_DECR
|
||||||
)
|
)
|
||||||
|
|
||||||
|
internal inline fun <R> convertCatching(element: FirElement, conversionScope: Fir2IrConversionScope? = null, block: () -> R): R {
|
||||||
|
try {
|
||||||
|
return block()
|
||||||
|
} catch (e: ProcessCanceledException) {
|
||||||
|
throw e
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
errorWithAttachment("Exception was thrown during transformation of ${element::class.java}", cause = e) {
|
||||||
|
withFirEntry("element", element)
|
||||||
|
conversionScope?.containingFileIfAny()?.let { withEntry("file", it.path) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+5
-22
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.backend.generators
|
package org.jetbrains.kotlin.fir.backend.generators
|
||||||
|
|
||||||
import com.intellij.openapi.progress.ProcessCanceledException
|
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
@@ -39,7 +38,6 @@ import org.jetbrains.kotlin.fir.types.builder.buildTypeProjectionWithVariance
|
|||||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
||||||
import org.jetbrains.kotlin.ir.declarations.name
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.*
|
import org.jetbrains.kotlin.ir.expressions.impl.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
@@ -408,8 +406,7 @@ class CallAndReferenceGenerator(
|
|||||||
dynamicOperator: IrDynamicOperator? = null,
|
dynamicOperator: IrDynamicOperator? = null,
|
||||||
variableAsFunctionMode: Boolean = false,
|
variableAsFunctionMode: Boolean = false,
|
||||||
noArguments: Boolean = false,
|
noArguments: Boolean = false,
|
||||||
): IrExpression {
|
): IrExpression = convertCatching(qualifiedAccess, conversionScope) {
|
||||||
try {
|
|
||||||
injectGetValueCall(qualifiedAccess, qualifiedAccess.calleeReference)?.let { return it }
|
injectGetValueCall(qualifiedAccess, qualifiedAccess.calleeReference)?.let { return it }
|
||||||
|
|
||||||
val irType = type.toIrType()
|
val irType = type.toIrType()
|
||||||
@@ -552,14 +549,6 @@ class CallAndReferenceGenerator(
|
|||||||
}
|
}
|
||||||
}.applyTypeArguments(qualifiedAccess).applyReceivers(qualifiedAccess, convertedExplicitReceiver)
|
}.applyTypeArguments(qualifiedAccess).applyReceivers(qualifiedAccess, convertedExplicitReceiver)
|
||||||
.applyCallArguments(qualifiedAccess)
|
.applyCallArguments(qualifiedAccess)
|
||||||
} catch (e: ProcessCanceledException) {
|
|
||||||
throw e
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
throw IllegalStateException(
|
|
||||||
"Error while translating ${qualifiedAccess.render()} " +
|
|
||||||
"from file ${conversionScope.containingFileIfAny()?.name ?: "???"} to BE IR", e
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirCallableSymbol<*>.valueParametersSize(): Int {
|
private fun FirCallableSymbol<*>.valueParametersSize(): Int {
|
||||||
@@ -626,8 +615,10 @@ class CallAndReferenceGenerator(
|
|||||||
|
|
||||||
internal fun findInjectedValue(calleeReference: FirReference) = extensions.findInjectedValue(calleeReference, conversionScope)
|
internal fun findInjectedValue(calleeReference: FirReference) = extensions.findInjectedValue(calleeReference, conversionScope)
|
||||||
|
|
||||||
fun convertToIrSetCall(variableAssignment: FirVariableAssignment, explicitReceiverExpression: IrExpression?): IrExpression {
|
fun convertToIrSetCall(
|
||||||
try {
|
variableAssignment: FirVariableAssignment,
|
||||||
|
explicitReceiverExpression: IrExpression?,
|
||||||
|
): IrExpression = convertCatching(variableAssignment, conversionScope) {
|
||||||
val type = irBuiltIns.unitType
|
val type = irBuiltIns.unitType
|
||||||
val calleeReference = variableAssignment.calleeReference ?: error("Reference not resolvable")
|
val calleeReference = variableAssignment.calleeReference ?: error("Reference not resolvable")
|
||||||
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
|
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
|
||||||
@@ -728,14 +719,6 @@ class CallAndReferenceGenerator(
|
|||||||
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
|
else -> generateErrorCallExpression(startOffset, endOffset, calleeReference)
|
||||||
}
|
}
|
||||||
}.applyTypeArguments(lValue).applyReceivers(lValue, explicitReceiverExpression)
|
}.applyTypeArguments(lValue).applyReceivers(lValue, explicitReceiverExpression)
|
||||||
} catch (e: ProcessCanceledException) {
|
|
||||||
throw e
|
|
||||||
} catch (e: Throwable) {
|
|
||||||
throw IllegalStateException(
|
|
||||||
"Error while translating ${variableAssignment.render()} " +
|
|
||||||
"from file ${conversionScope.containingFileIfAny()?.name ?: "???"} to BE IR", e
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
-14
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
|||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry
|
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
import org.jetbrains.kotlin.ir.builders.declarations.UNDEFINED_PARAMETER_INDEX
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -46,7 +45,6 @@ import org.jetbrains.kotlin.ir.types.IrType
|
|||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.name.*
|
import org.jetbrains.kotlin.name.*
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
|
|
||||||
import kotlin.contracts.ExperimentalContracts
|
import kotlin.contracts.ExperimentalContracts
|
||||||
import kotlin.contracts.contract
|
import kotlin.contracts.contract
|
||||||
|
|
||||||
@@ -971,18 +969,6 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
|
|||||||
annotationGenerator.generate(this, firAnnotationContainer)
|
annotationGenerator.generate(this, firAnnotationContainer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <R> convertCatching(element: FirElement, block: () -> R): R {
|
|
||||||
try {
|
|
||||||
return block()
|
|
||||||
} catch (e: ProcessCanceledException) {
|
|
||||||
throw e
|
|
||||||
} catch (e: Exception) {
|
|
||||||
errorWithAttachment("Exception was thrown during transformation of ${element::class.java}", cause = e) {
|
|
||||||
withFirEntry("element", element)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun IrDeclaration.setParent(irParent: IrDeclarationParent?) {
|
internal fun IrDeclaration.setParent(irParent: IrDeclarationParent?) {
|
||||||
|
|||||||
Reference in New Issue
Block a user