scala/scala — pull request #2088 by retronym (2013-02-07 21:00:43+00:00)
Title: SI-6146 More accurate prefixes for sealed subtypes.

When analysing exhaustivity/reachability of type tests
and equality tests, the pattern matcher must construct
a set of sealed subtypes based on the prefix of the
static type of and the set of sealed descendent symbols
of that type.

Previously, it was using `memberType` for this purpose.
In simple cases, this is sufficient:

scala> class C { class I1; object O { class I2 } }; object D extends C
defined class C
defined module D

scala> typeOf[D.type] memberType typeOf[C#I1].typeSymbol
res0: u.Type = D.I1

But, as reported in this bug, it fails when there is an
additional level of nesting:

scala> typeOf[D.type] memberType typeOf[c.O.I2 forSome { val c: C }].typeSymbol
res5: u.Type = C.O.I2

This commit introduces `nestedMemberType`, which uses `memberType`
recursively up the prefix chain prefix chain.

scala> nestedMemberType(typeOf[c.O.I2 forSome { val c: C }].typeSymbol, typeOf[D.type], typeOf[C].typeSymbol)
res6: u.Type = D.O.Id

Review by @adriaanm + @odersky