aboutsummaryrefslogtreecommitdiff
path: root/library
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
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')
-rw-r--r--library/src/scala/Projector.scala10
-rw-r--r--library/src/scala/Selectable.scala8
-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)
+ }
+}