Gradual migration of operator 'mod' to 'rem'

- Introduce new 'rem' operator convention
 - Prefer 'rem()' to 'mod()' when both are available, even if mod() is a
   member, and rem() -- an extension
 - Place operator 'rem' under the language feature
This commit is contained in:
Mikhail Zarechenskiy
2016-12-05 22:42:16 +03:00
parent 2df9daab1f
commit 97ca51381a
29 changed files with 528 additions and 28 deletions
@@ -0,0 +1,41 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class OldAndNew {
operator fun modAssign(x: Int) {}
operator fun remAssign(x: Int) {}
}
class OnlyOld {
operator fun modAssign(x: Int) {}
}
class OnlyNew {
operator fun remAssign(x: Int) {}
}
class Sample
operator fun Sample.modAssign(x: Int) {}
operator fun Sample.remAssign(x: Int) {}
class ModAndRemAssign {
operator fun mod(x: Int): ModAndRemAssign = ModAndRemAssign()
operator fun remAssign(x: Int) {}
}
fun test() {
val oldAndNew = OldAndNew()
oldAndNew %= 1
val onlyOld = OnlyOld()
onlyOld %= 1
val onlyNew = OnlyNew()
onlyNew %= 1
val sample = Sample()
sample %= 1
var modAndRemAssign = ModAndRemAssign()
modAndRemAssign <!ASSIGN_OPERATOR_AMBIGUITY!>%=<!> 1
}
@@ -0,0 +1,46 @@
package
public fun test(): kotlin.Unit
public operator fun Sample.modAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public operator fun Sample.remAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public final class ModAndRemAssign {
public constructor ModAndRemAssign()
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): ModAndRemAssign
public final operator fun remAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class OldAndNew {
public constructor OldAndNew()
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 modAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public final operator fun remAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class OnlyNew {
public constructor OnlyNew()
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 remAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class OnlyOld {
public constructor OnlyOld()
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 modAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Sample {
public constructor Sample()
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,35 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class OldAndNew {
operator fun mod(x: Int) {}
operator fun rem(x: Int) {}
}
class OnlyOld {
operator fun mod(x: Int) {}
}
class OnlyNew {
operator fun rem(x: Int) {}
}
class Sample
operator fun Sample.mod(x: Int) {}
operator fun Sample.rem(x: Int) {}
class IntAndUnit {
operator fun mod(x: Int): Int = 0
operator fun rem(x: Int) {}
}
fun test() {
OldAndNew() % 1
OnlyOld() % 1
OnlyNew() % 1
Sample() % 1
takeInt(<!TYPE_MISMATCH!>IntAndUnit() % 1<!>)
}
fun takeInt(x: Int) {}
@@ -0,0 +1,47 @@
package
public fun takeInt(/*0*/ x: kotlin.Int): kotlin.Unit
public fun test(): kotlin.Unit
public operator fun Sample.mod(/*0*/ x: kotlin.Int): kotlin.Unit
public operator fun Sample.rem(/*0*/ x: kotlin.Int): kotlin.Unit
public final class IntAndUnit {
public constructor IntAndUnit()
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.Int
public final operator fun rem(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class OldAndNew {
public constructor OldAndNew()
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 rem(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class OnlyNew {
public constructor OnlyNew()
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 rem(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class OnlyOld {
public constructor OnlyOld()
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Sample {
public constructor Sample()
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,16 @@
// !LANGUAGE: -OperatorRem
// !DIAGNOSTICS: -UNUSED_PARAMETER, -UNUSED_VARIABLE
class Foo {
<!UNSUPPORTED_FEATURE!>operator<!> fun rem(x: Int): Foo = Foo()
}
class Bar {
<!UNSUPPORTED_FEATURE!>operator<!> fun remAssign(x: Int) {}
}
fun baz() {
val f = Foo() % 1
val b = Bar()
b %= 1
}
@@ -0,0 +1,19 @@
package
public fun baz(): kotlin.Unit
public final class Bar {
public constructor Bar()
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 remAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Foo {
public constructor Foo()
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 rem(/*0*/ x: kotlin.Int): Foo
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,15 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER, -UNUSED_VARIABLE
class Foo {
operator fun rem(x: Int): Foo = Foo()
}
class Bar {
operator fun remAssign(x: Int) {}
}
fun baz() {
val f = Foo() % 1
val b = Bar()
b %= 1
}
@@ -0,0 +1,19 @@
package
public fun baz(): kotlin.Unit
public final class Bar {
public constructor Bar()
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 remAssign(/*0*/ x: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Foo {
public constructor Foo()
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 rem(/*0*/ x: kotlin.Int): Foo
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,12 @@
// !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) {}
@@ -0,0 +1,13 @@
package
public fun foo(): kotlin.Unit
public fun takeInt(/*0*/ x: kotlin.Int): kotlin.Unit
public operator fun Foo.mod(/*0*/ x: kotlin.Int): Foo
public operator fun Foo.rem(/*0*/ x: kotlin.Int): kotlin.Int
public final class Foo {
public constructor Foo()
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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,12 @@
// !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) {}
@@ -0,0 +1,13 @@
package
public fun foo(): kotlin.Unit
public fun takeInt(/*0*/ x: kotlin.Int): kotlin.Unit
public final class Foo {
public constructor Foo()
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): Foo
public final operator fun rem(/*0*/ x: kotlin.Int): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,14 @@
// !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) {}
@@ -0,0 +1,13 @@
package
public fun foo(): kotlin.Unit
public fun takeInt(/*0*/ x: kotlin.Int): kotlin.Unit
public operator fun Foo.rem(/*0*/ x: kotlin.Int): kotlin.Int
public final class Foo {
public constructor Foo()
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): Foo
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}