Write proper enclosingMethod/enclosingClass information to bytecode

This commit is contained in:
Mikhael Bogdanov
2013-02-11 17:16:46 +04:00
parent 1a54e42eb7
commit 1b2da6b558
8 changed files with 283 additions and 13 deletions
@@ -0,0 +1,36 @@
package foo;
import java.lang.Object;
class Foo {
class object { }
class InnerClass { }
class InnerObject { }
void foo(Foo f) {
class LocalClass {}
class LocalObject { }
}
Object objectLiteral = new Object() {
void objectLiteralFoo() { }
};
}
class PackageInnerObject { }
class FooPackage {
Object packageObjectLiteral = new Object() {
void objectLiteralFoo() { }
};
void packageMethod(Foo f) {
class PackageLocalClass {}
class PackageLocalObject {}
}
}
@@ -0,0 +1,34 @@
package foo;
class Foo {
class object {
fun objectFoo() { }
}
class InnerClass { }
object InnerObject { }
fun foo(f : Foo) {
class LocalClass {}
class LocalObject {}
}
val objectLiteral = object {
fun objectLiteralFoo() { }
}
}
object PackageInnerObject {
fun PackageInnerObjectFoo() { }
}
val packageObjectLiteral = object {
fun objectLiteralFoo() { }
}
fun packageMethod(f : Foo) {
class PackageLocalClass {}
class PackageLocalObject {}
}
@@ -0,0 +1,21 @@
class ClassObject {
void accessToClassObject() {
WithClassObject.object.$instance.foo();
WithClassObject.object.$instance.getValue();
WithClassObject.object.$instance.getValueWithGetter();
WithClassObject.object.$instance.getVariable();
WithClassObject.object.$instance.setVariable(0);
WithClassObject.object.$instance.getVariableWithAccessors();
WithClassObject.object.$instance.setVariableWithAccessors(0);
}
void accessToPackageObject() {
PackageInner.$instance.foo();
PackageInner.$instance.getValue();
}
void accessToInnerClass() {
new WithClassObject.MyInner().foo();
new WithClassObject.MyInner().getValue();
}
}
@@ -0,0 +1,25 @@
class WithClassObject {
class object {
fun foo() {}
val value: Int = 0
val valueWithGetter: Int
get() = 1
var variable: Int = 0
var variableWithAccessors: Int
get() = 0
set(v) {}
}
class MyInner {
fun foo() {}
val value: Int = 0
}
}
object PackageInner {
fun foo() {}
val value: Int = 0
}