K2: drop TypeParameterAsCallable check for reified in ::class
Related to KT-63377
This commit is contained in:
committed by
Space Team
parent
83cfcc30c6
commit
e391e68ea3
+1
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -374,6 +374,7 @@ class FirSyntheticCallGenerator(
|
||||
explicitReceiver = null,
|
||||
argumentList = argumentList,
|
||||
isImplicitInvoke = false,
|
||||
isUsedAsGetClassReceiver = false,
|
||||
typeArguments = emptyList(),
|
||||
session = session,
|
||||
containingFile = components.file,
|
||||
|
||||
+12
-6
@@ -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)
|
||||
|
||||
|
||||
+1
@@ -189,6 +189,7 @@ abstract class AbstractFirSpecificAnnotationResolveTransformer(
|
||||
override fun resolveQualifiedAccessAndSelectCandidate(
|
||||
qualifiedAccessExpression: FirQualifiedAccessExpression,
|
||||
isUsedAsReceiver: Boolean,
|
||||
isUsedAsGetClassReceiver: Boolean,
|
||||
callSite: FirElement
|
||||
): FirStatement {
|
||||
qualifiedAccessExpression.resolveFromImportScope()
|
||||
|
||||
Vendored
+1
-1
@@ -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>#|()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user