[FIR] remove user code leaks from compiler.fir.resolve module, add more information to some errors
This commit is contained in:
committed by
Space Team
parent
df0662459b
commit
d43057e19a
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-1
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+8
-1
@@ -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 -> {
|
||||
|
||||
+5
-2
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
+10
-1
@@ -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
-2
@@ -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
|
||||
|
||||
+6
-6
@@ -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()) {
|
||||
|
||||
+5
-2
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
-5
@@ -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
|
||||
|
||||
+8
-2
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user