[FIR] Move reference-related utils from :fir:tree to :fir:semantics
This is needed to gain access to providers functionality in those utilities, which is important for support of FirDeserializedEnumAccessExpression node (see later commits) ^KT-64975
This commit is contained in:
committed by
Space Team
parent
2e5a9b1416
commit
36958d585f
@@ -14,9 +14,8 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAcces
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression
|
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.FirSuperReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirThisReference
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile
|
import org.jetbrains.kotlin.fir.resolve.providers.getContainingFile
|
||||||
@@ -311,9 +310,9 @@ abstract class FirVisibilityChecker : FirSessionComponent {
|
|||||||
|
|
||||||
if (dispatchReceiverParameterClassLookupTag != dispatchReceiverValueOwnerLookupTag) return false
|
if (dispatchReceiverParameterClassLookupTag != dispatchReceiverValueOwnerLookupTag) return false
|
||||||
if (fir.visibility == Visibilities.PrivateToThis) {
|
if (fir.visibility == Visibilities.PrivateToThis) {
|
||||||
when (val dispatchReceiverReference = dispatchReceiver.toReference()) {
|
when (dispatchReceiver) {
|
||||||
is FirThisReference -> {
|
is FirThisReceiverExpression -> {
|
||||||
if (dispatchReceiverReference.boundSymbol != dispatchReceiverParameterClassSymbol) {
|
if (dispatchReceiver.calleeReference.boundSymbol != dispatchReceiverParameterClassSymbol) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -681,10 +681,10 @@ class LightTreeRawFirExpressionBuilder(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
superNode != null || additionalArgument?.calleeReference is FirSuperReference -> {
|
superNode != null || (additionalArgument as? FirResolvable)?.calleeReference is FirSuperReference -> {
|
||||||
CalleeAndReceiver(
|
CalleeAndReceiver(
|
||||||
buildErrorNamedReference {
|
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)
|
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+2
-2
@@ -2961,11 +2961,11 @@ open class PsiRawFirBuilder(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
calleeExpression is KtSuperExpression || parenthesizedArgument?.calleeReference is FirSuperReference -> {
|
calleeExpression is KtSuperExpression || (parenthesizedArgument as? FirResolvable)?.calleeReference is FirSuperReference -> {
|
||||||
CalleeAndReceiver(
|
CalleeAndReceiver(
|
||||||
buildErrorNamedReference {
|
buildErrorNamedReference {
|
||||||
source = (calleeExpression as? KtSuperExpression)?.toFirSourceElement()
|
source = (calleeExpression as? KtSuperExpression)?.toFirSourceElement()
|
||||||
?: parenthesizedArgument?.calleeReference?.source
|
?: (parenthesizedArgument as? FirResolvable)?.calleeReference?.source
|
||||||
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
diagnostic = ConeSimpleDiagnostic("Super cannot be a callee", DiagnosticKind.SuperNotAllowed)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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()
|
||||||
@@ -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.FirResolvedArgumentList
|
||||||
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
import org.jetbrains.kotlin.fir.expressions.impl.FirSingleExpressionBlock
|
||||||
import org.jetbrains.kotlin.fir.references.*
|
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.types.*
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||||
import org.jetbrains.kotlin.fir.visitors.TransformData
|
import org.jetbrains.kotlin.fir.visitors.TransformData
|
||||||
@@ -60,24 +59,6 @@ inline val FirCall.resolvedArgumentMapping: LinkedHashMap<FirExpression, FirValu
|
|||||||
else -> null
|
else -> 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 {
|
fun buildErrorLoop(source: KtSourceElement?, diagnostic: ConeDiagnostic): FirErrorLoop {
|
||||||
return buildErrorLoop {
|
return buildErrorLoop {
|
||||||
this.source = source
|
this.source = source
|
||||||
@@ -144,8 +125,6 @@ val FirVariableAssignment.dispatchReceiver: FirExpression? get() = unwrapLValue(
|
|||||||
|
|
||||||
val FirVariableAssignment.extensionReceiver: FirExpression? get() = unwrapLValue()?.extensionReceiver
|
val FirVariableAssignment.extensionReceiver: FirExpression? get() = unwrapLValue()?.extensionReceiver
|
||||||
|
|
||||||
val FirVariableAssignment.calleeReference: FirReference? get() = lValue.toReference()
|
|
||||||
|
|
||||||
val FirVariableAssignment.contextReceiverArguments: List<FirExpression> get() = unwrapLValue()?.contextReceiverArguments ?: emptyList()
|
val FirVariableAssignment.contextReceiverArguments: List<FirExpression> get() = unwrapLValue()?.contextReceiverArguments ?: emptyList()
|
||||||
|
|
||||||
fun FirVariableAssignment.unwrapLValue(): FirQualifiedAccessExpression? {
|
fun FirVariableAssignment.unwrapLValue(): FirQualifiedAccessExpression? {
|
||||||
@@ -154,9 +133,6 @@ fun FirVariableAssignment.unwrapLValue(): FirQualifiedAccessExpression? {
|
|||||||
?: (lValue as? FirDesugaredAssignmentValueReferenceExpression)?.expressionRef?.value as? 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 =
|
fun FirExpression.unwrapExpression(): FirExpression =
|
||||||
when (this) {
|
when (this) {
|
||||||
is FirWhenSubjectExpression -> whenRef.value.subject?.unwrapExpression() ?: this
|
is FirWhenSubjectExpression -> whenRef.value.subject?.unwrapExpression() ?: this
|
||||||
|
|||||||
Reference in New Issue
Block a user