summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeBrowsers.scala10
-rw-r--r--src/compiler/scala/tools/nsc/ast/Trees.scala13
-rw-r--r--src/compiler/scala/tools/nsc/matching/PatternMatchers.scala22
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