From f7a989f23a40541d6f2b6de88dca3c55e6d7376f Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Tue, 30 May 2006 10:47:58 +0000 Subject: fixed bugs615 and 617 --- .../scala/tools/nsc/ast/parser/TreeBuilder.scala | 32 +++++++++++++--------- src/compiler/scala/tools/nsc/symtab/Scopes.scala | 3 ++ src/compiler/scala/tools/nsc/symtab/Types.scala | 5 ++-- .../scala/tools/nsc/transform/AddInterfaces.scala | 5 ++-- 4 files changed, 28 insertions(+), 17 deletions(-) (limited to 'src/compiler') diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala index db8b695b39..f53ba1b365 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala @@ -52,20 +52,26 @@ abstract class TreeBuilder { } } - /** Traverse pattern and collect all variable names in buffer */ + /** Traverse pattern and collect all variable names with their types in buffer */ private object getvarTraverser extends Traverser { - val buf = new ListBuffer[Name]; + val buf = new ListBuffer[Pair[Name, Tree]]; def init: Traverser = { buf.clear; this } override def traverse(tree: Tree): unit = tree match { - case Bind(name, tpe) => - if ((name != nme.WILDCARD) && (buf.elements forall (name !=))) buf += name; - traverse(tpe) - case _ => super.traverse(tree) + case Bind(name, Typed(tree1, tpt)) => + if ((name != nme.WILDCARD) && (buf.elements forall (name !=))) + buf += Pair(name, tpt) + traverse(tree1) + case Bind(name, tree1) => + if ((name != nme.WILDCARD) && (buf.elements forall (name !=))) + buf += Pair(name, TypeTree()) + traverse(tree1) + case _ => + super.traverse(tree) } } - /** Returns list of all pattern variables without duplicates */ - private def getVariables(tree: Tree): List[Name] = { + /** Returns list of all pattern variables, possibly with their types, without duplicates */ + private def getVariables(tree: Tree): List[Pair[Name, Tree]] = { getvarTraverser.init.traverse(tree); getvarTraverser.buf.toList } @@ -355,20 +361,20 @@ abstract class TreeBuilder { val pat1 = patvarTransformer.transform(pat); val vars = getVariables(pat1); val matchExpr = atPos(pat1.pos){ - Match(rhs, List(CaseDef(pat1, EmptyTree, makeTupleTerm(vars map Ident)))) + Match(rhs, List(CaseDef(pat1, EmptyTree, makeTupleTerm(vars map (._1) map Ident)))) } vars match { case List() => List(matchExpr) - case List(vname) => - List(ValDef(mods, vname, TypeTree(), matchExpr)) + case List(Pair(vname, tpt)) => + List(ValDef(mods, vname, tpt, matchExpr)) case _ => val tmp = freshName(); val firstDef = ValDef(Modifiers(PRIVATE | LOCAL | SYNTHETIC), tmp, TypeTree(), matchExpr); var cnt = 0; - val restDefs = for (val v <- vars) yield { + val restDefs = for (val Pair(vname, tpt) <- vars) yield { cnt = cnt + 1; - ValDef(mods, v, TypeTree(), Select(Ident(tmp), newTermName("_" + cnt))) + ValDef(mods, vname, tpt, Select(Ident(tmp), newTermName("_" + cnt))) } firstDef :: restDefs } diff --git a/src/compiler/scala/tools/nsc/symtab/Scopes.scala b/src/compiler/scala/tools/nsc/symtab/Scopes.scala index a0f577c9a5..fd002c1f86 100644 --- a/src/compiler/scala/tools/nsc/symtab/Scopes.scala +++ b/src/compiler/scala/tools/nsc/symtab/Scopes.scala @@ -215,6 +215,9 @@ trait Scopes requires SymbolTable { */ def elements: Iterator[Symbol] = toList.elements; + def filter(p: Symbol => boolean): Scope = + if (!(toList forall p)) new Scope(toList filter p) else this + def mkString(start: String, sep: String, end: String) = toList.map(.defString).mkString(start, sep, end); diff --git a/src/compiler/scala/tools/nsc/symtab/Types.scala b/src/compiler/scala/tools/nsc/symtab/Types.scala index a0691632b3..5f0daee90c 100644 --- a/src/compiler/scala/tools/nsc/symtab/Types.scala +++ b/src/compiler/scala/tools/nsc/symtab/Types.scala @@ -883,8 +883,9 @@ trait Types requires SymbolTable { if (isFunctionType(this)) return args.init.mkString("(", ", ", ")") + " => " + args.last; } - (pre.prefixString + sym.nameString + - (if (args.isEmpty) "" else args.mkString("[", ",", "]"))) + val str = (pre.prefixString + sym.nameString + + (if (args.isEmpty) "" else args.mkString("[", ",", "]"))) + if (sym.isModuleClass) "" else str } override def prefixString = diff --git a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala index 1e4be38767..a2dc990e67 100644 --- a/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala +++ b/src/compiler/scala/tools/nsc/transform/AddInterfaces.scala @@ -120,8 +120,9 @@ abstract class AddInterfaces extends InfoTransform { else if (clazz.isImplClass || clazz == ArrayClass) parents else parents map mixinToImplClass } - val decls1 = if (clazz hasFlag INTERFACE) new Scope(decls.toList filter isInterfaceMember) - else decls; + val decls1 = decls filter (sym => + if (clazz hasFlag INTERFACE) isInterfaceMember(sym) else (!sym.isType || sym.isClass)) + //if (!clazz.isPackageClass) System.out.println("Decls of "+clazz+" after explicitOuter = " + decls1);//DEBUG if ((parents1 eq parents) && (decls1 eq decls)) tp else ClassInfoType(parents1, decls1, clazz) -- cgit v1.2.3