summaryrefslogtreecommitdiff
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
parent335de89b823ac04008aab6a05569d1097068e6cf (diff)
downloadscala-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.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
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala2
-rwxr-xr-x[-rw-r--r--]test/files/neg/bug421.scala (renamed from test/pending/pos/bug421.scala)0
-rwxr-xr-xtest/files/pos/bug319.scala21
-rw-r--r--test/files/pos/bug607.scala11
-rw-r--r--test/files/pos/bug615.scala11
-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