FirForLoopChecker: report also OPERATOR_MODIFIER if appropriate + minor

This commits checks iterator/hasNext/next functions whether they are
declared as operator or not. Also, it changes logic of hasNext/next
error reporting, now we're able to report errors about both these
functions.
This commit is contained in:
Mikhail Glukhikh
2021-04-16 15:24:16 +03:00
parent 2e14b65644
commit a736d62edd
16 changed files with 222 additions and 52 deletions
@@ -79,7 +79,7 @@ abstract class NotRange8() {
fun test(notRange1: NotRange1, notRange2: NotRange2, notRange3: NotRange3, notRange4: NotRange4, notRange5: NotRange5, notRange6: NotRange6, notRange7: NotRange7, notRange8: NotRange8, range0: Range0, range1: Range1) {
for (i in <!ITERATOR_MISSING!>notRange1<!>);
for (i in <!HAS_NEXT_MISSING!>notRange2<!>);
for (i in <!HAS_NEXT_MISSING, NEXT_MISSING!>notRange2<!>);
for (i in <!NEXT_MISSING!>notRange3<!>);
for (i in <!HAS_NEXT_MISSING!>notRange4<!>);
for (i in notRange5);
+28 -1
View File
@@ -111,4 +111,31 @@ fun test2() {
Anc() + Anc()
Anc() - Anc()
Anc2() + Anc2()
}
}
fun Int.iterator(): MyIntIterator = null!!
operator fun Double.iterator(): MyDoubleIterator = null!!
operator fun Boolean.iterator(): MyBooleanIterator = null!!
interface MyIntIterator {
operator fun hasNext(): Boolean
operator fun next(): Int
}
interface MyDoubleIterator {
operator fun hasNext(): Boolean
fun next(): Double
}
interface MyBooleanIterator {
fun hasNext(): Boolean
operator fun next(): Boolean
}
fun test3(i: Int, d: Double, b: Boolean) {
for (element in <!OPERATOR_MODIFIER_REQUIRED!>i<!>) {}
for (element in <!OPERATOR_MODIFIER_REQUIRED!>d<!>) {}
for (element in <!OPERATOR_MODIFIER_REQUIRED!>b<!>) {}
}
+28 -1
View File
@@ -111,4 +111,31 @@ fun test2() {
Anc() + Anc()
Anc() <!OPERATOR_MODIFIER_REQUIRED!>-<!> Anc()
Anc2() + Anc2()
}
}
fun Int.iterator(): MyIntIterator = null!!
operator fun Double.iterator(): MyDoubleIterator = null!!
operator fun Boolean.iterator(): MyBooleanIterator = null!!
interface MyIntIterator {
operator fun hasNext(): Boolean
operator fun next(): Int
}
interface MyDoubleIterator {
operator fun hasNext(): Boolean
fun next(): Double
}
interface MyBooleanIterator {
fun hasNext(): Boolean
operator fun next(): Boolean
}
fun test3(i: Int, d: Double, b: Boolean) {
for (element in <!OPERATOR_MODIFIER_REQUIRED!>i<!>) {}
for (element in <!OPERATOR_MODIFIER_REQUIRED!>d<!>) {}
for (element in <!OPERATOR_MODIFIER_REQUIRED!>b<!>) {}
}
+29
View File
@@ -2,6 +2,10 @@ package
public fun test(): kotlin.Unit
public fun test2(): kotlin.Unit
public fun test3(/*0*/ i: kotlin.Int, /*1*/ d: kotlin.Double, /*2*/ b: kotlin.Boolean): kotlin.Unit
public operator fun kotlin.Boolean.iterator(): MyBooleanIterator
public operator fun kotlin.Double.iterator(): MyDoubleIterator
public fun kotlin.Int.iterator(): MyIntIterator
public open class Anc : Base {
public constructor Anc()
@@ -65,3 +69,28 @@ public final class Example2 {
public final operator fun rangeTo(/*0*/ o: Example2): Example2
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface MyBooleanIterator {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun hasNext(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract operator fun next(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface MyDoubleIterator {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract operator fun hasNext(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract fun next(): kotlin.Double
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface MyIntIterator {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract operator fun hasNext(): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract operator fun next(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,12 +0,0 @@
class Coll {
operator fun iterator(): It? = null
}
class It {
operator fun next() = 1
operator fun hasNext() = false
}
fun test() {
for (x in <!HAS_NEXT_FUNCTION_NONE_APPLICABLE!>Coll()<!>) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
class Coll {
operator fun iterator(): It? = null
}
@@ -4,6 +4,6 @@ class X
operator fun <T> X.iterator(): Iterable<T> = TODO()
fun test() {
for (i in <!HAS_NEXT_MISSING!>X()<!>) {
for (i in <!HAS_NEXT_MISSING, NEXT_MISSING!>X()<!>) {
}
}