aboutsummaryrefslogtreecommitdiff
path: root/library/src/scala/reflect
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-01-07 14:47:18 +0700
committerMartin Odersky <odersky@gmail.com>2017-01-07 14:47:18 +0700
commit69feaa89167ebeb708535dd4abf3a79a410130f0 (patch)
treeec93cdc0b05ccb22628ca9dee454e33e4df3e8ee /library/src/scala/reflect
parent7e3f69ace983adfbc9bbf44954f9a5845add3d43 (diff)
downloaddotty-69feaa89167ebeb708535dd4abf3a79a410130f0.tar.gz
dotty-69feaa89167ebeb708535dd4abf3a79a410130f0.tar.bz2
dotty-69feaa89167ebeb708535dd4abf3a79a410130f0.zip
Change scheme to use Selectable
Use base types instead of implicits. This is more robust in the presence of type abstraction.
Diffstat (limited to 'library/src/scala/reflect')
-rw-r--r--library/src/scala/reflect/Selectable.scala (renamed from library/src/scala/reflect/Projector.scala)18
1 files changed, 10 insertions, 8 deletions
diff --git a/library/src/scala/reflect/Projector.scala b/library/src/scala/reflect/Selectable.scala
index b5732ee17..0dbdbc293 100644
--- a/library/src/scala/reflect/Projector.scala
+++ b/library/src/scala/reflect/Selectable.scala
@@ -1,8 +1,7 @@
package scala.reflect
-class Projector extends scala.Projector[Any] {
- import Projector._
- def get(receiver: Any, name: String): Any = {
+class Selectable(val receiver: Any) extends AnyVal with scala.Selectable {
+ def selectDynamic(name: String): Any = {
val rcls = receiver.getClass
try {
val fld = rcls.getField(name)
@@ -10,11 +9,11 @@ class Projector extends scala.Projector[Any] {
}
catch {
case ex: NoSuchFieldError =>
- getMethod(receiver, name).asInstanceOf[() => Any]()
+ selectDynamicMethod(name).asInstanceOf[() => Any]()
}
}
- override def getMethod(receiver: Any, name: String, paramTypes: ClassTag[_]*): Any = {
+ override def selectDynamicMethod(name: String, paramTypes: ClassTag[_]*): Any = {
val rcls = receiver.getClass
val paramClasses = paramTypes.map(_.runtimeClass)
val mth = rcls.getMethod(name, paramClasses: _*)
@@ -66,6 +65,9 @@ class Projector extends scala.Projector[Any] {
}
}
-object Projector {
- implicit val reflectiveProjector: scala.Projector[Any] = new Projector
-} \ No newline at end of file
+object Selectable {
+ implicit def reflectiveSelectable(receiver: Any): scala.Selectable = receiver match {
+ case receiver: scala.Selectable => receiver
+ case _ => new Selectable(receiver)
+ }
+}