Use descriptors for reflection on class properties

- use ConcurrentHashMap as a cache of class loaders to module descriptors
- KClassImpl now has a lazy class descriptor and it manages property creation
  by looking (also lazily) for the property descriptor in the corresponding
  scope
- since deserialized descriptors have full information about where a JVM symbol
  is located and what signature it has, new tests will begin to pass where
  Kotlin model and Java reflection model differ, see classObjectVar.kt
This commit is contained in:
Alexander Udalov
2015-02-19 17:27:58 +03:00
parent ba0ea1515b
commit 64fdb18ad3
11 changed files with 409 additions and 73 deletions
@@ -0,0 +1,15 @@
class A {
default object B {
var state: String = "12345"
}
}
fun box(): String {
val p = A.B::state
if (p.name != "state") return "Fail state: ${p.name}"
if (p.get(A.B) != "12345") return "Fail value: ${p.get(A.B)}"
p.set(A.B, "OK")
return p[A.B]
}
@@ -741,6 +741,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxWithStdlib/callableReference/property"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("classObjectVar.kt")
public void testClassObjectVar() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/property/classObjectVar.kt");
doTestWithStdlib(fileName);
}
@TestMetadata("delegated.kt")
public void testDelegated() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/property/delegated.kt");