set explicit receiver kind properly for calls

This commit is contained in:
Svetlana Isakova
2013-12-04 18:28:08 +04:00
parent cf5174d798
commit 928f77ffce
26 changed files with 612 additions and 35 deletions
@@ -0,0 +1,12 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: RECEIVER_ARGUMENT
// !THIS_OBJECT: NO_RECEIVER
// !RECEIVER_ARGUMENT: a
class A {}
fun A.foo() {}
fun bar(a: A) {
a.foo()
}
@@ -0,0 +1,12 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: THIS_OBJECT
// !THIS_OBJECT: a
// !RECEIVER_ARGUMENT: NO_RECEIVER
class A {
fun foo() {}
}
fun bar(a: A) {
a.foo()
}
@@ -0,0 +1,8 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: BOTH_RECEIVERS
// !THIS_OBJECT: f
// !RECEIVER_ARGUMENT: 1
fun bar(f: Int.()->Unit) {
1.f()
}
@@ -0,0 +1,8 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: THIS_OBJECT
// !THIS_OBJECT: f
// !RECEIVER_ARGUMENT: NO_RECEIVER
fun bar(f: ()->Unit) {
f()
}
@@ -0,0 +1,12 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: NO_EXPLICIT_RECEIVER
// !THIS_OBJECT: Class{A}
// !RECEIVER_ARGUMENT: NO_RECEIVER
trait A {
val foo: Int.()->Unit
fun test() {
1.foo()
}
}
@@ -0,0 +1,12 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: BOTH_RECEIVERS
// !THIS_OBJECT: foo
// !RECEIVER_ARGUMENT: 1
trait A {
val foo: Int.()->Unit
fun test() {
1.foo()
}
}
@@ -0,0 +1,12 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: THIS_OBJECT
// !THIS_OBJECT: a
// !RECEIVER_ARGUMENT: NO_RECEIVER
trait A {
val foo: (Int)->Int
}
fun test(a: A) {
a.foo(1)
}
@@ -0,0 +1,12 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: THIS_OBJECT
// !THIS_OBJECT: foo
// !RECEIVER_ARGUMENT: NO_RECEIVER
trait A {
val foo: (Int)->Int
}
fun test(a: A) {
a.foo(1)
}
@@ -0,0 +1,18 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: RECEIVER_ARGUMENT
// !THIS_OBJECT: A
// !RECEIVER_ARGUMENT: b
class A {
fun B.foo() {}
}
trait B
fun bar(a: A, b: B) {
with (a) {
b.foo()
}
}
fun <T, R> with(receiver: T, f: T.() -> R) : R = receiver.f()
@@ -0,0 +1,20 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: NO_EXPLICIT_RECEIVER
// !THIS_OBJECT: A
// !RECEIVER_ARGUMENT: B
class A {
fun B.foo() {}
}
trait B
fun bar(a: A, b: B) {
with (a) {
with (b) {
foo()
}
}
}
fun <T, R> with(receiver: T, f: T.() -> R) : R = receiver.f()
@@ -0,0 +1,12 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: NO_EXPLICIT_RECEIVER
// !THIS_OBJECT: NO_RECEIVER
// !RECEIVER_ARGUMENT: A
class A {}
fun A.foo() {}
fun A.bar() {
foo()
}
@@ -0,0 +1,12 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: NO_EXPLICIT_RECEIVER
// !THIS_OBJECT: A
// !RECEIVER_ARGUMENT: NO_RECEIVER
class A {
fun foo() {}
}
fun A.bar() {
foo()
}
@@ -0,0 +1,11 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: NO_EXPLICIT_RECEIVER
// !THIS_OBJECT: Class{A}
// !RECEIVER_ARGUMENT: NO_RECEIVER
class A {
fun foo() {}
fun bar() {
foo()
}
}
@@ -0,0 +1,12 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: BOTH_RECEIVERS
// !THIS_OBJECT: f
// !RECEIVER_ARGUMENT: 1
class Foo() {
fun Int.invoke() {}
}
fun bar(f: Foo) {
1.f()
}
@@ -0,0 +1,16 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: THIS_OBJECT
// !THIS_OBJECT: f
// !RECEIVER_ARGUMENT: Int
class Foo() {
fun Int.invoke() {}
}
fun bar(f: Foo, i: Int) {
with (i) {
f()
}
}
fun <T, R> with(receiver: T, f: T.() -> R) : R = throw Exception()
@@ -0,0 +1,11 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: RECEIVER_ARGUMENT
// !THIS_OBJECT: NO_RECEIVER
// !RECEIVER_ARGUMENT: f
class Foo
fun Foo.invoke() {}
fun bar(f: Foo) {
f()
}
@@ -0,0 +1,12 @@
// !CALL: invoke
// !EXPLICIT_RECEIVER_KIND: THIS_OBJECT
// !THIS_OBJECT: f
// !RECEIVER_ARGUMENT: NO_RECEIVER
class Foo {
fun invoke() {}
}
fun bar(f: Foo) {
f()
}
@@ -0,0 +1,44 @@
// !CALL: +
// !EXPLICIT_RECEIVER_KIND: RECEIVER_ARGUMENT
// !THIS_OBJECT: Title
// !RECEIVER_ARGUMENT: "Foo"
trait Element {
fun render(builder: StringBuilder, indent: String)
}
class TextElement(val text: String): Element {
override fun render(builder: StringBuilder, indent: String): Unit = fail
}
abstract class Tag(val name: String): Element {
protected fun initTag<T: Element>(tag: T, init: T.() -> Unit): T = fail
override fun render(builder: StringBuilder, indent: String): Unit = fail
}
abstract class TagWithText(name: String): Tag(name) {
fun String.plus() {}
}
class HTML(): TagWithText("html") {
fun head(init: Head.() -> Unit): Head = fail
}
class Head(): TagWithText("head") {
fun title(init: Title.() -> Unit): Title = fail
}
class Title(): TagWithText("title")
fun html(init: HTML.() -> Unit): HTML = fail
fun result() =
html {
head {
title {+"Foo"}
}
}
val fail: Nothing get() = throw Exception()
@@ -0,0 +1,10 @@
// !CALL: foo
// !EXPLICIT_RECEIVER_KIND: NO_EXPLICIT_RECEIVER
// !THIS_OBJECT: NO_RECEIVER
// !RECEIVER_ARGUMENT: NO_RECEIVER
fun foo() {}
fun bar() {
foo()
}