Introduce FirForLoopChecker

This commit is contained in:
Mikhail Glukhikh
2021-04-02 13:19:04 +03:00
parent 4ddc0ed3fe
commit 2e14b65644
35 changed files with 708 additions and 118 deletions
@@ -0,0 +1,206 @@
FILE: forLoopChecker.kt
public final class NotRange1 : R|kotlin/Any| {
public constructor(): R|NotRange1| {
super<R|kotlin/Any|>()
}
}
public abstract class NotRange2 : R|kotlin/Any| {
public constructor(): R|NotRange2| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|kotlin/Unit|
}
public abstract class ImproperIterator1 : R|kotlin/Any| {
public constructor(): R|ImproperIterator1| {
super<R|kotlin/Any|>()
}
public abstract operator fun hasNext(): R|kotlin/Boolean|
}
public abstract class NotRange3 : R|kotlin/Any| {
public constructor(): R|NotRange3| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|ImproperIterator1|
}
public abstract class ImproperIterator2 : R|kotlin/Any| {
public constructor(): R|ImproperIterator2| {
super<R|kotlin/Any|>()
}
public abstract operator fun next(): R|kotlin/Boolean|
}
public abstract class NotRange4 : R|kotlin/Any| {
public constructor(): R|NotRange4| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|ImproperIterator2|
}
public abstract class ImproperIterator3 : R|kotlin/Any| {
public constructor(): R|ImproperIterator3| {
super<R|kotlin/Any|>()
}
public abstract operator fun hasNext(): R|kotlin/Int|
public abstract operator fun next(): R|kotlin/Int|
}
public abstract class NotRange5 : R|kotlin/Any| {
public constructor(): R|NotRange5| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|ImproperIterator3|
}
public abstract class AmbiguousHasNextIterator : R|kotlin/Any| {
public constructor(): R|AmbiguousHasNextIterator| {
super<R|kotlin/Any|>()
}
public abstract operator fun hasNext(): R|kotlin/Boolean|
public final val hasNext: R|kotlin/Boolean|
public get(): R|kotlin/Boolean| {
^ Boolean(false)
}
public abstract operator fun next(): R|kotlin/Int|
}
public abstract class NotRange6 : R|kotlin/Any| {
public constructor(): R|NotRange6| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|AmbiguousHasNextIterator|
}
public abstract class ImproperIterator4 : R|kotlin/Any| {
public constructor(): R|ImproperIterator4| {
super<R|kotlin/Any|>()
}
public final val hasNext: R|kotlin/Int|
public get(): R|kotlin/Int| {
^ Int(1)
}
public abstract operator fun next(): R|kotlin/Int|
}
public abstract class NotRange7 : R|kotlin/Any| {
public constructor(): R|NotRange7| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|ImproperIterator3|
}
public abstract class GoodIterator : R|kotlin/Any| {
public constructor(): R|GoodIterator| {
super<R|kotlin/Any|>()
}
public abstract operator fun hasNext(): R|kotlin/Boolean|
public abstract operator fun next(): R|kotlin/Int|
}
public abstract class Range0 : R|kotlin/Any| {
public constructor(): R|Range0| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|GoodIterator|
}
public abstract class Range1 : R|kotlin/Any| {
public constructor(): R|Range1| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|kotlin/collections/Iterator<kotlin/Int>|
}
public abstract class ImproperIterator5 : R|kotlin/Any| {
public constructor(): R|ImproperIterator5| {
super<R|kotlin/Any|>()
}
public abstract val R|kotlin/String|.hasNext: R|kotlin/Boolean|
public get(): R|kotlin/Boolean|
public abstract operator fun next(): R|kotlin/Int|
}
public abstract class NotRange8 : R|kotlin/Any| {
public constructor(): R|NotRange8| {
super<R|kotlin/Any|>()
}
public abstract operator fun iterator(): R|ImproperIterator5|
}
public final fun test(notRange1: R|NotRange1|, notRange2: R|NotRange2|, notRange3: R|NotRange3|, notRange4: R|NotRange4|, notRange5: R|NotRange5|, notRange6: R|NotRange6|, notRange7: R|NotRange7|, notRange8: R|NotRange8|, range0: R|Range0|, range1: R|Range1|): R|kotlin/Unit| {
lval <iterator>: R|ERROR CLASS: Unresolved name: iterator| = R|<local>/notRange1|.<Unresolved name: iterator>#()
while(R|<local>/<iterator>|.<Unresolved name: hasNext>#()) {
lval i: R|ERROR CLASS: Unresolved name: next| = R|<local>/<iterator>|.<Unresolved name: next>#()
}
lval <iterator>: R|kotlin/Unit| = R|<local>/notRange2|.R|/NotRange2.iterator|()
while(R|<local>/<iterator>|.<Unresolved name: hasNext>#()) {
lval i: R|ERROR CLASS: Unresolved name: next| = R|<local>/<iterator>|.<Unresolved name: next>#()
}
lval <iterator>: R|ImproperIterator1| = R|<local>/notRange3|.R|/NotRange3.iterator|()
while(R|<local>/<iterator>|.R|/ImproperIterator1.hasNext|()) {
lval i: R|ERROR CLASS: Unresolved name: next| = R|<local>/<iterator>|.<Unresolved name: next>#()
}
lval <iterator>: R|ImproperIterator2| = R|<local>/notRange4|.R|/NotRange4.iterator|()
while(R|<local>/<iterator>|.<Unresolved name: hasNext>#()) {
lval i: R|kotlin/Boolean| = R|<local>/<iterator>|.R|/ImproperIterator2.next|()
}
lval <iterator>: R|ImproperIterator3| = R|<local>/notRange5|.R|/NotRange5.iterator|()
while(R|<local>/<iterator>|.R|/ImproperIterator3.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator3.next|()
}
lval <iterator>: R|AmbiguousHasNextIterator| = R|<local>/notRange6|.R|/NotRange6.iterator|()
while(R|<local>/<iterator>|.R|/AmbiguousHasNextIterator.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/AmbiguousHasNextIterator.next|()
}
lval <iterator>: R|ImproperIterator3| = R|<local>/notRange7|.R|/NotRange7.iterator|()
while(R|<local>/<iterator>|.R|/ImproperIterator3.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator3.next|()
}
lval <iterator>: R|ImproperIterator5| = R|<local>/notRange8|.R|/NotRange8.iterator|()
while(R|<local>/<iterator>|.<Unresolved name: hasNext>#()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/ImproperIterator5.next|()
}
lval <iterator>: R|GoodIterator| = R|<local>/range0|.R|/Range0.iterator|()
while(R|<local>/<iterator>|.R|/GoodIterator.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|/GoodIterator.next|()
}
lval <iterator>: R|kotlin/collections/Iterator<kotlin/Int>| = R|<local>/range1|.R|/Range1.iterator|()
while(R|<local>/<iterator>|.R|kotlin/collections/Iterator.hasNext|()) {
lval i: R|kotlin/Int| = R|<local>/<iterator>|.R|SubstitutionOverride<kotlin/collections/Iterator.next: R|kotlin/Int|>|()
}
}
@@ -0,0 +1,89 @@
import java.util.*;
class NotRange1() {
}
abstract class NotRange2() {
abstract operator fun iterator() : Unit
}
abstract class ImproperIterator1 {
abstract operator fun hasNext() : Boolean
}
abstract class NotRange3() {
abstract operator fun iterator() : ImproperIterator1
}
abstract class ImproperIterator2 {
abstract operator fun next() : Boolean
}
abstract class NotRange4() {
abstract operator fun iterator() : ImproperIterator2
}
abstract class ImproperIterator3 {
abstract operator fun hasNext() : Int
abstract operator fun next() : Int
}
abstract class NotRange5() {
abstract operator fun iterator() : ImproperIterator3
}
abstract class AmbiguousHasNextIterator {
abstract operator fun hasNext() : Boolean
val hasNext : Boolean get() = false
abstract operator fun next() : Int
}
abstract class NotRange6() {
abstract operator fun iterator() : AmbiguousHasNextIterator
}
abstract class ImproperIterator4 {
val hasNext : Int get() = 1
abstract operator fun next() : Int
}
abstract class NotRange7() {
abstract operator fun iterator() : ImproperIterator3
}
abstract class GoodIterator {
abstract operator fun hasNext() : Boolean
abstract operator fun next() : Int
}
abstract class Range0() {
abstract operator fun iterator() : GoodIterator
}
abstract class Range1() {
abstract operator fun iterator() : Iterator<Int>
}
abstract class ImproperIterator5 {
abstract val String.hasNext : Boolean
abstract operator fun next() : Int
}
abstract class NotRange8() {
abstract operator fun iterator() : ImproperIterator5
}
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 <!NEXT_MISSING!>notRange3<!>);
for (i in <!HAS_NEXT_MISSING!>notRange4<!>);
for (i in notRange5);
for (i in notRange6);
for (i in notRange7);
for (i in <!HAS_NEXT_MISSING!>notRange8<!>);
for (i in range0);
for (i in range1);
}