[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:
committed by
Space Team
parent
37a7044e74
commit
e2403c801f
+16
@@ -387,6 +387,22 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
add(FirErrors.FORBIDDEN_BINARY_MOD) { firDiagnostic ->
|
||||||
|
ForbiddenBinaryModImpl(
|
||||||
|
firSymbolBuilder.buildSymbol(firDiagnostic.a),
|
||||||
|
firDiagnostic.b,
|
||||||
|
firDiagnostic as KtPsiDiagnostic,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
add(FirErrors.DEPRECATED_BINARY_MOD) { firDiagnostic ->
|
||||||
|
DeprecatedBinaryModImpl(
|
||||||
|
firSymbolBuilder.buildSymbol(firDiagnostic.a),
|
||||||
|
firDiagnostic.b,
|
||||||
|
firDiagnostic as KtPsiDiagnostic,
|
||||||
|
token,
|
||||||
|
)
|
||||||
|
}
|
||||||
add(FirErrors.SUPER_IS_NOT_AN_EXPRESSION) { firDiagnostic ->
|
add(FirErrors.SUPER_IS_NOT_AN_EXPRESSION) { firDiagnostic ->
|
||||||
SuperIsNotAnExpressionImpl(
|
SuperIsNotAnExpressionImpl(
|
||||||
firDiagnostic as KtPsiDiagnostic,
|
firDiagnostic as KtPsiDiagnostic,
|
||||||
|
|||||||
+12
@@ -307,6 +307,18 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
abstract val altererNames: List<String?>
|
abstract val altererNames: List<String?>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
abstract class ForbiddenBinaryMod : KtFirDiagnostic<PsiElement>() {
|
||||||
|
override val diagnosticClass get() = ForbiddenBinaryMod::class
|
||||||
|
abstract val forbiddenFunction: KtSymbol
|
||||||
|
abstract val suggestedFunction: String
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class DeprecatedBinaryMod : KtFirDiagnostic<PsiElement>() {
|
||||||
|
override val diagnosticClass get() = DeprecatedBinaryMod::class
|
||||||
|
abstract val forbiddenFunction: KtSymbol
|
||||||
|
abstract val suggestedFunction: String
|
||||||
|
}
|
||||||
|
|
||||||
abstract class SuperIsNotAnExpression : KtFirDiagnostic<PsiElement>() {
|
abstract class SuperIsNotAnExpression : KtFirDiagnostic<PsiElement>() {
|
||||||
override val diagnosticClass get() = SuperIsNotAnExpression::class
|
override val diagnosticClass get() = SuperIsNotAnExpression::class
|
||||||
}
|
}
|
||||||
|
|||||||
+14
@@ -355,6 +355,20 @@ internal class AmbiguousAlteredAssignImpl(
|
|||||||
override val token: KtLifetimeToken,
|
override val token: KtLifetimeToken,
|
||||||
) : KtFirDiagnostic.AmbiguousAlteredAssign(), KtAbstractFirDiagnostic<PsiElement>
|
) : KtFirDiagnostic.AmbiguousAlteredAssign(), KtAbstractFirDiagnostic<PsiElement>
|
||||||
|
|
||||||
|
internal class ForbiddenBinaryModImpl(
|
||||||
|
override val forbiddenFunction: KtSymbol,
|
||||||
|
override val suggestedFunction: String,
|
||||||
|
override val firDiagnostic: KtPsiDiagnostic,
|
||||||
|
override val token: KtLifetimeToken,
|
||||||
|
) : KtFirDiagnostic.ForbiddenBinaryMod(), KtAbstractFirDiagnostic<PsiElement>
|
||||||
|
|
||||||
|
internal class DeprecatedBinaryModImpl(
|
||||||
|
override val forbiddenFunction: KtSymbol,
|
||||||
|
override val suggestedFunction: String,
|
||||||
|
override val firDiagnostic: KtPsiDiagnostic,
|
||||||
|
override val token: KtLifetimeToken,
|
||||||
|
) : KtFirDiagnostic.DeprecatedBinaryMod(), KtAbstractFirDiagnostic<PsiElement>
|
||||||
|
|
||||||
internal class SuperIsNotAnExpressionImpl(
|
internal class SuperIsNotAnExpressionImpl(
|
||||||
override val firDiagnostic: KtPsiDiagnostic,
|
override val firDiagnostic: KtPsiDiagnostic,
|
||||||
override val token: KtLifetimeToken,
|
override val token: KtLifetimeToken,
|
||||||
|
|||||||
+6
@@ -35403,6 +35403,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
|
|||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt55747.kt")
|
||||||
|
public void testKt55747() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt55747.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt8050.kt")
|
@TestMetadata("kt8050.kt")
|
||||||
public void testKt8050() throws Exception {
|
public void testKt8050() throws Exception {
|
||||||
|
|||||||
+6
@@ -35499,6 +35499,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt55747.kt")
|
||||||
|
public void testKt55747() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt55747.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt8050.kt")
|
@TestMetadata("kt8050.kt")
|
||||||
public void testKt8050() throws Exception {
|
public void testKt8050() throws Exception {
|
||||||
|
|||||||
+6
@@ -35403,6 +35403,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt55747.kt")
|
||||||
|
public void testKt55747() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt55747.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt8050.kt")
|
@TestMetadata("kt8050.kt")
|
||||||
public void testKt8050() throws Exception {
|
public void testKt8050() throws Exception {
|
||||||
|
|||||||
+8
@@ -152,6 +152,14 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
|||||||
val AMBIGUOUS_ALTERED_ASSIGN by error<PsiElement> {
|
val AMBIGUOUS_ALTERED_ASSIGN by error<PsiElement> {
|
||||||
parameter<List<String?>>("altererNames")
|
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") {
|
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 FUNCTION_EXPECTED by error2<PsiElement, String, ConeKotlinType>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
||||||
val RESOLUTION_TO_CLASSIFIER by error1<PsiElement, FirRegularClassSymbol>()
|
val RESOLUTION_TO_CLASSIFIER by error1<PsiElement, FirRegularClassSymbol>()
|
||||||
val AMBIGUOUS_ALTERED_ASSIGN by error1<PsiElement, List<String?>>()
|
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
|
// Super
|
||||||
val SUPER_IS_NOT_AN_EXPRESSION by error0<PsiElement>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
val SUPER_IS_NOT_AN_EXPRESSION by error0<PsiElement>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
||||||
|
|||||||
+18
-1
@@ -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.isSupertypeOf
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.overriddenFunctions
|
import org.jetbrains.kotlin.fir.analysis.checkers.overriddenFunctions
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
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.containingClassLookupTag
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
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.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
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.ASSIGNMENT_OPERATIONS
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions.BINARY_OPERATION_NAMES
|
import org.jetbrains.kotlin.util.OperatorNameConventions.BINARY_OPERATION_NAMES
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions.COMPARE_TO
|
import org.jetbrains.kotlin.util.OperatorNameConventions.COMPARE_TO
|
||||||
@@ -76,8 +77,24 @@ object FirOperatorModifierChecker : FirSimpleFunctionChecker() {
|
|||||||
return
|
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? {
|
private interface Check : (CheckerContext, FirSimpleFunction) -> String? {
|
||||||
|
|||||||
+4
@@ -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_SUPERTYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FINAL_UPPER_BOUND
|
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.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.FORBIDDEN_VARARG_PARAMETER_TYPE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FUNCTION_CALL_EXPECTED
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FUNCTION_CALL_EXPECTED
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.FUNCTION_DECLARATION_WITH_NO_NAME
|
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}",
|
"Multiple extensions tried to alter this assignement at the same time. Extensions: {0}",
|
||||||
COLLECTION(NULLABLE_STRING)
|
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(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")
|
map.put(NO_RECEIVER_ALLOWED, "No receiver can be passed to this function or property")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ class A() {
|
|||||||
var x = 5
|
var x = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATED_BINARY_MOD")
|
||||||
operator fun A.modAssign(y: Int) { throw RuntimeException("mod has been called instead of rem") }
|
operator fun A.modAssign(y: Int) { throw RuntimeException("mod has been called instead of rem") }
|
||||||
operator fun A.remAssign(y: Int) { x %= y + 1 }
|
operator fun A.remAssign(y: Int) { x %= y + 1 }
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
class A() {
|
class A() {
|
||||||
var x = 5
|
var x = 5
|
||||||
|
|
||||||
|
@Suppress("DEPRECATED_BINARY_MOD")
|
||||||
operator fun mod(y: Int) { throw RuntimeException("mod has been called instead of rem") }
|
operator fun mod(y: Int) { throw RuntimeException("mod has been called instead of rem") }
|
||||||
operator fun rem(y: Int) { x -= y }
|
operator fun rem(y: Int) { x -= y }
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+4
-4
@@ -2,12 +2,12 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
class OldAndNew {
|
class OldAndNew {
|
||||||
operator fun modAssign(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun modAssign(x: Int) {}
|
||||||
operator fun remAssign(x: Int) {}
|
operator fun remAssign(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class OnlyOld {
|
class OnlyOld {
|
||||||
operator fun modAssign(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun modAssign(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class OnlyNew {
|
class OnlyNew {
|
||||||
@@ -16,11 +16,11 @@ class OnlyNew {
|
|||||||
|
|
||||||
class Sample
|
class Sample
|
||||||
|
|
||||||
operator fun Sample.modAssign(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun Sample.modAssign(x: Int) {}
|
||||||
operator fun Sample.remAssign(x: Int) {}
|
operator fun Sample.remAssign(x: Int) {}
|
||||||
|
|
||||||
class ModAndRemAssign {
|
class ModAndRemAssign {
|
||||||
operator fun mod(x: Int): ModAndRemAssign = ModAndRemAssign()
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int): ModAndRemAssign = ModAndRemAssign()
|
||||||
operator fun remAssign(x: Int) {}
|
operator fun remAssign(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,12 +2,12 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
class OldAndNew {
|
class OldAndNew {
|
||||||
operator fun mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
operator fun rem(x: Int) {}
|
operator fun rem(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class OnlyOld {
|
class OnlyOld {
|
||||||
operator fun mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
class OnlyNew {
|
class OnlyNew {
|
||||||
@@ -16,11 +16,11 @@ class OnlyNew {
|
|||||||
|
|
||||||
class Sample
|
class Sample
|
||||||
|
|
||||||
operator fun Sample.mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun Sample.mod(x: Int) {}
|
||||||
operator fun Sample.rem(x: Int) {}
|
operator fun Sample.rem(x: Int) {}
|
||||||
|
|
||||||
class IntAndUnit {
|
class IntAndUnit {
|
||||||
operator fun mod(x: Int) = 0
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) = 0
|
||||||
operator fun rem(x: Int): Int = 0
|
operator fun rem(x: Int): Int = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -2,23 +2,23 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
object ModAndRem {
|
object ModAndRem {
|
||||||
operator fun mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
operator fun rem(x: Int) {}
|
operator fun rem(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
object OldMod {
|
object OldMod {
|
||||||
operator fun mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
object ModAndRemExtension
|
object ModAndRemExtension
|
||||||
operator fun ModAndRemExtension.mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun ModAndRemExtension.mod(x: Int) {}
|
||||||
operator fun ModAndRemExtension.rem(x: Int) {}
|
operator fun ModAndRemExtension.rem(x: Int) {}
|
||||||
|
|
||||||
object ModExtension
|
object ModExtension
|
||||||
operator fun ModExtension.mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun ModExtension.mod(x: Int) {}
|
||||||
|
|
||||||
object ModMemberAndRemExtension {
|
object ModMemberAndRemExtension {
|
||||||
operator fun mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
operator fun ModMemberAndRemExtension.rem(x: Int) {}
|
operator fun ModMemberAndRemExtension.rem(x: Int) {}
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
object OldMod {
|
object OldMod {
|
||||||
operator fun mod(x: Int) {}
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
object RemExtension
|
object RemExtension
|
||||||
|
|||||||
+4
-4
@@ -2,16 +2,16 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
object ModAndRem {
|
object ModAndRem {
|
||||||
operator fun mod(x: Int) {}
|
<!FORBIDDEN_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
operator fun rem(x: Int) {}
|
operator fun rem(x: Int) {}
|
||||||
|
|
||||||
operator fun modAssign(x: Int) {}
|
<!FORBIDDEN_BINARY_MOD!>operator<!> fun modAssign(x: Int) {}
|
||||||
operator fun remAssign(x: Int) {}
|
operator fun remAssign(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
object JustMod {
|
object JustMod {
|
||||||
operator fun mod(x: Int) {}
|
<!FORBIDDEN_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
operator fun modAssign(x: Int) {}
|
<!FORBIDDEN_BINARY_MOD!>operator<!> fun modAssign(x: Int) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
|
||||||
|
|
||||||
class ModAndRemAssign {
|
|
||||||
operator fun mod(x: Int) = ModAndRemAssign()
|
|
||||||
operator fun mod(x: String) = ModAndRemAssign()
|
|
||||||
operator fun modAssign(x: String) {}
|
|
||||||
operator fun remAssign(x: Int) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun ModAndRemAssign.mod(x: String) = ModAndRemAssign()
|
|
||||||
operator fun ModAndRemAssign.modAssign(x: String) {}
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
val modAndRemAssign = ModAndRemAssign()
|
|
||||||
modAndRemAssign %= 1
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
||||||
|
|
||||||
|
|||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
class Foo {
|
|
||||||
}
|
|
||||||
operator fun Foo.mod(x: Int): Foo = Foo()
|
|
||||||
operator fun Foo.rem(x: Int): Int = 0
|
|
||||||
|
|
||||||
fun foo() {
|
|
||||||
takeInt(Foo() % 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun takeInt(x: Int) {}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
class Foo {
|
|
||||||
operator fun mod(x: Int): Foo = Foo()
|
|
||||||
operator fun rem(x: Int): Int = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fun foo() {
|
|
||||||
takeInt(Foo() % 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun takeInt(x: Int) {}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
class A {
|
|
||||||
companion object {
|
|
||||||
operator fun A.rem(x: Int) = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
operator fun A.mod(x: Int) = ""
|
|
||||||
|
|
||||||
takeInt(A() % 123)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun takeInt(x: Int) {}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
-30
@@ -1,30 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
object B
|
|
||||||
|
|
||||||
class A {
|
|
||||||
operator fun B.rem(x: Int) = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test1() {
|
|
||||||
operator fun B.mod(x: Int) = ""
|
|
||||||
|
|
||||||
with(A()) {
|
|
||||||
takeInt(B % 10)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class C {
|
|
||||||
operator fun B.mod(x: Int) = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test2() {
|
|
||||||
operator fun B.rem(x: Int) = 0
|
|
||||||
|
|
||||||
with(C()) {
|
|
||||||
takeInt(B % 10)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun takeInt(x: Int) {}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
class A {
|
|
||||||
operator fun Int.mod(s: String) = 4
|
|
||||||
}
|
|
||||||
|
|
||||||
class B {
|
|
||||||
operator fun Int.rem(s: String) = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
with(B()) {
|
|
||||||
with(A()) {
|
|
||||||
takeString(1 % "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun takeString(s: String) {}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
-15
@@ -1,15 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
class Foo {
|
|
||||||
operator fun mod(x: Int): Foo = Foo()
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun Foo.rem(x: Int): Int = 0
|
|
||||||
|
|
||||||
|
|
||||||
fun foo() {
|
|
||||||
takeInt(Foo() % 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun takeInt(x: Int) {}
|
|
||||||
+1
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
|
||||||
|
|
||||||
class ModAndRemAssign {
|
|
||||||
operator fun mod(x: Int) = ModAndRemAssign()
|
|
||||||
operator fun mod(x: String) = ModAndRemAssign()
|
|
||||||
operator fun modAssign(x: String) {}
|
|
||||||
operator fun rem(x: Int) = ModAndRemAssign()
|
|
||||||
}
|
|
||||||
|
|
||||||
operator fun ModAndRemAssign.mod(x: String) = ModAndRemAssign()
|
|
||||||
operator fun ModAndRemAssign.modAssign(x: String) {}
|
|
||||||
|
|
||||||
fun test() {
|
|
||||||
var modAndRemAssign = ModAndRemAssign()
|
|
||||||
modAndRemAssign %= 1
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER, -EXTENSION_SHADOWED_BY_MEMBER
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
// !LANGUAGE: -ProhibitOperatorMod
|
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
|
||||||
|
|
||||||
object RemAndModAssign {
|
|
||||||
operator fun modAssign(x: String) {}
|
|
||||||
operator fun rem(x: Int) = RemAndModAssign
|
|
||||||
}
|
|
||||||
|
|
||||||
fun test2() {
|
|
||||||
var c = RemAndModAssign
|
|
||||||
c %= 123
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
// !LANGUAGE: -ProhibitOperatorMod
|
// !LANGUAGE: -ProhibitOperatorMod
|
||||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ object A {
|
|||||||
@Deprecated("Use mod instead", ReplaceWith("mod"), DeprecationLevel.HIDDEN)
|
@Deprecated("Use mod instead", ReplaceWith("mod"), DeprecationLevel.HIDDEN)
|
||||||
operator fun rem(x: Int) = 0
|
operator fun rem(x: Int) = 0
|
||||||
|
|
||||||
operator fun mod(x: Int) = ""
|
<!DEPRECATED_BINARY_MOD!>operator<!> fun mod(x: Int) = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test() {
|
fun test() {
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
|
|
||||||
|
object Rem {
|
||||||
|
<!FORBIDDEN_BINARY_MOD!>operator<!> fun mod(x: Int) {}
|
||||||
|
<!FORBIDDEN_BINARY_MOD!>operator<!> fun modAssign(x: Int) {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public object Rem {
|
||||||
|
private constructor Rem()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public final operator fun mod(/*0*/ x: kotlin.Int): kotlin.Unit
|
||||||
|
public final operator fun modAssign(/*0*/ x: kotlin.Int): kotlin.Unit
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
Generated
+6
@@ -35499,6 +35499,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt54410.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt55747.kt")
|
||||||
|
public void testKt55747() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/testsWithStdLib/kt55747.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("kt8050.kt")
|
@TestMetadata("kt8050.kt")
|
||||||
public void testKt8050() throws Exception {
|
public void testKt8050() throws Exception {
|
||||||
|
|||||||
@@ -92,4 +92,7 @@ object OperatorNameConventions {
|
|||||||
|
|
||||||
@JvmField
|
@JvmField
|
||||||
val DELEGATED_PROPERTY_OPERATORS = setOf(GET_VALUE, SET_VALUE, PROVIDE_DELEGATE)
|
val DELEGATED_PROPERTY_OPERATORS = setOf(GET_VALUE, SET_VALUE, PROVIDE_DELEGATE)
|
||||||
|
|
||||||
|
@JvmField
|
||||||
|
val MOD_OPERATORS_REPLACEMENT = mapOf(MOD to REM, MOD_ASSIGN to REM_ASSIGN)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user