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 | |
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')
-rw-r--r-- | library/src/scala/Projector.scala | 10 | ||||
-rw-r--r-- | library/src/scala/Selectable.scala | 8 | ||||
-rw-r--r-- | library/src/scala/reflect/Selectable.scala (renamed from library/src/scala/reflect/Projector.scala) | 18 |
3 files changed, 18 insertions, 18 deletions
diff --git a/library/src/scala/Projector.scala b/library/src/scala/Projector.scala deleted file mode 100644 index cff73f84d..000000000 --- a/library/src/scala/Projector.scala +++ /dev/null @@ -1,10 +0,0 @@ -package scala -import scala.reflect.ClassTag -import scala.annotation.implicitNotFound - -@implicitNotFound("no projector instance found to implement reflective access to structural type ${T}") -trait Projector[-T] extends Any { - def get(receiver: T, name: String): Any - def getMethod(receiver: T, name: String, paramClasses: ClassTag[_]*): Any = - new UnsupportedOperationException("getMethod") -} diff --git a/library/src/scala/Selectable.scala b/library/src/scala/Selectable.scala new file mode 100644 index 000000000..c5c714ca9 --- /dev/null +++ b/library/src/scala/Selectable.scala @@ -0,0 +1,8 @@ +package scala +import scala.reflect.ClassTag + +trait Selectable extends Any { + def selectDynamic(name: String): Any + def selectDynamicMethod(name: String, paramClasses: ClassTag[_]*): Any = + new UnsupportedOperationException("selectDynamicMethod") +} 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) + } +} |