aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/TypeOps.scala
diff options
context:
space:
mode:
authorGuillaume Martres <smarter@ubuntu.com>2016-01-23 22:45:24 +0100
committerGuillaume Martres <smarter@ubuntu.com>2016-01-23 22:45:24 +0100
commite9105c96253ae62cecb63e39764583f826876159 (patch)
tree10a1adc591d6cddd22adc03dfd36995ee6c49fea /src/dotty/tools/dotc/core/TypeOps.scala
parent8ceaba796346d40a1be156d38b02de91854634cd (diff)
parenteb1197c87b212bd3b776ce9e24f550e80888e5e4 (diff)
downloaddotty-e9105c96253ae62cecb63e39764583f826876159.tar.gz
dotty-e9105c96253ae62cecb63e39764583f826876159.tar.bz2
dotty-e9105c96253ae62cecb63e39764583f826876159.zip
Merge pull request #1039 from dotty-staging/fix-#998
Fix #998
Diffstat (limited to 'src/dotty/tools/dotc/core/TypeOps.scala')
-rw-r--r--src/dotty/tools/dotc/core/TypeOps.scala25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/core/TypeOps.scala b/src/dotty/tools/dotc/core/TypeOps.scala
index 6896468ba..70e8302d9 100644
--- a/src/dotty/tools/dotc/core/TypeOps.scala
+++ b/src/dotty/tools/dotc/core/TypeOps.scala
@@ -269,9 +269,28 @@ trait TypeOps { this: Context => // TODO: Make standalone object.
if (ctx.featureEnabled(defn.LanguageModuleClass, nme.keepUnions)) tp
else tp match {
case tp: OrType =>
- val commonBaseClasses = tp.mapReduceOr(_.baseClasses)(intersect)
- val doms = dominators(commonBaseClasses, Nil)
- doms.map(tp.baseTypeWithArgs).reduceLeft(AndType.apply)
+ def isClassRef(tp: Type): Boolean = tp match {
+ case tp: TypeRef => tp.symbol.isClass
+ case tp: RefinedType => isClassRef(tp.parent)
+ case _ => false
+ }
+ def next(tp: TypeProxy) = tp.underlying match {
+ case TypeBounds(_, hi) => hi
+ case nx => nx
+ }
+ tp.tp1 match {
+ case tp1: TypeProxy if !isClassRef(tp1) =>
+ approximateUnion(next(tp1) | tp.tp2)
+ case _ =>
+ tp.tp2 match {
+ case tp2: TypeProxy if !isClassRef(tp2) =>
+ approximateUnion(tp.tp1 | next(tp2))
+ case _ =>
+ val commonBaseClasses = tp.mapReduceOr(_.baseClasses)(intersect)
+ val doms = dominators(commonBaseClasses, Nil)
+ doms.map(tp.baseTypeWithArgs).reduceLeft(AndType.apply)
+ }
+ }
case tp @ AndType(tp1, tp2) =>
tp derived_& (approximateUnion(tp1), approximateUnion(tp2))
case tp: RefinedType =>