[FIR] Get rid of StoreNameReference and StoreCalleeReference

All usages of it are replaced with `replaceCalleeReference`
This commit is contained in:
Dmitriy Novozhilov
2022-12-15 13:22:59 +02:00
committed by Space Team
parent 3f8beb0b52
commit f8ef55ad16
4 changed files with 45 additions and 116 deletions
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.fir.resolve.diagnostics.*
import org.jetbrains.kotlin.fir.resolve.inference.ResolvedCallableReferenceAtom
import org.jetbrains.kotlin.fir.resolve.inference.inferenceComponents
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.resultType
@@ -90,7 +89,7 @@ class FirCallResolver(
expectedCandidates = forceCandidates
)
val resultExpression = functionCall.transformCalleeReference(StoreNameReference, nameReference)
functionCall.replaceCalleeReference(nameReference)
val candidate = (nameReference as? FirNamedReferenceWithCandidate)?.candidate
val resolvedReceiver = functionCall.explicitReceiver
if (candidate != null && resolvedReceiver is FirResolvedQualifier) {
@@ -107,7 +106,7 @@ class FirCallResolver(
contextReceiverArguments.addAll(candidate.contextReceiverArguments())
}
} else {
resultExpression
functionCall
}
val typeRef = components.typeFromCallee(resultFunctionCall)
if (typeRef.type is ConeErrorType) {
@@ -319,17 +318,17 @@ class FirCallResolver(
}
}
val resultExpression = qualifiedAccess.transformCalleeReference(StoreNameReference, nameReference)
qualifiedAccess.replaceCalleeReference(nameReference)
if (reducedCandidates.size == 1) {
val candidate = reducedCandidates.single()
resultExpression.apply {
qualifiedAccess.apply {
replaceDispatchReceiver(candidate.dispatchReceiverExpression())
replaceExtensionReceiver(candidate.chosenExtensionReceiverExpression())
replaceContextReceiverArguments(candidate.contextReceiverArguments())
}
}
if (resultExpression is FirExpression) transformer.storeTypeFromCallee(resultExpression)
return resultExpression
if (qualifiedAccess is FirExpression) transformer.storeTypeFromCallee(qualifiedAccess)
return qualifiedAccess
}
fun resolveCallableReference(
@@ -468,7 +467,9 @@ class FirCallResolver(
transformer.resolutionContext,
components.resolutionStageRunner
)
return delegatedConstructorCall.transformCalleeReference(StoreNameReference, errorReference)
return delegatedConstructorCall.apply {
replaceCalleeReference(errorReference)
}
}
val result = towerResolver.runResolverForDelegatingConstructor(
@@ -541,7 +542,9 @@ class FirCallResolver(
)
}
return annotation.transformCalleeReference(StoreNameReference, resolvedReference)
return annotation.apply {
replaceCalleeReference(resolvedReference)
}
}
private fun createCandidateForAnnotationCall(
@@ -588,7 +591,8 @@ class FirCallResolver(
result.currentApplicability,
)
return call.transformCalleeReference(StoreNameReference, nameReference).apply {
return call.apply {
call.replaceCalleeReference(nameReference)
val singleCandidate = reducedCandidates.singleOrNull()
if (singleCandidate != null) {
val symbol = singleCandidate.symbol
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeLambdaArgumentConstraintPosition
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.StoreNameReference
import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeTypeVariable
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
@@ -86,10 +85,8 @@ class PostponedArgumentsAnalyzer(
diagnostic = ConeUnresolvedReferenceError(callableReferenceAccess.calleeReference.name)
}
callableReferenceAccess.transformCalleeReference(
StoreNameReference,
namedReference
).apply {
callableReferenceAccess.apply {
replaceCalleeReference(namedReference)
val typeForCallableReference = atom.resultingTypeForCallableReference
val resolvedTypeRef = when {
typeForCallableReference != null -> buildResolvedTypeRef {
@@ -130,33 +130,29 @@ class FirCallCompletionResultsWriterTransformer(
extensionReceiver = extensionReceiver.transformSingle(integerOperatorApproximator, expectedExtensionReceiverType)
}
@Suppress("UNCHECKED_CAST")
val result = qualifiedAccessExpression
.transformCalleeReference(
StoreCalleeReference,
calleeReference.toResolvedReference(),
).apply {
replaceDispatchReceiver(dispatchReceiver)
replaceExtensionReceiver(extensionReceiver)
} as T
result.replaceContextReceiverArguments(subCandidate.contextReceiverArguments())
if (result is FirPropertyAccessExpressionImpl && calleeReference.candidate.currentApplicability == CandidateApplicability.K2_PROPERTY_AS_OPERATOR) {
result.nonFatalDiagnostics.add(ConePropertyAsOperator(calleeReference.candidate.symbol as FirPropertySymbol))
qualifiedAccessExpression.apply {
replaceCalleeReference(calleeReference.toResolvedReference())
replaceDispatchReceiver(dispatchReceiver)
replaceExtensionReceiver(extensionReceiver)
}
if (result is FirQualifiedAccessExpression) {
result.replaceTypeRef(typeRef)
} else if (result is FirVariableAssignment) {
result.replaceLValueTypeRef(typeRef)
qualifiedAccessExpression.replaceContextReceiverArguments(subCandidate.contextReceiverArguments())
if (qualifiedAccessExpression is FirPropertyAccessExpressionImpl && calleeReference.candidate.currentApplicability == CandidateApplicability.K2_PROPERTY_AS_OPERATOR) {
qualifiedAccessExpression.nonFatalDiagnostics.add(ConePropertyAsOperator(calleeReference.candidate.symbol as FirPropertySymbol))
}
if (qualifiedAccessExpression is FirQualifiedAccessExpression) {
qualifiedAccessExpression.replaceTypeRef(typeRef)
} else if (qualifiedAccessExpression is FirVariableAssignment) {
qualifiedAccessExpression.replaceLValueTypeRef(typeRef)
}
if (declaration !is FirErrorFunction) {
result.replaceTypeArguments(typeArguments)
qualifiedAccessExpression.replaceTypeArguments(typeArguments)
}
session.lookupTracker?.recordTypeResolveAsLookup(typeRef, qualifiedAccessExpression.source, context.file.source)
return result
return qualifiedAccessExpression
}
override fun transformQualifiedAccessExpression(
@@ -256,12 +252,8 @@ class FirCallCompletionResultsWriterTransformer(
annotationCall: FirAnnotationCall,
data: ExpectedArgumentType?
): FirStatement {
val calleeReference = annotationCall.calleeReference as? FirNamedReferenceWithCandidate
?: return annotationCall
annotationCall.transformCalleeReference(
StoreCalleeReference,
calleeReference.toResolvedReference(),
)
val calleeReference = annotationCall.calleeReference as? FirNamedReferenceWithCandidate ?: return annotationCall
annotationCall.replaceCalleeReference(calleeReference.toResolvedReference())
val subCandidate = calleeReference.candidate
val expectedArgumentsTypeMapping = runIf(!calleeReference.isError) { subCandidate.createArgumentsMapping() }
withFirArrayOfCallTransformer {
@@ -386,10 +378,8 @@ class FirCallCompletionResultsWriterTransformer(
}
}
return callableReferenceAccess.transformCalleeReference(
StoreCalleeReference,
resolvedReference,
).apply {
return callableReferenceAccess.apply {
replaceCalleeReference(resolvedReference)
replaceDispatchReceiver(subCandidate.dispatchReceiverExpression())
replaceExtensionReceiver(subCandidate.chosenExtensionReceiverExpression())
}
@@ -425,10 +415,9 @@ class FirCallCompletionResultsWriterTransformer(
variableAssignment.replaceLValueTypeRef(resultLValueType)
session.lookupTracker?.recordTypeResolveAsLookup(resultLValueType, variableAssignment.lValue.source, context.file.source)
return variableAssignment.transformCalleeReference(
StoreCalleeReference,
calleeReference.toResolvedReference(),
)
return variableAssignment.apply {
replaceCalleeReference(calleeReference.toResolvedReference())
}
}
override fun transformSmartCastExpression(smartCastExpression: FirSmartCastExpression, data: ExpectedArgumentType?): FirStatement {
@@ -510,10 +499,9 @@ class FirCallCompletionResultsWriterTransformer(
delegatedConstructorCall.replaceArgumentList(buildResolvedArgumentList(it, delegatedConstructorCall.argumentList.source))
}
}
return delegatedConstructorCall.transformCalleeReference(
StoreCalleeReference,
calleeReference.toResolvedReference(),
)
return delegatedConstructorCall.apply {
replaceCalleeReference(calleeReference.toResolvedReference())
}
}
private fun computeTypeArguments(
@@ -782,10 +770,9 @@ class FirCallCompletionResultsWriterTransformer(
syntheticCall.replaceTypeRefWithSubstituted(calleeReference, typeRef)
transformSyntheticCallChildren(syntheticCall, data)
return (syntheticCall.transformCalleeReference(
StoreCalleeReference,
calleeReference.toResolvedReference(),
) as D)
return syntheticCall.apply {
replaceCalleeReference(calleeReference.toResolvedReference())
}
}
private inline fun <reified D> transformSyntheticCallChildren(
@@ -41,65 +41,6 @@ internal object TransformImplicitType : FirDefaultTransformer<FirTypeRef>() {
}
}
internal object StoreNameReference : FirDefaultTransformer<FirNamedReference>() {
override fun <E : FirElement> transformElement(element: E, data: FirNamedReference): E {
return element
}
override fun transformNamedReference(
namedReference: FirNamedReference,
data: FirNamedReference
): FirNamedReference {
return data
}
override fun transformNamedReferenceWithCandidateSymbol(
namedReferenceWithCandidateSymbol: FirNamedReferenceWithCandidateSymbol,
data: FirNamedReference
): FirReference {
return data
}
override fun transformThisReference(thisReference: FirThisReference, data: FirNamedReference): FirReference {
return data
}
override fun transformSuperReference(
superReference: FirSuperReference,
data: FirNamedReference
): FirReference {
return data
}
}
internal object StoreCalleeReference : FirTransformer<FirNamedReference>() {
override fun <E : FirElement> transformElement(element: E, data: FirNamedReference): E {
return element
}
override fun transformNamedReference(
namedReference: FirNamedReference,
data: FirNamedReference
): FirNamedReference {
return data
}
override fun transformNamedReferenceWithCandidateSymbol(
namedReferenceWithCandidateSymbol: FirNamedReferenceWithCandidateSymbol,
data: FirNamedReference
): FirReference {
return data
}
override fun transformResolvedNamedReference(
resolvedNamedReference: FirResolvedNamedReference,
data: FirNamedReference
): FirNamedReference {
return data
}
}
internal fun FirValueParameter.transformVarargTypeToArrayType() {
if (isVararg) {
this.transformTypeToArrayType()