[FIR] Resolve operator calls to operator functions only
This commit is contained in:
committed by
TeamCityServer
parent
b1c8669b43
commit
e021e25d6c
+2
@@ -143,6 +143,8 @@ private fun mapInapplicableCandidateError(
|
||||
is UnsafeCall -> mapUnsafeCallError(diagnostic.candidate, rootCause, source, qualifiedAccessSource)
|
||||
is ManyLambdaExpressionArguments -> FirErrors.MANY_LAMBDA_EXPRESSION_ARGUMENTS.on(rootCause.argument.source ?: source)
|
||||
is InfixCallOfNonInfixFunction -> FirErrors.INFIX_MODIFIER_REQUIRED.on(source, rootCause.function)
|
||||
is OperatorCallOfNonOperatorFunction ->
|
||||
FirErrors.OPERATOR_MODIFIER_REQUIRED.on(source, rootCause.function, rootCause.function.fir.name.asString())
|
||||
else -> null
|
||||
}
|
||||
}.ifEmpty { listOf(FirErrors.INAPPLICABLE_CANDIDATE.on(source, diagnostic.candidate.symbol)) }
|
||||
|
||||
@@ -1889,7 +1889,7 @@ open class RawFirBuilder(
|
||||
}
|
||||
explicitReceiver = leftArgument
|
||||
argumentList = buildUnaryArgumentList(rightArgument)
|
||||
origin = if (conventionCallName != null) FirFunctionCallOrigin.REGULAR else FirFunctionCallOrigin.INFIX
|
||||
origin = if (conventionCallName != null) FirFunctionCallOrigin.OPERATOR else FirFunctionCallOrigin.INFIX
|
||||
}
|
||||
} else {
|
||||
val firOperation = operationToken.toFirOperation()
|
||||
|
||||
@@ -39,7 +39,7 @@ sealed class CallKind(vararg resolutionSequence: ResolutionStage) {
|
||||
CheckDispatchReceiver,
|
||||
CheckExtensionReceiver,
|
||||
CheckArguments,
|
||||
CheckInfixCall,
|
||||
CheckCallModifiers,
|
||||
EagerResolveOfCallableReferences,
|
||||
CheckLowPriorityInOverloadResolution,
|
||||
PostponedVariablesInitializerResolutionStage
|
||||
|
||||
+2
-1
@@ -104,4 +104,5 @@ class ManyLambdaExpressionArguments(
|
||||
val argument: FirExpression
|
||||
) : ResolutionDiagnostic(INAPPLICABLE_ARGUMENTS_MAPPING_ERROR)
|
||||
|
||||
class InfixCallOfNonInfixFunction(val function: FirNamedFunctionSymbol) : ResolutionDiagnostic(INAPPLICABLE_MODIFIER)
|
||||
class InfixCallOfNonInfixFunction(val function: FirNamedFunctionSymbol) : ResolutionDiagnostic(INAPPLICABLE_MODIFIER)
|
||||
class OperatorCallOfNonOperatorFunction(val function: FirNamedFunctionSymbol) : ResolutionDiagnostic(INAPPLICABLE_MODIFIER)
|
||||
@@ -267,14 +267,15 @@ internal object PostponedVariablesInitializerResolutionStage : ResolutionStage()
|
||||
}
|
||||
}
|
||||
|
||||
internal object CheckInfixCall : CheckerStage() {
|
||||
internal object CheckCallModifiers : CheckerStage() {
|
||||
override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) {
|
||||
if (callInfo.callSite is FirFunctionCall) {
|
||||
if (callInfo.callSite.origin == FirFunctionCallOrigin.INFIX) {
|
||||
val functionSymbol = candidate.symbol as? FirNamedFunctionSymbol ?: return
|
||||
if (!functionSymbol.fir.isInfix) {
|
||||
val functionSymbol = candidate.symbol as? FirNamedFunctionSymbol ?: return
|
||||
when {
|
||||
callInfo.callSite.origin == FirFunctionCallOrigin.INFIX && !functionSymbol.fir.isInfix ->
|
||||
sink.reportDiagnostic(InfixCallOfNonInfixFunction(functionSymbol))
|
||||
}
|
||||
callInfo.callSite.origin == FirFunctionCallOrigin.OPERATOR && !functionSymbol.fir.isOperator ->
|
||||
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user