Fir2Ir: wrap IrFakeOverrideBuilder call with try-catch
To add the file name to the exception message similarly to how it's done in `PerformByIrFilePhase.invokeSequential`, so that exceptions such as KT-65277 would be easier to diagnose.
This commit is contained in:
committed by
Space Team
parent
9e2c7ce1e1
commit
3d2d2af60c
@@ -5,7 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.pipeline
|
||||
|
||||
import org.jetbrains.kotlin.ir.KtDiagnosticReporterWithImplicitIrBasedContext
|
||||
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
||||
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizedResult
|
||||
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
|
||||
import org.jetbrains.kotlin.backend.common.actualizer.SpecialFakeOverrideSymbolsResolver
|
||||
@@ -21,11 +21,18 @@ import org.jetbrains.kotlin.fir.backend.jvm.Fir2IrJvmSpecialAnnotationSymbolProv
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.KtDiagnosticReporterWithImplicitIrBasedContext
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
||||
import org.jetbrains.kotlin.ir.overrides.buildForAll
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
|
||||
import org.jetbrains.kotlin.ir.overrides.IrFakeOverrideBuilder
|
||||
import org.jetbrains.kotlin.ir.types.IrTypeSystemContext
|
||||
import org.jetbrains.kotlin.ir.types.getClass
|
||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
|
||||
data class FirResult(val outputs: List<ModuleCompilerAnalyzedOutput>)
|
||||
@@ -125,6 +132,44 @@ fun FirResult.convertToIrAndActualize(
|
||||
return Fir2IrActualizedResult(irModuleFragment, components, pluginContext, actualizationResult)
|
||||
}
|
||||
|
||||
private fun IrFakeOverrideBuilder.buildForAll(modules: List<IrModuleFragment>) {
|
||||
val builtFakeOverridesClasses = mutableSetOf<IrClass>()
|
||||
fun buildFakeOverrides(clazz: IrClass) {
|
||||
if (clazz is IrLazyDeclarationBase) return
|
||||
if (!builtFakeOverridesClasses.add(clazz)) return
|
||||
for (c in clazz.superTypes) {
|
||||
c.getClass()?.let { buildFakeOverrides(it) }
|
||||
}
|
||||
buildFakeOverridesForClass(clazz, false)
|
||||
}
|
||||
|
||||
class ClassVisitor : IrElementVisitorVoid {
|
||||
override fun visitElement(element: IrElement) {
|
||||
element.acceptChildrenVoid(this)
|
||||
}
|
||||
|
||||
override fun visitClass(declaration: IrClass) {
|
||||
buildFakeOverrides(declaration)
|
||||
declaration.acceptChildrenVoid(this)
|
||||
}
|
||||
}
|
||||
|
||||
for (module in modules) {
|
||||
for (file in module.files) {
|
||||
try {
|
||||
file.acceptVoid(ClassVisitor())
|
||||
} catch (e: Throwable) {
|
||||
CodegenUtil.reportBackendException(e, "IR fake override builder", file.fileEntry.name) { offset ->
|
||||
file.fileEntry.takeIf { it.supportsDebugInfo }?.let {
|
||||
val (line, column) = it.getLineAndColumnNumbers(offset)
|
||||
line to column
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun convertToIr(
|
||||
firOutput: ModuleCompilerAnalyzedOutput,
|
||||
fir2IrExtensions: Fir2IrExtensions,
|
||||
|
||||
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.ir.overrides
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase
|
||||
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||
@@ -18,9 +16,6 @@ import org.jetbrains.kotlin.ir.types.*
|
||||
import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides
|
||||
import org.jetbrains.kotlin.ir.util.fileOrNull
|
||||
import org.jetbrains.kotlin.ir.util.render
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||
@@ -519,27 +514,3 @@ fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when (this) {
|
||||
is IrProperty -> isOverridableProperty()
|
||||
else -> false
|
||||
}
|
||||
|
||||
fun IrFakeOverrideBuilder.buildForAll(modules: List<IrModuleFragment>) {
|
||||
val builtFakeOverridesClasses = mutableSetOf<IrClass>()
|
||||
fun buildFakeOverrides(clazz: IrClass) {
|
||||
if (clazz is IrLazyDeclarationBase) return
|
||||
if (!builtFakeOverridesClasses.add(clazz)) return
|
||||
for (c in clazz.superTypes) {
|
||||
c.getClass()?.let { buildFakeOverrides(it) }
|
||||
}
|
||||
buildFakeOverridesForClass(clazz, false)
|
||||
}
|
||||
class ClassVisitor : IrElementVisitorVoid {
|
||||
override fun visitElement(element: IrElement) {
|
||||
element.acceptChildrenVoid(this)
|
||||
}
|
||||
override fun visitClass(declaration: IrClass) {
|
||||
buildFakeOverrides(declaration)
|
||||
declaration.acceptChildrenVoid(this)
|
||||
}
|
||||
}
|
||||
for (module in modules) {
|
||||
module.acceptVoid(ClassVisitor())
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user