Allow "@method()" syntax for explicit self sends, like CoffeeScript.

This commit is contained in:
Bob Nystrom
2015-11-30 21:44:12 -08:00
parent 37b70db1b0
commit 2e425ae840
10 changed files with 180 additions and 9 deletions

View File

@ -1,5 +1,5 @@
class Foo {
this new { // expect error
construct new { // expect error
System.print("ok")
}
}

View File

@ -0,0 +1,12 @@
class Foo {
construct new() {}
bar { "getter" }
test() {
var bar = "local"
System.print(@bar) // expect: getter
}
}
Foo.new().test()

View File

@ -0,0 +1,13 @@
class Foo {
construct new(field) {
_field = field
}
method() {
System.print(_field)
}
makeClosure() { Fn.new { @method() } }
}
Foo.new("value").makeClosure().call() // expect: value

View File

@ -0,0 +1,27 @@
class Foo {
construct new() {}
getter {
System.print("getter")
}
setter=(value) {
System.print("setter")
}
method(a) {
System.print("method")
}
}
class Bar is Foo {
construct new() {}
test() {
@getter // expect: getter
@setter = "value" // expect: setter
@method("arg") // expect: method
}
}
Bar.new().test()

View File

@ -0,0 +1,25 @@
class Foo {
construct new() {}
getter {
System.print("getter")
}
setter=(value) {
System.print("setter")
}
method(a) {
System.print("method")
}
test() {
@getter // expect: getter
@setter = "value" // expect: setter
@method("arg") // expect: method
}
}
Foo.new().test()
// TODO: Operators.

View File

@ -0,0 +1,51 @@
class Outer {
construct new() {}
getter {
System.print("outer getter")
}
setter=(value) {
System.print("outer setter")
}
method(a) {
System.print("outer method")
}
test() {
@getter // expect: outer getter
@setter = "value" // expect: outer setter
@method("arg") // expect: outer method
class Inner {
construct new() {}
getter {
System.print("inner getter")
}
setter=(value) {
System.print("inner setter")
}
method(a) {
System.print("inner method")
}
test() {
@getter // expect: inner getter
@setter = "value" // expect: inner setter
@method("arg") // expect: inner method
}
}
Inner.new().test()
@getter // expect: outer getter
@setter = "value" // expect: outer setter
@method("arg") // expect: outer method
}
}
Outer.new().test()

View File

@ -0,0 +1 @@
@method() // expect error

View File

@ -0,0 +1,21 @@
class Foo {
static getter {
System.print("getter")
}
static setter=(value) {
System.print("setter")
}
static method(a) {
System.print("method")
}
static test() {
@getter // expect: getter
@setter = "value" // expect: setter
@method("arg") // expect: method
}
}
Foo.test()

View File

@ -1,8 +1,8 @@
class Foo {
construct new() {}
getClosure { Fn.new { toString } }
getClosure() { Fn.new { toString } }
toString { "Foo" }
}
var closure = Foo.new().getClosure
var closure = Foo.new().getClosure()
System.print(closure.call()) // expect: Foo