diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index c8c77fd85b5..a99aac57393 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -14,9 +14,8 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAcces import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression -import org.jetbrains.kotlin.fir.expressions.toReference +import org.jetbrains.kotlin.fir.expressions.FirThisReceiverExpression import org.jetbrains.kotlin.fir.references.FirSuperReference -import org.jetbrains.kotlin.fir.references.FirThisReference import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile @@ -311,9 +310,9 @@ abstract class FirVisibilityChecker : FirSessionComponent { if (dispatchReceiverParameterClassLookupTag != dispatchReceiverValueOwnerLookupTag) return false if (fir.visibility == Visibilities.PrivateToThis) { - when (val dispatchReceiverReference = dispatchReceiver.toReference()) { - is FirThisReference -> { - if (dispatchReceiverReference.boundSymbol != dispatchReceiverParameterClassSymbol) { + when (dispatchReceiver) { + is FirThisReceiverExpression -> { + if (dispatchReceiver.calleeReference.boundSymbol != dispatchReceiverParameterClassSymbol) { return false } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt index 6e13819d30d..70dd18ec035 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirExpressionBuilder.kt @@ -681,10 +681,10 @@ class LightTreeRawFirExpressionBuilder( } ) - superNode != null || additionalArgument?.calleeReference is FirSuperReference -> { + superNode != null || (additionalArgument as? FirResolvable)?.calleeReference is FirSuperReference -> { CalleeAndReceiver( buildErrorNamedReference { - this.source = superNode?.toFirSourceElement() ?: additionalArgument?.calleeReference?.source + this.source = superNode?.toFirSourceElement() ?: (additionalArgument as? FirResolvable)?.calleeReference?.source diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed) } ) diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt index 01a8b3b44b2..74443058d4c 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt @@ -2961,11 +2961,11 @@ open class PsiRawFirBuilder( } ) - calleeExpression is KtSuperExpression || parenthesizedArgument?.calleeReference is FirSuperReference -> { + calleeExpression is KtSuperExpression || (parenthesizedArgument as? FirResolvable)?.calleeReference is FirSuperReference -> { CalleeAndReceiver( buildErrorNamedReference { source = (calleeExpression as? KtSuperExpression)?.toFirSourceElement() - ?: parenthesizedArgument?.calleeReference?.source + ?: (parenthesizedArgument as? FirResolvable)?.calleeReference?.source diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed) } ) diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt new file mode 100644 index 00000000000..0e986ecc0c7 --- /dev/null +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/expressions/ReferenceUtils.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.expressions + +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.references.FirReference +import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference +import org.jetbrains.kotlin.fir.references.resolved +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol + +fun FirExpression.toResolvedCallableReference(): FirResolvedNamedReference? { + return toReference()?.resolved +} + +fun FirExpression.toReference(): FirReference? { + return when (this) { + is FirWrappedArgumentExpression -> expression.toResolvedCallableReference() + is FirSmartCastExpression -> originalExpression.toReference() + is FirDesugaredAssignmentValueReferenceExpression -> expressionRef.value.toReference() + is FirResolvable -> calleeReference + else -> null + } +} + +fun FirExpression.toResolvedCallableSymbol(): FirCallableSymbol<*>? { + return toResolvedCallableReference()?.resolvedSymbol as? FirCallableSymbol<*>? +} + +val FirElement.calleeReference: FirReference? + get() = (this as? FirResolvable)?.calleeReference ?: (this as? FirVariableAssignment)?.calleeReference + +val FirVariableAssignment.calleeReference: FirReference? get() = lValue.toReference() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index e6cf83026cb..c466fca8fe9 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.expressions.impl.FirBlockImpl import org.jetbrains.kotlin.fir.expressions.impl.FirResolvedArgumentList import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock import org.jetbrains.kotlin.fir.references.* -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.fir.visitors.TransformData @@ -60,24 +59,6 @@ inline val FirCall.resolvedArgumentMapping: LinkedHashMap null } -fun FirExpression.toResolvedCallableReference(): FirResolvedNamedReference? { - return toReference()?.resolved -} - -fun FirExpression.toReference(): FirReference? { - return when (this) { - is FirWrappedArgumentExpression -> expression.toResolvedCallableReference() - is FirSmartCastExpression -> originalExpression.toReference() - is FirDesugaredAssignmentValueReferenceExpression -> expressionRef.value.toReference() - is FirResolvable -> calleeReference - else -> null - } -} - -fun FirExpression.toResolvedCallableSymbol(): FirCallableSymbol<*>? { - return toResolvedCallableReference()?.resolvedSymbol as? FirCallableSymbol<*>? -} - fun buildErrorLoop(source: KtSourceElement?, diagnostic: ConeDiagnostic): FirErrorLoop { return buildErrorLoop { this.source = source @@ -144,8 +125,6 @@ val FirVariableAssignment.dispatchReceiver: FirExpression? get() = unwrapLValue( val FirVariableAssignment.extensionReceiver: FirExpression? get() = unwrapLValue()?.extensionReceiver -val FirVariableAssignment.calleeReference: FirReference? get() = lValue.toReference() - val FirVariableAssignment.contextReceiverArguments: List get() = unwrapLValue()?.contextReceiverArguments ?: emptyList() fun FirVariableAssignment.unwrapLValue(): FirQualifiedAccessExpression? { @@ -154,9 +133,6 @@ fun FirVariableAssignment.unwrapLValue(): FirQualifiedAccessExpression? { ?: (lValue as? FirDesugaredAssignmentValueReferenceExpression)?.expressionRef?.value as? FirQualifiedAccessExpression } -val FirElement.calleeReference: FirReference? - get() = (this as? FirResolvable)?.calleeReference ?: (this as? FirVariableAssignment)?.calleeReference - fun FirExpression.unwrapExpression(): FirExpression = when (this) { is FirWhenSubjectExpression -> whenRef.value.subject?.unwrapExpression() ?: this