From f8ef55ad1628a0b2fd369ce1dcaef9d45e3236f4 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 15 Dec 2022 13:22:59 +0200 Subject: [PATCH] [FIR] Get rid of `StoreNameReference` and `StoreCalleeReference` All usages of it are replaced with `replaceCalleeReference` --- .../jetbrains/kotlin/fir/FirCallResolver.kt | 24 ++++--- .../inference/PostponedArgumentsAnalyzer.kt | 7 +- ...rCallCompletionResultsWriterTransformer.kt | 71 ++++++++----------- .../resolve/transformers/TransformUtils.kt | 59 --------------- 4 files changed, 45 insertions(+), 116 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 8b4b14dee4a..7e8bf628118 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -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 diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt index 1e165e4041e..367ccfa2dec 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/inference/PostponedArgumentsAnalyzer.kt @@ -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 { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index d019e8eb91b..93a19829660 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -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 transformSyntheticCallChildren( diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt index fb7ffec100f..3c57fed69e3 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/TransformUtils.kt @@ -41,65 +41,6 @@ internal object TransformImplicitType : FirDefaultTransformer() { } } - -internal object StoreNameReference : FirDefaultTransformer() { - override fun 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() { - override fun 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()