diff options
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala | 10 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/Trees.scala | 13 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/matching/PatternMatchers.scala | 22 |
3 files changed, 33 insertions, 12 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala b/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala index e645bf1ff1..d176d4ad82 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala @@ -37,16 +37,6 @@ abstract class TreeBrowsers { import global._ import nme.EMPTY - /** Pseudo tree class, so that all JTree nodes are treated uniformly */ - case class ProgramTree(units: List[UnitTree]) extends Tree { - override def toString(): String = "Program" - } - - /** Pseudo tree class, so that all JTree nodes are treated uniformly */ - case class UnitTree(unit: CompilationUnit) extends Tree { - override def toString(): String = unit.toString() - } - def create(): SwingBrowser = new SwingBrowser(); /** diff --git a/src/compiler/scala/tools/nsc/ast/Trees.scala b/src/compiler/scala/tools/nsc/ast/Trees.scala index 230665f96e..69dd2a2bd1 100644 --- a/src/compiler/scala/tools/nsc/ast/Trees.scala +++ b/src/compiler/scala/tools/nsc/ast/Trees.scala @@ -57,7 +57,7 @@ trait Trees requires Global { val NoMods = Modifiers(0) - abstract class Tree { + sealed abstract class Tree { { import util.Statistics if (Statistics.enabled) nodeCount = nodeCount + 1 @@ -139,6 +139,17 @@ trait Trees requires Global { } } + // bq: I moved this classes here from TreeBrowsers, otherwise cannot used *sealed* optimization + /** Pseudo tree class, so that all JTree nodes are treated uniformly */ + case class ProgramTree(units: List[UnitTree]) extends Tree { + override def toString(): String = "Program" + } + + /** Pseudo tree class, so that all JTree nodes are treated uniformly */ + case class UnitTree(unit: CompilationUnit) extends Tree { + override def toString(): String = unit.toString() + } + trait SymTree extends Tree { override def hasSymbol = true override var symbol: Symbol = NoSymbol diff --git a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala index 8428423fd7..d318e79fcb 100644 --- a/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala +++ b/src/compiler/scala/tools/nsc/matching/PatternMatchers.scala @@ -1061,6 +1061,14 @@ print() if (null == next) 1 else (next.length() + 1) } + final private def inheritsFromSealed(tpe:Type): Boolean = { + val it = tpe.baseClasses.elements + while(it.hasNext) { + if(it.next.isSealed) return true + } + return false + } + protected def toOptTree(node1: PatternNode, selector: Tree): Tree = { def insert2(tag: Int, node: PatternNode, current: TagNodePair): TagNodePair = { if (current eq null) @@ -1124,6 +1132,12 @@ print() */ var nCases: List[CaseDef] = Nil while (cases ne null) { + if(inheritsFromSealed(cases.node.tpe)) { + val t = toTree_refined(cases.node, selector, true) + //Console.println("optimize this"+t+" from this "+cases.node) + nCases = CaseDef(Literal(Constant(cases.tag)), + t) :: nCases; + } else nCases = CaseDef(Literal(Constant(cases.tag)), toTree(cases.node, selector)) :: nCases; cases = cases.next @@ -1152,6 +1166,10 @@ print() Or(And(cond, thenp), elsep) protected def toTree(node: PatternNode, selector:Tree): Tree = { + toTree_refined(node, selector, false) + } + + protected def toTree_refined(node: PatternNode, selector:Tree, ignoreSelectorType: Boolean): Tree = { //Konsole.println("pm.toTree("+node+","+selector+") selector.tpe = "+selector.tpe+")") if (selector.tpe eq null) scala.Predef.error("cannot go on") @@ -1184,7 +1202,9 @@ print() if(isSubType(selector.tpe,ntpe) && isSubType(ntpe, definitions.AnyRefClass.tpe)) { cond = NotNull(selector.duplicate) nstatic = nstatic + 1 - } else { + } else if(ignoreSelectorType) { + cond = Literal(Constant(true)) + } else { cond = typed { gen.mkIsInstanceOf(selector.duplicate, ntpe) } } // compare outer instance for patterns like foo1.Bar foo2.Bar if not statically known to match |