Frontend support for function as expression

This commit is contained in:
Stanislav Erokhin
2015-02-05 23:29:22 +03:00
parent 6ccd8ab764
commit 44895a23cf
28 changed files with 498 additions and 10 deletions
@@ -0,0 +1,20 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
annotation class ann(val name: String)
val ok = "OK"
class A
val withName = fun name() {}
val extensionWithName = fun A.name() {}
val withoutName = fun () {}
val extensionWithoutName = fun A.() {}
fun withAnnotation() = [ann(ok)] fun () {}
val withReturn = fun (): Int { return 5}
val withExpression = fun() = 5
val funfun = fun() = fun() = 5
val parentesized = (fun () {})
val parentesizedWithType = (fun () {}) : () -> Unit
val withType = (fun () {}) : () -> Unit
@@ -0,0 +1,29 @@
package
internal val extensionWithName: A.() -> kotlin.Unit
internal val extensionWithoutName: A.() -> kotlin.Unit
internal val funfun: () -> () -> kotlin.Int
internal val ok: kotlin.String = "OK"
internal val parentesized: () -> kotlin.Unit
internal val parentesizedWithType: () -> kotlin.Unit
internal val withExpression: () -> kotlin.Int
internal val withName: () -> kotlin.Unit
internal val withReturn: () -> kotlin.Int
internal val withType: () -> kotlin.Unit
internal val withoutName: () -> kotlin.Unit
internal fun withAnnotation(): () -> kotlin.Unit
internal final class A {
public constructor A()
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
}
internal final annotation class ann : kotlin.Annotation {
public constructor ann(/*0*/ name: kotlin.String)
internal final val name: kotlin.String
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,27 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
fun test() {
fun bar() {
val bas = fun() {
<!RETURN_NOT_ALLOWED!>return@bar<!>
}
}
val bar = fun() {
<!RETURN_NOT_ALLOWED!>return@test<!>
}
}
fun foo() {
val bal = @bag fun () {
val bar = fun() {
<!RETURN_NOT_ALLOWED!>return@bag<!>
}
return@bag
}
val bag = fun name() {
val bar = fun () {
<!RETURN_NOT_ALLOWED!>return@name<!>
}
}
}
@@ -0,0 +1,4 @@
package
internal fun foo(): kotlin.Unit
internal fun test(): kotlin.Unit
@@ -0,0 +1,31 @@
// !CHECK_TYPE
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
fun testReturnType(foo: String) {
val bar = fun () = foo
bar.checkType { it : _<() -> String> }
val bas: () -> String = fun () = foo
val bag: () -> Int = <!TYPE_MISMATCH!>fun () = foo<!>
}
fun testParamType() {
val bar = fun (bal: String){}
bar.checkType { it : _<(String) -> Unit> }
val bas: (String) -> Unit = fun (param: String) {}
val bag: (Int) -> Unit = <!TYPE_MISMATCH!>fun (param: String) {}<!>
}
fun testReceiverType() {
val bar = fun String.() {}
bar.checkType { it : _<String.() -> Unit> }
val bas: String.() -> Unit = fun String.() {}
val bag: Int.() -> Unit = <!TYPE_MISMATCH!>fun String.() {}<!>
}
@@ -0,0 +1,5 @@
package
internal fun testParamType(): kotlin.Unit
internal fun testReceiverType(): kotlin.Unit
internal fun testReturnType(/*0*/ foo: kotlin.String): kotlin.Unit
@@ -0,0 +1,18 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
val bar = fun name() {}
val bas = fun name() {}
fun gar(p: Any?) = fun name() {}
fun gas(p: Any?) = fun name() {}
fun outer() {
val bar = fun name() {}
val bas = fun name() {}
fun gar(p: Any?) = fun name() {}
fun gas(p: Any?) = fun name() {}
gar(fun name() {})
gar(fun name() {})
}
@@ -0,0 +1,7 @@
package
internal val bar: () -> kotlin.Unit
internal val bas: () -> kotlin.Unit
internal fun gar(/*0*/ p: kotlin.Any?): () -> kotlin.Unit
internal fun gas(/*0*/ p: kotlin.Any?): () -> kotlin.Unit
internal fun outer(): kotlin.Unit
@@ -0,0 +1,18 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
val bar = fun(p: Int = <!FUNCTION_EXPRESSION_PARAMETER_WITH_DEFAULT_VALUE!>3<!>) {}
val bas = fun(<!USELESS_VARARG_ON_PARAMETER!>vararg p: Int<!>) {}
fun gar() = fun(p: Int = <!FUNCTION_EXPRESSION_PARAMETER_WITH_DEFAULT_VALUE!>3<!>) {}
fun gas() = fun(<!USELESS_VARARG_ON_PARAMETER!>vararg p: Int<!>) {}
fun outer(b: Any?) {
val bar = fun(p: Int = <!FUNCTION_EXPRESSION_PARAMETER_WITH_DEFAULT_VALUE!>3<!>) {}
val bas = fun(<!USELESS_VARARG_ON_PARAMETER!>vararg p: Int<!>) {}
fun gar() = fun(p: Int = <!FUNCTION_EXPRESSION_PARAMETER_WITH_DEFAULT_VALUE!>3<!>) {}
fun gas() = fun(<!USELESS_VARARG_ON_PARAMETER!>vararg p: Int<!>) {}
outer(fun(p: Int = <!FUNCTION_EXPRESSION_PARAMETER_WITH_DEFAULT_VALUE!>3<!>) {})
outer(fun(<!USELESS_VARARG_ON_PARAMETER!>vararg p: Int<!>) {})
}
@@ -0,0 +1,7 @@
package
internal val bar: (kotlin.Int) -> kotlin.Unit
internal val bas: (kotlin.IntArray) -> kotlin.Unit
internal fun gar(): (kotlin.Int) -> kotlin.Unit
internal fun gas(): (kotlin.IntArray) -> kotlin.Unit
internal fun outer(/*0*/ b: kotlin.Any?): kotlin.Unit
@@ -0,0 +1,13 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
val label_fun = @label fun () {
return@label
}
val parenthesized_label_fun = (@label fun () {
return@label
})
val fun_with_name = fun name() {
return@name
}
@@ -0,0 +1,5 @@
package
internal val fun_with_name: () -> kotlin.Unit
internal val label_fun: () -> kotlin.Unit
internal val parenthesized_label_fun: () -> kotlin.Unit
@@ -0,0 +1,9 @@
val foo = fun(a: Int): String {
if (a == 1) return "4"
when (a) {
5 -> return "2"
3 -> return <!NULL_FOR_NONNULL_TYPE!>null<!>
2 -> return <!CONSTANT_EXPECTED_TYPE_MISMATCH!>2<!>
}
return ""
}
@@ -0,0 +1,3 @@
package
internal val foo: (kotlin.Int) -> kotlin.String
@@ -0,0 +1,20 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
trait B {
fun b_fun() {}
}
fun test(param: String) {
val local_val = 4
val bar = fun B.(fun_param: Int) {
param.length()
b_fun()
val inner_bar = local_val + fun_param
<!UNRESOLVED_REFERENCE!>bar<!>
}
<!UNRESOLVED_REFERENCE!>inner_bar<!>
<!UNRESOLVED_REFERENCE!>fun_param<!>
}
@@ -0,0 +1,10 @@
package
internal fun test(/*0*/ param: kotlin.String): kotlin.Unit
internal trait B {
internal open fun b_fun(): kotlin.Unit
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,18 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait A
fun devNull(a: Any?){}
val generic_fun = fun<!TYPE_PARAMETERS_NOT_ALLOWED!><T><!>(t: T): T = null!!
val extension_generic_fun = fun<!TYPE_PARAMETERS_NOT_ALLOWED!><T><!><!UNRESOLVED_REFERENCE!>T<!>.(t: T): T = null!!
fun fun_with_where() = fun <!TYPE_PARAMETERS_NOT_ALLOWED!><T><!> <!UNRESOLVED_REFERENCE!>T<!>.(t: T): T where T: A {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun outer() {
devNull(fun <!TYPE_PARAMETERS_NOT_ALLOWED!><T><!>() {})
devNull(fun <!TYPE_PARAMETERS_NOT_ALLOWED!><T><!> T.name() {})
devNull(fun <!TYPE_PARAMETERS_NOT_ALLOWED!><T><!> name(): T = null!!)
devNull(fun <!TYPE_PARAMETERS_NOT_ALLOWED!><T><!> name(t: T) {})
devNull(fun <!TYPE_PARAMETERS_NOT_ALLOWED!><T><!> name() where T:A {})
}
@@ -0,0 +1,13 @@
package
internal val extension_generic_fun: [ERROR : T].(T) -> T
internal val generic_fun: (T) -> T
internal fun devNull(/*0*/ a: kotlin.Any?): kotlin.Unit
internal fun fun_with_where(): [ERROR : T].(T) -> T
internal fun outer(): kotlin.Unit
internal trait A {
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,31 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
fun <T> parameter() = fun (t: T) = t
fun <T> receiver() = fun T.() = this
fun <T> returnType() = fun (): T = null!!
val <T> T.fromVal: () -> T get() = fun (): T = this@fromVal
fun devNull(a: Any?){}
fun <O> outer() {
fun <T> parameter() = fun (t: T) = t
fun <T> receiver() = fun T.() = this
fun <T> returnType() = fun (): T = null!!
devNull(fun (t: O) = t)
devNull(fun O.() = this)
devNull(fun (): O = null!!)
}
class Outer<O> {
fun <T> parameter() = fun (t: T) = t
fun <T> receiver() = fun T.() = this
fun <T> returnType() = fun (): T = null!!
init {
devNull(fun (t: O) = t)
devNull(fun O.() = this)
devNull(fun (): O = null!!)
}
}
@@ -0,0 +1,18 @@
package
internal val </*0*/ T> T.fromVal: () -> T
internal fun devNull(/*0*/ a: kotlin.Any?): kotlin.Unit
internal fun </*0*/ O> outer(): kotlin.Unit
internal fun </*0*/ T> parameter(): (T) -> T
internal fun </*0*/ T> receiver(): T.() -> T
internal fun </*0*/ T> returnType(): () -> T
internal final class Outer</*0*/ O> {
public constructor Outer</*0*/ O>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun </*0*/ T> parameter(): (T) -> T
internal final fun </*0*/ T> receiver(): T.() -> T
internal final fun </*0*/ T> returnType(): () -> T
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,12 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
annotation class ann
val bas = <!NON_MEMBER_FUNCTION_NO_BODY!>fun ()<!>
fun bar(a: Any) = <!NON_MEMBER_FUNCTION_NO_BODY!>fun name()<!>
fun outer() {
bar(<!NON_MEMBER_FUNCTION_NO_BODY!>fun ()<!>)
bar(<!NON_MEMBER_FUNCTION_NO_BODY!>fun name()<!>)
bar(<!NON_MEMBER_FUNCTION_NO_BODY!>[ann] fun name()<!>)
}
@@ -0,0 +1,12 @@
package
internal val bas: () -> kotlin.Unit
internal fun bar(/*0*/ a: kotlin.Any): () -> kotlin.Unit
internal fun outer(): kotlin.Unit
internal final annotation class ann : kotlin.Annotation {
public constructor ann()
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
}