diff options
author | Martin Odersky <odersky@gmail.com> | 2017-01-07 14:47:18 +0700 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-01-07 14:47:18 +0700 |
commit | 69feaa89167ebeb708535dd4abf3a79a410130f0 (patch) | |
tree | ec93cdc0b05ccb22628ca9dee454e33e4df3e8ee /library/src/scala/reflect | |
parent | 7e3f69ace983adfbc9bbf44954f9a5845add3d43 (diff) | |
download | dotty-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) + } +} |