CompilationException when labeling a method with Unit parameter?


#1

Here is my code:

    fun loop(block: (Int, Parser) -> Unit) {
        for ((index, parser) in queue.withIndex())
            block(index, parser)
    }
        label@ loop { index, parser ->
            parser.parseLine(event.getLine(index)) {
                if (it.cancelled) {
                    return@label
                }
                // stuff
            }
        }

and for a parseLine it looks like this

abstract fun parseLine(line: String, block: (ParserCallback) -> Unit)

ParserCallback is just a data class

Probably I’m doing something wrong, but someone said that if I get CompilationException I should notify you guys about that… so I’m doing that. IntelliJ IDEA allows that syntax above, so I hoped it will work, but not necessarily.

I’m using Gradle with Kotlin 1.2.50.
I have a pretty short deadline so it would be AWESOME if someone could help me with that.

Also, I forgot, the error message:
https://hastebin.com/curevumuvo.sql

PS: When I put label@ on parseLine function it still doesn’t work.


#2

This looks more like a bug for the issue tracker
https://youtrack.jetbrains.com/oauth?state=%2Fissues%2FKT

Did this work on the previous version?


#3

I’ve tried it on 1.2.31 and it wasn’t working too


#4

I can reproduce it. I simplified the code a bit

fun loop(block: (String) -> Unit){
	val data = listOf("foo", "bar", "baz")
	for (lines in data)
		block(lines)
}

fun main(vararg args: String){
	lable@ loop{
		return@lable
	}
}

#5

See bug https://youtrack.jetbrains.com/issue/KT-24157 and related.

Basically, you should put label name before opening brace

loop label@ { index, parser ->
    ...
}