feat: make this the implicit receiver for method calls inside class bodies

In the compiler, when a bare name is encountered inside a class definition and it does not resolve to a local variable or global, emit an implicit `this.` load before the call, enabling getter, setter, and method calls without explicit receiver. Update all benchmark, builtin, and test files to remove redundant `this.` qualifiers, and add comprehensive test suites for implicit receiver behavior across instance, inherited, static, nested, and shadowing scenarios.
This commit is contained in:
Bob Nystrom
2014-02-13 01:33:35 +00:00
parent c04865df2e
commit e3b3fef0fb
13 changed files with 217 additions and 51 deletions
@@ -0,0 +1,23 @@
class Foo {
getter {
IO.print("getter")
}
setter = value {
IO.print("setter")
}
method(a) {
IO.print("method")
}
}
class Bar is Foo {
test {
getter // expect: getter
setter = "value" // expect: setter
method("arg") // expect: method
}
}
(new Bar).test
@@ -0,0 +1,23 @@
class Foo {
getter {
IO.print("getter")
}
setter = value {
IO.print("setter")
}
method(a) {
IO.print("method")
}
test {
getter // expect: getter
setter = "value" // expect: setter
method("arg") // expect: method
}
}
(new Foo).test
// TODO: Need to decide how these interact with globals.
@@ -0,0 +1,17 @@
class Foo {
bar { return "getter" }
test {
IO.print(bar) // expect: getter
{
IO.print(bar) // expect: getter
var bar = "local"
IO.print(bar) // expect: local
}
IO.print(bar) // expect: getter
}
}
(new Foo).test
@@ -0,0 +1,20 @@
class Foo {
bar = value {
IO.print("setter")
return value
}
test {
bar = "value" // expect: setter
{
bar = "value" // expect: setter
var bar = "local"
bar = "value" // no expectation
}
bar = "value" // expect: setter
}
}
(new Foo).test
+47
View File
@@ -0,0 +1,47 @@
class Outer {
getter {
IO.print("outer getter")
}
setter = value {
IO.print("outer setter")
}
method(a) {
IO.print("outer method")
}
test {
getter // expect: outer getter
setter = "value" // expect: outer setter
method("arg") // expect: outer method
class Inner {
getter {
IO.print("inner getter")
}
setter = value {
IO.print("inner setter")
}
method(a) {
IO.print("inner method")
}
test {
getter // expect: inner getter
setter = "value" // expect: inner setter
method("arg") // expect: inner method
}
}
(new Inner).test
getter // expect: outer getter
setter = "value" // expect: outer setter
method("arg") // expect: outer method
}
}
(new Outer).test
@@ -0,0 +1,21 @@
class Foo {
static getter {
IO.print("getter")
}
static setter = value {
IO.print("setter")
}
static method(a) {
IO.print("method")
}
static test {
getter // expect: getter
setter = "value" // expect: setter
method("arg") // expect: method
}
}
Foo.test