diff options
author | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-08-06 06:40:44 -0700 |
---|---|---|
committer | Josh Suereth <Joshua.Suereth@gmail.com> | 2012-08-06 06:40:44 -0700 |
commit | ba402c457aecf7d94038534775b7b063d7d5bd9e (patch) | |
tree | ee45e6ca9b9dac6eb4e8b014e667dea6a0ca246b | |
parent | a05a68a9894f78fc8d7423c722e516a7ee49d559 (diff) | |
parent | ce4bcb536279d97617f85da3f66b5296c6ee2b96 (diff) | |
download | scala-ba402c457aecf7d94038534775b7b063d7d5bd9e.tar.gz scala-ba402c457aecf7d94038534775b7b063d7d5bd9e.tar.bz2 scala-ba402c457aecf7d94038534775b7b063d7d5bd9e.zip |
Merge pull request #1045 from scalamacros/ticket/6175
SI-6175 reflect over classes with symbolic names
-rw-r--r-- | src/reflect/scala/reflect/runtime/JavaMirrors.scala | 11 | ||||
-rw-r--r-- | test/files/run/t6175.scala | 5 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/runtime/JavaMirrors.scala b/src/reflect/scala/reflect/runtime/JavaMirrors.scala index 64c47a5502..5eb7770de6 100644 --- a/src/reflect/scala/reflect/runtime/JavaMirrors.scala +++ b/src/reflect/scala/reflect/runtime/JavaMirrors.scala @@ -777,7 +777,16 @@ trait JavaMirrors extends internal.SymbolTable with api.JavaUniverse { self: Sym lookupClass else if (jclazz.isLocalClass0 || isInvalidClassName(jname)) // local classes and implementation classes not preserved by unpickling - treat as Java - jclassAsScala(jclazz) + // + // upd. but only if they cannot be loaded as top-level classes + // otherwise we may mistake mangled symbolic names for mangled nested names + // + // in case when a Java binary name can be treated both as a top-level class and as a nested class + // (as described in http://groups.google.com/group/scala-internals/browse_thread/thread/10855403bbf04298) + // we check for a top-level class first + // this is totally correct, because a top-level class and a nested class with the same name cannot coexist + // so it's either one or another, but not both - therefore we always load $-bearing classes correctly + lookupClass orElse jclassAsScala(jclazz) else if (jclazz.isArray) ArrayClass else diff --git a/test/files/run/t6175.scala b/test/files/run/t6175.scala new file mode 100644 index 0000000000..69a0a712b6 --- /dev/null +++ b/test/files/run/t6175.scala @@ -0,0 +1,5 @@ +object Test extends App { + import reflect.runtime._ + val m = universe.typeOf[List[_]].members.head.asMethod + currentMirror.reflect (List (2, 3, 1)).reflectMethod(m) +}
\ No newline at end of file |