summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Typers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-07-25 23:24:22 +0000
committerMartin Odersky <odersky@gmail.com>2007-07-25 23:24:22 +0000
commitedff72ec735a5dd249d0f752171d5e15419f4fd9 (patch)
treeab7a2219aaaf8d0ba4230a3425c175ec44a4b5a2 /src/compiler/scala/tools/nsc/typechecker/Typers.scala
parente517b3b183d2b16bbac3fbcbfff38697e0aba31e (diff)
downloadscala-edff72ec735a5dd249d0f752171d5e15419f4fd9.tar.gz
scala-edff72ec735a5dd249d0f752171d5e15419f4fd9.tar.bz2
scala-edff72ec735a5dd249d0f752171d5e15419f4fd9.zip
fixed bugs 1242, 1236, 1210
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index e054f41900..20797b87b8 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -679,9 +679,8 @@ trait Typers { self: Analyzer =>
}
} else if ((mode & (PATTERNmode | FUNmode)) == (PATTERNmode | FUNmode)) { // (5)
val constr = tree.symbol.filter(_.isCaseFactory)
- if (constr != NoSymbol) {
- val clazz = constr.tpe.finalResultType.typeSymbol
- assert(clazz hasFlag CASE, tree)
+ val clazz = constr.tpe.finalResultType.typeSymbol
+ if ((constr != NoSymbol) && (clazz hasFlag CASE)) {
val prefix = tree.tpe.finalResultType.prefix
val tree1 = TypeTree(clazz.primaryConstructor.tpe.asSeenFrom(prefix, clazz.owner)) setOriginal tree
try {
@@ -1809,12 +1808,24 @@ trait Typers { self: Analyzer =>
var localSyms = collection.immutable.Set[Symbol]()
var boundSyms = collection.immutable.Set[Symbol]()
var localInstances = collection.immutable.Map[SymInstance, Symbol]()
+ def isLocal(sym: Symbol): Boolean =
+ if (sym == NoSymbol) false
+ else if (owner == NoSymbol) tree exists (defines(_, sym))
+ else containsDef(owner, sym)
+ def containsLocal(tp: Type): Boolean =
+ tp exists (t => isLocal(t.typeSymbol) || isLocal(t.termSymbol))
+ val normalizeLocals = new TypeMap {
+ def apply(tp: Type): Type = tp match {
+ case TypeRef(pre, sym, args) =>
+ if (sym.isAliasType && containsLocal(tp)) apply(tp.normalize)
+ else mapOver(tp)
+ case _ =>
+ mapOver(tp)
+ }
+ }
// add all local symbols of `tp' to `localSyms'
// expanding higher-kinded types into individual copies for esach instance.
def addLocals(tp: Type) {
- def isLocal(sym: Symbol): Boolean =
- if (owner == NoSymbol) tree exists (defines(_, sym))
- else containsDef(owner, sym)
def addIfLocal(sym: Symbol, tp: Type) {
if (sym != NoSymbol && !sym.isRefinementClass && isLocal(sym) &&
!(localSyms contains sym) && !(boundSyms contains sym) ) {
@@ -1863,8 +1874,9 @@ trait Typers { self: Analyzer =>
case _ => mapOver(t)
}
}
- addLocals(tree.tpe)
- packSymbols(localSyms.toList ::: localInstances.values.toList, substLocals(tree.tpe))
+ val normalizedTpe = normalizeLocals(tree.tpe)
+ addLocals(normalizedTpe)
+ packSymbols(localSyms.toList ::: localInstances.values.toList, substLocals(normalizedTpe))
}
protected def typedExistentialTypeTree(tree: ExistentialTypeTree): Tree = {