[FIR] Introduce OPERATOR_CALL_ON_CONSTRUCTOR diagnostic

#KT-59943
This commit is contained in:
Evgeniy.Zhelenskiy
2023-10-20 21:17:01 +02:00
committed by Space Team
parent 649bbcf35f
commit f4d18da6a0
12 changed files with 56 additions and 24 deletions
@@ -673,14 +673,20 @@ internal object PostponedVariablesInitializerResolutionStage : ResolutionStage()
internal object CheckCallModifiers : CheckerStage() {
override suspend fun check(candidate: Candidate, callInfo: CallInfo, sink: CheckerSink, context: ResolutionContext) {
if (callInfo.callSite is FirFunctionCall) {
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))
callInfo.isImplicitInvoke && !functionSymbol.fir.isOperator ->
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
when (val functionSymbol = candidate.symbol) {
is FirNamedFunctionSymbol -> 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))
callInfo.isImplicitInvoke && !functionSymbol.fir.isOperator ->
sink.reportDiagnostic(OperatorCallOfNonOperatorFunction(functionSymbol))
}
is FirConstructorSymbol -> {
if (callInfo.callSite.origin == FirFunctionCallOrigin.Operator) {
sink.reportDiagnostic(OperatorCallOfConstructor(functionSymbol))
}
}
}
}
}