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
|
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.IrActualizedResult
|
||||||
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
|
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
|
||||||
import org.jetbrains.kotlin.backend.common.actualizer.SpecialFakeOverrideSymbolsResolver
|
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.declarations.FirFile
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
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.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
|
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.IrTypeSystemContext
|
||||||
|
import org.jetbrains.kotlin.ir.types.getClass
|
||||||
import org.jetbrains.kotlin.ir.util.KotlinMangler
|
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
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
|
|
||||||
data class FirResult(val outputs: List<ModuleCompilerAnalyzedOutput>)
|
data class FirResult(val outputs: List<ModuleCompilerAnalyzedOutput>)
|
||||||
@@ -125,6 +132,44 @@ fun FirResult.convertToIrAndActualize(
|
|||||||
return Fir2IrActualizedResult(irModuleFragment, components, pluginContext, actualizationResult)
|
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(
|
private fun convertToIr(
|
||||||
firOutput: ModuleCompilerAnalyzedOutput,
|
firOutput: ModuleCompilerAnalyzedOutput,
|
||||||
fir2IrExtensions: Fir2IrExtensions,
|
fir2IrExtensions: Fir2IrExtensions,
|
||||||
|
|||||||
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.ir.overrides
|
|||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
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.IrPropertySymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
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.collectAndFilterRealOverrides
|
||||||
import org.jetbrains.kotlin.ir.util.fileOrNull
|
import org.jetbrains.kotlin.ir.util.fileOrNull
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
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.resolve.OverridingUtil.OverrideCompatibilityInfo
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
import org.jetbrains.kotlin.types.TypeCheckerState
|
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||||
@@ -519,27 +514,3 @@ fun IrDeclaration.isOverridableMemberOrAccessor(): Boolean = when (this) {
|
|||||||
is IrProperty -> isOverridableProperty()
|
is IrProperty -> isOverridableProperty()
|
||||||
else -> false
|
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