diff options
author | Martin Odersky <odersky@gmail.com> | 2006-05-30 10:47:58 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-05-30 10:47:58 +0000 |
commit | f7a989f23a40541d6f2b6de88dca3c55e6d7376f (patch) | |
tree | 4c86eb89b85ebfebc0f458b3efbb68df668b68d7 | |
parent | 335de89b823ac04008aab6a05569d1097068e6cf (diff) | |
download | scala-f7a989f23a40541d6f2b6de88dca3c55e6d7376f.tar.gz scala-f7a989f23a40541d6f2b6de88dca3c55e6d7376f.tar.bz2 scala-f7a989f23a40541d6f2b6de88dca3c55e6d7376f.zip |
fixed bugs615 and 617
-rw-r--r-- | src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala | 32 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Scopes.scala | 3 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/symtab/Types.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/AddInterfaces.scala | 5 | ||||
-rw-r--r-- | src/library/scala/runtime/ScalaRunTime.scala | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | test/files/neg/bug421.scala (renamed from test/pending/pos/bug421.scala) | 0 | ||||
-rwxr-xr-x | test/files/pos/bug319.scala | 21 | ||||
-rw-r--r-- | test/files/pos/bug607.scala | 11 | ||||
-rw-r--r-- | test/files/pos/bug615.scala | 11 | ||||
-rwxr-xr-x[-rw-r--r--] | test/files/run/bug429.scala (renamed from test/pending/run/bug429.scala) | 0 | ||||
-rwxr-xr-x[-rw-r--r--] | test/files/run/bug441.scala (renamed from test/pending/run/bug441.scala) | 0 |
11 files changed, 72 insertions, 18 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) diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala index b3ec5496d1..dfd79c84f8 100644 --- a/src/library/scala/runtime/ScalaRunTime.scala +++ b/src/library/scala/runtime/ScalaRunTime.scala @@ -90,7 +90,7 @@ object ScalaRunTime { def _equals(x: CaseClass, y: Any): Boolean = y match { case y1: CaseClass => - (x.getClass() eq y1.getClass()) && { + /*(x.getClass() eq y1.getClass() &&*/ { val arity = x.caseArity; var i = 0; while (i < arity && x.caseElement(i) == y1.caseElement(i)) diff --git a/test/pending/pos/bug421.scala b/test/files/neg/bug421.scala index 3e014b7500..3e014b7500 100644..100755 --- a/test/pending/pos/bug421.scala +++ b/test/files/neg/bug421.scala diff --git a/test/files/pos/bug319.scala b/test/files/pos/bug319.scala new file mode 100755 index 0000000000..eed25eb84c --- /dev/null +++ b/test/files/pos/bug319.scala @@ -0,0 +1,21 @@ +object test { + + trait A { type T; } + + trait B { type T; } + + /** def functor(x: A): B { type T = x.T } */ + abstract class functor() { + val arg: A; + val res: B { type T = arg.T } = + new B { type T = arg.T; }; + } + + val a = new A { type T = String }; + /** val b: B { type T = String } = functor(a) */ + val b: B { type T = String } = { + val tmp = new functor() { val arg = a }; + tmp.res + } + +} diff --git a/test/files/pos/bug607.scala b/test/files/pos/bug607.scala new file mode 100644 index 0000000000..42c3a15a85 --- /dev/null +++ b/test/files/pos/bug607.scala @@ -0,0 +1,11 @@ +object Test +{ + trait Foo { type T } + object FooX extends Foo { type T = X; trait X } + + def test(x : Foo { type T = FooX.X }) = {} + + def main(argv : Array[String]) : Unit = { + test(FooX) + } +} diff --git a/test/files/pos/bug615.scala b/test/files/pos/bug615.scala new file mode 100644 index 0000000000..8fefc952e0 --- /dev/null +++ b/test/files/pos/bug615.scala @@ -0,0 +1,11 @@ +object test { + abstract class Bar { + type T + def bar: Unit + } + new Bar { + type T = Int + def bar = () + }.bar +} + diff --git a/test/pending/run/bug429.scala b/test/files/run/bug429.scala index b2cc8128c0..b2cc8128c0 100644..100755 --- a/test/pending/run/bug429.scala +++ b/test/files/run/bug429.scala diff --git a/test/pending/run/bug441.scala b/test/files/run/bug441.scala index d90e872baa..d90e872baa 100644..100755 --- a/test/pending/run/bug441.scala +++ b/test/files/run/bug441.scala |