[FIR] remove user code leaks from compiler.fir.resolve module, add more information to some errors

This commit is contained in:
Ilya Kirillov
2023-07-04 12:32:45 +02:00
committed by Space Team
parent df0662459b
commit d43057e19a
11 changed files with 79 additions and 25 deletions
@@ -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)
}
}
}
@@ -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())
}
}
}
@@ -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)
}
}
}
@@ -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<ConeKotlinType?, VarargMappingState> {
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 -> {
@@ -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<Candidate>
@@ -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)
)
}
@@ -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))
}
@@ -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
@@ -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()) {
@@ -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)
}
}
}
@@ -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<ResolutionMode>(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<FirLocalScope> get() = components.localScopes
@@ -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<FirValueParameter>
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")