[FIR] Resolve operator calls to operator functions only

This commit is contained in:
Andrey Zinovyev
2021-05-17 11:46:04 +03:00
committed by TeamCityServer
parent b1c8669b43
commit e021e25d6c
10 changed files with 19 additions and 97 deletions
@@ -39,7 +39,7 @@ sealed class CallKind(vararg resolutionSequence: ResolutionStage) {
CheckDispatchReceiver,
CheckExtensionReceiver,
CheckArguments,
CheckInfixCall,
CheckCallModifiers,
EagerResolveOfCallableReferences,
CheckLowPriorityInOverloadResolution,
PostponedVariablesInitializerResolutionStage
@@ -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))
}
}
}