diff options
author | Paul Phillips <paulp@improving.org> | 2012-07-06 12:48:52 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-07-06 14:20:15 -0700 |
commit | 724b0dc71f1f8f91b995d01e9e027789f54ecdfe (patch) | |
tree | 5155c036949eb43d5bbb661bbbc5d18ffe3cc987 /test/files/neg | |
parent | c632aaca8bdf1dc7c8eac24f5dd0acb18b4683b6 (diff) | |
download | scala-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 'test/files/neg')
-rw-r--r-- | test/files/neg/reflection-names-neg.check | 10 | ||||
-rw-r--r-- | test/files/neg/reflection-names-neg.scala | 6 |
2 files changed, 16 insertions, 0 deletions
diff --git a/test/files/neg/reflection-names-neg.check b/test/files/neg/reflection-names-neg.check new file mode 100644 index 0000000000..a56a19e7fd --- /dev/null +++ b/test/files/neg/reflection-names-neg.check @@ -0,0 +1,10 @@ +reflection-names-neg.scala:5: error: type mismatch; + found : String("abc") + required: reflect.runtime.universe.Name +Note that implicit conversions are not applicable because they are ambiguous: + both method stringToTermName in trait Names of type (s: String)reflect.runtime.universe.TermName + and method stringToTypeName in trait Names of type (s: String)reflect.runtime.universe.TypeName + are possible conversion functions from String("abc") to reflect.runtime.universe.Name + val x2 = ("abc": Name) drop 1 // error + ^ +one error found diff --git a/test/files/neg/reflection-names-neg.scala b/test/files/neg/reflection-names-neg.scala new file mode 100644 index 0000000000..7283d16db9 --- /dev/null +++ b/test/files/neg/reflection-names-neg.scala @@ -0,0 +1,6 @@ +import scala.reflect.runtime.universe._ + +object Test { + val x1 = "abc" drop 1 // "bc": String + val x2 = ("abc": Name) drop 1 // error +} |