summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-05-30 10:47:58 +0000
committerMartin Odersky <odersky@gmail.com>2006-05-30 10:47:58 +0000
commitf7a989f23a40541d6f2b6de88dca3c55e6d7376f (patch)
tree4c86eb89b85ebfebc0f458b3efbb68df668b68d7 /src/compiler
parent335de89b823ac04008aab6a05569d1097068e6cf (diff)
downloadscala-f7a989f23a40541d6f2b6de88dca3c55e6d7376f.tar.gz
scala-f7a989f23a40541d6f2b6de88dca3c55e6d7376f.tar.bz2
scala-f7a989f23a40541d6f2b6de88dca3c55e6d7376f.zip
fixed bugs615 and 617
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala32
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Scopes.scala3
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Types.scala5
-rw-r--r--src/compiler/scala/tools/nsc/transform/AddInterfaces.scala5
4 files changed, 28 insertions, 17 deletions
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) "<object "+str+">" 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)