summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/StdNames.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-07-06 12:48:52 -0700
committerPaul Phillips <paulp@improving.org>2012-07-06 14:20:15 -0700
commit724b0dc71f1f8f91b995d01e9e027789f54ecdfe (patch)
tree5155c036949eb43d5bbb661bbbc5d18ffe3cc987 /src/reflect/scala/reflect/internal/StdNames.scala
parentc632aaca8bdf1dc7c8eac24f5dd0acb18b4683b6 (diff)
downloadscala-724b0dc71f1f8f91b995d01e9e027789f54ecdfe.tar.gz
scala-724b0dc71f1f8f91b995d01e9e027789f54ecdfe.tar.bz2
scala-724b0dc71f1f8f91b995d01e9e027789f54ecdfe.zip
Implicits to encourage more Name-dropping.
This creates implicits in cakes across the land from: String => TermName String => TypeName And also from: Name => NameOps[Name] // lower priority TermName => NameOps[TermName] TypeName => NameOps[TypeName] What this is all about, using "drop" as a motivating example, is that these should all work: "abc" drop 1 // "bc": String ("abc": TermName) drop 1 // "bc": TermName ("abc": TypeName) drop 1 // "bc": TypeName (("abc": TypeName): Name) drop 1 // "bc": Name But this should not: ("bc": Name) // ambiguity error This requires drop not being directly on Name; peer implicits from String => TermName and String => TypeName; implicit classes to install drop on TermName and TypeName; and a lower priority implicit class to allow ops on Names. Review by @xeno.by .
Diffstat (limited to 'src/reflect/scala/reflect/internal/StdNames.scala')
-rw-r--r--src/reflect/scala/reflect/internal/StdNames.scala7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala
index 72a99589d5..4070ad83c6 100644
--- a/src/reflect/scala/reflect/internal/StdNames.scala
+++ b/src/reflect/scala/reflect/internal/StdNames.scala
@@ -84,6 +84,9 @@ trait StdNames {
abstract class CommonNames extends NamesApi {
type NameType >: Null <: Name
+ // Masking some implicits so as to allow our targeted => NameType.
+ protected val stringToTermName = null
+ protected val stringToTypeName = null
protected implicit def createNameType(name: String): NameType
def flattenedName(segments: Name*): NameType =
@@ -963,7 +966,7 @@ trait StdNames {
case -1 => if (name == "") scala.Nil else scala.List(mkName(name, assumeTerm))
// otherwise, we can tell based on whether '#' or '.' is the following char.
case idx =>
- val (simple, div, rest) = (name take idx, name charAt idx, newTermName(name) drop (idx + 1))
+ val (simple, div, rest) = (name take idx, name charAt idx, name drop idx + 1)
mkName(simple, div == '.') :: segments(rest, assumeTerm)
}
}
@@ -1038,6 +1041,8 @@ trait StdNames {
}
abstract class SymbolNames {
+ protected val stringToTermName = null
+ protected val stringToTypeName = null
protected implicit def createNameType(s: String): TypeName = newTypeNameCached(s)
val BeanProperty : TypeName