K2: drop TypeParameterAsCallable check for reified in ::class

Related to KT-63377
This commit is contained in:
Mikhail Glukhikh
2023-11-23 15:11:27 +01:00
committed by Space Team
parent 83cfcc30c6
commit e391e68ea3
8 changed files with 34 additions and 24 deletions
@@ -48,6 +48,7 @@ abstract class AbstractCandidateInfoProvider(
containingDeclarations = emptyList(), // TODO - maybe we should pass declarations from context here (no visible differences atm)
containingFile = firFile,
isImplicitInvoke = false,
isUsedAsGetClassReceiver = false,
session = firSession,
)
}
@@ -143,8 +143,10 @@ class FirCallResolver(
): List<OverloadCandidate> {
val collector = AllCandidatesCollector(components, components.resolutionStageRunner)
val origin = (qualifiedAccess as? FirFunctionCall)?.origin ?: FirFunctionCallOrigin.Regular
val result =
collectCandidates(qualifiedAccess, name, forceCallKind = null, origin, containingDeclarations, resolutionContext, collector)
val result = collectCandidates(
qualifiedAccess, name, forceCallKind = null, isUsedAsGetClassReceiver = false,
origin, containingDeclarations, resolutionContext, collector
)
return collector.allCandidates.map { OverloadCandidate(it, isInBestCandidates = it in result.candidates) }
}
@@ -152,6 +154,7 @@ class FirCallResolver(
qualifiedAccess: FirQualifiedAccessExpression,
name: Name,
forceCallKind: CallKind? = null,
isUsedAsGetClassReceiver: Boolean = false,
origin: FirFunctionCallOrigin = FirFunctionCallOrigin.Regular,
containingDeclarations: List<FirDeclaration> = transformer.components.containingDeclarations,
resolutionContext: ResolutionContext = transformer.resolutionContext,
@@ -169,6 +172,7 @@ class FirCallResolver(
explicitReceiver,
argumentList,
isImplicitInvoke = qualifiedAccess is FirImplicitInvokeCall,
isUsedAsGetClassReceiver = isUsedAsGetClassReceiver,
typeArguments,
session,
components.file,
@@ -222,25 +226,17 @@ class FirCallResolver(
fun resolveVariableAccessAndSelectCandidate(
qualifiedAccess: FirQualifiedAccessExpression,
isUsedAsReceiver: Boolean,
isUsedAsGetClassReceiver: Boolean,
callSite: FirElement,
): FirStatement {
return resolveVariableAccessAndSelectCandidateImpl(qualifiedAccess, isUsedAsReceiver, callSite) { true }
}
fun resolveOnlyEnumOrQualifierAccessAndSelectCandidate(
qualifiedAccess: FirQualifiedAccessExpression,
isUsedAsReceiver: Boolean,
): FirStatement {
return resolveVariableAccessAndSelectCandidateImpl(qualifiedAccess, isUsedAsReceiver) accept@{ candidates ->
val symbol = candidates.singleOrNull()?.symbol ?: return@accept false
symbol is FirEnumEntrySymbol || symbol is FirRegularClassSymbol
}
return resolveVariableAccessAndSelectCandidateImpl(qualifiedAccess, isUsedAsReceiver, isUsedAsGetClassReceiver, callSite) { true }
}
private fun resolveVariableAccessAndSelectCandidateImpl(
qualifiedAccess: FirQualifiedAccessExpression,
isUsedAsReceiver: Boolean,
callSite: FirElement = qualifiedAccess,
isUsedAsGetClassReceiver: Boolean,
callSite: FirElement,
acceptCandidates: (Collection<Candidate>) -> Boolean,
): FirStatement {
val callee = qualifiedAccess.calleeReference as? FirSimpleNamedReference ?: return qualifiedAccess
@@ -250,7 +246,7 @@ class FirCallResolver(
val nonFatalDiagnosticFromExpression = (qualifiedAccess as? FirPropertyAccessExpression)?.nonFatalDiagnostics
val basicResult by lazy(LazyThreadSafetyMode.NONE) {
collectCandidates(qualifiedAccess, callee.name, callSite = callSite)
collectCandidates(qualifiedAccess, callee.name, isUsedAsGetClassReceiver = isUsedAsGetClassReceiver, callSite = callSite)
}
// Even if it's not receiver, it makes sense to continue qualifier if resolution is unsuccessful
@@ -487,6 +483,7 @@ class FirCallResolver(
explicitReceiver = null,
delegatedConstructorCall.argumentList,
isImplicitInvoke = false,
isUsedAsGetClassReceiver = false,
typeArguments = typeArguments,
session,
components.file,
@@ -622,6 +619,7 @@ class FirCallResolver(
explicitReceiver = null,
annotation.argumentList,
isImplicitInvoke = false,
isUsedAsGetClassReceiver = false,
typeArguments = annotation.typeArguments,
session,
components.file,
@@ -695,6 +693,7 @@ class FirCallResolver(
callableReferenceAccess.explicitReceiver,
FirEmptyArgumentList,
isImplicitInvoke = false,
isUsedAsGetClassReceiver = false,
emptyList(),
session,
components.file,
@@ -28,6 +28,7 @@ data class CallInfo(
override val explicitReceiver: FirExpression?,
override val argumentList: FirArgumentList,
override val isImplicitInvoke: Boolean,
val isUsedAsGetClassReceiver: Boolean,
val typeArguments: List<FirTypeProjection>,
val session: FirSession,
@@ -783,8 +783,9 @@ internal object ConstraintSystemForks : ResolutionStage() {
internal object TypeParameterAsCallable : ResolutionStage() {
override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) {
if (candidate.symbol is FirTypeParameterSymbol) {
val symbol = candidate.symbol
if (symbol is FirTypeParameterSymbol && !(callInfo.isUsedAsGetClassReceiver && symbol.isReified)) {
sink.yieldDiagnostic(TypeParameterAsExpression)
}
}
}
}
@@ -374,6 +374,7 @@ class FirSyntheticCallGenerator(
explicitReceiver = null,
argumentList = argumentList,
isImplicitInvoke = false,
isUsedAsGetClassReceiver = false,
typeArguments = emptyList(),
session = session,
containingFile = components.file,
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fakeElement
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isExternal
import org.jetbrains.kotlin.fir.declarations.utils.isInner
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.diagnostics.*
import org.jetbrains.kotlin.fir.expressions.*
@@ -91,13 +90,14 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
qualifiedAccessExpression: FirQualifiedAccessExpression,
data: ResolutionMode,
): FirStatement = whileAnalysing(session, qualifiedAccessExpression) {
transformQualifiedAccessExpression(qualifiedAccessExpression, data, isUsedAsReceiver = false)
transformQualifiedAccessExpression(qualifiedAccessExpression, data, isUsedAsReceiver = false, isUsedAsGetClassReceiver = false)
}
fun transformQualifiedAccessExpression(
qualifiedAccessExpression: FirQualifiedAccessExpression,
data: ResolutionMode,
isUsedAsReceiver: Boolean,
isUsedAsGetClassReceiver: Boolean,
): FirStatement {
if (qualifiedAccessExpression.isResolved && qualifiedAccessExpression.calleeReference !is FirSimpleNamedReference) {
return qualifiedAccessExpression
@@ -152,6 +152,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
val transformedCallee = resolveQualifiedAccessAndSelectCandidate(
qualifiedAccessExpression,
isUsedAsReceiver,
isUsedAsGetClassReceiver,
// Set the correct call site. For assignment LHSs, it's the assignment, otherwise it's the qualified access itself.
callSite = when (data) {
is ResolutionMode.AssignmentLValue -> data.variableAssignment
@@ -202,7 +203,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
if (explicitReceiver is FirPropertyAccessExpression) {
qualifiedAccessExpression.replaceExplicitReceiver(
transformQualifiedAccessExpression(
explicitReceiver, ResolutionMode.ReceiverResolution, isUsedAsReceiver = true
explicitReceiver, ResolutionMode.ReceiverResolution, isUsedAsReceiver = true, isUsedAsGetClassReceiver = false
) as FirExpression
)
return qualifiedAccessExpression
@@ -221,9 +222,12 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
protected open fun resolveQualifiedAccessAndSelectCandidate(
qualifiedAccessExpression: FirQualifiedAccessExpression,
isUsedAsReceiver: Boolean,
isUsedAsGetClassReceiver: Boolean,
callSite: FirElement,
): FirStatement {
return callResolver.resolveVariableAccessAndSelectCandidate(qualifiedAccessExpression, isUsedAsReceiver, callSite)
return callResolver.resolveVariableAccessAndSelectCandidate(
qualifiedAccessExpression, isUsedAsReceiver, isUsedAsGetClassReceiver, callSite
)
}
fun transformSuperReceiver(
@@ -1055,7 +1059,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
val transformedLHS = when (explicitReceiver) {
is FirPropertyAccessExpression ->
transformQualifiedAccessExpression(
explicitReceiver, ResolutionMode.ContextIndependent, isUsedAsReceiver = true
explicitReceiver, ResolutionMode.ContextIndependent, isUsedAsReceiver = true, isUsedAsGetClassReceiver = false
) as FirExpression
else ->
explicitReceiver?.transformSingle(this, ResolutionMode.ContextIndependent)
@@ -1096,7 +1100,9 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
val argument = getClassCall.argument
val replacedArgument: FirExpression =
if (argument is FirPropertyAccessExpression)
transformQualifiedAccessExpression(argument, dataForLhs, isUsedAsReceiver = true) as FirExpression
transformQualifiedAccessExpression(
argument, dataForLhs, isUsedAsReceiver = true, isUsedAsGetClassReceiver = true
) as FirExpression
else
argument.transform(this, dataForLhs)
@@ -189,6 +189,7 @@ abstract class AbstractFirSpecificAnnotationResolveTransformer(
override fun resolveQualifiedAccessAndSelectCandidate(
qualifiedAccessExpression: FirQualifiedAccessExpression,
isUsedAsReceiver: Boolean,
isUsedAsGetClassReceiver: Boolean,
callSite: FirElement
): FirStatement {
qualifiedAccessExpression.resolveFromImportScope()
@@ -12,7 +12,7 @@ FILE: memberTypeParameterVsNestedClass2.fir.kt
}
public final inline fun <reified T> foo(): R|kotlin/Unit| {
<getClass>(Q|Outer.T|)
<getClass>(R|T|)
lval x: R|T?| = Null(null)
lval y: R|T?| = R|/Outer.T.T<CS errors: /Outer.T.T>#|()
}