diff options
author | Paul Phillips <paulp@improving.org> | 2011-08-06 21:53:17 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-08-06 21:53:17 +0000 |
commit | 05382e2351e1ec6ebfbb50c4df12a2b1410a0b80 (patch) | |
tree | 4112795a3f5fa89fa47408a20526b88d57599c34 /src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala | |
parent | 990fa046e6bbe95d5def208b38fead77d2437f9f (diff) | |
download | scala-05382e2351e1ec6ebfbb50c4df12a2b1410a0b80.tar.gz scala-05382e2351e1ec6ebfbb50c4df12a2b1410a0b80.tar.bz2 scala-05382e2351e1ec6ebfbb50c4df12a2b1410a0b80.zip |
Improved structural type error messages, and ot...
Improved structural type error messages, and other error message related
boosts. Closes SI-4877, review by odersky.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala b/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala index 2c424d17d7..6e0e78e8e2 100644 --- a/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala +++ b/src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala @@ -212,6 +212,13 @@ trait TypeDiagnostics { else if (sym.variance == -1) "contravariant" else "invariant" + // I think this should definitely be on by default, but I need to + // play with it a bit longer. For now it's behind -Xlint. + def explainAlias(tp: Type) = ( + if (!settings.lint.value || (tp eq tp.normalize)) "" + else " (which expands to)\n " + tp.normalize + ) + /** Look through the base types of the found type for any which * might have been valid subtypes if given conformant type arguments. * Examine those for situations where the type error would have been @@ -286,12 +293,12 @@ trait TypeDiagnostics { "" // no elaborable variance situation found } - def foundReqMsg(found: Type, req: Type): String = { - (withDisambiguation(List(), found, req) { - ";\n found : " + found.toLongString + existentialContext(found) + - "\n required: " + req + existentialContext(req) - }) + explainVariance(found, req) - } + def foundReqMsg(found: Type, req: Type): String = ( + withDisambiguation(Nil, found, req)( + ";\n found : " + found.toLongString + existentialContext(found) + explainAlias(found) + + "\n required: " + req + existentialContext(req) + explainAlias(req) + ) + explainVariance(found, req) + ) case class TypeDiag(tp: Type, sym: Symbol) extends Ordered[TypeDiag] { // save the name because it will be mutated until it has been |