Skip to content

Commit 3ba3b39

Browse files
author
amin
committed
Changed reflection to allow getting a Scala Sym...
Changed reflection to allow getting a Scala Symbol for the implementation class of a trait.
1 parent 85e7755 commit 3ba3b39

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

src/compiler/scala/reflect/runtime/JavaToScala.scala

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
351351
* not available, wrapped from the Java reflection info.
352352
*/
353353
def classToScala(jclazz: jClass[_]): Symbol = classCache.toScala(jclazz) {
354-
if (jclazz.isMemberClass) {
354+
if (jclazz.isMemberClass && !nme.isImplClassName(jclazz.getName)) {
355355
val sym = sOwner(jclazz).info.decl(newTypeName(jclazz.getSimpleName))
356356
assert(sym.isType, sym+"/"+jclazz+"/"+sOwner(jclazz)+"/"+jclazz.getSimpleName)
357357
sym.asInstanceOf[ClassSymbol]
@@ -456,9 +456,11 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
456456
private def jclassAsScala(jclazz: jClass[_]): Symbol = jclassAsScala(jclazz, sOwner(jclazz))
457457

458458
private def jclassAsScala(jclazz: jClass[_], owner: Symbol): Symbol = {
459-
val clazz = owner.newClass(NoPosition, newTypeName(jclazz.getSimpleName))
459+
val name = newTypeName(jclazz.getSimpleName)
460+
val completer = (clazz: Symbol, module: Symbol) => new FromJavaClassCompleter(clazz, module, jclazz)
461+
val (clazz, module) = createClassModule(owner, name, completer)
460462
classCache enter (jclazz, clazz)
461-
clazz setInfo new FromJavaClassCompleter(clazz, NoSymbol, jclazz)
463+
clazz
462464
}
463465

464466
/**
@@ -523,4 +525,4 @@ trait JavaToScala extends ConversionUtil { self: SymbolTable =>
523525
}
524526
}
525527

526-
class ReflectError(msg: String) extends java.lang.Error(msg)
528+
class ReflectError(msg: String) extends java.lang.Error(msg)

test/files/run/reflection-implClass.scala

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,35 @@
44
* symbol for them should be created using fallback mechanism
55
* that exposes Java reflection information dressed up in
66
* a Scala symbol.
7-
**/
8-
object Test extends App {
7+
*/
8+
object Test extends App with Outer {
99
import scala.reflect.mirror
10-
val name = manifest[Foo].erasure.getName + "$class"
11-
val implClass = Class.forName(name)
12-
val symbol = mirror.classToSymbol(implClass)
13-
assert(symbol != mirror.NoSymbol)
10+
11+
assert(mirror.classToSymbol(manifest[Foo].erasure).info.decl(mirror.newTermName("bar")).info ==
12+
mirror.classToSymbol(manifest[Bar].erasure).info.decl(mirror.newTermName("foo")).info)
13+
14+
val s1 = implClass(manifest[Foo].erasure)
15+
assert(s1 != mirror.NoSymbol)
16+
assert(s1.info != mirror.NoType)
17+
assert(s1.companionModule.info != mirror.NoType)
18+
assert(s1.companionModule.info.decl(mirror.newTermName("bar")) != mirror.NoSymbol)
19+
val s2 = implClass(manifest[Bar].erasure)
20+
assert(s2 != mirror.NoSymbol)
21+
assert(s2.info != mirror.NoType)
22+
assert(s2.companionModule.info != mirror.NoType)
23+
assert(s2.companionModule.info.decl(mirror.newTermName("foo")) != mirror.NoSymbol)
24+
def implClass(clazz: Class[_]) = {
25+
val implClass = Class.forName(clazz.getName + "$class")
26+
mirror.classToSymbol(implClass)
27+
}
1428
}
1529

1630
trait Foo {
1731
def bar = 1
1832
}
33+
34+
trait Outer {
35+
trait Bar {
36+
def foo = 1
37+
}
38+
}

0 commit comments

Comments
 (0)