From d43057e19a4f995ef3a91b5deb7f7b7e478180ad Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 4 Jul 2023 12:32:45 +0200 Subject: [PATCH] [FIR] remove user code leaks from `compiler.fir.resolve` module, add more information to some errors --- .../jetbrains/kotlin/fir/resolve/ResolveUtils.kt | 6 +++++- .../jetbrains/kotlin/fir/resolve/SamResolution.kt | 10 ++++++++-- .../calls/AbstractConeCallConflictResolver.kt | 6 +++++- .../resolve/calls/CallableReferenceResolution.kt | 9 ++++++++- .../resolve/calls/ConeOverloadConflictResolver.kt | 7 +++++-- .../calls/FirArgumentsToParametersMapper.kt | 11 ++++++++++- .../kotlin/fir/resolve/calls/tower/TowerLevels.kt | 11 +++++++++-- .../transformers/FirStatusResolveTransformer.kt | 12 ++++++------ .../fir/resolve/transformers/FirStatusResolver.kt | 7 +++++-- .../resolve/FirAbstractBodyResolveTransformer.kt | 15 ++++++++++----- ...bstractContractResolveTransformerDispatcher.kt | 10 ++++++++-- 11 files changed, 79 insertions(+), 25 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 66cdd4b25e6..afe5c433e95 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -48,6 +49,7 @@ import org.jetbrains.kotlin.types.SmartcastStability import org.jetbrains.kotlin.types.model.safeSubstitute import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -354,7 +356,9 @@ private fun BodyResolveComponents.typeFromSymbol(symbol: FirBasedSymbol<*>): Fir type = symbol.constructType(emptyArray(), isNullable = false) } } - else -> error("Failed to extract type from symbol: $symbol") + else -> errorWithAttachment("Failed to extract type from symbol: ${symbol::class.java}") { + withFirEntry("declaration", symbol.fir) + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt index 391607b9db7..1c055a6c0d5 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/SamResolution.kt @@ -21,7 +21,10 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirTypeParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl -import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.declarations.utils.isAbstract +import org.jetbrains.kotlin.fir.declarations.utils.isActual +import org.jetbrains.kotlin.fir.declarations.utils.isExpect +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.diagnostics.ConeIntermediateDiagnostic import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.moduleData @@ -41,6 +44,7 @@ import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.unreachableBranch @@ -401,7 +405,9 @@ fun FirSimpleFunction.isPublicInObject(checkOnlyName: Boolean): Boolean { valueParameters[1].hasTypeOf(StandardClassIds.Int, allowNullable = false) else -> false } - else -> error("Unexpected method name: $name") + else -> errorWithAttachment("Unexpected method name") { + withEntry("methodName", name.asString()) + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt index c755f0b4ba8..fa85c141a12 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.resolve.FirSamResolver import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.name.StandardClassIds.Byte @@ -29,6 +30,7 @@ import org.jetbrains.kotlin.resolve.calls.results.* import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.requireOrDescribe import org.jetbrains.kotlin.utils.addIfNotNull +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment abstract class AbstractConeCallConflictResolver( private val specificityComparator: TypeSpecificityComparator, @@ -120,7 +122,9 @@ abstract class AbstractConeCallConflictResolver( is FirVariable -> createFlatSignature(call, declaration) is FirClass -> createFlatSignature(call, declaration) is FirTypeAlias -> createFlatSignature(call, declaration) - else -> error("Not supported: $declaration") + else -> errorWithAttachment("Not supported: ${declaration::class.java}") { + withFirEntry("declaration", declaration) + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt index db4f612db4a..f5ec8eb7ecf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/CallableReferenceResolution.kt @@ -28,6 +28,8 @@ import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.utils.exceptions.withConeTypeEntry +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.FirVisitor import org.jetbrains.kotlin.name.StandardClassIds @@ -36,6 +38,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.runTransaction import org.jetbrains.kotlin.resolve.calls.tower.isSuccess import org.jetbrains.kotlin.types.expressions.CoercionStrategy import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment internal object CheckCallableReferenceExpectedType : CheckerStage() { @@ -309,7 +312,11 @@ private fun varargParameterTypeByExpectedParameter( varargMappingState: VarargMappingState, ): Pair { val elementType = substitutedParameter.returnTypeRef.coneType.arrayElementType() - ?: error("Vararg parameter $substitutedParameter does not have vararg type") + ?: errorWithAttachment("Vararg parameter ${substitutedParameter::class.java} does not have vararg type") { + withConeTypeEntry("expectedParameterType", expectedParameterType) + withFirEntry("substitutedParameter", substitutedParameter) + withEntry("varargMappingState", varargMappingState.toString()) + } return when (varargMappingState) { VarargMappingState.UNMAPPED -> { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt index bb25979bea7..21400603499 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeOverloadConflictResolver.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.utils.modality -import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents import org.jetbrains.kotlin.fir.resolve.inference.ConeTypeParameterBasedTypeVariable import org.jetbrains.kotlin.fir.resolve.inference.InferenceComponents @@ -22,6 +21,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.unwrapSubstitutionOverrides +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.resolve.calls.inference.model.NewConstraintSystemImpl import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystemConstraintPosition import org.jetbrains.kotlin.resolve.calls.results.FlatSignature @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.TypeParameterMarker import org.jetbrains.kotlin.types.model.TypeSubstitutorMarker import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment typealias CandidateSignature = FlatSignature @@ -337,7 +338,9 @@ class ConeSimpleConstraintSystemImpl(val system: NewConstraintSystemImpl, val se for (upperBound in typeParameter.symbol.resolvedBounds) { addSubtypeConstraint( substitutionMap[typeParameter.typeParameterSymbol] - ?: error("No ${typeParameter.symbol.fir.render()} in substitution map"), + ?: errorWithAttachment("No ${typeParameter.symbol.fir::class.java} in substitution map") { + withFirEntry("typeParameter", typeParameter.symbol.fir) + }, substitutor.substituteOrSelf(upperBound.coneType) ) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt index 9110dbc8b7e..1d3b393e209 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt @@ -23,9 +23,11 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.processOverriddenFunctions import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget import org.jetbrains.kotlin.util.OperatorNameConventions +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import kotlin.collections.component1 import kotlin.collections.component2 import kotlin.collections.set @@ -293,7 +295,14 @@ private class FirCallArgumentsProcessor( for ((parameter, resolvedArgument) in result) { if (!parameter.isVararg) { if (resolvedArgument !is ResolvedCallArgument.SimpleArgument) { - error("Incorrect resolved argument for parameter $parameter :$resolvedArgument") + errorWithAttachment("Incorrect resolved argument for parameter ${parameter::class.java}: ${resolvedArgument::class.java}") { + withFirEntry("parameter", parameter) + withEntryGroup("arguments") { + for ((index, argument) in resolvedArgument.arguments.withIndex()) { + withFirEntry("argument$index", argument) + } + } + } } else if (resolvedArgument.callArgument.isSpread) { addDiagnostic(NonVarargSpread(resolvedArgument.callArgument)) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt index 4a91d54148b..e11de13fd40 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/TowerLevels.kt @@ -9,7 +9,10 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.fakeElement import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.ContextReceiverGroup +import org.jetbrains.kotlin.fir.declarations.FirConstructor +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId import org.jetbrains.kotlin.fir.declarations.utils.isInner import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.expressions.FirExpression @@ -26,9 +29,11 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.utils.exceptions.withConeTypeEntry import org.jetbrains.kotlin.name.StandardClassIds.Annotations.HidesMembers import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.utils.SmartList +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment enum class ProcessResult { FOUND, SCOPE_EMPTY; @@ -133,7 +138,9 @@ class MemberScopeTowerLevel( scopeSession, FakeOverrideTypeCalculator.DoNothing, requiredMembersPhase = FirResolvePhase.STATUS, - ) ?: error("No scope for flexible type scope, while it's not null for $dispatchReceiverType") + ) ?: errorWithAttachment("No scope for flexible type scope, while it's not null") { + withConeTypeEntry("dispatchReceiverType", dispatchReceiverType) + } } else { typeForSyntheticScope = dispatchReceiverType useSiteForSyntheticScope = scope diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt index 7ff29c4dc0c..45c58b02945 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolveTransformer.kt @@ -17,17 +17,15 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.LocalClassesNavigationInfo import org.jetbrains.kotlin.fir.scopes.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhaseWithCallableMembers import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.toSymbol +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.fir.visitors.transformSingle +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment import org.jetbrains.kotlin.util.PrivateForInline class FirStatusResolveProcessor( @@ -286,7 +284,9 @@ abstract class AbstractFirStatusResolveTransformer( is FirRegularClass -> declaration.declarations is FirAnonymousObject -> declaration.declarations is FirFile -> declaration.declarations - else -> error("Not supported declaration ${declaration::class.simpleName}") + else -> errorWithAttachment("Unsupported declaration: ${declaration::class.java}") { + withFirEntry("declaration", declaration) + } } if (declaration.needResolveMembers()) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt index 5e29701355d..1775316753c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirStatusResolver.kt @@ -18,15 +18,16 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.extensions.FirStatusTransformerExtension import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.statusTransformerExtensions -import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.toEffectiveVisibility import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.fir.visibilityChecker import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment class FirStatusResolver( val session: FirSession, @@ -77,7 +78,9 @@ class FirStatusResolver( is FirConstructor -> resolveStatus(declaration, containingClass, isLocal) is FirField -> resolveStatus(declaration, containingClass, isLocal) is FirBackingField -> resolveStatus(declaration, containingClass, isLocal) - else -> error("Unsupported declaration type: ${declaration.render()}") + else -> errorWithAttachment("Unsupported declaration type: ${declaration::class.java}") { + withFirEntry("declaration", declaration) + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index 35063ff1945..3033d9af3ab 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.resolve.transformers.body.resolve import org.jetbrains.kotlin.fir.FirCallResolver +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.util.PrivateForInline import org.jetbrains.kotlin.fir.declarations.* @@ -24,8 +25,10 @@ import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.resolve.transformers.* import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope -import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImplWithoutSource import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImplWithoutSource +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAbstractPhaseTransformer(phase) { abstract val context: BodyResolveContext @@ -54,18 +57,20 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb } override fun transformLazyExpression(lazyExpression: FirLazyExpression, data: ResolutionMode): FirStatement { - suppressOrThrowError("FirLazyExpression should be calculated before accessing") + suppressOrThrowError("FirLazyExpression should be calculated before accessing", lazyExpression) return lazyExpression } override fun transformLazyBlock(lazyBlock: FirLazyBlock, data: ResolutionMode): FirStatement { - suppressOrThrowError("FirLazyBlock should be calculated before accessing") + suppressOrThrowError("FirLazyBlock should be calculated before accessing", lazyBlock) return lazyBlock } - private fun suppressOrThrowError(message: String) { + private fun suppressOrThrowError(message: String, element: FirElement) { if (System.getProperty("kotlin.suppress.lazy.expression.access").toBoolean()) return - error(message) + errorWithAttachment(message) { + withFirEntry("firElement", element) + } } protected inline val localScopes: List get() = components.localScopes diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt index 10d05bd00d9..1bc653850ce 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/contracts/FirAbstractContractResolveTransformerDispatcher.kt @@ -31,8 +31,10 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclaration import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImplWithoutSource +import org.jetbrains.kotlin.fir.utils.exceptions.withFirEntry import org.jetbrains.kotlin.fir.visitors.transformSingle import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment abstract class FirAbstractContractResolveTransformerDispatcher( session: FirSession, @@ -313,13 +315,17 @@ abstract class FirAbstractContractResolveTransformerDispatcher( private val FirContractDescriptionOwner.valueParameters: List get() = when (this) { is FirFunction -> valueParameters - else -> error() + else -> errorWithAttachment("Expected ${FirFunction::class.java} but ${this::class.java} found") { + withFirEntry("foundElement", this@valueParameters) + } } private val FirContractDescriptionOwner.body: FirBlock get() = when (this) { is FirFunction -> body!! - else -> error() + else -> errorWithAttachment("Expected ${FirFunction::class.java} but ${this::class.java} found") { + withFirEntry("foundElement", this@body) + } } private fun FirContractDescriptionOwner.error(): Nothing = throw IllegalStateException("${this::class} can not be a contract owner")