From 4afd17d6d309ba1d64979ee9078edebc5d8e035e Mon Sep 17 00:00:00 2001 From: Paul Phillips Date: Tue, 5 Oct 2010 02:59:06 +0000 Subject: Massively simplified the exhaustiveness checker... Massively simplified the exhaustiveness checker with no measurable loss of fidelity. I might be the only one who can be unsurprised by such a bloody diff: anyone else would rightly say "how on earth..." No review. --- .../scala/tools/nsc/matching/MatrixAdditions.scala | 27 +++------------------- 1 file changed, 3 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala b/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala index fbfe00d2c1..e2d26abf1f 100644 --- a/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala +++ b/src/compiler/scala/tools/nsc/matching/MatrixAdditions.scala @@ -155,32 +155,11 @@ trait MatrixAdditions extends ast.TreeDSL import Flags.{ MUTABLE, ABSTRACT, SEALED, TRANS_FLAG } private case class Combo(index: Int, sym: Symbol) { + val isBaseClass = sym.tpe.baseClasses.toSet + // is this combination covered by the given pattern? def isCovered(p: Pattern) = { - def cmpSymbols(t1: Type, t2: Type) = t1.typeSymbol eq t2.typeSymbol - def coversSym = { - val tpe = decodedEqualsType(p.tpe) - lazy val lmoc = sym.companionModule - val symtpe = - if ((sym hasFlag Flags.MODULE) && (lmoc ne NoSymbol)) - singleType(sym.tpe.prefix, lmoc) // e.g. None, Nil - else sym.tpe - - /** Note to Martin should you come through this way: this - * logic looks way overcomplicated for the intention, but a little - * experimentation showed that at least most of it is serving - * some necessary purpose. It doesn't seem like much more than - * "sym.tpe matchesPattern tpe" ought to be necessary though. - * - * For the time being I tacked the matchesPattern test onto the - * end to address #3097. - */ - (tpe.typeSymbol == sym) || - (symtpe <:< tpe) || - (symtpe.parents exists (x => cmpSymbols(x, tpe))) || // e.g. Some[Int] <: Option[&b] - ((tpe.prefix memberType sym) <:< tpe) || // outer, see combinator.lexical.Scanner - (symtpe matchesPattern tpe) - } + def coversSym = isBaseClass(decodedEqualsType(p.tpe).typeSymbol) cond(p.tree) { case _: UnApply | _: ArrayValue => true -- cgit v1.2.3