diff options
author | Paul Phillips <paulp@improving.org> | 2011-09-26 23:49:03 +0000 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2011-09-26 23:49:03 +0000 |
commit | e412524fee20da975954c929893e88db17dbdd9a (patch) | |
tree | e7c491b8d303879b49426d98f714d81c672d885f /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | 660d80f682317eaf3d55a9b63bb95396ac417cdd (diff) | |
download | scala-e412524fee20da975954c929893e88db17dbdd9a.tar.gz scala-e412524fee20da975954c929893e88db17dbdd9a.tar.bz2 scala-e412524fee20da975954c929893e88db17dbdd9a.zip |
ProductN, and method synthesis toolbox.
- Finished giving case classes a ProductN parent, and flipped it on. The
"finish" part involved not breaking existing code where case classes
manually extend the appropriate ProductN. (Like, Tuple 1-22.)
- Generalized most of SyntheticMethods to ease method creation and class
manipulation in general.
- Fixed bugs related to the above, like the fact that this used to be a
compile error:
scala> case class Foo() extends Serializable
<console>:28: error: trait Serializable is inherited twice
case class Foo() extends Serializable
^
It feels like there's a better way to eliminate the duplicate parents,
but after spending a lot of time chasing my tail in that peril-fraught
zone between namer and typer, I don't see an easy path to improve on
it. Closes SI-1799. For that modification to Typers, review by odersky.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index d1ba2df815..1c8b2486c9 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1213,8 +1213,26 @@ trait Typers extends Modes with Adaptations { */ //Console.println("parents("+clazz") = "+supertpt :: mixins);//DEBUG - supertpt :: mixins mapConserve (tpt => checkNoEscaping.privates(clazz, tpt)) - } catch { + + // Certain parents are added in the parser before it is known whether + // that class also declared them as parents. For instance, this is an + // error unless we take corrective action here: + // + // case class Foo() extends Serializable + // + // So we strip the duplicates before typer. + def fixDuplicates(remaining: List[Tree]): List[Tree] = remaining match { + case Nil => Nil + case x :: xs => + val sym = x.symbol + x :: fixDuplicates( + if (isPossibleSyntheticParent(sym)) xs filterNot (_.symbol == sym) + else xs + ) + } + fixDuplicates(supertpt :: mixins) mapConserve (tpt => checkNoEscaping.privates(clazz, tpt)) + } + catch { case ex: TypeError => templ.tpe = null reportTypeError(templ.pos, ex) |