diff options
author | Paul Phillips <paulp@improving.org> | 2012-08-09 14:10:22 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-08-09 14:32:51 -0700 |
commit | eb2375cc5327293c708226e78f80a97cc780a12f (patch) | |
tree | 61a10ec88c12546ccf44dbe653fec42a8429d203 /src/scalap | |
parent | c0d5f0aaddc7bc309f84afd5d4f4b5c136c65816 (diff) | |
download | scala-eb2375cc5327293c708226e78f80a97cc780a12f.tar.gz scala-eb2375cc5327293c708226e78f80a97cc780a12f.tar.bz2 scala-eb2375cc5327293c708226e78f80a97cc780a12f.zip |
Warn when Any or AnyVal is inferred.
For the very small price of annotating types as Any/AnyVal in those
cases where we wish to use them, we can obtain useful warnings.
I made trunk clean against this warning and found several bugs
or at least suboptimalities in the process.
I put the warning behind -Xlint for the moment, but I think this
belongs on by default, even for this alone:
scala> List(1, 2, 3) contains "a"
<console>:8: warning: a type was inferred to be `Any`; this may indicate a programming error.
List(1, 2, 3) contains "a"
^
res0: Boolean = false
Or this punishment meted out by SI-4042:
scala> 1l to 5l contains 5
<console>:8: warning: a type was inferred to be `AnyVal`; this may indicate a programming error.
1l to 5l contains 5
^
res0: Boolean = false
A different situation where this arises, which I have seen variations
of many times:
scala> class A[T](default: T) {
def get(x: => Option[T]) = x getOrElse Some(default)
}
<console>:7: warning: a type was inferred to be `Any`; this may indicate a programming error.
class A[T](default: T) { def get(x: => Option[T]) = x getOrElse Some(default) }
^
// Oops, this was what I meant
scala> class A[T](default: T) {
def get(x: => Option[T]) = x getOrElse default
}
defined class A
Harder to avoid spurious warnings when "Object" is inferred.
Diffstat (limited to 'src/scalap')
-rw-r--r-- | src/scalap/scala/tools/scalap/scalax/rules/Rule.scala | 2 | ||||
-rw-r--r-- | src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/Rule.scala b/src/scalap/scala/tools/scalap/scalax/rules/Rule.scala index 1500b81050..489a05ecd0 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/Rule.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/Rule.scala @@ -50,7 +50,7 @@ trait Rule[-In, +Out, +A, +X] extends (In => Result[Out, A, X]) { lazy val choices = Rule.this :: other :: Nil } - def orError[In2 <: In] = this orElse(error[In2]) + def orError[In2 <: In] = this orElse error[Any] def |[In2 <: In, Out2 >: Out, A2 >: A, X2 >: X](other : => Rule[In2, Out2, A2, X2]) = orElse(other) diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala index e88efa1bfd..7d06a7169b 100644 --- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala +++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala @@ -167,7 +167,7 @@ object ScalaSigEntryParsers extends RulesWithState with MemoisableRules { val symbolInfo = nameRef ~ symbolRef ~ nat ~ (symbolRef?) ~ ref ~ get ^~~~~~^ SymbolInfo - def symHeader(key: Int) = (key -~ none | (key + 64) -~ nat) + def symHeader(key: Int): EntryParser[Any] = (key -~ none | (key + 64) -~ nat) def symbolEntry(key : Int) = symHeader(key) -~ symbolInfo @@ -263,7 +263,7 @@ object ScalaSigEntryParsers extends RulesWithState with MemoisableRules { 47 -~ typeLevel ~ typeIndex ^~^ DeBruijnIndexType, 48 -~ typeRef ~ (symbolRef*) ^~^ ExistentialType) as "type" - lazy val literal = oneOf( + lazy val literal: EntryParser[Any] = oneOf( 24 -^ (()), 25 -~ longValue ^^ (_ != 0L), 26 -~ longValue ^^ (_.toByte), |