Permalink
Browse files

SI-5833 Fixes tail-of-Nil problem in RefinedType#normalizeImpl

RefinedType#normalizeImpl was checking to see if the flattened list of
parents had an empty tail then pulling the head if so. But if the list
was empty then boom. This fix makes it check if the whole list has
length 1 instead. Empty lists will flow through to the rest the logic
which has no problems with Nil.
  • Loading branch information...
1 parent 8d25d05 commit 057417236845b689f29c221037e1d06d2b6e43bb @JamesIry JamesIry committed Feb 4, 2013
Showing with 2 additions and 2 deletions.
  1. +2 −2 src/reflect/scala/reflect/internal/Types.scala
@@ -1800,7 +1800,7 @@ trait Types extends api.Types { self: SymbolTable =>
// TODO see comments around def intersectionType and def merge
def flatten(tps: List[Type]): List[Type] = tps flatMap { case RefinedType(parents, ds) if ds.isEmpty => flatten(parents) case tp => List(tp) }
val flattened = flatten(parents).distinct
- if (decls.isEmpty && flattened.tail.isEmpty) {
+ if (decls.isEmpty && hasLength(flattened, 1)) {
flattened.head
} else if (flattened != parents) {
refinedType(flattened, if (typeSymbol eq NoSymbol) NoSymbol else typeSymbol.owner, decls, NoPosition)
@@ -3542,7 +3542,7 @@ trait Types extends api.Types { self: SymbolTable =>
if (phase.erasedTypes)
if (parents.isEmpty) ObjectClass.tpe else parents.head
else {
- val clazz = owner.newRefinementClass(pos) // TODO: why were we passing in NoPosition instead of pos?
+ val clazz = owner.newRefinementClass(pos)
val result = RefinedType(parents, decls, clazz)
clazz.setInfo(result)
result

0 comments on commit 0574172

Please sign in to comment.