[FIR] KT-55747: Report error for operator fun mod

^KT-55747 Fixed

Merge-request: KT-MR-8522
Merged-by: Nikolay Lunyak <Nikolay.Lunyak@jetbrains.com>
This commit is contained in:
Nikolay Lunyak
2023-01-30 08:48:33 +00:00
committed by Space Team
parent 37a7044e74
commit e2403c801f
40 changed files with 147 additions and 173 deletions
@@ -35499,6 +35499,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
}
@Test
@TestMetadata("kt55747.kt")
public void testKt55747() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/kt55747.kt");
}
@Test
@TestMetadata("kt8050.kt")
public void testKt8050() throws Exception {
@@ -35403,6 +35403,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
}
@Test
@TestMetadata("kt55747.kt")
public void testKt55747() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/kt55747.kt");
}
@Test
@TestMetadata("kt8050.kt")
public void testKt8050() throws Exception {
@@ -152,6 +152,14 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val AMBIGUOUS_ALTERED_ASSIGN by error<PsiElement> {
parameter<List<String?>>("altererNames")
}
val FORBIDDEN_BINARY_MOD by error<PsiElement>(PositioningStrategy.OPERATOR_MODIFIER) {
parameter<FirBasedSymbol<*>>("forbiddenFunction")
parameter<String>("suggestedFunction")
}
val DEPRECATED_BINARY_MOD by error<PsiElement>(PositioningStrategy.OPERATOR_MODIFIER) {
parameter<FirBasedSymbol<*>>("forbiddenFunction")
parameter<String>("suggestedFunction")
}
}
val SUPER by object : DiagnosticGroup("Super") {
@@ -164,6 +164,8 @@ object FirErrors {
val FUNCTION_EXPECTED by error2<PsiElement, String, ConeKotlinType>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
val RESOLUTION_TO_CLASSIFIER by error1<PsiElement, FirRegularClassSymbol>()
val AMBIGUOUS_ALTERED_ASSIGN by error1<PsiElement, List<String?>>()
val FORBIDDEN_BINARY_MOD by error2<PsiElement, FirBasedSymbol<*>, String>(SourceElementPositioningStrategies.OPERATOR_MODIFIER)
val DEPRECATED_BINARY_MOD by error2<PsiElement, FirBasedSymbol<*>, String>(SourceElementPositioningStrategies.OPERATOR_MODIFIER)
// Super
val SUPER_IS_NOT_AN_EXPRESSION by error0<PsiElement>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.hasModifier
import org.jetbrains.kotlin.fir.analysis.checkers.isSupertypeOf
import org.jetbrains.kotlin.fir.analysis.checkers.overriddenFunctions
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.utils.isInline
@@ -32,6 +31,8 @@ import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.StandardClassIds
import org.jetbrains.kotlin.name.isSubpackageOf
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.util.OperatorNameConventions.ASSIGNMENT_OPERATIONS
import org.jetbrains.kotlin.util.OperatorNameConventions.BINARY_OPERATION_NAMES
import org.jetbrains.kotlin.util.OperatorNameConventions.COMPARE_TO
@@ -76,8 +77,24 @@ object FirOperatorModifierChecker : FirSimpleFunctionChecker() {
return
}
}
checkReplaceableLegacyOperators(declaration, context, reporter)
}
private fun checkReplaceableLegacyOperators(declaration: FirSimpleFunction, context: CheckerContext, reporter: DiagnosticReporter) {
val replacement = OperatorNameConventions.MOD_OPERATORS_REPLACEMENT[declaration.name] ?: return
val diagnostic = if (
declaration.symbol.callableId.packageName.isSubpackageOf(StandardClassIds.BASE_KOTLIN_PACKAGE) ||
!context.languageVersionSettings.supportsFeature(LanguageFeature.ProhibitOperatorMod)
) {
FirErrors.DEPRECATED_BINARY_MOD
} else {
FirErrors.FORBIDDEN_BINARY_MOD
}
reporter.reportOn(declaration.source, diagnostic, declaration.symbol, replacement.asString(), context)
}
}
private interface Check : (CheckerContext, FirSimpleFunction) -> String? {
@@ -214,6 +214,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.EXTENSION_PROPERT
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FINAL_SUPERTYPE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FINAL_UPPER_BOUND
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FLOAT_LITERAL_OUT_OF_RANGE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.DEPRECATED_BINARY_MOD
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FORBIDDEN_BINARY_MOD
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FORBIDDEN_VARARG_PARAMETER_TYPE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FUNCTION_CALL_EXPECTED
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FUNCTION_DECLARATION_WITH_NO_NAME
@@ -712,6 +714,8 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
"Multiple extensions tried to alter this assignement at the same time. Extensions: {0}",
COLLECTION(NULLABLE_STRING)
)
map.put(DEPRECATED_BINARY_MOD, "Convention for ''{0}'' is forbidden. Use ''{1}''", SYMBOL, STRING)
map.put(FORBIDDEN_BINARY_MOD, "Deprecated convention for ''{0}''. Use ''{1}''", SYMBOL, STRING)
map.put(ILLEGAL_SELECTOR, "The expression cannot be a selector (occur after a dot)")
map.put(NO_RECEIVER_ALLOWED, "No receiver can be passed to this function or property")