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:
@@ -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
@@ -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
@@ -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<!>) {}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
-12
@@ -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
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
class Coll {
|
||||
operator fun iterator(): It? = null
|
||||
}
|
||||
|
||||
+1
-1
@@ -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()<!>) {
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user