diff options
202 files changed, 3468 insertions, 1382 deletions
@@ -285,12 +285,13 @@ TODO: <!-- so we don't have to wait for artifacts to synch to maven central (we don't distribute partest with Scala, so the risk of sonatype and maven being out of synch is irrelevant): --> - <!-- <artifact:remoteRepository refid="extra-repo"/> --> + <artifact:remoteRepository refid="extra-repo"/> <dependency groupId="org.scala-lang.modules" artifactId="scala-partest_${scala.binary.version}" version="${partest.version.number}" /> </artifact:dependencies> <copy-deps project="partest"/> <artifact:dependencies pathId="scalacheck.classpath" filesetId="scalacheck.fileset" versionsId="scalacheck.versions"> + <artifact:remoteRepository refid="extra-repo"/> <dependency groupId="org.scalacheck" artifactId="scalacheck_${scala.binary.version}" version="${scalacheck.version.number}" /> </artifact:dependencies> @@ -302,7 +303,7 @@ TODO: <!-- used by the test.osgi target to create osgi bundles for the xml, parser-combinator jars must specify sourcesFilesetId, javadocFilesetId to download these types of artifacts --> <artifact:dependencies pathId="external-modules.deps.classpath" sourcesFilesetId="external-modules.sources.fileset" javadocFilesetId="external-modules.javadoc.fileset"> - <!-- <artifact:remoteRepository refid="extra-repo"/> --> + <artifact:remoteRepository refid="extra-repo"/> <dependency groupId="org.scala-lang.modules" artifactId="scala-xml_${scala.binary.version}" version="${scala-xml.version.number}"/> <dependency groupId="org.scala-lang.modules" artifactId="scala-parser-combinators_${scala.binary.version}" version="${scala-parser-combinators.version.number}"/> </artifact:dependencies> @@ -920,9 +921,15 @@ TODO: Why, the compiler we're testing, of course, and partest with all its dependencies. --> <path id="partest.compilation.path"> + <path refid="partest.compilation.path.core"/> + <path refid="partest.compilation.path.noncore"/> + </path> + <path id="partest.compilation.path.core"> <pathelement location="${library.jar}"/> <pathelement location="${reflect.jar}"/> <pathelement location="${compiler.jar}"/> + </path> + <path id="partest.compilation.path.noncore"> <!-- TODO modularize compiler <pathelement location="${scaladoc.jar}"/> @@ -1892,6 +1899,17 @@ TODO: <testSuite colors="8" kinds="pos neg run jvm res scalap scalacheck specialized instrumented"/> </target> + <target name="test.suite.quick" depends="init, quick.done"> + <path id="test.suite.path"> + <path refid="quick.bin.tool.path"/> + <path refid="quick.interactive.build.path"/> + <path refid="partest.compilation.path.noncore"/> + </path> + <property name="pcp" value="${toString:test.suite.path}"/> + <taskdef classpathref="test.suite.path" resource="scala/tools/partest/antlib.xml"/> + <testSuite colors="8" kinds="pos neg run jvm res scalap scalacheck specialized instrumented" pcp="${pcp}"/> + </target> + <target name="test.run" depends="test.suite.init"> <testSuite kinds="run jvm"/> </target> diff --git a/docs/examples/fors.scala b/docs/examples/fors.scala index b937e53fcd..29616b61b1 100644 --- a/docs/examples/fors.scala +++ b/docs/examples/fors.scala @@ -83,7 +83,7 @@ object fors { if b1 != b2; Elem(_, "author", _, _, Text(a1)) <- b1.toList; Elem(_, "author", _, _, Text(a2)) <- b2.toList; - if a1 == a2) yield Pair(a1, a2)) + if a1 == a2) yield (a1, a2)) def removeDuplicates[a](xs: List[a]): List[a] = if (xs.isEmpty) diff --git a/docs/examples/iterators.scala b/docs/examples/iterators.scala index e2e5e050a0..9ddb141d61 100644 --- a/docs/examples/iterators.scala +++ b/docs/examples/iterators.scala @@ -15,8 +15,8 @@ object iterators { def findGreater(xs: Array[Double], limit: Double) = xs.iterator .zip(Iterator.from(0)) - .filter{case Pair(x, i) => x > limit } - .map{case Pair(x, i) => i} + .filter{case (x, i) => x > limit } + .map{case (x, i) => i} def main(args: Array[String]) { val ar = Array/*[Double]*/(6, 2, 8, 5, 1) diff --git a/docs/examples/jolib/Ref.scala b/docs/examples/jolib/Ref.scala index 32952b4351..099a3c2df2 100644 --- a/docs/examples/jolib/Ref.scala +++ b/docs/examples/jolib/Ref.scala @@ -12,20 +12,20 @@ import concurrent.SyncVar; import concurrent.jolib._; class Ref[a](init: a) extends Join { - + object get extends Synchr[a](this) { case class C() extends SyncVar[a]; } object set extends Synchr[unit](this) { case class C(x: a) extends SyncVar[unit]; } object state extends Asynchr(this) { case class C(x: a); } rules ( - Pair(List(get, state), { case List(g @ get.C(), state.C(x) ) => + (List(get, state), { case List(g @ get.C(), state.C(x) ) => { g.set(x); state(state.C(x)) } }), - Pair(List(set, state), { case List(s @ set.C(x), state.C(y) ) => + (List(set, state), { case List(s @ set.C(x), state.C(y) ) => { s.set(()); state(state.C(x)) } }) ); state(state.C(init)); - + def Get: a = get(get.C()); def Set(x: a): unit = set(set.C(x)); } diff --git a/docs/examples/jolib/parallelOr.scala b/docs/examples/jolib/parallelOr.scala index fb8288c5b2..a0305c56bf 100644 --- a/docs/examples/jolib/parallelOr.scala +++ b/docs/examples/jolib/parallelOr.scala @@ -13,27 +13,27 @@ import concurrent.SyncVar; /** Implementation in the join-calculus of a parallel OR. */ object or extends Join { - + object res extends Synchr[boolean](this) { case class C() extends SyncVar[boolean] }; object res1 extends Asynchr(this) { case class C(b: boolean); } object res2 extends Asynchr(this) { case class C(b: boolean); } object res1False extends Synchr[boolean](this) { case class C() extends SyncVar[boolean] }; object res2False extends Synchr[boolean](this) { case class C() extends SyncVar[boolean] }; - + rules( - Pair(List(res, res1), { case List(r @ res.C(), res1.C(b)) => + (List(res, res1), { case List(r @ res.C(), res1.C(b)) => if (b) r.set(b) else r.set(res1False(res1False.C())) }), - - Pair(List(res, res2), { case List(r @ res.C(), res2.C(b)) => + + (List(res, res2), { case List(r @ res.C(), res2.C(b)) => if (b) r.set(b) else r.set(res2False(res2False.C())) }), - - Pair(List(res1False, res2), { case List(r @ res1False.C(), res2.C(b)) => + + (List(res1False, res2), { case List(r @ res1False.C(), res2.C(b)) => r.set(b) }), - - Pair(List(res2False, res1), { case List(r @ res2False.C(), res1.C(b)) => + + (List(res2False, res1), { case List(r @ res2False.C(), res1.C(b)) => r.set(b) }) ); - + def apply(b1: => boolean, b2: => boolean): boolean = { concurrent.ops.spawn(res1(res1.C(b1))); concurrent.ops.spawn(res2(res2.C(b2))); @@ -42,7 +42,7 @@ object or extends Join { } */ object parallelOr { - + def main(args: Array[String]): unit = { def loop: boolean = { while (true) {}; true }; /* diff --git a/docs/examples/monads/callccInterpreter.scala b/docs/examples/monads/callccInterpreter.scala index 5b556bd8fa..b5008c4c1b 100644 --- a/docs/examples/monads/callccInterpreter.scala +++ b/docs/examples/monads/callccInterpreter.scala @@ -14,7 +14,7 @@ object callccInterpreter { def showM(m: M[Value]): String = (m in id).toString(); - def callCC[A](h: (A => M[A]) => M[A]) = + def callCC[A](h: (A => M[A]) => M[A]) = M[A](c => h(a => M[A](d => c(a))) in c); type Name = String; @@ -30,7 +30,7 @@ object callccInterpreter { trait Value; case object Wrong extends Value { override def toString() = "wrong" - } + } case class Num(n: Int) extends Value { override def toString() = n.toString(); } @@ -38,15 +38,15 @@ object callccInterpreter { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]]; + type Environment = List[Tuple2[Name, Value]]; def lookup(x: Name, e: Environment): M[Value] = e match { case List() => unitM(Wrong) - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value): M[Value] = Pair(a, b) match { - case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + def add(a: Value, b: Value): M[Value] = (a, b) match { + case (Num(m), Num(n)) => unitM(Num(m + n)) case _ => unitM(Wrong) } @@ -62,15 +62,15 @@ object callccInterpreter { b <- interp(r, e); c <- add(a, b)) yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) case App(f, t) => for (a <- interp(f, e); b <- interp(t, e); c <- apply(a, b)) yield c - case Ccc(x, t) => callCC(k => interp(t, Pair(x, Fun(k)) :: e)) + case Ccc(x, t) => callCC(k => interp(t, (x, Fun(k)) :: e)) } - def test(t: Term): String = + def test(t: Term): String = showM(interp(t, List())); val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11))); diff --git a/docs/examples/monads/directInterpreter.scala b/docs/examples/monads/directInterpreter.scala index 06fffba8e2..d8ca8ccfa7 100644 --- a/docs/examples/monads/directInterpreter.scala +++ b/docs/examples/monads/directInterpreter.scala @@ -20,15 +20,15 @@ object directInterpreter { case Fun(f) => "<function>" } - type Environment = List[Pair[Name, Value]]; + type Environment = List[Tuple2[Name, Value]]; def lookup(x: Name, e: Environment): Value = e match { case List() => Wrong - case Pair(y, b) :: e1 => if (x == y) b else lookup(x, e1) + case (y, b) :: e1 => if (x == y) b else lookup(x, e1) } - def add(a: Value, b: Value): Value = Pair(a, b) match { - case Pair(Num(m), Num(n)) => Num(m + n) + def add(a: Value, b: Value): Value = (a, b) match { + case (Num(m), Num(n)) => Num(m + n) case _ => Wrong } @@ -41,15 +41,15 @@ object directInterpreter { case Var(x) => lookup(x, e) case Con(n) => Num(n) case Add(l, r) => add(interp(l, e), interp(r, e)) - case Lam(x, t) => Fun(a => interp(t, Pair(x, a) :: e)) + case Lam(x, t) => Fun(a => interp(t, (x, a) :: e)) case App(f, t) => apply(interp(f, e), interp(t, e)) } - def test(t: Term): String = + def test(t: Term): String = showval(interp(t, List())); val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11))); - def main(args: Array[String]) = + def main(args: Array[String]) = System.out.println(test(term0)); } diff --git a/docs/examples/monads/errorInterpreter.scala b/docs/examples/monads/errorInterpreter.scala index d3cc45627d..c15e1041e2 100644 --- a/docs/examples/monads/errorInterpreter.scala +++ b/docs/examples/monads/errorInterpreter.scala @@ -41,15 +41,15 @@ object errorInterpreter { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]] + type Environment = List[Tuple2[Name, Value]] def lookup(x: Name, e: Environment): M[Value] = e match { case List() => errorM("unbound variable: " + x); - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value): M[Value] = Pair(a, b) match { - case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + def add(a: Value, b: Value): M[Value] = (a, b) match { + case (Num(m), Num(n)) => unitM(Num(m + n)) case _ => errorM("should be numbers: " + a + "," + b) } @@ -65,7 +65,7 @@ object errorInterpreter { b <- interp(r, e); c <- add(a, b)) yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) case App(f, t) => for (a <- interp(f, e); b <- interp(t, e); c <- apply(a, b)) diff --git a/docs/examples/monads/simpleInterpreter.scala b/docs/examples/monads/simpleInterpreter.scala index cde3a92dbb..64636749ff 100644 --- a/docs/examples/monads/simpleInterpreter.scala +++ b/docs/examples/monads/simpleInterpreter.scala @@ -22,7 +22,7 @@ object simpleInterpreter { trait Value; case object Wrong extends Value { override def toString() = "wrong" - } + } case class Num(n: Int) extends Value { override def toString() = n.toString(); } @@ -30,15 +30,15 @@ object simpleInterpreter { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]]; + type Environment = List[Tuple2[Name, Value]]; def lookup(x: Name, e: Environment): M[Value] = e match { case List() => unitM(Wrong) - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value): M[Value] = Pair(a, b) match { - case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + def add(a: Value, b: Value): M[Value] = (a, b) match { + case (Num(m), Num(n)) => unitM(Num(m + n)) case _ => unitM(Wrong) } @@ -54,14 +54,14 @@ object simpleInterpreter { b <- interp(r, e); c <- add(a, b)) yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) case App(f, t) => for (a <- interp(f, e); b <- interp(t, e); c <- apply(a, b)) yield c } - def test(t: Term): String = + def test(t: Term): String = showM(interp(t, List())); val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11))); diff --git a/docs/examples/monads/stateInterpreter.scala b/docs/examples/monads/stateInterpreter.scala index 97f3335dab..e13e9049da 100644 --- a/docs/examples/monads/stateInterpreter.scala +++ b/docs/examples/monads/stateInterpreter.scala @@ -4,20 +4,20 @@ object stateInterpreter { type State = Int; - val tickS = new M(s => Pair((), s + 1)); + val tickS = new M(s => ((), s + 1)); - case class M[A](in: State => Pair[A, State]) { - def bind[B](k: A => M[B]) = M[B]{ s0 => - val Pair(a, s1) = this in s0; k(a) in s1 + case class M[A](in: State => Tuple2[A, State]) { + def bind[B](k: A => M[B]) = M[B]{ s0 => + val (a, s1) = this in s0; k(a) in s1 } def map[B](f: A => B): M[B] = bind(x => unitM(f(x))); def flatMap[B](f: A => M[B]): M[B] = bind(f); } - def unitM[A](a: A) = M[A](s => Pair(a, s)); + def unitM[A](a: A) = M[A](s => (a, s)); def showM(m: M[Value]): String = { - val Pair(a, s1) = m in 0; + val (a, s1) = m in 0; "Value: " + a + "; Count: " + s1 } @@ -41,15 +41,15 @@ object stateInterpreter { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]]; + type Environment = List[Tuple2[Name, Value]]; def lookup(x: Name, e: Environment): M[Value] = e match { case List() => unitM(Wrong) - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value): M[Value] = Pair(a, b) match { - case Pair(Num(m), Num(n)) => for (_ <- tickS) yield Num(m + n) + def add(a: Value, b: Value): M[Value] = (a, b) match { + case (Num(m), Num(n)) => for (_ <- tickS) yield Num(m + n) case _ => unitM(Wrong) } @@ -65,14 +65,14 @@ object stateInterpreter { b <- interp(r, e); c <- add(a, b)) yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) case App(f, t) => for (a <- interp(f, e); b <- interp(t, e); c <- apply(a, b)) yield c } - def test(t: Term): String = + def test(t: Term): String = showM(interp(t, List())); val term0 = App(Lam("x", Add(Var("x"), Var("x"))), Add(Con(10), Con(11))); diff --git a/docs/examples/patterns.scala b/docs/examples/patterns.scala index 738deabc66..d082fcc3de 100644 --- a/docs/examples/patterns.scala +++ b/docs/examples/patterns.scala @@ -13,17 +13,17 @@ object patterns { case Leaf(x) => x } - def find[a,b](it: Iterator[Pair[a, b]], x: a): Option[b] = { + def find[a,b](it: Iterator[Tuple2[a, b]], x: a): Option[b] = { var result: Option[b] = None var found = false while (it.hasNext && !found) { - val Pair(x1, y) = it.next + val (x1, y) = it.next if (x == x1) { found = true; result = Some(y) } } result } - def printFinds[a](xs: List[Pair[a, String]], x: a) = + def printFinds[a](xs: List[Tuple2[a, String]], x: a) = find(xs.iterator, x) match { case Some(y) => System.out.println(y) case None => System.out.println("no match") @@ -31,6 +31,6 @@ object patterns { def main(args: Array[String]) { println("sum of leafs=" + sumLeaves(tree1)) - printFinds(List(Pair(3, "three"), Pair(4, "four")), 4) + printFinds(List((3, "three"), (4, "four")), 4) } } diff --git a/docs/examples/pilib/elasticBuffer.scala b/docs/examples/pilib/elasticBuffer.scala index 5fec96ab6c..c173735dbb 100644 --- a/docs/examples/pilib/elasticBuffer.scala +++ b/docs/examples/pilib/elasticBuffer.scala @@ -8,7 +8,7 @@ object elasticBuffer { * Recursive type for channels that carry a "String" channel and * an object of the type we define. */ - class MetaChan extends Chan[Pair[Chan[String], MetaChan]] + class MetaChan extends Chan[Tuple2[Chan[String], MetaChan]] def Buffer(put: Chan[String], get: Chan[String]): Unit = { @@ -18,19 +18,19 @@ object elasticBuffer { def Bl(i:Chan[String], l: MetaChan, o: Chan[String], r: MetaChan): unit = choice ( - l(Pair(o,r)) * (System.out.println("Removed one cell.")), + l((o,r)) * (System.out.println("Removed one cell.")), i * (inp => Cl(i, l, o, r, inp)) ) /** * A buffer cell containing a value, ready to receive (o,r) from the right. */ - def Cl(i: Chan[String], l: MetaChan, + def Cl(i: Chan[String], l: MetaChan, o: Chan[String], r: MetaChan, content: String): Unit = choice ( o(content) * (Bl(i,l,o,r)), i * (inp => Dl(i,l,o,r,content, inp)), - r * ( { case Pair(newo, newr) => Cl(i,l,newo,newr,content) }) + r * ( { case (newo, newr) => Cl(i,l,newo,newr,content) }) ) /** diff --git a/docs/examples/pilib/handover.scala b/docs/examples/pilib/handover.scala index c9b6156c2c..4e9a5670a0 100644 --- a/docs/examples/pilib/handover.scala +++ b/docs/examples/pilib/handover.scala @@ -13,14 +13,14 @@ object handoverRecursive { * Recursive type for channels that carry a channel "unit" and * an object of the type we define. */ - class Switch extends Chan[Pair[Chan[unit], Switch]] + class Switch extends Chan[Tuple2[Chan[unit], Switch]] /** * Car. */ def Car(talk: Chan[unit], switch: Switch): unit = choice ( - switch * ({ case Pair(t,s) => Car(t, s) }), + switch * ({ case (t,s) => Car(t, s) }), talk(()) * ( { Thread.sleep(1 + random.nextInt(1000)); System.out.println("Car emitted a message."); @@ -32,20 +32,20 @@ object handoverRecursive { * Control center. */ def Control(talk1: Chan[unit], switch1: Switch, - gain1: Switch, lose1: Switch, + gain1: Switch, lose1: Switch, talk2: Chan[unit], switch2: Switch, gain2: Switch, lose2: Switch): unit = { def Control1: unit= { Thread.sleep(1 + random.nextInt(1000)); - lose1.write(Pair(talk2, switch2)); - gain2.write(Pair(talk2, switch2)); + lose1.write((talk2, switch2)); + gain2.write((talk2, switch2)); Control2 } def Control2: unit = { Thread.sleep(1 + random.nextInt(1000)); - lose2.write(Pair(talk1, switch1)); - gain1.write(Pair(talk1, switch1)); + lose2.write((talk1, switch1)); + gain1.write((talk1, switch1)); Control1 } Control1 @@ -62,8 +62,8 @@ object handoverRecursive { System.out.println(id + " received a message.") ActiveTransmitter(id, talk, switch, gain, lose) }), - lose * ({ case Pair(t, s) => { - switch.write(Pair(t, s)) + lose * ({ case (t, s) => { + switch.write((t, s)) IdleTransmitter(id, gain, lose) }}) ); @@ -72,7 +72,7 @@ object handoverRecursive { * Idle transmitter. */ def IdleTransmitter(id: String, gain: Switch, lose: Switch): unit = { - val Pair(t, s) = gain.read; + val (t, s) = gain.read; ActiveTransmitter(id, t, s, gain, lose) } @@ -108,7 +108,7 @@ object handoverCast { def Car(talk: Chan[Any], switch: Chan[Any]): unit = choice ( switch * (o => { - val Pair(t,s) = o.asInstanceOf[Pair[Chan[Any],Chan[Any]]]; + val (t,s) = o.asInstanceOf[Tuple2[Chan[Any],Chan[Any]]]; Car(t, s) }), talk(()) * ( { @@ -122,20 +122,20 @@ object handoverCast { * Control center. */ def Control(talk1: Chan[Any], switch1: Chan[Any], - gain1: Chan[Any], lose1: Chan[Any], + gain1: Chan[Any], lose1: Chan[Any], talk2: Chan[Any], switch2: Chan[Any], gain2: Chan[Any], lose2: Chan[Any]): unit = { def Control1: unit = { Thread.sleep(1 + random.nextInt(1000)); - lose1.write(Pair(talk2, switch2)); - gain2.write(Pair(talk2, switch2)); + lose1.write((talk2, switch2)); + gain2.write((talk2, switch2)); Control2 } def Control2: unit = { Thread.sleep(1 + random.nextInt(1000)); - lose2.write(Pair(talk1, switch1)); - gain1.write(Pair(talk1, switch1)); + lose2.write((talk1, switch1)); + gain1.write((talk1, switch1)); Control1 } Control1 @@ -153,8 +153,8 @@ object handoverCast { ActiveTransmitter(id, talk, switch, gain, lose) }), lose * (o => { - val Pair(t, s) = o.asInstanceOf[Pair[Chan[Any],Chan[Any]]] - switch.write(Pair(t, s)) + val (t, s) = o.asInstanceOf[Tuple2[Chan[Any],Chan[Any]]] + switch.write((t, s)) IdleTransmitter(id, gain, lose) }) ) @@ -163,7 +163,7 @@ object handoverCast { * Idle transmitter. */ def IdleTransmitter(id: String, gain: Chan[Any], lose: Chan[Any]): unit = { - val Pair(t, s) = gain.read.asInstanceOf[Pair[Chan[Any],Chan[Any]]] + val (t, s) = gain.read.asInstanceOf[Tuple2[Chan[Any],Chan[Any]]] ActiveTransmitter(id, t, s, gain, lose) } diff --git a/docs/examples/pilib/piNat.scala b/docs/examples/pilib/piNat.scala index a1a0e682e1..c6d9bdaf5c 100644 --- a/docs/examples/pilib/piNat.scala +++ b/docs/examples/pilib/piNat.scala @@ -4,23 +4,23 @@ import scala.concurrent.pilib._ /** Church encoding of naturals in the Pi-calculus */ object piNat extends Application { - + /** Locations of Pi-calculus natural */ - class NatChan extends Chan[Triple[Chan[Unit], Chan[NatChan], Chan[NatChan]]] + class NatChan extends Chan[Tuple3[Chan[Unit], Chan[NatChan], Chan[NatChan]]] /** Zero */ def Z(l: NatChan): Unit = choice ( - l * { case Triple(z, sd, d) => z.write(()) } + l * { case (z, sd, d) => z.write(()) } ) /** Successor of Double */ def SD(n: NatChan, l: NatChan): Unit = choice ( - l * { case Triple(z, sd, d) => sd.write(n) } + l * { case (z, sd, d) => sd.write(n) } ) /** Double */ def D(n: NatChan, l: NatChan): Unit = choice ( - l * { case Triple(z, sd, d) => d.write(n) } + l * { case (z, sd, d) => d.write(n) } ) /** Make "l" a location representing the natural "n" */ @@ -34,7 +34,7 @@ object piNat extends Application { val z = new Chan[Unit] val sd = new Chan[NatChan] val d = new Chan[NatChan] - spawn < m.write(Triple(z, sd, d)) >; + spawn < m.write((z, sd, d)) >; choice ( z * { x => make(1, n) }, sd * { m1 => { val n1 = new NatChan; spawn < D(n1, n) >; Succ(m1, n1) } }, @@ -47,7 +47,7 @@ object piNat extends Application { val z = new Chan[Unit] val sd = new Chan[NatChan] val d = new Chan[NatChan] - spawn < l.write(Triple(z, sd, d)) >; + spawn < l.write((z, sd, d)) >; choice ( z * { x => spawn < Z(m) >; Z(n) }, sd * { l1 => { val m1 = new NatChan; val n1 = new NatChan; @@ -64,7 +64,7 @@ object piNat extends Application { val z = new Chan[Unit] val sd = new Chan[NatChan] val d = new Chan[NatChan] - spawn < n.write(Triple(z, sd, d)) >; + spawn < n.write((z, sd, d)) >; choice ( z * { x => 0 }, sd * { n1 => 2 * value(n1) + 1 }, diff --git a/docs/examples/typeinf.scala b/docs/examples/typeinf.scala index d4bc8bf3e1..ac6cc35f6b 100644 --- a/docs/examples/typeinf.scala +++ b/docs/examples/typeinf.scala @@ -53,11 +53,11 @@ object typeInfer { (emptySubst /: tyvars) ((s, tv) => s.extend(tv, newTyvar())) (tpe) } - type Env = List[Pair[String, TypeScheme]] + type Env = List[Tuple2[String, TypeScheme]] def lookup(env: Env, x: String): TypeScheme = env match { case List() => null - case Pair(y, t) :: env1 => if (x == y) t else lookup(env1, x) + case (y, t) :: env1 => if (x == y) t else lookup(env1, x) } def gen(env: Env, t: Type): TypeScheme = @@ -69,22 +69,22 @@ object typeInfer { case Tycon(k, ts) => (List[Tyvar]() /: ts) ((tvs, t) => tvs union tyvars(t)) } - def tyvars(ts: TypeScheme): List[Tyvar] = + def tyvars(ts: TypeScheme): List[Tyvar] = tyvars(ts.tpe) diff ts.tyvars; def tyvars(env: Env): List[Tyvar] = (List[Tyvar]() /: env) ((tvs, nt) => tvs union tyvars(nt._2)) - def mgu(t: Type, u: Type, s: Subst): Subst = Pair(s(t), s(u)) match { - case Pair(Tyvar(a), Tyvar(b)) if (a == b) => + def mgu(t: Type, u: Type, s: Subst): Subst = (s(t), s(u)) match { + case (Tyvar(a), Tyvar(b)) if (a == b) => s - case Pair(Tyvar(a), _) if !(tyvars(u) contains a) => + case (Tyvar(a), _) if !(tyvars(u) contains a) => s.extend(Tyvar(a), u) - case Pair(_, Tyvar(a)) => + case (_, Tyvar(a)) => mgu(u, t, s) - case Pair(Arrow(t1, t2), Arrow(u1, u2)) => + case (Arrow(t1, t2), Arrow(u1, u2)) => mgu(t1, u1, mgu(t2, u2, s)) - case Pair(Tycon(k1, ts), Tycon(k2, us)) if (k1 == k2) => + case (Tycon(k1, ts), Tycon(k2, us)) if (k1 == k2) => (s /: (ts zip us)) ((s, tu) => mgu(tu._1, tu._2, s)) case _ => throw new TypeError("cannot unify " + s(t) + " with " + s(u)) @@ -103,7 +103,7 @@ object typeInfer { case Lam(x, e1) => val a, b = newTyvar() val s1 = mgu(t, Arrow(a, b), s) - val env1 = Pair(x, TypeScheme(List(), a)) :: env + val env1 = (x, TypeScheme(List(), a)) :: env tp(env1, e1, b, s1) case App(e1, e2) => @@ -114,7 +114,7 @@ object typeInfer { case Let(x, e1, e2) => val a = newTyvar() val s1 = tp(env, e1, a, s) - tp(Pair(x, gen(env, s1(a))) :: env, e2, t, s1) + tp((x, gen(env, s1(a))) :: env, e2, t, s1) } } var current: Term = null @@ -134,18 +134,18 @@ object typeInfer { private val a = typeInfer.newTyvar() val env = List( /* - Pair("true", gen(booleanType)), - Pair("false", gen(booleanType)), - Pair("if", gen(Arrow(booleanType, Arrow(a, Arrow(a, a))))), - Pair("zero", gen(intType)), - Pair("succ", gen(Arrow(intType, intType))), - Pair("nil", gen(listType(a))), - Pair("cons", gen(Arrow(a, Arrow(listType(a), listType(a))))), - Pair("isEmpty", gen(Arrow(listType(a), booleanType))), - Pair("head", gen(Arrow(listType(a), a))), - Pair("tail", gen(Arrow(listType(a), listType(a)))), + ("true", gen(booleanType)), + ("false", gen(booleanType)), + ("if", gen(Arrow(booleanType, Arrow(a, Arrow(a, a))))), + ("zero", gen(intType)), + ("succ", gen(Arrow(intType, intType))), + ("nil", gen(listType(a))), + ("cons", gen(Arrow(a, Arrow(listType(a), listType(a))))), + ("isEmpty", gen(Arrow(listType(a), booleanType))), + ("head", gen(Arrow(listType(a), a))), + ("tail", gen(Arrow(listType(a), listType(a)))), */ - Pair("fix", gen(Arrow(Arrow(a, a), a))) + ("fix", gen(Arrow(Arrow(a, a), a))) ) } @@ -181,7 +181,7 @@ object typeInfer { yield Lam(x, t): Term ) ||| ( for ( - letid <- id if letid == "let"; + letid <- id if letid == "let"; x <- ident; _ <- wschr('='); t <- term; @@ -220,7 +220,7 @@ object typeInfer { val input = 0 def any = new Parser[char] { def apply(in: int): Parser[char]#Result = - if (in < s.length()) Some(Pair(s charAt in, in + 1)) else None + if (in < s.length()) Some((s charAt in, in + 1)) else None } } @@ -239,7 +239,7 @@ object typeInfer { if (args.length == 1) { val ps = new ParseString(args(0)) with MiniMLParsers ps.all(ps.input) match { - case Some(Pair(term, _)) => + case Some((term, _)) => "" + term + ": " + showType(term) case None => "syntax error" diff --git a/src/actors/scala/actors/Future.scala b/src/actors/scala/actors/Future.scala index 9d123cb2d5..4421c7a07a 100644 --- a/src/actors/scala/actors/Future.scala +++ b/src/actors/scala/actors/Future.scala @@ -180,17 +180,17 @@ object Futures { var cnt = 0 val mappedFts = fts.map(ft => - Pair({cnt+=1; cnt-1}, ft)) + ({cnt+=1; cnt-1}, ft)) - val unsetFts = mappedFts.filter((p: Pair[Int, Future[Any]]) => { + val unsetFts = mappedFts.filter((p: Tuple2[Int, Future[Any]]) => { if (p._2.isSet) { resultsMap(p._1) = Some(p._2()); false } else { resultsMap(p._1) = None; true } }) - val partFuns = unsetFts.map((p: Pair[Int, Future[Any]]) => { + val partFuns = unsetFts.map((p: Tuple2[Int, Future[Any]]) => { val FutCh = p._2.inputChannel - val singleCase: PartialFunction[Any, Pair[Int, Any]] = { - case FutCh ! any => Pair(p._1, any) + val singleCase: PartialFunction[Any, Tuple2[Int, Any]] = { + case FutCh ! any => (p._1, any) } singleCase }) @@ -201,7 +201,7 @@ object Futures { } Actor.timer.schedule(timerTask, timeout) - def awaitWith(partFuns: Seq[PartialFunction[Any, Pair[Int, Any]]]) { + def awaitWith(partFuns: Seq[PartialFunction[Any, Tuple2[Int, Any]]]) { val reaction: PartialFunction[Any, Unit] = new PartialFunction[Any, Unit] { def isDefinedAt(msg: Any) = msg match { case TIMEOUT => true @@ -212,7 +212,7 @@ object Futures { case _ => { val pfOpt = partFuns find (_ isDefinedAt msg) val pf = pfOpt.get // succeeds always - val Pair(idx, subres) = pf(msg) + val (idx, subres) = pf(msg) resultsMap(idx) = Some(subres) val partFunsRest = partFuns filter (_ != pf) diff --git a/src/actors/scala/actors/remote/NetKernel.scala b/src/actors/scala/actors/remote/NetKernel.scala index 4795ff3eb6..57d7af6d26 100644 --- a/src/actors/scala/actors/remote/NetKernel.scala +++ b/src/actors/scala/actors/remote/NetKernel.scala @@ -43,8 +43,8 @@ private[remote] class NetKernel(service: Service) { private val names = new mutable.HashMap[OutputChannel[Any], Symbol] def register(name: Symbol, a: OutputChannel[Any]): Unit = synchronized { - actors += Pair(name, a) - names += Pair(a, name) + actors(name) = a + names(a) = name } def getOrCreateName(from: OutputChannel[Any]) = names.get(from) match { @@ -79,7 +79,7 @@ private[remote] class NetKernel(service: Service) { def createProxy(node: Node, sym: Symbol): Proxy = { val p = new Proxy(node, sym, this) - proxies += Pair((node, sym), p) + proxies((node, sym)) = p p } @@ -99,7 +99,7 @@ private[remote] class NetKernel(service: Service) { proxies.synchronized { proxies.get((senderNode, senderName)) match { case Some(senderProxy) => // do nothing - case None => proxies += Pair((senderNode, senderName), p) + case None => proxies((senderNode, senderName)) = p } } diff --git a/src/actors/scala/actors/remote/Proxy.scala b/src/actors/scala/actors/remote/Proxy.scala index 43a43ac99c..9949b36181 100644 --- a/src/actors/scala/actors/remote/Proxy.scala +++ b/src/actors/scala/actors/remote/Proxy.scala @@ -142,7 +142,7 @@ private[remote] class DelegateActor(creator: Proxy, node: Node, name: Symbol, ke // create a new reply channel... val replyCh = new Channel[Any](this) // ...that maps to session - sessionMap += Pair(replyCh, session) + sessionMap(replyCh) = session // local send out.send(msg, replyCh) @@ -178,7 +178,7 @@ private[remote] class DelegateActor(creator: Proxy, node: Node, name: Symbol, ke // create fresh session ID... val fresh = FreshNameCreator.newName(node+"@"+name) // ...that maps to reply channel - channelMap += Pair(fresh, sender) + channelMap(fresh) = sender kernel.forward(sender, node, name, msg, fresh) } else { kernel.forward(sender, node, name, msg, 'nosession) diff --git a/src/actors/scala/actors/remote/RemoteActor.scala b/src/actors/scala/actors/remote/RemoteActor.scala index 799076a01f..2daf9ceb43 100644 --- a/src/actors/scala/actors/remote/RemoteActor.scala +++ b/src/actors/scala/actors/remote/RemoteActor.scala @@ -64,7 +64,7 @@ object RemoteActor { val serv = TcpService(port, cl) val kern = serv.kernel val s = Actor.self(Scheduler) - kernels += Pair(s, kern) + kernels(s) = kern s.onTerminate { Debug.info("alive actor "+s+" terminated") @@ -90,7 +90,7 @@ object RemoteActor { val kernel = kernels.get(Actor.self(Scheduler)) match { case None => val serv = TcpService(TcpService.generatePort, cl) - kernels += Pair(Actor.self(Scheduler), serv.kernel) + kernels(Actor.self(Scheduler)) = serv.kernel serv.kernel case Some(k) => k diff --git a/src/actors/scala/actors/remote/TcpService.scala b/src/actors/scala/actors/remote/TcpService.scala index 75e36b2738..69e5c46c52 100644 --- a/src/actors/scala/actors/remote/TcpService.scala +++ b/src/actors/scala/actors/remote/TcpService.scala @@ -35,7 +35,7 @@ object TcpService { service case None => val service = new TcpService(port, cl) - ports += Pair(port, service) + ports(port) = service service.start() Debug.info("created service at "+service.node) service @@ -106,9 +106,9 @@ class TcpService(port: Int, cl: ClassLoader) extends Thread with Service { // when remote net kernel comes up (pendingSends.get(node): @unchecked) match { case None => - pendingSends += Pair(node, List(data)) + pendingSends(node) = List(data) case Some(msgs) if msgs.length < TcpService.BufSize => - pendingSends += Pair(node, data :: msgs) + pendingSends(node) = data :: msgs } } @@ -183,7 +183,7 @@ class TcpService(port: Int, cl: ClassLoader) extends Thread with Service { new mutable.HashMap[Node, TcpServiceWorker] private[actors] def addConnection(node: Node, worker: TcpServiceWorker) = synchronized { - connections += Pair(node, worker) + connections(node) = worker } def getConnection(n: Node) = synchronized { diff --git a/src/compiler/scala/reflect/macros/compiler/Resolvers.scala b/src/compiler/scala/reflect/macros/compiler/Resolvers.scala index 03d306f593..e4851632a5 100644 --- a/src/compiler/scala/reflect/macros/compiler/Resolvers.scala +++ b/src/compiler/scala/reflect/macros/compiler/Resolvers.scala @@ -9,7 +9,7 @@ trait Resolvers { import global._ import analyzer._ - import definitions.{EmptyPackageClass => _, _} + import definitions._ import treeInfo._ import gen._ private val runDefinitions = currentRun.runDefinitions diff --git a/src/compiler/scala/tools/ant/ScalaTool.scala b/src/compiler/scala/tools/ant/ScalaTool.scala index e7ac53c8fb..bb6a933d3f 100644 --- a/src/compiler/scala/tools/ant/ScalaTool.scala +++ b/src/compiler/scala/tools/ant/ScalaTool.scala @@ -139,7 +139,7 @@ class ScalaTool extends ScalaMatchingTask { val st = s.trim val stArray = st.split("=", 2) if (stArray.length == 2) { - if (input != "") List(Pair(stArray(0), stArray(1))) else Nil + if (input != "") List((stArray(0), stArray(1))) else Nil } else buildError("Property " + st + " is not formatted properly.") @@ -170,7 +170,7 @@ class ScalaTool extends ScalaMatchingTask { private def getProperties: String = properties.map({ - case Pair(name,value) => "-D" + name + "=\"" + value + "\"" + case (name,value) => "-D" + name + "=\"" + value + "\"" }).mkString("", " ", "") /*============================================================================*\ diff --git a/src/compiler/scala/tools/ant/sabbus/Compilers.scala b/src/compiler/scala/tools/ant/sabbus/Compilers.scala index b1994233e8..a0aad49f20 100644 --- a/src/compiler/scala/tools/ant/sabbus/Compilers.scala +++ b/src/compiler/scala/tools/ant/sabbus/Compilers.scala @@ -27,7 +27,7 @@ object Compilers extends scala.collection.DefaultMap[String, Compiler] { if (debug) println("Making compiler " + id) if (debug) println(" memory before: " + freeMemoryString) val comp = new Compiler(classpath, settings) - container += Pair(id, comp) + container(id) = comp if (debug) println(" memory after: " + freeMemoryString) comp } diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala index cd1869340a..0429e295b4 100644 --- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala +++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala @@ -1774,10 +1774,12 @@ self => in.nextToken() if (in.token == SUBTYPE || in.token == SUPERTYPE) wildcardType(start) else atPos(start) { Bind(tpnme.WILDCARD, EmptyTree) } - case IDENTIFIER if nme.isVariableName(in.name) => - atPos(start) { Bind(identForType(), EmptyTree) } case _ => - typ() + typ() match { + case Ident(name: TypeName) if nme.isVariableName(name) => + atPos(start) { Bind(name, EmptyTree) } + case t => t + } } } @@ -2530,11 +2532,7 @@ self => val vparamss = paramClauses(nme.CONSTRUCTOR, classContextBounds map (_.duplicate), ofCaseClass = false) newLineOptWhenFollowedBy(LBRACE) val rhs = in.token match { - case LBRACE => { - if (settings.future) - deprecationWarning(in.offset, "Procedure syntax is deprecated. Convert procedure to method by adding `: Unit =`.") - atPos(in.offset) { constrBlock(vparamss) } - } + case LBRACE => atPos(in.offset) { constrBlock(vparamss) } case _ => accept(EQUALS) ; atPos(in.offset) { constrExpr(vparamss) } } DefDef(mods, nme.CONSTRUCTOR, List(), vparamss, TypeTree(), rhs) @@ -2560,14 +2558,16 @@ self => var restype = fromWithinReturnType(typedOpt()) val rhs = if (isStatSep || in.token == RBRACE) { - if (settings.future) - deprecationWarning(in.lastOffset, "Procedure syntax is deprecated. Convert procedure to method by adding `: Unit`.") - if (restype.isEmpty) restype = scalaUnitConstr + if (restype.isEmpty) { + if (settings.future) + deprecationWarning(in.lastOffset, s"Procedure syntax is deprecated. Convert procedure `$name` to method by adding `: Unit`.") + restype = scalaUnitConstr + } newmods |= Flags.DEFERRED EmptyTree } else if (restype.isEmpty && in.token == LBRACE) { if (settings.future) - deprecationWarning(in.offset, "Procedure syntax is deprecated. Convert procedure to method by adding `: Unit =`.") + deprecationWarning(in.offset, s"Procedure syntax is deprecated. Convert procedure `$name` to method by adding `: Unit =`.") restype = scalaUnitConstr blockExpr() } else { diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/Liveness.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/Liveness.scala index 60f7857d0c..939641c3eb 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/Liveness.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/Liveness.scala @@ -69,7 +69,7 @@ abstract class Liveness { case STORE_LOCAL(local) if (!genSet(local)) => killSet = killSet + local case _ => () } - Pair(genSet, killSet) + (genSet, killSet) } override def run() { diff --git a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala index 7a53293384..f10d7cdc40 100644 --- a/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala +++ b/src/compiler/scala/tools/nsc/backend/icode/analysis/TypeFlowAnalysis.scala @@ -418,7 +418,7 @@ abstract class TypeFlowAnalysis { !blackballed(concreteMethod) } if(isCandidate) { - remainingCALLs += Pair(cm, CallsiteInfo(b, receiver, result.stack.length, concreteMethod)) + remainingCALLs(cm) = CallsiteInfo(b, receiver, result.stack.length, concreteMethod) } else { remainingCALLs.remove(cm) isOnWatchlist.remove(cm) diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala index c166b0bb7e..4f9f4c9e31 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala @@ -741,13 +741,13 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder { var flatKeys: List[Int] = Nil var targets: List[asm.Label] = Nil var default: asm.Label = null - var switchBlocks: List[Pair[asm.Label, Tree]] = Nil + var switchBlocks: List[Tuple2[asm.Label, Tree]] = Nil // collect switch blocks and their keys, but don't emit yet any switch-block. for (caze @ CaseDef(pat, guard, body) <- tree.cases) { assert(guard == EmptyTree, guard) val switchBlockPoint = new asm.Label - switchBlocks ::= Pair(switchBlockPoint, body) + switchBlocks ::= (switchBlockPoint, body) pat match { case Literal(value) => flatKeys ::= value.intValue @@ -772,7 +772,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder { // emit switch-blocks. val postMatch = new asm.Label for (sb <- switchBlocks.reverse) { - val Pair(caseLabel, caseBody) = sb + val (caseLabel, caseBody) = sb markProgramPoint(caseLabel) genLoad(caseBody, generatedType) bc goTo postMatch @@ -790,7 +790,7 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder { genLoad(expr, expectedType) val end = currProgramPoint() if (emitVars) { // add entries to LocalVariableTable JVM attribute - for (Pair(sym, start) <- varsInScope.reverse) { emitLocalVarScope(sym, start, end) } + for ((sym, start) <- varsInScope.reverse) { emitLocalVarScope(sym, start, end) } } varsInScope = savedScope } diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala index c22ced26a5..64ed094a47 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeHelpers.scala @@ -112,7 +112,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters { val ta = exemplars.get(a) val tb = exemplars.get(b) - val res = Pair(ta.isInterface, tb.isInterface) match { + val res = (ta.isInterface, tb.isInterface) match { case (true, true) => // exercised by test/files/run/t4761.scala if (tb.isSubtypeOf(ta.c)) ta.c @@ -759,7 +759,7 @@ abstract class BCodeHelpers extends BCodeTypes with BytecodeWriters { def emitParamAnnotations(jmethod: asm.MethodVisitor, pannotss: List[List[AnnotationInfo]]) { val annotationss = pannotss map (_ filter shouldEmitAnnotation) if (annotationss forall (_.isEmpty)) return - for (Pair(annots, idx) <- annotationss.zipWithIndex; + for ((annots, idx) <- annotationss.zipWithIndex; annot <- annots) { val AnnotationInfo(typ, args, assocs) = annot assert(args.isEmpty, args) diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala index 5fe03624cf..c921d11d00 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala @@ -436,7 +436,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers { var labelDef: scala.collection.Map[Symbol, LabelDef] = null// (LabelDef-sym -> LabelDef) // bookkeeping the scopes of non-synthetic local vars, to emit debug info (`emitVars`). - var varsInScope: List[Pair[Symbol, asm.Label]] = null // (local-var-sym -> start-of-scope) + var varsInScope: List[Tuple2[Symbol, asm.Label]] = null // (local-var-sym -> start-of-scope) // helpers around program-points. def lastInsn: asm.tree.AbstractInsnNode = { diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BCodeTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/BCodeTypes.scala index 916d118b6e..5be5abd895 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/BCodeTypes.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/BCodeTypes.scala @@ -90,11 +90,11 @@ abstract class BCodeTypes extends BCodeIdiomatic { ) boxResultType = - for(Pair(csym, msym) <- currentRun.runDefinitions.boxMethod) + for((csym, msym) <- currentRun.runDefinitions.boxMethod) yield (msym -> classLiteral(primitiveTypeMap(csym))) unboxResultType = - for(Pair(csym, msym) <- currentRun.runDefinitions.unboxMethod) + for((csym, msym) <- currentRun.runDefinitions.unboxMethod) yield (msym -> primitiveTypeMap(csym)) // boxed classes are looked up in the `exemplars` map by jvmWiseLUB(). diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala index 5e885fdd04..e92f8c2541 100644 --- a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala +++ b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala @@ -293,7 +293,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM { def inameToSymbol(iname: String): Symbol = { val name = global.newTypeName(iname) val res0 = - if (nme.isModuleName(name)) rootMirror.getModule(name.dropModule) + if (nme.isModuleName(name)) rootMirror.getModuleByName(name.dropModule) else rootMirror.getClassByName(name.replace('/', '.')) // TODO fails for inner classes (but this hasn't been tested). assert(res0 != NoSymbol) val res = jsymbol(res0) @@ -335,7 +335,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM { assert(a.isClass) assert(b.isClass) - val res = Pair(a.isInterface, b.isInterface) match { + val res = (a.isInterface, b.isInterface) match { case (true, true) => global.lub(List(a.tpe, b.tpe)).typeSymbol // TODO assert == firstCommonSuffix of resp. parents case (true, false) => @@ -1014,7 +1014,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM { def emitParamAnnotations(jmethod: asm.MethodVisitor, pannotss: List[List[AnnotationInfo]]) { val annotationss = pannotss map (_ filter shouldEmitAnnotation) if (annotationss forall (_.isEmpty)) return - for (Pair(annots, idx) <- annotationss.zipWithIndex; + for ((annots, idx) <- annotationss.zipWithIndex; annot <- annots) { val AnnotationInfo(typ, args, assocs) = annot assert(args.isEmpty, args) @@ -2156,7 +2156,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM { def getMerged(): scala.collection.Map[Local, List[Interval]] = { // TODO should but isn't: unbalanced start(s) of scope(s) - val shouldBeEmpty = pending filter { p => val Pair(_, st) = p; st.nonEmpty } + val shouldBeEmpty = pending filter { p => val (_, st) = p; st.nonEmpty } val merged = mutable.Map[Local, List[Interval]]() def addToMerged(lv: Local, start: Label, end: Label) { val intv = Interval(start, end) @@ -2169,7 +2169,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM { (b) take the latest end (onePastLast if none available) (c) merge the thus made-up interval */ - for(Pair(k, st) <- shouldBeEmpty) { + for((k, st) <- shouldBeEmpty) { var start = st.toList.sortBy(_.getOffset).head if(merged.isDefinedAt(k)) { val balancedStart = merged(k).head.lstart @@ -2206,25 +2206,25 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM { } // adding non-param locals var anonCounter = 0 - var fltnd: List[Triple[String, Local, Interval]] = Nil - for(Pair(local, ranges) <- scoping.getMerged()) { + var fltnd: List[Tuple3[String, Local, Interval]] = Nil + for((local, ranges) <- scoping.getMerged()) { var name = javaName(local.sym) if (name == null) { anonCounter += 1 name = "<anon" + anonCounter + ">" } for(intrvl <- ranges) { - fltnd ::= Triple(name, local, intrvl) + fltnd ::= (name, local, intrvl) } } // quest for deterministic output that Map.toList doesn't provide (so that ant test.stability doesn't complain). val srtd = fltnd.sortBy { kr => - val Triple(name: String, _, intrvl: Interval) = kr + val (name: String, _, intrvl: Interval) = kr - Triple(intrvl.start, intrvl.end - intrvl.start, name) // ie sort by (start, length, name) + (intrvl.start, intrvl.end - intrvl.start, name) // ie sort by (start, length, name) } - for(Triple(name, local, Interval(start, end)) <- srtd) { + for((name, local, Interval(start, end)) <- srtd) { jmethod.visitLocalVariable(name, descriptor(local.kind), null, start, end, indexOf(local)) } // "There may be no more than one LocalVariableTable attribute per local variable in the Code attribute" diff --git a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala index 0cfcea87f8..0f317422ac 100644 --- a/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala +++ b/src/compiler/scala/tools/nsc/backend/opt/DeadCodeElimination.scala @@ -119,7 +119,7 @@ abstract class DeadCodeElimination extends SubComponent { m foreachBlock { bb => useful(bb) = new mutable.BitSet(bb.size) var rd = rdef.in(bb) - for (Pair(i, idx) <- bb.toList.zipWithIndex) { + for ((i, idx) <- bb.toList.zipWithIndex) { // utility for adding to worklist def moveToWorkList() = moveToWorkListIf(cond = true) @@ -137,7 +137,7 @@ abstract class DeadCodeElimination extends SubComponent { i match { case LOAD_LOCAL(_) => - defs = defs + Pair(((bb, idx)), rd.vars) + defs = defs + (((bb, idx), rd.vars)) moveToWorkListIf(cond = false) case STORE_LOCAL(l) => @@ -350,7 +350,7 @@ abstract class DeadCodeElimination extends SubComponent { val oldInstr = bb.toList bb.open() bb.clear() - for (Pair(i, idx) <- oldInstr.zipWithIndex) { + for ((i, idx) <- oldInstr.zipWithIndex) { if (useful(bb)(idx)) { debuglog(" * " + i + " is useful") bb.emit(i, i.pos) diff --git a/src/compiler/scala/tools/nsc/plugins/Plugin.scala b/src/compiler/scala/tools/nsc/plugins/Plugin.scala index 1578caff26..d194c095f8 100644 --- a/src/compiler/scala/tools/nsc/plugins/Plugin.scala +++ b/src/compiler/scala/tools/nsc/plugins/Plugin.scala @@ -144,7 +144,7 @@ object Plugin { // (j, Try(descriptor)) def required(j: Path) = j -> loadDescriptionFromJar(j) - type Paired = Pair[Path, Try[PluginDescription]] + type Paired = Tuple2[Path, Try[PluginDescription]] val included: List[Paired] = (dirs flatMap (_ ifDirectory scan)).flatten val exploded: List[Paired] = jars flatMap (_ ifDirectory explode) val explicit: List[Paired] = jars flatMap (_ ifFile required) diff --git a/src/compiler/scala/tools/nsc/reporters/Reporter.scala b/src/compiler/scala/tools/nsc/reporters/Reporter.scala index 0544da5d3c..68362c066d 100644 --- a/src/compiler/scala/tools/nsc/reporters/Reporter.scala +++ b/src/compiler/scala/tools/nsc/reporters/Reporter.scala @@ -80,10 +80,4 @@ abstract class Reporter { WARNING.count = 0 cancelled = false } - - // sbt compat - @deprecated("Moved to scala.reflect.internal.util.StringOps", "2.10.0") - def countElementsAsString(n: Int, elements: String): String = StringOps.countElementsAsString(n, elements) - @deprecated("Moved to scala.reflect.internal.util.StringOps", "2.10.0") - def countAsString(n: Int): String = StringOps.countAsString(n) } diff --git a/src/compiler/scala/tools/nsc/scratchpad/Mixer.scala b/src/compiler/scala/tools/nsc/scratchpad/Mixer.scala deleted file mode 100644 index 3aecc06b1e..0000000000 --- a/src/compiler/scala/tools/nsc/scratchpad/Mixer.scala +++ /dev/null @@ -1,99 +0,0 @@ -package scala.tools.nsc.scratchpad - -import java.io.{FileInputStream, InputStreamReader, IOException} - -import scala.collection.mutable.ArrayBuffer - -@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") -class Mixer { - - protected val stdSeparator = "//> " - protected val ctdSeparator = "//| " - protected val sepColumn = 50 - protected val tabInc = 8 - - type Comments = Seq[(Int, Array[Char])] - - def parseComments(comments: Array[Char]): Iterator[(Int, Array[Char])] = new Iterator[(Int, Array[Char])] { - var idx = 0 - def hasNext = idx < comments.length - def next() = { - val nextSpace = comments indexOf (' ', idx) - var nextNL = comments indexOf ('\n', nextSpace + 1) - if (nextNL < 0) nextNL = comments.length - val result = - (new String(comments.slice(idx, nextSpace)).toInt, comments.slice(nextSpace + 1, nextNL)) - idx = nextNL + 1 - result - } - } - - def mix(source: Array[Char], comments: Array[Char]): Array[Char] = { - val mixed = new ArrayBuffer[Char] - var written = 0 - def align() = { - var idx = mixed.lastIndexOf('\n') + 1 - var col = 0 - while (idx < mixed.length) { - col = - if (mixed(idx) == '\t') (col / tabInc) * tabInc + tabInc - else col + 1 - idx += 1 - } - if (col > sepColumn) { - mixed += '\n' - col = 0 - } - while (col < sepColumn) { - mixed += ' ' - col += 1 - } - } - for ((offset, cs) <- parseComments(comments)) { - val sep = - if (written < offset) { - for (i <- written until offset) mixed += source(i) - written = offset - stdSeparator - } else { - mixed += '\n' - ctdSeparator - } - align() - mixed ++= sep ++= cs - } - mixed ++= source.view(written, source.length) - mixed.toArray - } - -} - -object Mixer extends Mixer { - - def contents(name: String): Array[Char] = { - val page = new Array[Char](2 << 14) - val buf = new ArrayBuffer[Char] - val in = new FileInputStream(name) - val rdr = new InputStreamReader(in) - var nread = 0 - do { - nread = rdr.read(page, 0, page.length) - buf ++= (if (nread == page.length) page else page.take(nread)) - } while (nread >= 0) - buf.toArray - } - - def main(args: Array[String]) { - val mixer = new Mixer - try { - require(args.length == 2, "required arguments: file1 file2") - val source = contents(args(0)) - val comments = contents(args(1)) - val mixed = mixer.mix(source, comments) - println(mixed.mkString) - } catch { - case ex: IOException => - println("error: "+ ex.getMessage) - } - } -} diff --git a/src/compiler/scala/tools/nsc/scratchpad/SourceInserter.scala b/src/compiler/scala/tools/nsc/scratchpad/SourceInserter.scala deleted file mode 100644 index 61c1717fea..0000000000 --- a/src/compiler/scala/tools/nsc/scratchpad/SourceInserter.scala +++ /dev/null @@ -1,21 +0,0 @@ -package scala.tools.nsc -package scratchpad - -import scala.reflect.internal.Chars._ - -@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") -object SourceInserter { - def stripRight(cs: Array[Char]): Array[Char] = { - val lines = - new String(cs) split "\n" - def leftPart(str: String) = - (str split """//>|//\|""").head - def isContinuation(str: String) = - ((str contains "//>") || (str contains "//|")) && (leftPart(str) forall isWhitespace) - def stripTrailingWS(str: String) = - str take (str lastIndexWhere (!isWhitespace(_))) + 1 - val prefixes = - lines filterNot isContinuation map leftPart map stripTrailingWS - (prefixes mkString "\n").toArray - } -} diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala index 01acbb8cc2..fdec1edcc0 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala @@ -388,11 +388,11 @@ trait Implicits { */ private def dominates(dtor: Type, dted: Type): Boolean = { def core(tp: Type): Type = tp.dealiasWiden match { - case RefinedType(parents, defs) => intersectionType(parents map core, tp.typeSymbol.owner) + case RefinedType(parents, defs) => intersectionType(parents map core, tp.typeSymbol.owner) case AnnotatedType(annots, tp, selfsym) => core(tp) - case ExistentialType(tparams, result) => core(result).subst(tparams, tparams map (t => core(t.info.bounds.hi))) - case PolyType(tparams, result) => core(result).subst(tparams, tparams map (t => core(t.info.bounds.hi))) - case _ => tp + case ExistentialType(tparams, result) => core(result).subst(tparams, tparams map (t => core(t.info.bounds.hi))) + case PolyType(tparams, result) => core(result).subst(tparams, tparams map (t => core(t.info.bounds.hi))) + case _ => tp } def stripped(tp: Type): Type = { // `t.typeSymbol` returns the symbol of the normalized type. If that normalized type @@ -401,23 +401,18 @@ trait Implicits { val syms = for (t <- tp; if t.typeSymbol.isTypeParameter) yield t.typeSymbol deriveTypeWithWildcards(syms.distinct)(tp) } - def sum(xs: List[Int]) = (0 /: xs)(_ + _) - def complexity(tp: Type): Int = tp.dealiasWiden match { - case NoPrefix => - 0 - case SingleType(pre, sym) => - if (sym.isPackage) 0 else complexity(tp.dealiasWiden) - case TypeRef(pre, sym, args) => - complexity(pre) + sum(args map complexity) + 1 - case RefinedType(parents, _) => - sum(parents map complexity) + 1 - case _ => - 1 + def complexity(tp: Type): Int = tp.dealias match { + case NoPrefix => 0 + case SingleType(pre, sym) => if (sym.isPackage) 0 else complexity(tp.dealiasWiden) + case ThisType(sym) => if (sym.isPackage) 0 else 1 + case TypeRef(pre, sym, args) => complexity(pre) + (args map complexity).sum + 1 + case RefinedType(parents, _) => (parents map complexity).sum + 1 + case _ => 1 } def overlaps(tp1: Type, tp2: Type): Boolean = (tp1, tp2) match { case (RefinedType(parents, _), _) => parents exists (overlaps(_, tp2)) case (_, RefinedType(parents, _)) => parents exists (overlaps(tp1, _)) - case _ => tp1.typeSymbol == tp2.typeSymbol + case _ => tp1.typeSymbol == tp2.typeSymbol } val dtor1 = stripped(core(dtor)) val dted1 = stripped(core(dted)) @@ -664,6 +659,8 @@ trait Implicits { if (context.hasErrors) fail("hasMatchingSymbol reported error: " + context.firstError.get.errMsg) + else if (itree3.isErroneous) + fail("error typechecking implicit candidate") else if (isLocal && !hasMatchingSymbol(itree2)) fail("candidate implicit %s is shadowed by %s".format( info.sym.fullLocationString, itree2.symbol.fullLocationString)) diff --git a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala index 03aad71165..46ff98875f 100644 --- a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala +++ b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala @@ -162,7 +162,7 @@ trait NamesDefaults { self: Analyzer => // never used for constructor calls, they always have a stable qualifier def blockWithQualifier(qual: Tree, selected: Name) = { - val sym = blockTyper.context.owner.newValue(unit.freshTermName("qual$"), qual.pos, newFlags = ARTIFACT) setInfo uncheckedBounds(qual.tpe) + val sym = blockTyper.context.owner.newValue(unit.freshTermName("qual$"), newFlags = ARTIFACT) setInfo uncheckedBounds(qual.tpe) setPos (qual.pos.makeTransparent) blockTyper.context.scope enter sym val vd = atPos(sym.pos)(ValDef(sym, qual) setType NoType) // it stays in Vegas: SI-5720, SI-5727 @@ -173,13 +173,16 @@ trait NamesDefaults { self: Analyzer => // setSymbol below is important because the 'selected' function might be overloaded. by // assigning the correct method symbol, typedSelect will just assign the type. the reason // to still call 'typed' is to correctly infer singleton types, SI-5259. - val f = blockTyper.typedOperator(Select(newQual, selected).setSymbol(baseFun1.symbol)) + val selectPos = + if(qual.pos.isRange && baseFun.pos.isRange) qual.pos.union(baseFun.pos).withStart(Math.min(qual.pos.end, baseFun.pos.end)) + else baseFun.pos + val f = blockTyper.typedOperator(Select(newQual, selected).setSymbol(baseFun1.symbol).setPos(selectPos)) if (funTargs.isEmpty) f else TypeApply(f, funTargs).setType(baseFun.tpe) } val b = Block(List(vd), baseFunTransformed) - .setType(baseFunTransformed.tpe).setPos(baseFun.pos) + .setType(baseFunTransformed.tpe).setPos(baseFun.pos.makeTransparent) context.namedApplyBlockInfo = Some((b, NamedApplyInfo(Some(newQual), defaultTargs, Nil, blockTyper))) b diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index fa704adde2..8594309818 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -5051,7 +5051,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper // @M: fun is typed in TAPPmode because it is being applied to its actual type parameters val fun1 = typed(fun, mode.forFunMode | TAPPmode) - val tparams = fun1.symbol.typeParams + val tparams = if (fun1.symbol == null) Nil else fun1.symbol.typeParams //@M TODO: val undets_fun = context.undetparams ? // "do args first" (by restoring the context.undetparams) in order to maintain context.undetparams on the function side. diff --git a/src/compiler/scala/tools/nsc/util/package.scala b/src/compiler/scala/tools/nsc/util/package.scala index cb46004174..4237f36ade 100644 --- a/src/compiler/scala/tools/nsc/util/package.scala +++ b/src/compiler/scala/tools/nsc/util/package.scala @@ -90,51 +90,22 @@ package object util { lazy val trace = new SimpleTracer(System.out) - @deprecated("Moved to scala.reflect.internal.util.StringOps", "2.10.0") - val StringOps = scala.reflect.internal.util.StringOps - - @deprecated("Moved to scala.reflect.internal.util.StringOps", "2.10.0") - type StringOps = scala.reflect.internal.util.StringOps - - @deprecated("scala.reflect.internal.util.WeakHashSet", "2.10.0") - type WeakHashSet[T <: AnyRef] = scala.reflect.internal.util.WeakHashSet[T] - - @deprecated("Moved to scala.reflect.internal.util.Position", "2.10.0") - val Position = scala.reflect.internal.util.Position - + // These four deprecated since 2.10.0 are still used in (at least) + // the sbt 0.12.4 compiler interface. @deprecated("Moved to scala.reflect.internal.util.Position", "2.10.0") type Position = scala.reflect.internal.util.Position - @deprecated("Moved to scala.reflect.internal.util.NoPosition", "2.10.0") val NoPosition = scala.reflect.internal.util.NoPosition - @deprecated("Moved to scala.reflect.internal.util.FakePos", "2.10.0") val FakePos = scala.reflect.internal.util.FakePos - @deprecated("Moved to scala.reflect.internal.util.FakePos", "2.10.0") type FakePos = scala.reflect.internal.util.FakePos - @deprecated("Moved to scala.reflect.internal.util.OffsetPosition", "2.10.0") - type OffsetPosition = scala.reflect.internal.util.OffsetPosition - + // These three were still used in scala-refactoring. @deprecated("Moved to scala.reflect.internal.util.RangePosition", "2.10.0") type RangePosition = scala.reflect.internal.util.RangePosition - @deprecated("Moved to scala.reflect.internal.util.SourceFile", "2.10.0") type SourceFile = scala.reflect.internal.util.SourceFile - - @deprecated("Moved to scala.reflect.internal.util.NoSourceFile", "2.10.0") - val NoSourceFile = scala.reflect.internal.util.NoSourceFile - - @deprecated("Moved to scala.reflect.internal.util.NoFile", "2.10.0") - val NoFile = scala.reflect.internal.util.NoFile - - @deprecated("Moved to scala.reflect.internal.util.ScriptSourceFile", "2.10.0") - val ScriptSourceFile = scala.reflect.internal.util.ScriptSourceFile - - @deprecated("Moved to scala.reflect.internal.util.ScriptSourceFile", "2.10.0") - type ScriptSourceFile = scala.reflect.internal.util.ScriptSourceFile - @deprecated("Moved to scala.reflect.internal.util.BatchSourceFile", "2.10.0") type BatchSourceFile = scala.reflect.internal.util.BatchSourceFile diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala b/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala index 3901184c25..126c14ac81 100644 --- a/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala +++ b/src/compiler/scala/tools/reflect/quasiquotes/Parsers.scala @@ -55,9 +55,7 @@ trait Parsers { self: Quasiquotes => def isHole(name: Name): Boolean = holeMap.contains(name) - override implicit def fresh: FreshNameCreator = new FreshNameCreator { - override def newName(prefix: String) = super.newName(nme.QUASIQUOTE_PREFIX + prefix) - } + override implicit def fresh: FreshNameCreator = new FreshNameCreator(nme.QUASIQUOTE_PREFIX) override val treeBuilder = new ParserTreeBuilder { override implicit def fresh: FreshNameCreator = parser.fresh @@ -189,19 +187,5 @@ trait Parsers { self: Quasiquotes => } } - // Extractor that matches names which were generated by call to - // freshTermName or freshTypeName within quasiquotes. Such names - // have qq$some$random$prefix$0 shape where qq$ part is added - // by modified fresh name creator in QuasiquoteParser. - object FreshName { - def unapply(name: Name): Option[String] = - name.toString.split("\\$").toSeq match { - case qq +: (middle :+ last) - if qq + "$" == nme.QUASIQUOTE_PREFIX - && Try(last.toInt).isSuccess && middle.nonEmpty => - Some(middle.mkString("", "$", "$")) - case _ => - None - } - } + object FreshName extends FreshNameExtractor(nme.QUASIQUOTE_PREFIX) }
\ No newline at end of file diff --git a/src/eclipse/partest/.classpath b/src/eclipse/partest/.classpath index e2a66118b9..35528a276d 100644 --- a/src/eclipse/partest/.classpath +++ b/src/eclipse/partest/.classpath @@ -5,7 +5,7 @@ <classpathentry combineaccessrules="false" kind="src" path="/repl"/> <classpathentry kind="var" path="M2_REPO/com/googlecode/java-diff-utils/diffutils/1.3.0/diffutils-1.3.0.jar"/> <classpathentry kind="var" path="M2_REPO/org/scala-tools/testing/test-interface/0.5/test-interface-0.5.jar"/> - <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11.0-M6/1.0.0-RC7/scala-partest_2.11.0-M6-1.0.0-RC7.jar"/> + <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11.0-M7/1.0.0-RC8/scala-partest_2.11.0-M7-1.0.0-RC8.jar"/> <classpathentry kind="var" path="SCALA_BASEDIR/lib/ant/ant.jar"/> <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_CONTAINER"/> <classpathentry kind="con" path="org.scala-ide.sdt.launching.SCALA_COMPILER_CONTAINER"/> diff --git a/src/eclipse/scaladoc/.classpath b/src/eclipse/scaladoc/.classpath index ac67fd2b03..c8f0e89b8a 100644 --- a/src/eclipse/scaladoc/.classpath +++ b/src/eclipse/scaladoc/.classpath @@ -6,8 +6,8 @@ <classpathentry combineaccessrules="false" kind="src" path="/scala-compiler"/> <classpathentry combineaccessrules="false" kind="src" path="/scala-library"/> <classpathentry combineaccessrules="false" kind="src" path="/partest-extras"/> - <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-xml_2.11.0-M6/1.0.0-RC6/scala-xml_2.11.0-M6-1.0.0-RC6.jar"/> - <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-parser-combinators_2.11.0-M6/1.0.0-RC4/scala-parser-combinators_2.11.0-M6-1.0.0-RC4.jar"/> - <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11.0-M6/1.0.0-RC7/scala-partest_2.11.0-M6-1.0.0-RC7.jar"/> + <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-xml_2.11.0-M7/1.0.0-RC7/scala-xml_2.11.0-M7-1.0.0-RC7.jar"/> + <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-parser-combinators_2.11.0-M7/1.0.0-RC5/scala-parser-combinators_2.11.0-M7-1.0.0-RC5.jar"/> + <classpathentry kind="var" path="M2_REPO/org/scala-lang/modules/scala-partest_2.11.0-M7/1.0.0-RC8/scala-partest_2.11.0-M7-1.0.0-RC8.jar"/> <classpathentry kind="output" path="build-quick-scaladoc"/> </classpath> diff --git a/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala b/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala index d036a6e853..69cae24808 100644 --- a/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala +++ b/src/interactive/scala/tools/nsc/interactive/CompilerControl.scala @@ -62,17 +62,6 @@ trait CompilerControl { self: Global => def onUnitOf[T](source: SourceFile)(op: RichCompilationUnit => T): T = op(unitOfFile.getOrElse(source.file, new RichCompilationUnit(source))) - /** The compilation unit corresponding to a source file - * if it does not yet exist create a new one atomically - * Note: We want to get roid of this operation as it messes compiler invariants. - */ - @deprecated("use getUnitOf(s) or onUnitOf(s) instead", "2.10.0") - def unitOf(s: SourceFile): RichCompilationUnit = getOrCreateUnitOf(s) - - /** The compilation unit corresponding to a position */ - @deprecated("use getUnitOf(pos.source) or onUnitOf(pos.source) instead", "2.10.0") - def unitOf(pos: Position): RichCompilationUnit = getOrCreateUnitOf(pos.source) - /** Removes the CompilationUnit corresponding to the given SourceFile * from consideration for recompilation. */ @@ -229,18 +218,6 @@ trait CompilerControl { self: Global => def askParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) = postWorkItem(new AskParsedEnteredItem(source, keepLoaded, response)) - /** Set sync var `response` to a pair consisting of - * - the fully qualified name of the first top-level object definition in the file. - * or "" if there are no object definitions. - * - the text of the instrumented program which, when run, - * prints its output and all defined values in a comment column. - * - * @param source The source file to be analyzed - * @param response The response. - */ - @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") - def askInstrumented(source: SourceFile, line: Int, response: Response[(String, Array[Char])]) = - postWorkItem(new AskInstrumentedItem(source, line, response)) /** Cancels current compiler run and start a fresh one where everything will be re-typechecked * (but not re-loaded). @@ -250,11 +227,6 @@ trait CompilerControl { self: Global => /** Tells the compile server to shutdown, and not to restart again */ def askShutdown() = scheduler raise ShutdownReq - @deprecated("use parseTree(source) instead", "2.10.0") // deleted 2nd parameter, as this has to run on 2.8 also. - def askParse(source: SourceFile, response: Response[Tree]) = respond(response) { - parseTree(source) - } - /** Returns parse tree for source `source`. No symbols are entered. Syntax errors are reported. * * This method is thread-safe and as such can safely run outside of the presentation @@ -419,15 +391,6 @@ trait CompilerControl { self: Global => response raise new MissingResponse } - @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") - case class AskInstrumentedItem(source: SourceFile, line: Int, response: Response[(String, Array[Char])]) extends WorkItem { - def apply() = self.getInstrumented(source, line, response) - override def toString = "getInstrumented "+source - - def raiseMissing() = - response raise new MissingResponse - } - /** A do-nothing work scheduler that responds immediately with MissingResponse. * * Used during compiler shutdown. diff --git a/src/interactive/scala/tools/nsc/interactive/ContextTrees.scala b/src/interactive/scala/tools/nsc/interactive/ContextTrees.scala index 93ef4c4d6c..4f67a22b8f 100644 --- a/src/interactive/scala/tools/nsc/interactive/ContextTrees.scala +++ b/src/interactive/scala/tools/nsc/interactive/ContextTrees.scala @@ -6,6 +6,7 @@ package scala.tools.nsc package interactive import scala.collection.mutable.ArrayBuffer +import scala.annotation.tailrec trait ContextTrees { self: Global => @@ -28,44 +29,59 @@ trait ContextTrees { self: Global => override def toString = "ContextTree("+pos+", "+children+")" } - /** Optionally returns the smallest context that contains given `pos`, or None if none exists. + /** Returns the most precise context possible for the given `pos`. + * + * It looks for the finest ContextTree containing `pos`, and then look inside + * this ContextTree for a child ContextTree located immediately before `pos`. + * If such a child exists, returns its context, otherwise returns the context of + * the parent ContextTree. + * + * This is required to always return a context which contains the all the imports + * declared up to `pos` (see SI-7280 for a test case). + * + * Can return None if `pos` is before any valid Scala code. */ def locateContext(contexts: Contexts, pos: Position): Option[Context] = synchronized { - def locateNearestContextTree(contexts: Contexts, pos: Position, recent: Array[ContextTree]): Option[ContextTree] = { - locateContextTree(contexts, pos) match { - case Some(x) => - recent(0) = x - locateNearestContextTree(x.children, pos, recent) - case None => recent(0) match { - case null => None - case x => Some(x) - } + @tailrec + def locateFinestContextTree(context: ContextTree): ContextTree = { + if (context.pos includes pos) { + locateContextTree(context.children, pos) match { + case Some(x) => + locateFinestContextTree(x) + case None => + context + } + } else { + context } } - locateNearestContextTree(contexts, pos, new Array[ContextTree](1)) map (_.context) + locateContextTree(contexts, pos) map locateFinestContextTree map (_.context) } + /** Returns the ContextTree containing `pos`, or the ContextTree positioned just before `pos`, + * or None if `pos` is located before all ContextTrees. + */ def locateContextTree(contexts: Contexts, pos: Position): Option[ContextTree] = { if (contexts.isEmpty) None else { - val hi = contexts.length - 1 - if ((contexts(hi).pos properlyPrecedes pos) || (pos properlyPrecedes contexts(0).pos)) None - else { - def loop(lo: Int, hi: Int): Option[ContextTree] = { + @tailrec + def loop(lo: Int, hi: Int, previousSibling: Option[ContextTree]): Option[ContextTree] = { + if (pos properlyPrecedes contexts(lo).pos) + previousSibling + else if (contexts(hi).pos properlyPrecedes pos) + Some(contexts(hi)) + else { val mid = (lo + hi) / 2 val midpos = contexts(mid).pos - if ((pos precedes midpos) && (mid < hi)) - loop(lo, mid) - else if ((midpos precedes pos) && (lo < mid)) - loop(mid, hi) - else if (midpos includes pos) + if (midpos includes pos) Some(contexts(mid)) - else if (contexts(mid+1).pos includes pos) - Some(contexts(mid+1)) - else None + else if (midpos properlyPrecedes pos) + loop(mid + 1, hi, Some(contexts(mid))) + else + loop(lo, mid, previousSibling) } - loop(0, hi) } + loop(0, contexts.length - 1, None) } } diff --git a/src/interactive/scala/tools/nsc/interactive/Global.scala b/src/interactive/scala/tools/nsc/interactive/Global.scala index da838e0f83..441398e443 100644 --- a/src/interactive/scala/tools/nsc/interactive/Global.scala +++ b/src/interactive/scala/tools/nsc/interactive/Global.scala @@ -18,6 +18,7 @@ import symtab.Flags.{ACCESSOR, PARAMACCESSOR} import scala.annotation.{ elidable, tailrec } import scala.language.implicitConversions import scala.tools.nsc.typechecker.Typers +import scala.util.control.Breaks._ /** * This trait allows the IDE to have an instance of the PC that @@ -100,7 +101,6 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") with CompilerControl with ContextTrees with RichCompilationUnits - with ScratchPadMaker with Picklers { import definitions._ @@ -406,85 +406,91 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") * */ private[interactive] def pollForWork(pos: Position) { - if (!interruptsEnabled) return - if (pos == NoPosition || nodesSeen % yieldPeriod == 0) - Thread.`yield`() - - def nodeWithWork(): Option[WorkEvent] = - if (scheduler.moreWork || pendingResponse.isCancelled) Some(new WorkEvent(nodesSeen, System.currentTimeMillis)) - else None - - nodesSeen += 1 - logreplay("atnode", nodeWithWork()) match { - case Some(WorkEvent(id, _)) => - debugLog("some work at node "+id+" current = "+nodesSeen) -// assert(id >= nodesSeen) - moreWorkAtNode = id - case None => - } + var loop: Boolean = true + while (loop) { + breakable{ + loop = false + if (!interruptsEnabled) return + if (pos == NoPosition || nodesSeen % yieldPeriod == 0) + Thread.`yield`() + + def nodeWithWork(): Option[WorkEvent] = + if (scheduler.moreWork || pendingResponse.isCancelled) Some(new WorkEvent(nodesSeen, System.currentTimeMillis)) + else None + + nodesSeen += 1 + logreplay("atnode", nodeWithWork()) match { + case Some(WorkEvent(id, _)) => + debugLog("some work at node "+id+" current = "+nodesSeen) + // assert(id >= nodesSeen) + moreWorkAtNode = id + case None => + } - if (nodesSeen >= moreWorkAtNode) { - - logreplay("asked", scheduler.pollInterrupt()) match { - case Some(ir) => - try { - interruptsEnabled = false - debugLog("ask started"+timeStep) - ir.execute() - } finally { - debugLog("ask finished"+timeStep) - interruptsEnabled = true + if (nodesSeen >= moreWorkAtNode) { + + logreplay("asked", scheduler.pollInterrupt()) match { + case Some(ir) => + try { + interruptsEnabled = false + debugLog("ask started"+timeStep) + ir.execute() + } finally { + debugLog("ask finished"+timeStep) + interruptsEnabled = true + } + loop = true; break + case _ => } - pollForWork(pos) - case _ => - } - - if (logreplay("cancelled", pendingResponse.isCancelled)) { - throw CancelException - } - - logreplay("exception thrown", scheduler.pollThrowable()) match { - case Some(ex: FreshRunReq) => - newTyperRun() - minRunId = currentRunId - demandNewCompilerRun() - - case Some(ShutdownReq) => - scheduler.synchronized { // lock the work queue so no more items are posted while we clean it up - val units = scheduler.dequeueAll { - case item: WorkItem => Some(item.raiseMissing()) - case _ => Some(()) - } - - // don't forget to service interrupt requests - scheduler.dequeueAllInterrupts(_.execute()) - - debugLog("ShutdownReq: cleaning work queue (%d items)".format(units.size)) - debugLog("Cleanup up responses (%d loadedType pending, %d parsedEntered pending)" - .format(waitLoadedTypeResponses.size, getParsedEnteredResponses.size)) - checkNoResponsesOutstanding() - log.flush() - scheduler = new NoWorkScheduler - throw ShutdownReq + if (logreplay("cancelled", pendingResponse.isCancelled)) { + throw CancelException } - case Some(ex: Throwable) => log.flush(); throw ex - case _ => - } - - lastWasReload = false + logreplay("exception thrown", scheduler.pollThrowable()) match { + case Some(ex: FreshRunReq) => + newTyperRun() + minRunId = currentRunId + demandNewCompilerRun() + + case Some(ShutdownReq) => + scheduler.synchronized { // lock the work queue so no more items are posted while we clean it up + val units = scheduler.dequeueAll { + case item: WorkItem => Some(item.raiseMissing()) + case _ => Some(()) + } + + // don't forget to service interrupt requests + scheduler.dequeueAllInterrupts(_.execute()) + + debugLog("ShutdownReq: cleaning work queue (%d items)".format(units.size)) + debugLog("Cleanup up responses (%d loadedType pending, %d parsedEntered pending)" + .format(waitLoadedTypeResponses.size, getParsedEnteredResponses.size)) + checkNoResponsesOutstanding() + + log.flush() + scheduler = new NoWorkScheduler + throw ShutdownReq + } + + case Some(ex: Throwable) => log.flush(); throw ex + case _ => + } - logreplay("workitem", scheduler.nextWorkItem()) match { - case Some(action) => - try { - debugLog("picked up work item at "+pos+": "+action+timeStep) - action() - debugLog("done with work item: "+action) - } finally { - debugLog("quitting work item: "+action+timeStep) + lastWasReload = false + + logreplay("workitem", scheduler.nextWorkItem()) match { + case Some(action) => + try { + debugLog("picked up work item at "+pos+": "+action+timeStep) + action() + debugLog("done with work item: "+action) + } finally { + debugLog("quitting work item: "+action+timeStep) + } + case None => } - case None => + } } } } @@ -1171,18 +1177,6 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "") } } - @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") - def getInstrumented(source: SourceFile, line: Int, response: Response[(String, Array[Char])]) { - try { - interruptsEnabled = false - respond(response) { - instrument(source, line) - } - } finally { - interruptsEnabled = true - } - } - // ---------------- Helper classes --------------------------- /** The typer run */ diff --git a/src/interactive/scala/tools/nsc/interactive/REPL.scala b/src/interactive/scala/tools/nsc/interactive/REPL.scala index 33981771ec..8e9b0ceee0 100644 --- a/src/interactive/scala/tools/nsc/interactive/REPL.scala +++ b/src/interactive/scala/tools/nsc/interactive/REPL.scala @@ -9,7 +9,6 @@ package interactive import scala.reflect.internal.util._ import scala.tools.nsc.reporters._ import scala.tools.nsc.io._ -import scala.tools.nsc.scratchpad.SourceInserter import java.io.FileWriter /** Interface of interactive compiler to a client such as an IDE @@ -89,8 +88,6 @@ object REPL { val completeResult = new Response[List[comp.Member]] val typedResult = new Response[comp.Tree] val structureResult = new Response[comp.Tree] - @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") - val instrumentedResult = new Response[(String, Array[Char])] def makePos(file: String, off1: String, off2: String) = { val source = toSourceFile(file) @@ -112,52 +109,6 @@ object REPL { show(structureResult) } - /** Write instrumented source file to disk. - * @param iFullName The full name of the first top-level object in source - * @param iContents An Array[Char] containing the instrumented source - * @return The name of the instrumented source file - */ - @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") - def writeInstrumented(iFullName: String, suffix: String, iContents: Array[Char]): String = { - val iSimpleName = iFullName drop ((iFullName lastIndexOf '.') + 1) - val iSourceName = iSimpleName + suffix - val ifile = new FileWriter(iSourceName) - ifile.write(iContents) - ifile.close() - iSourceName - } - - /** The method for implementing worksheet functionality. - * @param arguments a file name, followed by optional command line arguments that are passed - * to the compiler that processes the instrumented source. - * @param line A line number that controls uop to which line results should be produced - * If line = -1, results are produced for all expressions in the worksheet. - * @return The generated file content containing original source in the left column - * and outputs in the right column, or None if the presentation compiler - * does not respond to askInstrumented. - */ - @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") - def instrument(arguments: List[String], line: Int): Option[(String, String)] = { - val source = toSourceFile(arguments.head) - // strip right hand side comment column and any trailing spaces from all lines - val strippedContents = SourceInserter.stripRight(source.content) - val strippedSource = new BatchSourceFile(source.file, strippedContents) - println("stripped source = "+strippedSource+":"+strippedContents.mkString) - comp.askReload(List(strippedSource), reloadResult) - comp.askInstrumented(strippedSource, line, instrumentedResult) - using(instrumentedResult) { - case (iFullName, iContents) => - println(s"instrumented source $iFullName = ${iContents.mkString}") - val iSourceName = writeInstrumented(iFullName, "$instrumented.scala", iContents) - val sSourceName = writeInstrumented(iFullName, "$stripped.scala", strippedContents) - (iSourceName, sSourceName) -/* - * val vdirOpt = compileInstrumented(iSourceName, arguments.tail) - runInstrumented(vdirOpt, iFullName, strippedSource.content) - */ - } - } - loop { line => (line split " ").toList match { case "reload" :: args => @@ -177,10 +128,6 @@ object REPL { doComplete(makePos(file, off1, off2)) case List("complete", file, off1) => doComplete(makePos(file, off1, off1)) - case "instrument" :: arguments => - println(instrument(arguments, -1)) - case "instrumentTo" :: line :: arguments => - println(instrument(arguments, line.toInt)) case List("quit") => comp.askShutdown() sys.exit(1) @@ -195,8 +142,6 @@ object REPL { | typeat <file> <pos> | complete <file> <start-pos> <end-pos> | compile <file> <pos> - | instrument <file> <arg>* - | instrumentTo <line-num> <file> <arg>* | structure <file> | quit |""".stripMargin) diff --git a/src/interactive/scala/tools/nsc/interactive/ScratchPadMaker.scala b/src/interactive/scala/tools/nsc/interactive/ScratchPadMaker.scala deleted file mode 100644 index 2400b97d97..0000000000 --- a/src/interactive/scala/tools/nsc/interactive/ScratchPadMaker.scala +++ /dev/null @@ -1,201 +0,0 @@ -package scala -package tools.nsc -package interactive - -import scala.reflect.internal.util.{SourceFile, BatchSourceFile, RangePosition} -import scala.collection.mutable.ArrayBuffer -import scala.reflect.internal.Chars.{isLineBreakChar, isWhitespace} -import ast.parser.Tokens._ - -@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") -trait ScratchPadMaker { self: Global => - - import definitions._ - - private case class Patch(offset: Int, text: String) - - private class Patcher(contents: Array[Char], lex: LexicalStructure, endOffset: Int) extends Traverser { - var objectName: String = "" - - private val patches = new ArrayBuffer[Patch] - private val toPrint = new ArrayBuffer[String] - private var skipped = 0 - private var resNum: Int = -1 - - private def nextRes(): String = { - resNum += 1 - "res$"+resNum - } - - private def nameType(name: String, tpe: Type): String = { - // if name ends in symbol character, add a space to separate it from the following ':' - val pad = if (Character.isLetter(name.last) || Character.isDigit(name.last)) "" else " " - name+pad+": "+tpe - } - - private def nameType(sym: Symbol): String = nameType(sym.name.decoded, sym.tpe) - - private def literal(str: String) = "\"\"\""+str+"\"\"\"" - - private val prologue = ";import scala.runtime.WorksheetSupport._; def main(args: Array[String])=$execute{" - - private val epilogue = "}" - - private def applyPendingPatches(offset: Int) = { - if (skipped == 0) patches += Patch(offset, prologue) - for (msg <- toPrint) patches += Patch(offset, ";System.out.println("+msg+")") - toPrint.clear() - } - - /** The position where to insert an instrumentation statement in front of given statement. - * This is at the latest `stat.pos.start`. But in order not to mess with column numbers - * in position we try to insert it at the end of the previous token instead. - * Furthermore, `(' tokens have to be skipped because they do not show up - * in statement range positions. - */ - private def instrumentPos(start: Int): Int = { - val (prevToken, prevStart, prevEnd) = lex.locate(start - 1) - if (prevStart >= start) start - else if (prevToken == LPAREN) instrumentPos(prevStart) - else prevEnd - } - - private def addSkip(stat: Tree): Unit = { - val ipos = instrumentPos(stat.pos.start) - if (stat.pos.start > skipped) applyPendingPatches(ipos) - if (stat.pos.start >= endOffset) - patches += Patch(ipos, ";$stop()") - var end = stat.pos.end - if (end > skipped) { - while (end < contents.length && !isLineBreakChar(contents(end))) end += 1 - patches += Patch(ipos, ";$skip("+(end-skipped)+"); ") - skipped = end - } - } - - private def addSandbox(expr: Tree) = {} -// patches += (Patch(expr.pos.start, "sandbox("), Patch(expr.pos.end, ")")) - - private def resultString(prefix: String, expr: String) = - literal(prefix + " = ") + " + $show(" + expr + ")" - - private def traverseStat(stat: Tree) = - if (stat.pos.isInstanceOf[RangePosition]) { - stat match { - case ValDef(_, _, _, rhs) => - addSkip(stat) - if (stat.symbol.isLazy) - toPrint += literal(nameType(stat.symbol) + " = <lazy>") - else if (!stat.symbol.isSynthetic) { - addSandbox(rhs) - toPrint += resultString(nameType(stat.symbol), stat.symbol.name.toString) - } - case DefDef(_, _, _, _, _, _) => - addSkip(stat) - toPrint += literal(nameType(stat.symbol)) - case Annotated(_, arg) => - traverse(arg) - case DocDef(_, defn) => - traverse(defn) - case _ => - if (stat.isTerm) { - addSkip(stat) - if (stat.tpe.typeSymbol == UnitClass) { - addSandbox(stat) - } else { - val resName = nextRes() - val dispResName = resName filter ('$' != _) - val offset = instrumentPos(stat.pos.start) - patches += Patch(offset, "val " + resName + " = ") - addSandbox(stat) - toPrint += resultString(nameType(dispResName, stat.tpe), resName) - } - } - } - } - - override def traverse(tree: Tree): Unit = tree match { - case PackageDef(_, _) => - super.traverse(tree) - case ModuleDef(_, name, Template(_, _, body)) => - val topLevel = objectName.isEmpty - if (topLevel) { - objectName = tree.symbol.fullName - body foreach traverseStat - if (skipped != 0) { // don't issue prologue and epilogue if there are no instrumented statements - applyPendingPatches(skipped) - patches += Patch(skipped, epilogue) - } - } - case _ => - } - - /** The patched text. - * @require traverse is run first - */ - def result: Array[Char] = { - val reslen = contents.length + (patches map (_.text.length)).sum - val res = Array.ofDim[Char](reslen) - var lastOffset = 0 - var from = 0 - var to = 0 - for (Patch(offset, text) <- patches) { - val delta = offset - lastOffset - assert(delta >= 0) - Array.copy(contents, from, res, to, delta) - from += delta - to += delta - lastOffset = offset - text.copyToArray(res, to) - to += text.length - } - assert(contents.length - from == reslen - to) - Array.copy(contents, from, res, to, contents.length - from) - res - } - } - - class LexicalStructure(source: SourceFile) { - val token = new ArrayBuffer[Int] - val startOffset = new ArrayBuffer[Int] - val endOffset = new ArrayBuffer[Int] - private val scanner = new syntaxAnalyzer.UnitScanner(new CompilationUnit(source)) - scanner.init() - while (scanner.token != EOF) { - startOffset += scanner.offset - token += scanner.token - scanner.nextToken() - endOffset += scanner.lastOffset - } - - /** @return token that starts before or at offset, its startOffset, its endOffset - */ - def locate(offset: Int): (Int, Int, Int) = { - var lo = 0 - var hi = token.length - 1 - while (lo < hi) { - val mid = (lo + hi + 1) / 2 - if (startOffset(mid) <= offset) lo = mid - else hi = mid - 1 - } - (token(lo), startOffset(lo), endOffset(lo)) - } - } - - /** Compute an instrumented version of a sourcefile. - * @param source The given sourcefile. - * @param line The line up to which results should be printed, -1 = whole document. - * @return A pair consisting of - * - the fully qualified name of the first top-level object definition in the file. - * or "" if there are no object definitions. - * - the text of the instrumented program which, when run, - * prints its output and all defined values in a comment column. - */ - protected def instrument(source: SourceFile, line: Int): (String, Array[Char]) = { - val tree = typedTree(source, forceReload = true) - val endOffset = if (line < 0) source.length else source.lineToOffset(line + 1) - val patcher = new Patcher(source.content, new LexicalStructure(source), endOffset) - patcher.traverse(tree) - (patcher.objectName, patcher.result) - } -} diff --git a/src/interactive/scala/tools/nsc/interactive/tests/InteractiveTest.scala b/src/interactive/scala/tools/nsc/interactive/tests/InteractiveTest.scala index f30d896fb7..2cb4f5fd4a 100644 --- a/src/interactive/scala/tools/nsc/interactive/tests/InteractiveTest.scala +++ b/src/interactive/scala/tools/nsc/interactive/tests/InteractiveTest.scala @@ -61,7 +61,7 @@ abstract class InteractiveTest * Override this member if you need to change the default set of executed test actions. */ protected lazy val testActions: ListBuffer[PresentationCompilerTestDef] = { - ListBuffer(new CompletionAction(compiler), new TypeAction(compiler), new HyperlinkAction(compiler)) + ListBuffer(new TypeCompletionAction(compiler), new ScopeCompletionAction(compiler), new TypeAction(compiler), new HyperlinkAction(compiler)) } /** Add new presentation compiler actions to test. Presentation compiler's test diff --git a/src/interactive/scala/tools/nsc/interactive/tests/core/AskCommand.scala b/src/interactive/scala/tools/nsc/interactive/tests/core/AskCommand.scala index 8d446cbbf8..4f9df6808f 100644 --- a/src/interactive/scala/tools/nsc/interactive/tests/core/AskCommand.scala +++ b/src/interactive/scala/tools/nsc/interactive/tests/core/AskCommand.scala @@ -42,7 +42,7 @@ trait AskParse extends AskCommand { import compiler.Tree /** `sources` need to be entirely parsed before running the test - * (else commands such as `AskCompletionAt` may fail simply because + * (else commands such as `AskTypeCompletionAt` may fail simply because * the source's AST is not yet loaded). */ def askParse(sources: Seq[SourceFile]) { @@ -72,10 +72,10 @@ trait AskReload extends AskCommand { } /** Ask the presentation compiler for completion at a given position. */ -trait AskCompletionAt extends AskCommand { +trait AskTypeCompletionAt extends AskCommand { import compiler.Member - private[tests] def askCompletionAt(pos: Position)(implicit reporter: Reporter): Response[List[Member]] = { + private[tests] def askTypeCompletionAt(pos: Position)(implicit reporter: Reporter): Response[List[Member]] = { reporter.println("\naskTypeCompletion at " + pos.source.file.name + ((pos.line, pos.column))) ask { @@ -84,6 +84,19 @@ trait AskCompletionAt extends AskCommand { } } +/** Ask the presentation compiler for scope completion at a given position. */ +trait AskScopeCompletionAt extends AskCommand { + import compiler.Member + + private[tests] def askScopeCompletionAt(pos: Position)(implicit reporter: Reporter): Response[List[Member]] = { + reporter.println("\naskScopeCompletion at " + pos.source.file.name + ((pos.line, pos.column))) + + ask { + compiler.askScopeCompletion(pos, _) + } + } +} + /** Ask the presentation compiler for type info at a given position. */ trait AskTypeAt extends AskCommand { import compiler.Tree diff --git a/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala b/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala index e28bf20745..bc490d8d45 100644 --- a/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala +++ b/src/interactive/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala @@ -12,16 +12,16 @@ private[tests] trait CoreTestDefs /** Ask the presentation compiler for completion at all locations * (in all sources) where the defined `marker` is found. */ - class CompletionAction(override val compiler: Global) + class TypeCompletionAction(override val compiler: Global) extends PresentationCompilerTestDef - with AskCompletionAt { + with AskTypeCompletionAt { override def runTest() { - askAllSources(CompletionMarker) { pos => - askCompletionAt(pos) + askAllSources(TypeCompletionMarker) { pos => + askTypeCompletionAt(pos) } { (pos, members) => withResponseDelimiter { - reporter.println("[response] askCompletionAt " + format(pos)) + reporter.println("[response] askTypeCompletion at " + format(pos)) // we skip getClass because it changed signature between 1.5 and 1.6, so there is no // universal check file that we can provide for this to work reporter.println("retrieved %d members".format(members.size)) @@ -34,6 +34,37 @@ private[tests] trait CoreTestDefs } } + /** Ask the presentation compiler for completion at all locations + * (in all sources) where the defined `marker` is found. */ + class ScopeCompletionAction(override val compiler: Global) + extends PresentationCompilerTestDef + with AskScopeCompletionAt { + + override def runTest() { + askAllSources(ScopeCompletionMarker) { pos => + askScopeCompletionAt(pos) + } { (pos, members) => + withResponseDelimiter { + reporter.println("[response] askScopeCompletion at " + format(pos)) + try { + // exclude members not from source (don't have position), for more focused and self contained tests. + def eligible(sym: compiler.Symbol) = sym.pos != compiler.NoPosition + val filtered = members.filter(member => eligible(member.sym)) + + reporter.println("retrieved %d members".format(filtered.size)) + compiler ask { () => + reporter.println(filtered.map(_.forceInfoString).sorted mkString "\n") + } + } catch { + case t: Throwable => + t.printStackTrace() + } + + } + } + } + } + /** Ask the presentation compiler for type info at all locations * (in all sources) where the defined `marker` is found. */ class TypeAction(override val compiler: Global) @@ -57,7 +88,7 @@ private[tests] trait CoreTestDefs class HyperlinkAction(override val compiler: Global) extends PresentationCompilerTestDef with AskTypeAt - with AskCompletionAt { + with AskTypeCompletionAt { override def runTest() { askAllSources(HyperlinkMarker) { pos => diff --git a/src/interactive/scala/tools/nsc/interactive/tests/core/TestMarker.scala b/src/interactive/scala/tools/nsc/interactive/tests/core/TestMarker.scala index a5c228a549..3f9b40277c 100644 --- a/src/interactive/scala/tools/nsc/interactive/tests/core/TestMarker.scala +++ b/src/interactive/scala/tools/nsc/interactive/tests/core/TestMarker.scala @@ -20,7 +20,9 @@ abstract case class TestMarker(marker: String) { TestMarker.checkForDuplicate(this) } -object CompletionMarker extends TestMarker("/*!*/") +object TypeCompletionMarker extends TestMarker("/*!*/") + +object ScopeCompletionMarker extends TestMarker("/*_*/") object TypeMarker extends TestMarker("/*?*/") diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala index cd96b5182c..8900450fa3 100644 --- a/src/library/scala/Predef.scala +++ b/src/library/scala/Predef.scala @@ -26,8 +26,6 @@ import scala.io.ReadStdin * [[scala.collection.immutable.Set]], and the [[scala.collection.immutable.List]] * constructors ([[scala.collection.immutable.::]] and * [[scala.collection.immutable.Nil]]). - * The types `Pair` (a [[scala.Tuple2]]) and `Triple` (a [[scala.Tuple3]]), with - * simple constructors, are also provided. * * === Console I/O === * Predef provides a number of simple functions for console I/O, such as @@ -230,13 +228,17 @@ object Predef extends LowPriorityImplicits with DeprecatedPredef { // tupling ------------------------------------------------------------ + @deprecated("Use built-in tuple syntax or Tuple2 instead", "2.11.0") type Pair[+A, +B] = Tuple2[A, B] + @deprecated("Use built-in tuple syntax or Tuple2 instead", "2.11.0") object Pair { def apply[A, B](x: A, y: B) = Tuple2(x, y) def unapply[A, B](x: Tuple2[A, B]): Option[Tuple2[A, B]] = Some(x) } + @deprecated("Use built-in tuple syntax or Tuple3 instead", "2.11.0") type Triple[+A, +B, +C] = Tuple3[A, B, C] + @deprecated("Use built-in tuple syntax or Tuple3 instead", "2.11.0") object Triple { def apply[A, B, C](x: A, y: B, z: C) = Tuple3(x, y, z) def unapply[A, B, C](x: Tuple3[A, B, C]): Option[Tuple3[A, B, C]] = Some(x) diff --git a/src/library/scala/Responder.scala b/src/library/scala/Responder.scala index 0a42ddb0ea..8a658e252a 100644 --- a/src/library/scala/Responder.scala +++ b/src/library/scala/Responder.scala @@ -18,6 +18,7 @@ package scala * @see class Responder * @since 2.1 */ +@deprecated("This object will be removed", "2.11.0") object Responder { /** Creates a responder that answer continuations with the constant `a`. @@ -58,6 +59,7 @@ object Responder { * @version 1.0 * @since 2.1 */ +@deprecated("This class will be removed", "2.11.0") abstract class Responder[+A] extends Serializable { def respond(k: A => Unit): Unit diff --git a/src/library/scala/annotation/migration.scala b/src/library/scala/annotation/migration.scala index 65bee4c2cb..e71be00f32 100644 --- a/src/library/scala/annotation/migration.scala +++ b/src/library/scala/annotation/migration.scala @@ -25,7 +25,4 @@ package scala.annotation * * @since 2.8 */ - private[scala] final class migration(message: String, changedIn: String) extends scala.annotation.StaticAnnotation { - @deprecated("Use the constructor taking two Strings instead.", "2.10.0") - def this(majorVersion: Int, minorVersion: Int, message: String) = this(message, majorVersion + "." + minorVersion) - } + private[scala] final class migration(message: String, changedIn: String) extends scala.annotation.StaticAnnotation diff --git a/src/library/scala/collection/immutable/IntMap.scala b/src/library/scala/collection/immutable/IntMap.scala index 07e2ddaae2..8991d0b75a 100644 --- a/src/library/scala/collection/immutable/IntMap.scala +++ b/src/library/scala/collection/immutable/IntMap.scala @@ -213,7 +213,7 @@ sealed abstract class IntMap[+T] extends AbstractMap[Int, T] } /** - * Loop over the keys of the map. The same as `keys.foreach(f)`, but may + * Loop over the values of the map. The same as `values.foreach(f)`, but may * be more efficient. * * @param f The loop body diff --git a/src/library/scala/collection/immutable/LongMap.scala b/src/library/scala/collection/immutable/LongMap.scala index 506546c5ba..868c0c0f47 100644 --- a/src/library/scala/collection/immutable/LongMap.scala +++ b/src/library/scala/collection/immutable/LongMap.scala @@ -205,7 +205,7 @@ extends AbstractMap[Long, T] } /** - * Loop over the keys of the map. The same as keys.foreach(f), but may + * Loop over the values of the map. The same as values.foreach(f), but may * be more efficient. * * @param f The loop body diff --git a/src/library/scala/collection/immutable/Range.scala b/src/library/scala/collection/immutable/Range.scala index 34b2346851..00f398a4b0 100644 --- a/src/library/scala/collection/immutable/Range.scala +++ b/src/library/scala/collection/immutable/Range.scala @@ -117,22 +117,6 @@ extends scala.collection.AbstractSeq[Int] fail() } - @deprecated("Range.foreach() is now self-contained, making this auxiliary method redundant.", "2.10.1") - def validateRangeBoundaries(f: Int => Any): Boolean = { - validateMaxLength() - - start != Int.MinValue || end != Int.MinValue || { - var count = 0 - var num = start - while (count < numRangeElements) { - f(num) - count += 1 - num += step - } - false - } - } - final def apply(idx: Int): Int = { validateMaxLength() if (idx < 0 || idx >= numRangeElements) throw new IndexOutOfBoundsException(idx.toString) diff --git a/src/library/scala/collection/mutable/AnyRefMap.scala b/src/library/scala/collection/mutable/AnyRefMap.scala new file mode 100644 index 0000000000..df74bb5187 --- /dev/null +++ b/src/library/scala/collection/mutable/AnyRefMap.scala @@ -0,0 +1,451 @@ +package scala +package collection +package mutable + +import generic.CanBuildFrom + +/** This class implements mutable maps with `AnyRef` keys based on a hash table with open addressing. + * + * Basic map operations on single entries, including `contains` and `get`, + * are typically significantly faster with `AnyRefMap` than [[HashMap]]. + * Note that numbers and characters are not handled specially in AnyRefMap; + * only plain `equals` and `hashCode` are used in comparisons. + * + * Methods that traverse or regenerate the map, including `foreach` and `map`, + * are not in general faster than with `HashMap`. The methods `foreachKey`, + * `foreachValue`, `mapValuesNow`, and `transformValues` are, however, faster + * than alternative ways to achieve the same functionality. + * + * Maps with open addressing may become less efficient at lookup after + * repeated addition/removal of elements. Although `AnyRefMap` makes a + * decent attempt to remain efficient regardless, calling `repack` + * on a map that will no longer have elements removed but will be + * used heavily may save both time and storage space. + * + * This map is not indended to contain more than 2^29 entries (approximately + * 500 million). The maximum capacity is 2^30, but performance will degrade + * rapidly as 2^30 is approached. + * + */ +final class AnyRefMap[K <: AnyRef, V] private[collection] (defaultEntry: K => V, initialBufferSize: Int, initBlank: Boolean) +extends AbstractMap[K, V] + with Map[K, V] + with MapLike[K, V, AnyRefMap[K, V]] +{ + import AnyRefMap._ + def this() = this(AnyRefMap.exceptionDefault, 16, true) + + /** Creates a new `AnyRefMap` that returns default values according to a supplied key-value mapping. */ + def this(defaultEntry: K => V) = this(defaultEntry, 16, true) + + /** Creates a new `AnyRefMap` with an initial buffer of specified size. + * + * An `AnyRefMap` can typically contain half as many elements as its buffer size + * before it requires resizing. + */ + def this(initialBufferSize: Int) = this(AnyRefMap.exceptionDefault, initialBufferSize, true) + + /** Creates a new `AnyRefMap` with specified default values and initial buffer size. */ + def this(defaultEntry: K => V, initialBufferSize: Int) = this(defaultEntry, initialBufferSize, true) + + private[this] var mask = 0 + private[this] var _size = 0 + private[this] var _vacant = 0 + private[this] var _hashes: Array[Int] = null + private[this] var _keys: Array[AnyRef] = null + private[this] var _values: Array[AnyRef] = null + + if (initBlank) defaultInitialize(initialBufferSize) + + private[this] def defaultInitialize(n: Int) { + mask = + if (n<0) 0x7 + else (((1 << (32 - java.lang.Integer.numberOfLeadingZeros(n-1))) - 1) & 0x3FFFFFFF) | 0x7 + _hashes = new Array[Int](mask+1) + _keys = new Array[AnyRef](mask+1) + _values = new Array[AnyRef](mask+1) + } + + private[collection] def initializeTo( + m: Int, sz: Int, vc: Int, hz: Array[Int], kz: Array[AnyRef], vz: Array[AnyRef] + ) { + mask = m; _size = sz; _vacant = vc; _hashes = hz; _keys = kz; _values = vz + } + + override def size: Int = _size + override def empty: AnyRefMap[K,V] = new AnyRefMap(defaultEntry) + + private def imbalanced: Boolean = + (_size + _vacant) > 0.5*mask || _vacant > _size + + private def hashOf(key: K): Int = { + if (key eq null) 0x41081989 + else { + val h = key.hashCode + // Part of the MurmurHash3 32 bit finalizer + val i = (h ^ (h >>> 16)) * 0x85EBCA6B + val j = (i ^ (i >>> 13)) + if (j==0) 0x41081989 else j & 0x7FFFFFFF + } + } + + private def seekEntry(h: Int, k: AnyRef): Int = { + var e = h & mask + var x = 0 + var g = 0 + while ({ g = _hashes(e); g != 0}) { + if (g == h && { val q = _keys(e); (q eq k) || ((q ne null) && (q equals k)) }) return e + x += 1 + e = (e + 2*(x+1)*x - 3) & mask + } + e | MissingBit + } + + private def seekEntryOrOpen(h: Int, k: AnyRef): Int = { + var e = h & mask + var x = 0 + var g = 0 + var o = -1 + while ({ g = _hashes(e); g != 0}) { + if (g == h && { val q = _keys(e); (q eq k) || ((q ne null) && (q equals k)) }) return e + else if (o == -1 && g+g == 0) o = e + x += 1 + e = (e + 2*(x+1)*x - 3) & mask + } + if (o >= 0) o | MissVacant else e | MissingBit + } + + override def contains(key: K): Boolean = seekEntry(hashOf(key), key) >= 0 + + override def get(key: K): Option[V] = { + val i = seekEntry(hashOf(key), key) + if (i < 0) None else Some(_values(i).asInstanceOf[V]) + } + + override def getOrElse[V1 >: V](key: K, default: => V1): V1 = { + val i = seekEntry(hashOf(key), key) + if (i < 0) default else _values(i).asInstanceOf[V] + } + + override def getOrElseUpdate(key: K, defaultValue: => V): V = { + val h = hashOf(key) + val i = seekEntryOrOpen(h, key) + if (i < 0) { + val value = defaultValue + _size += 1 + val j = i & IndexMask + _hashes(j) = h + _keys(j) = key.asInstanceOf[AnyRef] + _values(j) = value.asInstanceOf[AnyRef] + if ((i & VacantBit) != 0) _vacant -= 1 + else if (imbalanced) repack() + value + } + else _values(i).asInstanceOf[V] + } + + /** Retrieves the value associated with a key, or the default for that type if none exists + * (null for AnyRef, 0 for floats and integers). + * + * Note: this is the fastest way to retrieve a value that may or + * may not exist, if the default null/zero is acceptable. For key/value + * pairs that do exist, `apply` (i.e. `map(key)`) is equally fast. + */ + def getOrNull(key: K): V = { + val i = seekEntry(hashOf(key), key) + (if (i < 0) null else _values(i)).asInstanceOf[V] + } + + /** Retrieves the value associated with a key. + * If the key does not exist in the map, the `defaultEntry` for that key + * will be returned instead; an exception will be thrown if no + * `defaultEntry` was supplied. + */ + override def apply(key: K): V = { + val i = seekEntry(hashOf(key), key) + if (i < 0) defaultEntry(key) else _values(i).asInstanceOf[V] + } + + /** Defers to defaultEntry to find a default value for the key. Throws an + * exception if no other default behavior was specified. + */ + override def default(key: K) = defaultEntry(key) + + private def repack(newMask: Int) { + val oh = _hashes + val ok = _keys + val ov = _values + mask = newMask + _hashes = new Array[Int](mask+1) + _keys = new Array[AnyRef](mask+1) + _values = new Array[AnyRef](mask+1) + _vacant = 0 + var i = 0 + while (i < oh.length) { + val h = oh(i) + if (h+h != 0) { + var e = h & mask + var x = 0 + while (_hashes(e) != 0) { x += 1; e = (e + 2*(x+1)*x - 3) & mask } + _hashes(e) = h + _keys(e) = ok(i) + _values(e) = ov(i) + } + i += 1 + } + } + + /** Repacks the contents of this `AnyRefMap` for maximum efficiency of lookup. + * + * For maps that undergo a complex creation process with both addition and + * removal of keys, and then are used heavily with no further removal of + * elements, calling `repack` after the end of the creation can result in + * improved performance. Repacking takes time proportional to the number + * of entries in the map. + */ + def repack() { + var m = mask + if (_size + _vacant >= 0.5*mask && !(_vacant > 0.2*mask)) m = ((m << 1) + 1) & IndexMask + while (m > 8 && 8*_size < m) m = m >>> 1 + repack(m) + } + + override def put(key: K, value: V): Option[V] = { + val h = hashOf(key) + val k = key + var i = seekEntryOrOpen(h, k) + if (i < 0) { + val j = i & IndexMask + _hashes(j) = h + _keys(j) = k + _values(j) = value.asInstanceOf[AnyRef] + _size += 1 + if ((i & VacantBit) != 0) _vacant -= 1 + else if (imbalanced) repack() + None + } + else { + val ans = Some(_values(i).asInstanceOf[V]) + _hashes(i) = h + _keys(i) = k + _values(i) = value.asInstanceOf[AnyRef] + ans + } + } + + /** Updates the map to include a new key-value pair. + * + * This is the fastest way to add an entry to an `AnyRefMap`. + */ + override def update(key: K, value: V): Unit = { + val h = hashOf(key) + val k = key + var i = seekEntryOrOpen(h, k) + if (i < 0) { + val j = i & IndexMask + _hashes(j) = h + _keys(j) = k + _values(j) = value.asInstanceOf[AnyRef] + _size += 1 + if ((i & VacantBit) != 0) _vacant -= 1 + else if (imbalanced) repack() + } + else { + _hashes(i) = h + _keys(i) = k + _values(i) = value.asInstanceOf[AnyRef] + } + } + + /** Adds a new key/value pair to this map and returns the map. */ + def +=(key: K, value: V): this.type = { update(key, value); this } + + def +=(kv: (K, V)): this.type = { update(kv._1, kv._2); this } + + def -=(key: K): this.type = { + val i = seekEntry(hashOf(key), key) + if (i >= 0) { + _size -= 1 + _vacant += 1 + _hashes(i) = Int.MinValue + _keys(i) = null + _values(i) = null + } + this + } + + def iterator: Iterator[(K, V)] = new Iterator[(K, V)] { + private[this] val hz = _hashes + private[this] val kz = _keys + private[this] val vz = _values + + private[this] var index = 0 + private[this] var found = false + + def hasNext = found || (index<hz.length && { + var h = hz(index) + if (h+h != 0) found = true + else { + index += 1 + while (index < hz.length && { h = hz(index); h+h == 0 }) index += 1 + found = (index < hz.length) + } + found + }) + + def next = { + if (found || hasNext) { + val ans = (_keys(index).asInstanceOf[K], _values(index).asInstanceOf[V]) + index += 1 + found = false + ans + } + else throw new NoSuchElementException("next") + } + } + + override def foreach[A](f: ((K,V)) => A) { + var i = 0 + var e = _size + while (e > 0) { + while(i < _hashes.length && { val h = _hashes(i); h+h == 0 && i < _hashes.length}) i += 1 + if (i < _hashes.length) { + f((_keys(i).asInstanceOf[K], _values(i).asInstanceOf[V])) + i += 1 + e -= 1 + } + else return + } + } + + override def clone(): AnyRefMap[K, V] = { + val hz = java.util.Arrays.copyOf(_hashes, _hashes.length) + val kz = java.util.Arrays.copyOf(_keys, _keys.length) + val vz = java.util.Arrays.copyOf(_values, _values.length) + val arm = new AnyRefMap[K, V](defaultEntry, 1, false) + arm.initializeTo(mask, _size, _vacant, hz, kz, vz) + arm + } + + private[this] def foreachElement[A,B](elems: Array[AnyRef], f: A => B) { + var i,j = 0 + while (i < _hashes.length & j < _size) { + val h = _hashes(i) + if (h+h != 0) { + j += 1 + f(elems(i).asInstanceOf[A]) + } + i += 1 + } + } + + /** Applies a function to all keys of this map. */ + def foreachKey[A](f: K => A) { foreachElement[K,A](_keys, f) } + + /** Applies a function to all values of this map. */ + def foreachValue[A](f: V => A) { foreachElement[V,A](_values, f) } + + /** Creates a new `AnyRefMap` with different values. + * Unlike `mapValues`, this method generates a new + * collection immediately. + */ + def mapValuesNow[V1](f: V => V1): AnyRefMap[K, V1] = { + val arm = new AnyRefMap[K,V1](AnyRefMap.exceptionDefault, 1, false) + val hz = java.util.Arrays.copyOf(_hashes, _hashes.length) + val kz = java.util.Arrays.copyOf(_keys, _keys.length) + val vz = new Array[AnyRef](_values.length) + var i,j = 0 + while (i < _hashes.length & j < _size) { + val h = _hashes(i) + if (h+h != 0) { + j += 1 + vz(i) = f(_values(i).asInstanceOf[V]).asInstanceOf[AnyRef] + } + i += 1 + } + arm.initializeTo(mask, _size, _vacant, hz, kz, vz) + arm + } + + /** Applies a transformation function to all values stored in this map. + * Note: the default, if any, is not transformed. + */ + def transformValues(f: V => V): this.type = { + var i,j = 0 + while (i < _hashes.length & j < _size) { + val h = _hashes(i) + if (h+h != 0) { + j += 1 + _values(i) = f(_values(i).asInstanceOf[V]).asInstanceOf[AnyRef] + } + i += 1 + } + this + } + +} + +object AnyRefMap { + private final val IndexMask = 0x3FFFFFFF + private final val MissingBit = 0x80000000 + private final val VacantBit = 0x40000000 + private final val MissVacant = 0xC0000000 + + private val exceptionDefault = (k: Any) => throw new NoSuchElementException(if (k == null) "(null)" else k.toString) + + implicit def canBuildFrom[K <: AnyRef, V, J <: AnyRef, U]: CanBuildFrom[AnyRefMap[K,V], (J, U), AnyRefMap[J,U]] = + new CanBuildFrom[AnyRefMap[K,V], (J, U), AnyRefMap[J,U]] { + def apply(from: AnyRefMap[K,V]): AnyRefMapBuilder[J, U] = apply() + def apply(): AnyRefMapBuilder[J, U] = new AnyRefMapBuilder[J, U] + } + + final class AnyRefMapBuilder[K <: AnyRef, V] extends Builder[(K, V), AnyRefMap[K, V]] { + private[collection] var elems: AnyRefMap[K, V] = new AnyRefMap[K, V] + def +=(entry: (K, V)): this.type = { + elems += entry + this + } + def clear() { elems = new AnyRefMap[K, V] } + def result(): AnyRefMap[K, V] = elems + } + + /** Creates a new `AnyRefMap` with zero or more key/value pairs. */ + def apply[K <: AnyRef, V](elems: (K, V)*): AnyRefMap[K, V] = { + val sz = if (elems.hasDefiniteSize) elems.size else 4 + val arm = new AnyRefMap[K, V](sz * 2) + elems.foreach{ case (k,v) => arm(k) = v } + if (arm.size < (sz>>3)) arm.repack() + arm + } + + /** Creates a new empty `AnyRefMap`. */ + def empty[K <: AnyRef, V]: AnyRefMap[K, V] = new AnyRefMap[K, V] + + /** Creates a new empty `AnyRefMap` with the supplied default */ + def withDefault[K <: AnyRef, V](default: K => V): AnyRefMap[K, V] = new AnyRefMap[K, V](default) + + /** Creates a new `AnyRefMap` from arrays of keys and values. + * Equivalent to but more efficient than `AnyRefMap((keys zip values): _*)`. + */ + def fromZip[K <: AnyRef, V](keys: Array[K], values: Array[V]): AnyRefMap[K, V] = { + val sz = math.min(keys.length, values.length) + val arm = new AnyRefMap[K, V](sz * 2) + var i = 0 + while (i < sz) { arm(keys(i)) = values(i); i += 1 } + if (arm.size < (sz>>3)) arm.repack() + arm + } + + /** Creates a new `AnyRefMap` from keys and values. + * Equivalent to but more efficient than `AnyRefMap((keys zip values): _*)`. + */ + def fromZip[K <: AnyRef, V](keys: Iterable[K], values: Iterable[V]): AnyRefMap[K, V] = { + val sz = math.min(keys.size, values.size) + val arm = new AnyRefMap[K, V](sz * 2) + val ki = keys.iterator + val vi = values.iterator + while (ki.hasNext && vi.hasNext) arm(ki.next) = vi.next + if (arm.size < (sz >> 3)) arm.repack() + arm + } +} diff --git a/src/library/scala/collection/mutable/LongMap.scala b/src/library/scala/collection/mutable/LongMap.scala new file mode 100644 index 0000000000..81c381279f --- /dev/null +++ b/src/library/scala/collection/mutable/LongMap.scala @@ -0,0 +1,558 @@ +package scala +package collection +package mutable + +import generic.CanBuildFrom + +/** This class implements mutable maps with `Long` keys based on a hash table with open addressing. + * + * Basic map operations on single entries, including `contains` and `get`, + * are typically substantially faster with `LongMap` than [[HashMap]]. Methods + * that act on the whole map, including `foreach` and `map` are not in + * general expected to be faster than with a generic map, save for those + * that take particular advantage of the internal structure of the map: + * `foreachKey`, `foreachValue`, `mapValuesNow`, and `transformValues`. + * + * Maps with open addressing may become less efficient at lookup after + * repeated addition/removal of elements. Although `LongMap` makes a + * decent attempt to remain efficient regardless, calling `repack` + * on a map that will no longer have elements removed but will be + * used heavily may save both time and storage space. + * + * This map is not indended to contain more than 2^29 entries (approximately + * 500 million). The maximum capacity is 2^30, but performance will degrade + * rapidly as 2^30 is approached. + * + */ +final class LongMap[V] private[collection] (defaultEntry: Long => V, initialBufferSize: Int, initBlank: Boolean) +extends AbstractMap[Long, V] + with Map[Long, V] + with MapLike[Long, V, LongMap[V]] + with Serializable +{ + import LongMap._ + + def this() = this(LongMap.exceptionDefault, 16, true) + + /** Creates a new `LongMap` that returns default values according to a supplied key-value mapping. */ + def this(defaultEntry: Long => V) = this(defaultEntry, 16, true) + + /** Creates a new `LongMap` with an initial buffer of specified size. + * + * A LongMap can typically contain half as many elements as its buffer size + * before it requires resizing. + */ + def this(initialBufferSize: Int) = this(LongMap.exceptionDefault, initialBufferSize, true) + + /** Creates a new `LongMap` with specified default values and initial buffer size. */ + def this(defaultEntry: Long => V, initialBufferSize: Int) = this(defaultEntry, initialBufferSize, true) + + private[this] var mask = 0 + private[this] var extraKeys: Int = 0 + private[this] var zeroValue: AnyRef = null + private[this] var minValue: AnyRef = null + private[this] var _size = 0 + private[this] var _vacant = 0 + private[this] var _keys: Array[Long] = null + private[this] var _values: Array[AnyRef] = null + + if (initBlank) defaultInitialize(initialBufferSize) + + private[this] def defaultInitialize(n: Int) = { + mask = + if (n<0) 0x7 + else (((1 << (32 - java.lang.Integer.numberOfLeadingZeros(n-1))) - 1) & 0x3FFFFFFF) | 0x7 + _keys = new Array[Long](mask+1) + _values = new Array[AnyRef](mask+1) + } + + private[collection] def initializeTo( + m: Int, ek: Int, zv: AnyRef, mv: AnyRef, sz: Int, vc: Int, kz: Array[Long], vz: Array[AnyRef] + ) { + mask = m; extraKeys = ek; zeroValue = zv; minValue = mv; _size = sz; _vacant = vc; _keys = kz; _values = vz + } + + override def size: Int = _size + (extraKeys+1)/2 + override def empty: LongMap[V] = new LongMap() + + private def imbalanced: Boolean = + (_size + _vacant) > 0.5*mask || _vacant > _size + + private def toIndex(k: Long): Int = { + // Part of the MurmurHash3 32 bit finalizer + val h = ((k ^ (k >>> 32)) & 0xFFFFFFFFL).toInt + var x = (h ^ (h >>> 16)) * 0x85EBCA6B + (x ^ (x >>> 13)) & mask + } + + private def seekEmpty(k: Long): Int = { + var e = toIndex(k) + var x = 0 + while (_keys(e) != 0) { x += 1; e = (e + 2*(x+1)*x - 3) & mask } + e + } + + private def seekEntry(k: Long): Int = { + var e = toIndex(k) + var x = 0 + var q = 0L + while ({ q = _keys(e); if (q==k) return e; q != 0}) { x += 1; e = (e + 2*(x+1)*x - 3) & mask } + e | MissingBit + } + + private def seekEntryOrOpen(k: Long): Int = { + var e = toIndex(k) + var x = 0 + var q = 0L + while ({ q = _keys(e); if (q==k) return e; q+q != 0}) { + x += 1 + e = (e + 2*(x+1)*x - 3) & mask + } + if (q == 0) return e | MissingBit + val o = e | MissVacant + while ({ q = _keys(e); if (q==k) return e; q != 0}) { + x += 1 + e = (e + 2*(x+1)*x - 3) & mask + } + o + } + + override def contains(key: Long): Boolean = { + if (key == -key) (((key>>>63).toInt+1) & extraKeys) != 0 + else seekEntry(key) >= 0 + } + + override def get(key: Long): Option[V] = { + if (key == -key) { + if ((((key>>>63).toInt+1) & extraKeys) == 0) None + else if (key == 0) Some(zeroValue.asInstanceOf[V]) + else Some(minValue.asInstanceOf[V]) + } + else { + val i = seekEntry(key) + if (i < 0) None else Some(_values(i).asInstanceOf[V]) + } + } + + override def getOrElse[V1 >: V](key: Long, default: => V1): V1 = { + if (key == -key) { + if ((((key>>>63).toInt+1) & extraKeys) == 0) default + else if (key == 0) zeroValue.asInstanceOf[V1] + else minValue.asInstanceOf[V1] + } + else { + val i = seekEntry(key) + if (i < 0) default else _values(i).asInstanceOf[V1] + } + } + + override def getOrElseUpdate(key: Long, defaultValue: => V): V = { + if (key == -key) { + val kbits = (key>>>63).toInt + 1 + if ((kbits & extraKeys) == 0) { + val value = defaultValue + extraKeys |= kbits + if (key == 0) zeroValue = value.asInstanceOf[AnyRef] + else minValue = value.asInstanceOf[AnyRef] + value + } + else if (key == 0) zeroValue.asInstanceOf[V] + else minValue.asInstanceOf[V] + } + else { + val i = seekEntryOrOpen(key) + if (i < 0) { + val value = defaultValue + _size += 1 + val j = i & IndexMask + _keys(j) = key + _values(j) = value.asInstanceOf[AnyRef] + if ((i & VacantBit) != 0) _vacant -= 1 + else if (imbalanced) repack() + value + } + else _values(i).asInstanceOf[V] + } + } + + /** Retrieves the value associated with a key, or the default for that type if none exists + * (null for AnyRef, 0 for floats and integers). + * + * Note: this is the fastest way to retrieve a value that may or + * may not exist, if the default null/zero is acceptable. For key/value + * pairs that do exist, `apply` (i.e. `map(key)`) is equally fast. + */ + def getOrNull(key: Long): V = { + if (key == -key) { + if ((((key>>>63).toInt+1) & extraKeys) == 0) null.asInstanceOf[V] + else if (key == 0) zeroValue.asInstanceOf[V] + else minValue.asInstanceOf[V] + } + else { + val i = seekEntry(key) + if (i < 0) null.asInstanceOf[V] else _values(i).asInstanceOf[V] + } + } + + /** Retrieves the value associated with a key. + * If the key does not exist in the map, the `defaultEntry` for that key + * will be returned instead. + */ + override def apply(key: Long): V = { + if (key == -key) { + if ((((key>>>63).toInt+1) & extraKeys) == 0) defaultEntry(key) + else if (key == 0) zeroValue.asInstanceOf[V] + else minValue.asInstanceOf[V] + } + else { + val i = seekEntry(key) + if (i < 0) defaultEntry(key) else _values(i).asInstanceOf[V] + } + } + + /** The user-supplied default value for the key. Throws an exception + * if no other default behavior was specified. + */ + override def default(key: Long) = defaultEntry(key) + + private def repack(newMask: Int) { + val ok = _keys + val ov = _values + mask = newMask + _keys = new Array[Long](mask+1) + _values = new Array[AnyRef](mask+1) + _vacant = 0 + var i = 0 + while (i < ok.length) { + val k = ok(i) + if (k != -k) { + val j = seekEmpty(k) + _keys(j) = k + _values(j) = ov(i) + } + i += 1 + } + } + + /** Repacks the contents of this `LongMap` for maximum efficiency of lookup. + * + * For maps that undergo a complex creation process with both addition and + * removal of keys, and then are used heavily with no further removal of + * elements, calling `repack` after the end of the creation can result in + * improved performance. Repacking takes time proportional to the number + * of entries in the map. + */ + def repack() { + var m = mask + if (_size + _vacant >= 0.5*mask && !(_vacant > 0.2*mask)) m = ((m << 1) + 1) & IndexMask + while (m > 8 && 8*_size < m) m = m >>> 1 + repack(m) + } + + override def put(key: Long, value: V): Option[V] = { + if (key == -key) { + if (key == 0) { + val ans = if ((extraKeys&1) == 1) Some(zeroValue.asInstanceOf[V]) else None + zeroValue = value.asInstanceOf[AnyRef] + extraKeys |= 1 + ans + } + else { + val ans = if ((extraKeys&2) == 1) Some(minValue.asInstanceOf[V]) else None + minValue = value.asInstanceOf[AnyRef] + extraKeys |= 2 + ans + } + } + else { + val i = seekEntryOrOpen(key) + if (i < 0) { + val j = i & IndexMask + _keys(j) = key + _values(j) = value.asInstanceOf[AnyRef] + _size += 1 + if ((i & VacantBit) != 0) _vacant -= 1 + else if (imbalanced) repack() + None + } + else { + val ans = Some(_values(i).asInstanceOf[V]) + _keys(i) = key + _values(i) = value.asInstanceOf[AnyRef] + ans + } + } + } + + /** Updates the map to include a new key-value pair. + * + * This is the fastest way to add an entry to a `LongMap`. + */ + override def update(key: Long, value: V): Unit = { + if (key == -key) { + if (key == 0) { + zeroValue = value.asInstanceOf[AnyRef] + extraKeys |= 1 + } + else { + minValue = value.asInstanceOf[AnyRef] + extraKeys |= 2 + } + } + else { + var i = seekEntryOrOpen(key) + if (i < 0) { + val j = i & IndexMask + _keys(j) = key + _values(j) = value.asInstanceOf[AnyRef] + _size += 1 + if ((i & VacantBit) != 0) _vacant -= 1 + else if (imbalanced) repack() + } + else { + _keys(i) = key + _values(i) = value.asInstanceOf[AnyRef] + } + } + } + + /** Adds a new key/value pair to this map and returns the map. */ + def +=(key: Long, value: V): this.type = { update(key, value); this } + + def +=(kv: (Long, V)): this.type = { update(kv._1, kv._2); this } + + def -=(key: Long): this.type = { + if (key == -key) { + if (key == 0L) { + extraKeys &= 0x2 + zeroValue = null + } + else { + extraKeys &= 0x1 + minValue = null + } + } + else { + val i = seekEntry(key) + if (i >= 0) { + _size -= 1 + _vacant += 1 + _keys(i) = Long.MinValue + _values(i) = null + } + } + this + } + + def iterator: Iterator[(Long, V)] = new Iterator[(Long, V)] { + private[this] val kz = _keys + private[this] val vz = _values + + private[this] var nextPair: (Long, V) = + if (extraKeys==0) null + else if ((extraKeys&1)==1) (0L, zeroValue.asInstanceOf[V]) + else (Long.MinValue, minValue.asInstanceOf[V]) + + private[this] var anotherPair: (Long, V) = + if (extraKeys==3) (Long.MinValue, minValue.asInstanceOf[V]) + else null + + private[this] var index = 0 + + def hasNext: Boolean = nextPair != null || (index < kz.length && { + var q = kz(index) + while (q == -q) { + index += 1 + if (index >= kz.length) return false + q = kz(index) + } + nextPair = (kz(index), vz(index).asInstanceOf[V]) + index += 1 + true + }) + def next = { + if (nextPair == null && !hasNext) throw new NoSuchElementException("next") + val ans = nextPair + if (anotherPair != null) { + nextPair = anotherPair + anotherPair = null + } + nextPair = null + ans + } + } + + override def foreach[A](f: ((Long,V)) => A) { + var i,j = 0 + while (i < _keys.length & j < _size) { + val k = _keys(i) + if (k != -k) { + j += 1 + f((k, _values(i).asInstanceOf[V])) + } + i += 1 + } + if ((extraKeys & 1) == 1) f((0L, zeroValue.asInstanceOf[V])) + if ((extraKeys & 2) == 2) f((Long.MinValue, minValue.asInstanceOf[V])) + } + + override def clone(): LongMap[V] = { + val kz = java.util.Arrays.copyOf(_keys, _keys.length) + val vz = java.util.Arrays.copyOf(_values, _values.length) + val lm = new LongMap[V](defaultEntry, 1, false) + lm.initializeTo(mask, extraKeys, zeroValue, minValue, _size, _vacant, kz, vz) + lm + } + + /** Applies a function to all keys of this map. */ + def foreachKey[A](f: Long => A) { + var i,j = 0 + while (i < _keys.length & j < _size) { + val k = _keys(i) + if (k != -k) { + j += 1 + f(k) + } + i += 1 + } + if ((extraKeys & 1) == 1) f(0L) + if ((extraKeys & 2) == 2) f(Long.MinValue) + } + + /** Applies a function to all values of this map. */ + def foreachValue[A](f: V => A) { + var i,j = 0 + while (i < _keys.length & j < _size) { + val k = _keys(i) + if (k != -k) { + j += 1 + f(_values(i).asInstanceOf[V]) + } + i += 1 + } + if ((extraKeys & 1) == 1) f(zeroValue.asInstanceOf[V]) + if ((extraKeys & 2) == 2) f(minValue.asInstanceOf[V]) + } + + /** Creates a new `LongMap` with different values. + * Unlike `mapValues`, this method generates a new + * collection immediately. + */ + def mapValuesNow[V1](f: V => V1): LongMap[V1] = { + val lm = new LongMap[V1](LongMap.exceptionDefault, 1, false) + val kz = java.util.Arrays.copyOf(_keys, _keys.length) + val vz = new Array[AnyRef](_values.length) + var i,j = 0 + while (i < _keys.length & j < _size) { + val k = _keys(i) + if (k != -k) { + j += 1 + vz(i) = f(_values(i).asInstanceOf[V]).asInstanceOf[AnyRef] + } + i += 1 + } + val zv = if ((extraKeys & 1) == 1) f(zeroValue.asInstanceOf[V]).asInstanceOf[AnyRef] else null + val mv = if ((extraKeys & 2) == 2) f(minValue.asInstanceOf[V]).asInstanceOf[AnyRef] else null + lm.initializeTo(mask, extraKeys, zv, mv, _size, _vacant, kz, vz) + lm + } + + /** Applies a transformation function to all values stored in this map. + * Note: the default, if any, is not transformed. + */ + def transformValues(f: V => V): this.type = { + var i,j = 0 + while (i < _keys.length & j < _size) { + val k = _keys(i) + if (k != -k) { + j += 1 + _values(i) = f(_values(i).asInstanceOf[V]).asInstanceOf[AnyRef] + } + i += 1 + } + if ((extraKeys & 1) == 1) zeroValue = f(zeroValue.asInstanceOf[V]).asInstanceOf[AnyRef] + if ((extraKeys & 2) == 2) minValue = f(minValue.asInstanceOf[V]).asInstanceOf[AnyRef] + this + } + + /* + override def toString = { + val sb = new StringBuilder("LongMap(") + var n = 0 + foreach{ case (k,v) => + if (n > 0) sb ++= ", " + sb ++= k.toString + sb ++= " -> " + sb ++= v.toString + n += 1 + } + sb += ')' + sb.result + } + */ +} + +object LongMap { + private final val IndexMask = 0x3FFFFFFF + private final val MissingBit = 0x80000000 + private final val VacantBit = 0x40000000 + private final val MissVacant = 0xC0000000 + + private val exceptionDefault: Long => Nothing = (k: Long) => throw new NoSuchElementException(k.toString) + + implicit def canBuildFrom[V, U]: CanBuildFrom[LongMap[V], (Long, U), LongMap[U]] = + new CanBuildFrom[LongMap[V], (Long, U), LongMap[U]] { + def apply(from: LongMap[V]): LongMapBuilder[U] = apply() + def apply(): LongMapBuilder[U] = new LongMapBuilder[U] + } + + final class LongMapBuilder[V] extends Builder[(Long, V), LongMap[V]] { + private[collection] var elems: LongMap[V] = new LongMap[V] + def +=(entry: (Long, V)): this.type = { + elems += entry + this + } + def clear() { elems = new LongMap[V] } + def result(): LongMap[V] = elems + } + + /** Creates a new `LongMap` with zero or more key/value pairs. */ + def apply[V](elems: (Long, V)*): LongMap[V] = { + val sz = if (elems.hasDefiniteSize) elems.size else 4 + val lm = new LongMap[V](sz * 2) + elems.foreach{ case (k,v) => lm(k) = v } + if (lm.size < (sz>>3)) lm.repack() + lm + } + + /** Creates a new empty `LongMap`. */ + def empty[V]: LongMap[V] = new LongMap[V] + + /** Creates a new empty `LongMap` with the supplied default */ + def withDefault[V](default: Long => V): LongMap[V] = new LongMap[V](default) + + /** Creates a new `LongMap` from arrays of keys and values. + * Equivalent to but more efficient than `LongMap((keys zip values): _*)`. + */ + def fromZip[V](keys: Array[Long], values: Array[V]): LongMap[V] = { + val sz = math.min(keys.length, values.length) + val lm = new LongMap[V](sz * 2) + var i = 0 + while (i < sz) { lm(keys(i)) = values(i); i += 1 } + if (lm.size < (sz>>3)) lm.repack() + lm + } + + /** Creates a new `LongMap` from keys and values. + * Equivalent to but more efficient than `LongMap((keys zip values): _*)`. + */ + def fromZip[V](keys: Iterable[Long], values: Iterable[V]): LongMap[V] = { + val sz = math.min(keys.size, values.size) + val lm = new LongMap[V](sz * 2) + val ki = keys.iterator + val vi = values.iterator + while (ki.hasNext && vi.hasNext) lm(ki.next) = vi.next + if (lm.size < (sz >> 3)) lm.repack() + lm + } +} diff --git a/src/library/scala/concurrent/Future.scala b/src/library/scala/concurrent/Future.scala index dd86af0dd4..f905785bd6 100644 --- a/src/library/scala/concurrent/Future.scala +++ b/src/library/scala/concurrent/Future.scala @@ -488,7 +488,7 @@ object Future { */ def apply[T](body: =>T)(implicit @deprecatedName('execctx) executor: ExecutionContext): Future[T] = impl.Future(body) - /** Simple version of `Futures.traverse`. Transforms a `TraversableOnce[Future[A]]` into a `Future[TraversableOnce[A]]`. + /** Simple version of `Future.traverse`. Transforms a `TraversableOnce[Future[A]]` into a `Future[TraversableOnce[A]]`. * Useful for reducing many `Future`s into a single `Future`. */ def sequence[A, M[_] <: TraversableOnce[_]](in: M[Future[A]])(implicit cbf: CanBuildFrom[M[Future[A]], A, M[A]], executor: ExecutionContext): Future[M[A]] = { diff --git a/src/library/scala/concurrent/impl/Promise.scala b/src/library/scala/concurrent/impl/Promise.scala index 418d859d79..b15601058e 100644 --- a/src/library/scala/concurrent/impl/Promise.scala +++ b/src/library/scala/concurrent/impl/Promise.scala @@ -82,11 +82,11 @@ private[concurrent] object Promise { * 2. Complete, with a result. * 3. Linked to another DefaultPromise. * - * If a DefaultPromise is linked it another DefaultPromise then it will + * If a DefaultPromise is linked to another DefaultPromise, it will * delegate all its operations to that other promise. This means that two * DefaultPromises that are linked will appear, to external callers, to have - * exactly the same state and behaviour. E.g. they will both appear to be - * either complete or incomplete, and with the same values. + * exactly the same state and behaviour. For instance, both will appear as + * incomplete, or as complete with the same result value. * * A DefaultPromise stores its state entirely in the AnyRef cell exposed by * AbstractPromise. The type of object stored in the cell fully describes the diff --git a/src/library/scala/math/BigDecimal.scala b/src/library/scala/math/BigDecimal.scala index 0a2da16523..d783dd29f5 100644 --- a/src/library/scala/math/BigDecimal.scala +++ b/src/library/scala/math/BigDecimal.scala @@ -158,8 +158,7 @@ object BigDecimal { * @author Stephane Micheloud * @version 1.0 */ -@deprecatedInheritance("This class will be made final.", "2.10.0") -class BigDecimal( +final class BigDecimal( val bigDecimal: BigDec, val mc: MathContext) extends ScalaNumber with ScalaNumericConversions with Serializable { diff --git a/src/library/scala/math/BigInt.scala b/src/library/scala/math/BigInt.scala index b25dbefebd..5e70bdc2f6 100644 --- a/src/library/scala/math/BigInt.scala +++ b/src/library/scala/math/BigInt.scala @@ -109,8 +109,7 @@ object BigInt { * @author Martin Odersky * @version 1.0, 15/07/2003 */ -@deprecatedInheritance("This class will be made final.", "2.10.0") -class BigInt(val bigInteger: BigInteger) extends ScalaNumber with ScalaNumericConversions with Serializable { +final class BigInt(val bigInteger: BigInteger) extends ScalaNumber with ScalaNumericConversions with Serializable { /** Returns the hash code for this BigInt. */ override def hashCode(): Int = if (isValidLong) unifiedPrimitiveHashcode() diff --git a/src/library/scala/reflect/ClassManifestDeprecatedApis.scala b/src/library/scala/reflect/ClassManifestDeprecatedApis.scala index 798746851a..ca7a3cddb8 100644 --- a/src/library/scala/reflect/ClassManifestDeprecatedApis.scala +++ b/src/library/scala/reflect/ClassManifestDeprecatedApis.scala @@ -16,6 +16,7 @@ import java.lang.{ Class => jClass } trait ClassManifestDeprecatedApis[T] extends OptManifest[T] { self: ClassManifest[T] => + // Still in use in target test.junit.comp. @deprecated("Use runtimeClass instead", "2.10.0") def erasure: jClass[_] = runtimeClass @@ -64,12 +65,12 @@ trait ClassManifestDeprecatedApis[T] extends OptManifest[T] { // when the erasure is the same, even before considering variance. !cannotMatch && { // this part is wrong for not considering variance - if (this.erasure == that.erasure) + if (this.runtimeClass == that.runtimeClass) subargs(this.typeArguments, that.typeArguments) // this part is wrong for punting unless the rhs has no type // arguments, but it's better than a blindfolded pinata swing. else - that.typeArguments.isEmpty && subtype(this.erasure, that.erasure) + that.typeArguments.isEmpty && subtype(this.runtimeClass, that.runtimeClass) } } @@ -91,29 +92,29 @@ trait ClassManifestDeprecatedApis[T] extends OptManifest[T] { @deprecated("Use wrap instead", "2.10.0") def arrayManifest: ClassManifest[Array[T]] = - ClassManifest.classType[Array[T]](arrayClass[T](erasure), this) + ClassManifest.classType[Array[T]](arrayClass[T](runtimeClass), this) override def newArray(len: Int): Array[T] = - java.lang.reflect.Array.newInstance(erasure, len).asInstanceOf[Array[T]] + java.lang.reflect.Array.newInstance(runtimeClass, len).asInstanceOf[Array[T]] @deprecated("Use wrap.newArray instead", "2.10.0") def newArray2(len: Int): Array[Array[T]] = - java.lang.reflect.Array.newInstance(arrayClass[T](erasure), len) + java.lang.reflect.Array.newInstance(arrayClass[T](runtimeClass), len) .asInstanceOf[Array[Array[T]]] @deprecated("Use wrap.wrap.newArray instead", "2.10.0") def newArray3(len: Int): Array[Array[Array[T]]] = - java.lang.reflect.Array.newInstance(arrayClass[Array[T]](arrayClass[T](erasure)), len) + java.lang.reflect.Array.newInstance(arrayClass[Array[T]](arrayClass[T](runtimeClass)), len) .asInstanceOf[Array[Array[Array[T]]]] @deprecated("Use wrap.wrap.wrap.newArray instead", "2.10.0") def newArray4(len: Int): Array[Array[Array[Array[T]]]] = - java.lang.reflect.Array.newInstance(arrayClass[Array[Array[T]]](arrayClass[Array[T]](arrayClass[T](erasure))), len) + java.lang.reflect.Array.newInstance(arrayClass[Array[Array[T]]](arrayClass[Array[T]](arrayClass[T](runtimeClass))), len) .asInstanceOf[Array[Array[Array[Array[T]]]]] @deprecated("Use wrap.wrap.wrap.wrap.newArray instead", "2.10.0") def newArray5(len: Int): Array[Array[Array[Array[Array[T]]]]] = - java.lang.reflect.Array.newInstance(arrayClass[Array[Array[Array[T]]]](arrayClass[Array[Array[T]]](arrayClass[Array[T]](arrayClass[T](erasure)))), len) + java.lang.reflect.Array.newInstance(arrayClass[Array[Array[Array[T]]]](arrayClass[Array[Array[T]]](arrayClass[Array[T]](arrayClass[T](runtimeClass)))), len) .asInstanceOf[Array[Array[Array[Array[Array[T]]]]]] @deprecated("Create WrappedArray directly instead", "2.10.0") @@ -131,7 +132,7 @@ trait ClassManifestDeprecatedApis[T] extends OptManifest[T] { protected def argString = if (typeArguments.nonEmpty) typeArguments.mkString("[", ", ", "]") - else if (erasure.isArray) "["+ClassManifest.fromClass(erasure.getComponentType)+"]" + else if (runtimeClass.isArray) "["+ClassManifest.fromClass(runtimeClass.getComponentType)+"]" else "" } @@ -221,7 +222,7 @@ object ClassManifestFactory { */ def abstractType[T](prefix: OptManifest[_], name: String, upperbound: ClassManifest[_], args: OptManifest[_]*): ClassManifest[T] = new ClassManifest[T] { - override def runtimeClass = upperbound.erasure + override def runtimeClass = upperbound.runtimeClass override val typeArguments = args.toList override def toString = prefix.toString+"#"+name+argString } @@ -236,6 +237,6 @@ private class ClassTypeManifest[T]( { override def toString = (if (prefix.isEmpty) "" else prefix.get.toString+"#") + - (if (erasure.isArray) "Array" else erasure.getName) + + (if (runtimeClass.isArray) "Array" else runtimeClass.getName) + argString }
\ No newline at end of file diff --git a/src/library/scala/reflect/Manifest.scala b/src/library/scala/reflect/Manifest.scala index 3bc76da295..803c980058 100644 --- a/src/library/scala/reflect/Manifest.scala +++ b/src/library/scala/reflect/Manifest.scala @@ -46,7 +46,7 @@ trait Manifest[T] extends ClassManifest[T] with Equals { override def typeArguments: List[Manifest[_]] = Nil override def arrayManifest: Manifest[Array[T]] = - Manifest.classType[Array[T]](arrayClass[T](erasure), this) + Manifest.classType[Array[T]](arrayClass[T](runtimeClass), this) override def canEqual(that: Any): Boolean = that match { case _: Manifest[_] => true @@ -56,10 +56,10 @@ trait Manifest[T] extends ClassManifest[T] with Equals { * faster than <:< and rules out most comparisons. */ override def equals(that: Any): Boolean = that match { - case m: Manifest[_] => (m canEqual this) && (this.erasure == m.erasure) && (this <:< m) && (m <:< this) + case m: Manifest[_] => (m canEqual this) && (this.runtimeClass == m.runtimeClass) && (this <:< m) && (m <:< this) case _ => false } - override def hashCode = this.erasure.## + override def hashCode = this.runtimeClass.## } // TODO undeprecated until Scala reflection becomes non-experimental @@ -238,7 +238,7 @@ object ManifestFactory { override val typeArguments: List[Manifest[_]]) extends Manifest[T] { override def toString = (if (prefix.isEmpty) "" else prefix.get.toString+"#") + - (if (erasure.isArray) "Array" else erasure.getName) + + (if (runtimeClass.isArray) "Array" else runtimeClass.getName) + argString } @@ -259,7 +259,7 @@ object ManifestFactory { */ def wildcardType[T](lowerBound: Manifest[_], upperBound: Manifest[_]): Manifest[T] = new Manifest[T] { - def runtimeClass = upperBound.erasure + def runtimeClass = upperBound.runtimeClass override def toString = "_" + (if (lowerBound eq Nothing) "" else " >: "+lowerBound) + @@ -269,7 +269,7 @@ object ManifestFactory { /** Manifest for the intersection type `parents_0 with ... with parents_n'. */ def intersectionType[T](parents: Manifest[_]*): Manifest[T] = new Manifest[T] { - def runtimeClass = parents.head.erasure + def runtimeClass = parents.head.runtimeClass override def toString = parents.mkString(" with ") } } diff --git a/src/library/scala/runtime/WorksheetSupport.scala b/src/library/scala/runtime/WorksheetSupport.scala deleted file mode 100644 index d86f8873aa..0000000000 --- a/src/library/scala/runtime/WorksheetSupport.scala +++ /dev/null @@ -1,93 +0,0 @@ -package scala.runtime -import java.io.{OutputStream, PrintStream} -import scala.runtime.ScalaRunTime.stringOf - -/** A utility object that's needed by the code that executes a worksheet. - */ -@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0") -object WorksheetSupport { - - /** The offset in the source which should be printed */ - private var currentOffset = 0 - - /** A stream that flushes in regular intervals so that output can be captured - * in real time. The flush interval is determined by the field "flushInterval". - * By default it is 30ms. - */ - private class FlushedOutputStream(out: OutputStream) extends OutputStream { - protected def flushInterval = 30000000L // interval between flushes, by default 30ms - protected def width = 80 // output width, by default 80 characters - protected def tabInc = 8 // tab increment, by default 8 characters - private var lastFlush: Long = 0L - private var col = -1 - override def write(b: Array[Byte], off: Int, len: Int) = { - for (idx <- off until (off + len min b.length)) writeOne(b(idx).toInt) - flush() - } - override def write(c: Int) { - writeOne(c) - flush() - } - override def flush() { - val current = System.nanoTime - if (current - lastFlush >= flushInterval) { - out.flush() - lastFlush = current - } - } - def writeOne(c: Int) { - if (col < 0) { - col = 0 - write((currentOffset+" ").getBytes) - } - out.write(c) - col = - if (c == '\n') -1 - else if (c == '\t') (col / tabInc) * tabInc + tabInc - else col + 1 - if (col >= width) writeOne('\n') - } - def ensureNewLine() = if (col > 0) writeOne('\n') - } - - private val flushedOut = new FlushedOutputStream(System.out) - private val printOut = new PrintStream(flushedOut) - - private def redirected(op: => Unit) = { - val oldSysOut = System.out - val oldSysErr = System.err - val oldConsOut = Console.out - val oldConsErr = Console.err - System.setOut(printOut) - System.setErr(printOut) - Console.setOut(printOut) - Console.setErr(printOut) - try op - finally { - printOut.close() - System.setOut(oldSysOut) - System.setErr(oldSysErr) - Console.setOut(oldConsOut) - Console.setErr(oldConsErr) - } - } - - def $execute(op: => Unit) = redirected { - try op - catch { - case ex: StopException => ; - case ex: Throwable => ex.printStackTrace() - } - } - - def $skip(n: Int) = { - flushedOut.ensureNewLine() - currentOffset += n - } - - def $stop() = throw new StopException - - def $show(x: Any): String = stringOf(x) -} - -class StopException extends Exception diff --git a/src/library/scala/util/control/NonFatal.scala b/src/library/scala/util/control/NonFatal.scala index 11fb988e8e..9d3dfea074 100644 --- a/src/library/scala/util/control/NonFatal.scala +++ b/src/library/scala/util/control/NonFatal.scala @@ -11,9 +11,8 @@ package util.control /** * Extractor of non-fatal Throwables. Will not match fatal errors like `VirtualMachineError` - * (for example, `OutOfMemoryError`, a subclass of `VirtualMachineError`), `ThreadDeath`, + * (for example, `OutOfMemoryError` and `StackOverflowError`, subclasses of `VirtualMachineError`), `ThreadDeath`, * `LinkageError`, `InterruptedException`, `ControlThrowable`. - * However, `StackOverflowError` is matched, i.e. considered non-fatal. * * Note that [[scala.util.control.ControlThrowable]], an internal Throwable, is not matched by * `NonFatal` (and would therefore be thrown). @@ -34,7 +33,6 @@ object NonFatal { * Returns true if the provided `Throwable` is to be considered non-fatal, or false if it is to be considered fatal */ def apply(t: Throwable): Boolean = t match { - case _: StackOverflowError => true // StackOverflowError ok even though it is a VirtualMachineError // VirtualMachineError includes OutOfMemoryError and other fatal errors case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable => false case _ => true diff --git a/src/library/scala/util/hashing/MurmurHash3.scala b/src/library/scala/util/hashing/MurmurHash3.scala index c85664349e..1bfaeb255b 100644 --- a/src/library/scala/util/hashing/MurmurHash3.scala +++ b/src/library/scala/util/hashing/MurmurHash3.scala @@ -275,12 +275,4 @@ object MurmurHash3 extends MurmurHash3 { finalizeHash(h, n) } */ - - @deprecated("Use unorderedHash", "2.10.0") - final def symmetricHash[T](xs: scala.collection.GenTraversableOnce[T], seed: Int = symmetricSeed): Int = - unorderedHash(xs.seq, seed) - - @deprecated("Use orderedHash", "2.10.0") - final def traversableHash[T](xs: scala.collection.GenTraversableOnce[T], seed: Int = traversableSeed): Int = - orderedHash(xs.seq, seed) } diff --git a/src/manual/scala/man1/scala.scala b/src/manual/scala/man1/scala.scala index dbd4ea55a2..f48b99bd5a 100644 --- a/src/manual/scala/man1/scala.scala +++ b/src/manual/scala/man1/scala.scala @@ -55,7 +55,7 @@ object scala extends Command { CmdOption("savecompiled"), "Save this compiled version of scripts in order to speed up " & "later executions of the same script. When running a script, " & - "save the compiled version of in a file with the same name as the " & + "save the compiled version in a file with the same name as the " & "script but with an extension of " & Mono(".jar") & ". On subsequent " & "runs of the same script, the pre-compiled " & Mono(".jar") & " file " & "will be used if it is newer than the script file."), diff --git a/src/reflect/scala/reflect/api/JavaUniverse.scala b/src/reflect/scala/reflect/api/JavaUniverse.scala index 6fc76c9693..df5e0699a5 100644 --- a/src/reflect/scala/reflect/api/JavaUniverse.scala +++ b/src/reflect/scala/reflect/api/JavaUniverse.scala @@ -34,7 +34,7 @@ trait JavaUniverse extends Universe with JavaMirrors { self => mirror.universe match { case ju: JavaUniverse => val jm = mirror.asInstanceOf[ju.Mirror] - val sym = jm.classSymbol(manifest.erasure) + val sym = jm.classSymbol(manifest.runtimeClass) val tpe = if (manifest.typeArguments.isEmpty) sym.toType else ju.appliedType(sym.toTypeConstructor, manifest.typeArguments map (targ => ju.manifestToTypeTag(jm, targ)) map (_.in(jm).tpe)) diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala index 563f23cb3b..19f06894c8 100644 --- a/src/reflect/scala/reflect/internal/Definitions.scala +++ b/src/reflect/scala/reflect/internal/Definitions.scala @@ -16,7 +16,7 @@ import scala.reflect.api.{Universe => ApiUniverse} trait Definitions extends api.StandardDefinitions { self: SymbolTable => - import rootMirror.{getModule, getPackage, getClassByName, getRequiredClass, getRequiredModule, getClassIfDefined, getModuleIfDefined, getPackageObject, getPackageIfDefined, getPackageObjectIfDefined, requiredClass, requiredModule} + import rootMirror.{getModuleByName, getPackage, getClassByName, getRequiredClass, getRequiredModule, getClassIfDefined, getModuleIfDefined, getPackageObject, getPackageIfDefined, getPackageObjectIfDefined, requiredClass, requiredModule} object definitions extends DefinitionsClass @@ -87,7 +87,7 @@ trait Definitions extends api.StandardDefinitions { lazy val abbrvTag = symbolsMap(ScalaValueClasses, nameToTag) withDefaultValue OBJECT_TAG lazy val numericWeight = symbolsMapFilt(ScalaValueClasses, nameToWeight.keySet, nameToWeight) - lazy val boxedModule = classesMap(x => getModule(boxedName(x))) + lazy val boxedModule = classesMap(x => getModuleByName(boxedName(x))) lazy val boxedClass = classesMap(x => getClassByName(boxedName(x))) lazy val refClass = classesMap(x => getRequiredClass("scala.runtime." + x + "Ref")) lazy val volatileRefClass = classesMap(x => getRequiredClass("scala.runtime.Volatile" + x + "Ref")) @@ -153,18 +153,6 @@ trait Definitions extends api.StandardDefinitions { private var isInitialized = false def isDefinitionsInitialized = isInitialized - @deprecated("Moved to rootMirror.RootPackage", "2.10.0") - val RootPackage: ModuleSymbol = rootMirror.RootPackage - - @deprecated("Moved to rootMirror.RootClass", "2.10.0") - val RootClass: ClassSymbol = rootMirror.RootClass - - @deprecated("Moved to rootMirror.EmptyPackage", "2.10.0") - val EmptyPackage: ModuleSymbol = rootMirror.EmptyPackage - - @deprecated("Moved to rootMirror.EmptyPackageClass", "2.10.0") - val EmptyPackageClass: ClassSymbol = rootMirror.EmptyPackageClass - // It becomes tricky to create dedicated objects for other symbols because // of initialization order issues. lazy val JavaLangPackage = getPackage("java.lang") diff --git a/src/reflect/scala/reflect/internal/FreshNames.scala b/src/reflect/scala/reflect/internal/FreshNames.scala new file mode 100644 index 0000000000..bb488aa2a8 --- /dev/null +++ b/src/reflect/scala/reflect/internal/FreshNames.scala @@ -0,0 +1,35 @@ +/* NSC -- new Scala compiler + * Copyright 2005-2013 LAMP/EPFL + */ + +package scala +package reflect +package internal + +import scala.reflect.internal.util.FreshNameCreator + +trait FreshNames { self: Names => + // default fresh name creator used to abstract over currentUnit.fresh and runtime fresh name creator + def currentFreshNameCreator: FreshNameCreator + + // create fresh term/type name using implicit fresh name creator + def freshTermName(prefix: String = "x$")(implicit creator: FreshNameCreator): TermName = newTermName(creator.newName(prefix)) + def freshTypeName(prefix: String)(implicit creator: FreshNameCreator): TypeName = newTypeName(creator.newName(prefix)) + + // Extractor that matches names which were generated by some + // FreshNameCreator with known prefix. Extracts user-specified + // prefix that was used as a parameter to newName by stripping + // global creator prefix and unique number in the end of the name. + class FreshNameExtractor(creatorPrefix: String = "") { + // quote prefix so that it can be used with replaceFirst + // which expects regExp rather than simple string + val quotedCreatorPrefix = java.util.regex.Pattern.quote(creatorPrefix) + + def unapply(name: Name): Option[String] = { + val sname = name.toString + // name should start with creatorPrefix and end with number + if (!sname.startsWith(creatorPrefix) || !sname.matches("^.*\\d*$")) None + else Some(NameTransformer.decode(sname.replaceFirst(quotedCreatorPrefix, "").replaceAll("\\d*$", ""))) + } + } +}
\ No newline at end of file diff --git a/src/reflect/scala/reflect/internal/Mirrors.scala b/src/reflect/scala/reflect/internal/Mirrors.scala index e122fa498b..3a630b6a16 100644 --- a/src/reflect/scala/reflect/internal/Mirrors.scala +++ b/src/reflect/scala/reflect/internal/Mirrors.scala @@ -96,10 +96,6 @@ trait Mirrors extends api.Mirrors { } } - @deprecated("Use getClassByName", "2.10.0") - def getClass(fullname: Name): ClassSymbol = - getClassByName(fullname) - def getClassByName(fullname: Name): ClassSymbol = ensureClassSymbol(fullname.toString, getModuleOrClass(fullname.toTypeName)) @@ -131,15 +127,11 @@ trait Mirrors extends api.Mirrors { case _ => MissingRequirementError.notFound("object " + fullname) } - @deprecated("Use getModuleByName", "2.10.0") - def getModule(fullname: Name): ModuleSymbol = - getModuleByName(fullname) - def getModuleByName(fullname: Name): ModuleSymbol = ensureModuleSymbol(fullname.toString, getModuleOrClass(fullname.toTermName), allowPackages = true) def getRequiredModule(fullname: String): ModuleSymbol = - getModule(newTermNameCached(fullname)) + getModuleByName(newTermNameCached(fullname)) // TODO: What syntax do we think should work here? Say you have an object // like scala.Predef. You can't say requiredModule[scala.Predef] since there's @@ -155,7 +147,7 @@ trait Mirrors extends api.Mirrors { getModuleIfDefined(newTermNameCached(fullname)) def getModuleIfDefined(fullname: Name): Symbol = - wrapMissing(getModule(fullname.toTermName)) + wrapMissing(getModuleByName(fullname.toTermName)) /** @inheritdoc * diff --git a/src/reflect/scala/reflect/internal/SymbolTable.scala b/src/reflect/scala/reflect/internal/SymbolTable.scala index 4998580a7d..c3f3e35fb3 100644 --- a/src/reflect/scala/reflect/internal/SymbolTable.scala +++ b/src/reflect/scala/reflect/internal/SymbolTable.scala @@ -42,6 +42,7 @@ abstract class SymbolTable extends macros.Universe with BuildUtils with PrivateWithin with pickling.Translations + with FreshNames { val gen = new TreeGen { val global: SymbolTable.this.type = SymbolTable.this } @@ -398,11 +399,6 @@ abstract class SymbolTable extends macros.Universe * Adds the `sm` String interpolator to a [[scala.StringContext]]. */ implicit val StringContextStripMarginOps: StringContext => StringContextStripMarginOps = util.StringContextStripMarginOps - - // fresh name creation - def currentFreshNameCreator: FreshNameCreator - def freshTermName(prefix: String = "x$")(implicit creator: FreshNameCreator): TermName = newTermName(creator.newName(prefix)) - def freshTypeName(prefix: String)(implicit creator: FreshNameCreator): TypeName = newTypeName(creator.newName(prefix)) } object SymbolTableStats { diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala index bd17c18119..85bc3158f6 100644 --- a/src/reflect/scala/reflect/internal/Symbols.scala +++ b/src/reflect/scala/reflect/internal/Symbols.scala @@ -452,23 +452,6 @@ trait Symbols extends api.Symbols { self: SymbolTable => case _ => new StubTermSymbol(this, name.toTermName, missingMessage) } - @deprecated("Use the other signature", "2.10.0") - def newClass(pos: Position, name: TypeName): Symbol = newClass(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newModuleClass(pos: Position, name: TypeName): Symbol = newModuleClass(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newLabel(pos: Position, name: TermName): MethodSymbol = newLabel(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newValue(pos: Position, name: TermName): TermSymbol = newTermSymbol(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newAliasType(pos: Position, name: TypeName): Symbol = newAliasType(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newAbstractType(pos: Position, name: TypeName): Symbol = newAbstractType(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newExistential(pos: Position, name: TypeName): Symbol = newExistential(name, pos) - @deprecated("Use the other signature", "2.10.0") - def newMethod(pos: Position, name: TermName): MethodSymbol = newMethod(name, pos) - // ----- locking and unlocking ------------------------------------------------------ // True if the symbol is unlocked. @@ -2047,10 +2030,6 @@ trait Symbols extends api.Symbols { self: SymbolTable => else if (isMethod || isClass) this else owner.logicallyEnclosingMember - /** Kept for source compatibility with 2.9. Scala IDE for Eclipse relies on this. */ - @deprecated("Use enclosingTopLevelClass", "2.10.0") - def toplevelClass: Symbol = enclosingTopLevelClass - /** The top-level class containing this symbol. */ def enclosingTopLevelClass: Symbol = if (isTopLevel) { @@ -2365,9 +2344,6 @@ trait Symbols extends api.Symbols { self: SymbolTable => def associatedFile: AbstractFile = enclosingTopLevelClass.associatedFile def associatedFile_=(f: AbstractFile) { abort("associatedFile_= inapplicable for " + this) } - @deprecated("Use associatedFile_= instead", "2.10.0") - def sourceFile_=(f: AbstractFile): Unit = associatedFile_=(f) - /** If this is a sealed class, its known direct subclasses. * Otherwise, the empty set. */ diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala index 8982fd4246..a933a5d189 100644 --- a/src/reflect/scala/reflect/internal/TreeInfo.scala +++ b/src/reflect/scala/reflect/internal/TreeInfo.scala @@ -848,7 +848,7 @@ abstract class TreeInfo { }) def isMacroApplication(tree: Tree): Boolean = - !tree.isDef && tree.symbol != null && tree.symbol.isMacro && !tree.symbol.isErroneous + !tree.isDef && tree.symbol != null && tree.symbol.isTermMacro && !tree.symbol.isErroneous def isMacroApplicationOrBlock(tree: Tree): Boolean = tree match { case Block(_, expr) => isMacroApplicationOrBlock(expr) diff --git a/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala b/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala index 3e54de8e1e..8442c1015f 100644 --- a/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala +++ b/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala @@ -11,7 +11,7 @@ import java.util.concurrent.atomic.AtomicLong import scala.collection.mutable import scala.reflect.NameTransformer -class FreshNameCreator { +class FreshNameCreator(creatorPrefix: String = "") { protected val counters = new ConcurrentHashMap[String, AtomicLong]() /** @@ -21,7 +21,8 @@ class FreshNameCreator { */ def newName(prefix: String): String = { val safePrefix = NameTransformer.encode(prefix) - counters.putIfAbsent(safePrefix, new AtomicLong(0)); - safePrefix + counters.get(safePrefix).incrementAndGet(); + counters.putIfAbsent(safePrefix, new AtomicLong(0)) + val idx = counters.get(safePrefix).incrementAndGet() + s"$creatorPrefix$safePrefix$idx" } } diff --git a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala index bce506ee0a..344f7682c1 100644 --- a/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala +++ b/src/reflect/scala/reflect/runtime/JavaUniverseForce.scala @@ -51,6 +51,7 @@ trait JavaUniverseForce { self: runtime.JavaUniverse => // inaccessible: this.SimpleNameOrdering this.traceSymbols this.perRunCaches + this.FreshNameExtractor this.FixedMirrorTreeCreator this.FixedMirrorTypeCreator this.CompoundTypeTreeOriginalAttachment diff --git a/src/repl/scala/tools/nsc/interpreter/IMain.scala b/src/repl/scala/tools/nsc/interpreter/IMain.scala index 0d55423247..8fba1e538e 100644 --- a/src/repl/scala/tools/nsc/interpreter/IMain.scala +++ b/src/repl/scala/tools/nsc/interpreter/IMain.scala @@ -9,10 +9,11 @@ package interpreter import PartialFunction.cond import scala.language.implicitConversions +import scala.beans.BeanProperty import scala.collection.mutable import scala.concurrent.{ Future, ExecutionContext } import scala.reflect.runtime.{ universe => ru } -import scala.reflect.{ BeanProperty, ClassTag, classTag } +import scala.reflect.{ ClassTag, classTag } import scala.reflect.internal.util.{ BatchSourceFile, SourceFile } import scala.tools.util.PathResolver import scala.tools.nsc.io.AbstractFile diff --git a/src/repl/scala/tools/nsc/interpreter/JavapClass.scala b/src/repl/scala/tools/nsc/interpreter/JavapClass.scala index 50c90968af..496d5face1 100644 --- a/src/repl/scala/tools/nsc/interpreter/JavapClass.scala +++ b/src/repl/scala/tools/nsc/interpreter/JavapClass.scala @@ -180,7 +180,7 @@ class JavapClass( /** Base class for javap tool adapters for java 6 and 7. */ abstract class JavapTool { type ByteAry = Array[Byte] - type Input = Pair[String, Try[ByteAry]] + type Input = Tuple2[String, Try[ByteAry]] /** Run the tool. */ def apply(raw: Boolean, options: Seq[String])(inputs: Seq[Input]): List[JpResult] diff --git a/src/scaladoc/scala/tools/ant/Scaladoc.scala b/src/scaladoc/scala/tools/ant/Scaladoc.scala index fd6d637212..36a1405b11 100644 --- a/src/scaladoc/scala/tools/ant/Scaladoc.scala +++ b/src/scaladoc/scala/tools/ant/Scaladoc.scala @@ -574,7 +574,7 @@ class Scaladoc extends ScalaMatchingTask { \*============================================================================*/ /** Initializes settings and source files */ - protected def initialize: Pair[Settings, List[File]] = { + protected def initialize: Tuple2[Settings, List[File]] = { // Tests if all mandatory attributes are set and valid. if (origin.isEmpty) buildError("Attribute 'srcdir' is not set.") if (getOrigin.isEmpty) buildError("Attribute 'srcdir' is not set.") @@ -660,14 +660,14 @@ class Scaladoc extends ScalaMatchingTask { log("Scaladoc params = '" + addParams + "'", Project.MSG_DEBUG) docSettings processArgumentString addParams - Pair(docSettings, sourceFiles) + (docSettings, sourceFiles) } def safeBuildError(message: String): Unit = if (nofail) log(message) else buildError(message) /** Performs the compilation. */ override def execute() = { - val Pair(docSettings, sourceFiles) = initialize + val (docSettings, sourceFiles) = initialize val reporter = new ConsoleReporter(docSettings) try { val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings) diff --git a/src/scalap/scala/tools/scalap/Arguments.scala b/src/scalap/scala/tools/scalap/Arguments.scala index 41346d13c0..cb0a92b6b3 100644 --- a/src/scalap/scala/tools/scalap/Arguments.scala +++ b/src/scalap/scala/tools/scalap/Arguments.scala @@ -46,8 +46,8 @@ object Arguments { } def parseBinding(str: String, separator: Char): (String, String) = (str indexOf separator) match { - case -1 => argumentError("missing '" + separator + "' in binding '" + str + "'") ; Pair("", "") - case idx => Pair((str take idx).trim, (str drop (idx + 1)).trim) + case -1 => argumentError("missing '" + separator + "' in binding '" + str + "'") ; ("", "") + case idx => ((str take idx).trim, (str drop (idx + 1)).trim) } def parse(args: Array[String]): Arguments = { @@ -141,7 +141,7 @@ class Arguments { if (key.length > 0) bindings.getOrElseUpdate(tag, new mutable.HashMap)(key) = value - def addBinding(tag: String, binding: Pair[String, String]): Unit = + def addBinding(tag: String, binding: Tuple2[String, String]): Unit = addBinding(tag, binding._1, binding._2) def addOther(arg: String): Unit = others += arg diff --git a/test/build-partest.xml b/test/build-partest.xml index 22ad85ac03..e909a09123 100755 --- a/test/build-partest.xml +++ b/test/build-partest.xml @@ -7,6 +7,7 @@ <attribute name="srcdir" default="files"/> <!-- TODO: make targets for `pending` and other subdirs --> <attribute name="colors" default="${partest.colors}"/> <attribute name="scalacOpts" default="${scalac.args.optimise}"/> + <attribute name="pcp" default="${toString:partest.compilation.path}"/> <attribute name="kinds"/> <sequential> <property name="partest.dir" value="@{dir}" /> @@ -14,7 +15,7 @@ kinds="@{kinds}" colors="@{colors}" scalacOpts="@{scalacOpts}" - compilationpathref="partest.compilation.path"/> + compilationpath="@{pcp}"/> </sequential> </macrodef> </project> diff --git a/test/disabled/run/lisp.scala b/test/disabled/run/lisp.scala index 06e68f508a..73f24da757 100644 --- a/test/disabled/run/lisp.scala +++ b/test/disabled/run/lisp.scala @@ -12,11 +12,11 @@ class LispTokenizer(s: String) extends Iterator[String] { while (i < s.length() && s.charAt(i) <= ' ') i += 1 i < s.length() } - def next: String = + def next: String = if (hasNext) { val start = i if (isDelimiter(s charAt i)) i += 1 - else + else do i = i + 1 while (!isDelimiter(s charAt i)) s.substring(start, i) @@ -190,10 +190,10 @@ object LispCaseClasses extends Lisp { def extendEnv(env: Environment, ps: List[String], args: List[Data]): Environment = - Pair(ps, args) match { - case Pair(List(), List()) => + (ps, args) match { + case (List(), List()) => env - case Pair(p :: ps1, arg :: args1) => + case (p :: ps1, arg :: args1) => extendEnv(env.extend(p, arg), ps1, args1) case _ => lispError("wrong number of arguments") @@ -381,10 +381,10 @@ object LispAny extends Lisp { def extendEnv(env: Environment, ps: List[String], args: List[Data]): Environment = - Pair(ps, args) match { - case Pair(List(), List()) => + (ps, args) match { + case (List(), List()) => env - case Pair(p :: ps1, arg :: args1) => + case (p :: ps1, arg :: args1) => extendEnv(env.extend(p, arg), ps1, args1) case _ => lispError("wrong number of arguments") diff --git a/test/files/jvm/non-fatal-tests.scala b/test/files/jvm/non-fatal-tests.scala index 791b1d3100..1ff7ee516e 100644 --- a/test/files/jvm/non-fatal-tests.scala +++ b/test/files/jvm/non-fatal-tests.scala @@ -4,8 +4,7 @@ trait NonFatalTests { //NonFatals val nonFatals: Seq[Throwable] = - Seq(new StackOverflowError, - new RuntimeException, + Seq(new RuntimeException, new Exception, new Throwable, new NotImplementedError) @@ -13,6 +12,7 @@ trait NonFatalTests { //Fatals val fatals: Seq[Throwable] = Seq(new InterruptedException, + new StackOverflowError, new OutOfMemoryError, new LinkageError, new VirtualMachineError {}, diff --git a/test/files/jvm/typerep.scala b/test/files/jvm/typerep.scala index 1d6f0b7907..4f900d98d7 100644 --- a/test/files/jvm/typerep.scala +++ b/test/files/jvm/typerep.scala @@ -86,7 +86,7 @@ object testArrays { object testTuples { println(getType((3, "abc"))) - println(getType(Triple('a', 'b', "c"))) + println(getType(('a', 'b', "c"))) println(getType(((3, "abc"), (4, "xyz")))) println(getType(((Some('b'), 3), (Some('a'), 4)))) //println(getType(((Some('b'), 3), (None, 4)))) diff --git a/test/files/neg/class-of-double-targs.check b/test/files/neg/class-of-double-targs.check new file mode 100644 index 0000000000..f7e2094f97 --- /dev/null +++ b/test/files/neg/class-of-double-targs.check @@ -0,0 +1,4 @@ +class-of-double-targs.scala:2: error: expression of type Class[Int](classOf[scala.Int]) does not take type parameters. + classOf[Int][Int] + ^ +one error found diff --git a/test/files/neg/class-of-double-targs.scala b/test/files/neg/class-of-double-targs.scala new file mode 100644 index 0000000000..26a2fa8381 --- /dev/null +++ b/test/files/neg/class-of-double-targs.scala @@ -0,0 +1,3 @@ +object Test { + classOf[Int][Int] +} diff --git a/test/files/neg/patmatexhaust.scala b/test/files/neg/patmatexhaust.scala index aa7dac7d7d..f937197829 100644 --- a/test/files/neg/patmatexhaust.scala +++ b/test/files/neg/patmatexhaust.scala @@ -22,9 +22,9 @@ class TestSealedExhaustive { // compile only def ma3(x:Mult) = (x,x) match { // not exhaustive case (Kult(_), Qult()) => // Kult missing - //case Pair(Kult(_), Kult(_)) => + //case (Kult(_), Kult(_)) => case (Qult(), Kult(_)) => // Qult missing - //case Pair(Qult(), Qult()) => + //case (Qult(), Qult()) => } def ma3u(x:Mult) = ((x,x) : @unchecked) match { // not exhaustive, but not checked! diff --git a/test/files/neg/t414.scala b/test/files/neg/t414.scala index 1662b9a105..86646d13c2 100644 --- a/test/files/neg/t414.scala +++ b/test/files/neg/t414.scala @@ -1,5 +1,5 @@ case class Empty[a]() extends IntMap[a]; -case class Node[a](left: IntMap[a], keyVal: Pair[Int, a], right: IntMap[a]) extends IntMap[a]; +case class Node[a](left: IntMap[a], keyVal: Tuple2[Int, a], right: IntMap[a]) extends IntMap[a]; abstract class IntMap[a] { def lookup(key: Int): a = this match { case Empty => diff --git a/test/files/neg/t5702-neg-bad-and-wild.check b/test/files/neg/t5702-neg-bad-and-wild.check index ff9e5e5703..a52136dbf8 100644 --- a/test/files/neg/t5702-neg-bad-and-wild.check +++ b/test/files/neg/t5702-neg-bad-and-wild.check @@ -23,6 +23,6 @@ t5702-neg-bad-and-wild.scala:23: error: bad simple pattern: bad use of _* (a seq val K(ns @ _*, x) = k // bad use of _* (a sequence pattern must be the last pattern) ^ t5702-neg-bad-and-wild.scala:24: error: bad simple pattern: bad use of _* (sequence pattern not allowed) - val (b, _ * ) = Pair(5,6) // bad use of _* (sequence pattern not allowed) + val (b, _ * ) = (5,6) // bad use of _* (sequence pattern not allowed) ^ 9 errors found diff --git a/test/files/neg/t5702-neg-bad-and-wild.scala b/test/files/neg/t5702-neg-bad-and-wild.scala index 3833a002b1..aadda37da7 100644 --- a/test/files/neg/t5702-neg-bad-and-wild.scala +++ b/test/files/neg/t5702-neg-bad-and-wild.scala @@ -21,7 +21,7 @@ object Test { //gowild.scala:14: error: star patterns must correspond with varargs parameters val K(is @ _*) = k val K(ns @ _*, x) = k // bad use of _* (a sequence pattern must be the last pattern) - val (b, _ * ) = Pair(5,6) // bad use of _* (sequence pattern not allowed) + val (b, _ * ) = (5,6) // bad use of _* (sequence pattern not allowed) // no longer complains //bad-and-wild.scala:15: error: ')' expected but '}' found. } diff --git a/test/files/neg/t7605-deprecation.check b/test/files/neg/t7605-deprecation.check index 9c466c058c..6db94613a1 100644 --- a/test/files/neg/t7605-deprecation.check +++ b/test/files/neg/t7605-deprecation.check @@ -1,12 +1,15 @@ -t7605-deprecation.scala:2: warning: Procedure syntax is deprecated. Convert procedure to method by adding `: Unit =`. - def this(i: Int) { this() } - ^ -t7605-deprecation.scala:3: warning: Procedure syntax is deprecated. Convert procedure to method by adding `: Unit =`. +t7605-deprecation.scala:2: warning: Procedure syntax is deprecated. Convert procedure `bar` to method by adding `: Unit =`. def bar {} ^ -t7605-deprecation.scala:4: warning: Procedure syntax is deprecated. Convert procedure to method by adding `: Unit`. +t7605-deprecation.scala:3: warning: Procedure syntax is deprecated. Convert procedure `baz` to method by adding `: Unit`. def baz ^ +t7605-deprecation.scala:4: warning: Procedure syntax is deprecated. Convert procedure `boo` to method by adding `: Unit`. + def boo(i: Int, l: Long) + ^ +t7605-deprecation.scala:5: warning: Procedure syntax is deprecated. Convert procedure `boz` to method by adding `: Unit =`. + def boz(i: Int, l: Long) {} + ^ error: No warnings can be incurred under -Xfatal-warnings. -three warnings found +four warnings found one error found diff --git a/test/files/neg/t7605-deprecation.scala b/test/files/neg/t7605-deprecation.scala index 4a7dcd26d6..2b3362f94a 100644 --- a/test/files/neg/t7605-deprecation.scala +++ b/test/files/neg/t7605-deprecation.scala @@ -1,5 +1,8 @@ abstract class Foo { - def this(i: Int) { this() } def bar {} def baz -}
\ No newline at end of file + def boo(i: Int, l: Long) + def boz(i: Int, l: Long) {} + def this(i: Int) { this() } // Don't complain here! + def foz: Unit // Don't complain here! +} diff --git a/test/files/neg/t997.scala b/test/files/neg/t997.scala index e8d10f4317..1198738f24 100644 --- a/test/files/neg/t997.scala +++ b/test/files/neg/t997.scala @@ -1,5 +1,5 @@ // An extractor with 2 results -object Foo { def unapply(x : String) = Some(Pair(x, x)) } +object Foo { def unapply(x : String) = Some((x, x)) } object Test extends App { diff --git a/test/files/neg/wellkinded_wrongarity.check b/test/files/neg/wellkinded_wrongarity.check index 1dc38db5c1..b9f033b453 100644 --- a/test/files/neg/wellkinded_wrongarity.check +++ b/test/files/neg/wellkinded_wrongarity.check @@ -1,4 +1,4 @@ -wellkinded_wrongarity.scala:5: error: Pair takes two type parameters, expected: one -object mp extends Monad[Pair] +wellkinded_wrongarity.scala:5: error: Tuple2 takes two type parameters, expected: one +object mp extends Monad[Tuple2] ^ one error found diff --git a/test/files/neg/wellkinded_wrongarity.scala b/test/files/neg/wellkinded_wrongarity.scala index 2bb0e2ce8a..39c7601d53 100644 --- a/test/files/neg/wellkinded_wrongarity.scala +++ b/test/files/neg/wellkinded_wrongarity.scala @@ -2,4 +2,4 @@ class Monad[m[x]] -object mp extends Monad[Pair] +object mp extends Monad[Tuple2] diff --git a/test/files/pos/bounds.scala b/test/files/pos/bounds.scala index cfea4626c3..26bc84a1b9 100644 --- a/test/files/pos/bounds.scala +++ b/test/files/pos/bounds.scala @@ -1,11 +1,11 @@ trait Map[A, +C] { - def ++ [B1 >: C] (kvs: Iterable[Pair[A, B1]]): Map[A, B1] = this - def ++ [B1 >: C] (kvs: Iterator[Pair[A, B1]]): Map[A, B1] = this + def ++ [B1 >: C] (kvs: Iterable[Tuple2[A, B1]]): Map[A, B1] = this + def ++ [B1 >: C] (kvs: Iterator[Tuple2[A, B1]]): Map[A, B1] = this } class ListMap[A, +B] extends Map[A, B] {} object ListMap { def empty[X, Y] = new ListMap[X, Y] - def apply[A1, B2](elems: Pair[A1, B2]*): Map[A1, B2] = empty[A1,B2].++(elems.iterator) + def apply[A1, B2](elems: Tuple2[A1, B2]*): Map[A1, B2] = empty[A1,B2].++(elems.iterator) } diff --git a/test/files/pos/macro-implicit-invalidate-on-error.check b/test/files/pos/macro-implicit-invalidate-on-error.check new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/files/pos/macro-implicit-invalidate-on-error.check diff --git a/test/files/pos/macro-implicit-invalidate-on-error.scala b/test/files/pos/macro-implicit-invalidate-on-error.scala new file mode 100644 index 0000000000..22cd2d34b4 --- /dev/null +++ b/test/files/pos/macro-implicit-invalidate-on-error.scala @@ -0,0 +1,28 @@ +package scala.reflect +package api + +import scala.language.experimental.macros +import scala.reflect.macros.Context + +trait Liftable[T] { + def apply(universe: api.Universe, value: T): universe.Tree +} + +object Liftable { + implicit def liftCaseClass[T <: Product]: Liftable[T] = macro liftCaseClassImpl[T] + + def liftCaseClassImpl[T: c.WeakTypeTag](c: Context): c.Expr[Liftable[T]] = { + import c.universe._ + val tpe = weakTypeOf[T] + if (!tpe.typeSymbol.asClass.isCaseClass) c.abort(c.enclosingPosition, "denied") + val p = List(q"Literal(Constant(1))") + c.Expr[Liftable[T]] { q""" + new scala.reflect.api.Liftable[$tpe] { + def apply(universe: scala.reflect.api.Universe, value: $tpe): universe.Tree = { + import universe._ + Apply(Select(Ident(TermName("C")), TermName("apply")), List(..$p)) + } + } + """ } + } +} diff --git a/test/files/pos/patmat.scala b/test/files/pos/patmat.scala index 4e652b146e..51b879abf2 100644 --- a/test/files/pos/patmat.scala +++ b/test/files/pos/patmat.scala @@ -3,8 +3,8 @@ object ZipFun { //just compilation - def zipFun[a, b](xs: List[a], ys: List[b]): List[Pair[a, b]] = (Pair(xs, ys): @unchecked) match { - // !!! case Pair(List(), _), Pair(_, List()) => List() + def zipFun[a, b](xs: List[a], ys: List[b]): List[Tuple2[a, b]] = ((xs, ys): @unchecked) match { + // !!! case (List(), _), (_, List()) => List() case (x :: xs1, y :: ys1) => (x, y) :: zipFun(xs1, ys1) } } diff --git a/test/files/pos/spec-doubledef-new.scala b/test/files/pos/spec-doubledef-new.scala index ad9c6399a5..589ceb33b2 100644 --- a/test/files/pos/spec-doubledef-new.scala +++ b/test/files/pos/spec-doubledef-new.scala @@ -19,12 +19,12 @@ abstract class B[T, @specialized(scala.Int) U : TypeTag, @specialized(scala.Int) val u: U val v: V - def f(t: T, v2: V): Pair[U, V] = { + def f(t: T, v2: V): Tuple2[U, V] = { val m: Array[U] = null if (m.isEmpty) { - Pair(u, v) + (u, v) } else { - Pair(u, v2) + (u, v2) } } }
\ No newline at end of file diff --git a/test/files/pos/spec-doubledef-old.scala b/test/files/pos/spec-doubledef-old.scala index 86b0d857d3..bde259e4fa 100644 --- a/test/files/pos/spec-doubledef-old.scala +++ b/test/files/pos/spec-doubledef-old.scala @@ -17,12 +17,12 @@ abstract class B[T, @specialized(scala.Int) U : Manifest, @specialized(scala.Int val u: U val v: V - def f(t: T, v2: V): Pair[U, V] = { + def f(t: T, v2: V): Tuple2[U, V] = { val m: Array[U] = null if (m.isEmpty) { - Pair(u, v) + (u, v) } else { - Pair(u, v2) + (u, v2) } } } diff --git a/test/files/pos/t0064.scala b/test/files/pos/t0064.scala index c2ce4bf6d0..1eeca8dcad 100644 --- a/test/files/pos/t0064.scala +++ b/test/files/pos/t0064.scala @@ -1,6 +1,6 @@ object B { def main(Args:Array[String]) = { - val Pair(_,x) = Pair(1,2); + val (_,x) = (1,2); x + 1; } } diff --git a/test/files/pos/t1014.scala b/test/files/pos/t1014.scala new file mode 100644 index 0000000000..6fb7f7ba49 --- /dev/null +++ b/test/files/pos/t1014.scala @@ -0,0 +1,16 @@ +class NodeSeq +class Elem extends NodeSeq + +class EO extends App with Moo { + // return type is Flog, inherited from overridden method. + // implicit conversions are applied because expected type `pt` is `Flog` when `computeType(rhs, pt)`. + def cat = (??? : Elem) + + implicit def nodeSeqToFlog(in: Elem): Flog = new Flog(in) +} + +trait Moo { + def cat: Flog +} + +class Flog(val in: NodeSeq) diff --git a/test/files/pos/t1203a.scala b/test/files/pos/t1203a.scala new file mode 100644 index 0000000000..cf5ab9fba0 --- /dev/null +++ b/test/files/pos/t1203a.scala @@ -0,0 +1,13 @@ +class Node +object NodeSeq { + implicit def seqToNodeSeq(s: Seq[Node]): NodeSeq = ??? +} +abstract class NodeSeq extends collection.immutable.Seq[Node] + +case class ant(t: String) extends scala.annotation.Annotation +object Test { + def main(args: Array[String]): Unit = { + val a: NodeSeq @ant("12") = Nil + println(a) + } +} diff --git a/test/files/pos/t247.scala b/test/files/pos/t247.scala index e976404e61..fdcafeb2c6 100644 --- a/test/files/pos/t247.scala +++ b/test/files/pos/t247.scala @@ -16,11 +16,11 @@ class Tree[KEY,Entry](order:Order[KEY]) { def size =0; } -class TreeMap[KEY,VALUE](_factory:TreeMapFactory[KEY]) extends Tree[KEY,Pair[KEY,VALUE]](_factory.order) with scala.collection.DefaultMap[KEY, VALUE] with Map[KEY, VALUE] { +class TreeMap[KEY,VALUE](_factory:TreeMapFactory[KEY]) extends Tree[KEY,Tuple2[KEY,VALUE]](_factory.order) with scala.collection.DefaultMap[KEY, VALUE] with Map[KEY, VALUE] { val factory = _factory val order = _factory.order; def this(newOrder:Order[KEY]) = this(new TreeMapFactory[KEY](newOrder)); def get(key:KEY) = null; - def iterator:Iterator[Pair[KEY,VALUE]] = null; + def iterator:Iterator[Tuple2[KEY,VALUE]] = null; override def size = super[Tree].size } diff --git a/test/files/pos/t2698.scala b/test/files/pos/t2698.scala new file mode 100644 index 0000000000..bce02e48b3 --- /dev/null +++ b/test/files/pos/t2698.scala @@ -0,0 +1,14 @@ +class WordExp { + abstract class Label + type _labelT <: Label +} + +import scala.collection._ + +abstract class S2 { + val lang: WordExp + type __labelT = lang._labelT + + var deltaq: Array[__labelT] = _ + def delta1 = immutable.Map(deltaq.zipWithIndex: _*) +} diff --git a/test/files/pos/t3160.scala b/test/files/pos/t3160.scala new file mode 100644 index 0000000000..cc007dc014 --- /dev/null +++ b/test/files/pos/t3160.scala @@ -0,0 +1,6 @@ +import scala.collection.mutable._ +class Node + +class A { + def f(x: Node): Node = ??? +} diff --git a/test/files/pos/t443.scala b/test/files/pos/t443.scala index 5b5e3ea828..cdaefe9ecd 100644 --- a/test/files/pos/t443.scala +++ b/test/files/pos/t443.scala @@ -1,10 +1,10 @@ object Test { - def lookup(): Option[Pair[String, String]] = - ((null: Option[Pair[String, String]]) : @unchecked) match { - case Some(Pair(_, _)) => + def lookup(): Option[Tuple2[String, String]] = + ((null: Option[Tuple2[String, String]]) : @unchecked) match { + case Some((_, _)) => if (true) - Some(Pair(null, null)) + Some((null, null)) else lookup() match { case Some(_) => Some(null) diff --git a/test/files/pos/t4579.scala b/test/files/pos/t4579.scala index 8951ec011f..cd1553f02a 100644 --- a/test/files/pos/t4579.scala +++ b/test/files/pos/t4579.scala @@ -190,10 +190,10 @@ object LispCaseClasses extends Lisp { def extendEnv(env: Environment, ps: List[String], args: List[Data]): Environment = - Pair(ps, args) match { - case Pair(List(), List()) => + (ps, args) match { + case (List(), List()) => env - case Pair(p :: ps1, arg :: args1) => + case (p :: ps1, arg :: args1) => extendEnv(env.extend(p, arg), ps1, args1) case _ => lispError("wrong number of arguments") @@ -381,10 +381,10 @@ object LispAny extends Lisp { def extendEnv(env: Environment, ps: List[String], args: List[Data]): Environment = - Pair(ps, args) match { - case Pair(List(), List()) => + (ps, args) match { + case (List(), List()) => env - case Pair(p :: ps1, arg :: args1) => + case (p :: ps1, arg :: args1) => extendEnv(env.extend(p, arg), ps1, args1) case _ => lispError("wrong number of arguments") diff --git a/test/files/pos/t5120.scala b/test/files/pos/t5120.scala index 6731af14e4..86d4470bd5 100644 --- a/test/files/pos/t5120.scala +++ b/test/files/pos/t5120.scala @@ -5,9 +5,9 @@ class Test { class ScopedKey[T] class Value[T] - class Compiled[T](val settings: Seq[Pair[T]]) + class Compiled[T](val settings: Seq[Tuple2[T]]) - case class Pair[T](k: ScopedKey[T], v: ScopedKey[T]) + case class Tuple2[T](k: ScopedKey[T], v: ScopedKey[T]) def transform[T](x: T) = x diff --git a/test/files/pos/t6201.scala b/test/files/pos/t6201.scala new file mode 100644 index 0000000000..d4e5bce03a --- /dev/null +++ b/test/files/pos/t6201.scala @@ -0,0 +1,19 @@ +// probably needs xml's weirdness to reproduce +// (specifically, _root_.scala.xml.Null being in the root package) +class Elem + +class Test { + def elem: Elem = ??? + + class Foo1 { + def must(x: Elem) = () + } + + class Foo2 { + def must(x: Int) = () + } + implicit def toFoo1(s: Elem) = new Foo1() + implicit def toFoo2(s: Elem) = new Foo2() + + def is: Unit = { (elem) } +}
\ No newline at end of file diff --git a/test/files/pos/t7983.scala b/test/files/pos/t7983.scala new file mode 100644 index 0000000000..a583e538c5 --- /dev/null +++ b/test/files/pos/t7983.scala @@ -0,0 +1,31 @@ +package foo.bar.baz // the package nesting level material to this bug + +class DivergenceTest { + + trait ColumnBase[T] + + trait ShapeLevel + trait Flat extends ShapeLevel + trait Lower extends Flat + + class Shape2[Level <: ShapeLevel, -M, U] + + implicit final def columnBaseShape[Level >: Flat <: ShapeLevel, T, C <: ColumnBase[_]] + (implicit ev: C <:< ColumnBase[T] + ): Shape2[Level, C, T] = ??? + + implicit final def intShape[Level <: ShapeLevel, T]: Shape2[Level, Int, Int] = ??? + implicit final def tuple2Shape[Level <: ShapeLevel, M1,M2, U1,U2] + (implicit u1: Shape2[_ <: Level, M1, U1], + u2: Shape2[_ <: Level, M2, U2] + ): Shape2[Level, (M1,M2), (U1,U2)] = ??? + + def foo { + class Coffees extends ColumnBase[Int] + + def map1[F, T](f: F)(implicit shape: Shape2[_ <: Flat, F, T]) = ??? + + map1(((1, null: Coffees), 1)) + map1(((null: Coffees, 1), 1)) // fails with implicit divergence error in 2.11.0-M6, works under 2.10.3 + } +} diff --git a/test/files/pos/t7987/Macro_1.scala b/test/files/pos/t7987/Macro_1.scala new file mode 100644 index 0000000000..81f717b9c4 --- /dev/null +++ b/test/files/pos/t7987/Macro_1.scala @@ -0,0 +1,6 @@ +import scala.language.experimental._ + +object Macro { + def apply[A](a: A): A = macro impl[A] + def impl[A](c: reflect.macros.Context)(a: c.Expr[A]): c.Expr[A] = a +} diff --git a/test/files/pos/t7987/Test_2.scala b/test/files/pos/t7987/Test_2.scala new file mode 100644 index 0000000000..5896fdb517 --- /dev/null +++ b/test/files/pos/t7987/Test_2.scala @@ -0,0 +1,12 @@ +class C[T] { + def foo = 0 +} + +object Test { + implicit def AnyToC[T](a: Any): C[T] = new C[T] + // was: "macro not expanded" + Macro { + "".foo + () + } +} diff --git a/test/files/pos/tcpoly_bounds1.scala b/test/files/pos/tcpoly_bounds1.scala index 5874cc664d..63263cb152 100644 --- a/test/files/pos/tcpoly_bounds1.scala +++ b/test/files/pos/tcpoly_bounds1.scala @@ -1,7 +1,7 @@ -class Foo[t[x]<: Pair[Int, x]] +class Foo[t[x]<: Tuple2[Int, x]] // -class MyPair[z](a: Int, b: z) extends Pair[Int, z](a,b) +class MyPair[z](a: Int, b: z) extends Tuple2[Int, z](a,b) object foo extends Foo[MyPair] diff --git a/test/files/pos/typealiases.scala b/test/files/pos/typealiases.scala index d03b521f77..93d1dce4dc 100644 --- a/test/files/pos/typealiases.scala +++ b/test/files/pos/typealiases.scala @@ -14,7 +14,7 @@ trait Test[T] { object main extends Test[Int] { val pair1 = (1,1) - implicit def topair(x: Int): Pair[Int, Int] = (x,x) + implicit def topair(x: Int): Tuple2[Int, Int] = (x,x) val pair2: MyPair[Int] = 1 val x: Short = 1 } diff --git a/test/files/pos/unapplyNeedsMemberType.scala b/test/files/pos/unapplyNeedsMemberType.scala index b423257e04..3a96e189af 100644 --- a/test/files/pos/unapplyNeedsMemberType.scala +++ b/test/files/pos/unapplyNeedsMemberType.scala @@ -19,7 +19,7 @@ class Join[a] extends Gunk[a] { def append(s1: Seq, s2: Seq): Seq = s1 // mock implementation def unapply_Cons(s: Any) = s match { - case App(Cons(x, xs), ys) => Some(Pair(x, append(xs, ys))) + case App(Cons(x, xs), ys) => Some((x, append(xs, ys))) case _ => null } } diff --git a/test/files/pos/valdefs.scala b/test/files/pos/valdefs.scala index 85ffa132b7..c8f78cd2bf 100644 --- a/test/files/pos/valdefs.scala +++ b/test/files/pos/valdefs.scala @@ -11,6 +11,6 @@ object test { } abstract class Sub2() extends Base() { - override val Pair(x, y) = Pair("abc", 2.0); + override val (x, y) = ("abc", 2.0); } } diff --git a/test/files/positions/ExcludedPrefix1.scala b/test/files/positions/ExcludedPrefix1.scala index f3562c37f0..b3182eae78 100644 --- a/test/files/positions/ExcludedPrefix1.scala +++ b/test/files/positions/ExcludedPrefix1.scala @@ -35,7 +35,7 @@ object ExcludedPrefix1 { (i, j) = (0, 0) - val Pair( + val ( k, l) = (0, 0) } diff --git a/test/files/positions/Overlap4.scala b/test/files/positions/Overlap4.scala index 0049293954..f54837295b 100644 --- a/test/files/positions/Overlap4.scala +++ b/test/files/positions/Overlap4.scala @@ -1,3 +1,3 @@ object Overlap4 { - val Pair(a, b) = (0, 0) + val (a, b) = (0, 0) } diff --git a/test/files/positions/Scaladoc7.scala b/test/files/positions/Scaladoc7.scala index 6175222e3f..0198d4d6ac 100644 --- a/test/files/positions/Scaladoc7.scala +++ b/test/files/positions/Scaladoc7.scala @@ -2,5 +2,5 @@ object Scaladoc7 { /** * Foo */ - val Pair(i, j) = (1, 2) + val (i, j) = (1, 2) } diff --git a/test/files/presentation/callcc-interpreter.check b/test/files/presentation/callcc-interpreter.check index d41b982614..1f868097ca 100644 --- a/test/files/presentation/callcc-interpreter.check +++ b/test/files/presentation/callcc-interpreter.check @@ -1,8 +1,8 @@ reload: CallccInterpreter.scala -askTypeCompletion at CallccInterpreter.scala(51,38) +askTypeCompletion at CallccInterpreter.scala(51,34) ================================================================================ -[response] askCompletionAt (51,38) +[response] askTypeCompletion at (51,34) retrieved 59 members abstract trait Term extends AnyRef abstract trait Value extends AnyRef @@ -83,8 +83,8 @@ def showM(m: callccInterpreter.M[callccInterpreter.Value]): String = m.in.apply( askType at CallccInterpreter.scala(50,30) ================================================================================ [response] askTypeAt (50,30) -def add(a: callccInterpreter.Value, b: callccInterpreter.Value): callccInterpreter.M[_ >: callccInterpreter.Num with callccInterpreter.Wrong.type <: Product with Serializable with callccInterpreter.Value] = scala.this.Predef.Pair.apply[callccInterpreter.Value, callccInterpreter.Value](a, b) match { - case scala.this.Predef.Pair.unapply[callccInterpreter.Value, callccInterpreter.Value](<unapply-selector>) <unapply> ((n: Int)callccInterpreter.Num((m @ _)), (n: Int)callccInterpreter.Num((n @ _))) => this.unitM[callccInterpreter.Num](callccInterpreter.this.Num.apply(m.+(n))) +def add(a: callccInterpreter.Value, b: callccInterpreter.Value): callccInterpreter.M[_ >: callccInterpreter.Num with callccInterpreter.Wrong.type <: Product with Serializable with callccInterpreter.Value] = scala.Tuple2.apply[callccInterpreter.Value, callccInterpreter.Value](a, b) match { + case (_1: callccInterpreter.Value, _2: callccInterpreter.Value)(callccInterpreter.Value, callccInterpreter.Value)((n: Int)callccInterpreter.Num((m @ _)), (n: Int)callccInterpreter.Num((n @ _))) => this.unitM[callccInterpreter.Num](callccInterpreter.this.Num.apply(m.+(n))) case _ => callccInterpreter.this.unitM[callccInterpreter.Wrong.type](callccInterpreter.this.Wrong) } ================================================================================ diff --git a/test/files/presentation/callcc-interpreter/src/CallccInterpreter.scala b/test/files/presentation/callcc-interpreter/src/CallccInterpreter.scala index ce3b996b96..d498fe0b17 100644 --- a/test/files/presentation/callcc-interpreter/src/CallccInterpreter.scala +++ b/test/files/presentation/callcc-interpreter/src/CallccInterpreter.scala @@ -40,15 +40,15 @@ object callccInterpreter { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]] + type Environment = List[Tuple2[Name, Value]] def lookup(x: Name, e: Environment): M[Value] = e match { case List() => unitM(Wrong) - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value) /*?*/ = Pair(a, b) match { - case Pair(Num(m), Num(n)) => this./*!*/unitM(Num(m + n)) + def add(a: Value, b: Value) /*?*/ = (a, b) match { + case (Num(m), Num(n)) => this./*!*/unitM(Num(m + n)) case _ => unitM(Wrong) } @@ -60,16 +60,20 @@ object callccInterpreter { def interp(t: Term, e: Environment): M[Value] = t match { case Var(x) => lookup(x, e) case Con(n) => unitM(Num(n)) - case Add(l, r) => for (val a <- interp(l, e); - val b <- interp(r, e); - val c <- add(a, b)) - yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) - case App(f, t) => for (val a <- interp(f, e); - val b <- interp(t, e); - val c <- apply(a, b)) - yield c - case Ccc(x, t) => callCC(k => interp(t, Pair(x, Fun(k)) :: e)) + case Add(l, r) => + for { + a <- interp(l, e) + b <- interp(r, e) + c <- add(a, b) + } yield c + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) + case App(f, t) => + for { + a <- interp(f, e) + b <- interp(t, e) + c <- apply(a, b) + } yield c + case Ccc(x, t) => callCC(k => interp(t, (x, Fun(k)) :: e)) } def test(t: Term): String = showM(interp(t, List())) diff --git a/test/files/presentation/completion-implicit-chained.check b/test/files/presentation/completion-implicit-chained.check index b34e6bc7e1..f9d77f7a53 100644 --- a/test/files/presentation/completion-implicit-chained.check +++ b/test/files/presentation/completion-implicit-chained.check @@ -2,7 +2,7 @@ reload: Completions.scala askTypeCompletion at Completions.scala(11,16) ================================================================================ -[response] askCompletionAt (11,16) +[response] askTypeCompletion at (11,16) retrieved 24 members [inaccessible] protected[package lang] def clone(): Object [inaccessible] protected[package lang] def finalize(): Unit diff --git a/test/files/presentation/ide-bug-1000349.check b/test/files/presentation/ide-bug-1000349.check index aa6660cec5..c59fa6843f 100644 --- a/test/files/presentation/ide-bug-1000349.check +++ b/test/files/presentation/ide-bug-1000349.check @@ -2,7 +2,7 @@ reload: CompletionOnEmptyArgMethod.scala askTypeCompletion at CompletionOnEmptyArgMethod.scala(2,17) ================================================================================ -[response] askCompletionAt (2,17) +[response] askTypeCompletion at (2,17) retrieved 32 members def +(other: String): String def ->[B](y: B): (Foo, B) diff --git a/test/files/presentation/ide-bug-1000475.check b/test/files/presentation/ide-bug-1000475.check index cb7de6d34a..f5b4253e1a 100644 --- a/test/files/presentation/ide-bug-1000475.check +++ b/test/files/presentation/ide-bug-1000475.check @@ -2,7 +2,7 @@ reload: Foo.scala askTypeCompletion at Foo.scala(3,7) ================================================================================ -[response] askCompletionAt (3,7) +[response] askTypeCompletion at (3,7) retrieved 31 members [inaccessible] protected[package lang] def clone(): Object [inaccessible] protected[package lang] def finalize(): Unit @@ -36,7 +36,7 @@ final def wait(x$1: Long,x$2: Int): Unit askTypeCompletion at Foo.scala(6,10) ================================================================================ -[response] askCompletionAt (6,10) +[response] askTypeCompletion at (6,10) retrieved 31 members [inaccessible] protected[package lang] def clone(): Object [inaccessible] protected[package lang] def finalize(): Unit @@ -70,7 +70,7 @@ final def wait(x$1: Long,x$2: Int): Unit askTypeCompletion at Foo.scala(7,7) ================================================================================ -[response] askCompletionAt (7,7) +[response] askTypeCompletion at (7,7) retrieved 31 members [inaccessible] protected[package lang] def clone(): Object [inaccessible] protected[package lang] def finalize(): Unit diff --git a/test/files/presentation/ide-bug-1000531.check b/test/files/presentation/ide-bug-1000531.check index 9a2cad5fd2..dff89b155b 100644 --- a/test/files/presentation/ide-bug-1000531.check +++ b/test/files/presentation/ide-bug-1000531.check @@ -2,7 +2,7 @@ reload: CrashOnLoad.scala askTypeCompletion at CrashOnLoad.scala(6,12) ================================================================================ -[response] askCompletionAt (6,12) +[response] askTypeCompletion at (6,12) retrieved 120 members [inaccessible] protected[package lang] def clone(): Object [inaccessible] protected[package lang] def finalize(): Unit diff --git a/test/files/presentation/implicit-member.check b/test/files/presentation/implicit-member.check index ef361599c5..5ad52b4dd3 100644 --- a/test/files/presentation/implicit-member.check +++ b/test/files/presentation/implicit-member.check @@ -2,7 +2,7 @@ reload: ImplicitMember.scala askTypeCompletion at ImplicitMember.scala(7,7) ================================================================================ -[response] askCompletionAt (7,7) +[response] askTypeCompletion at (7,7) retrieved 34 members def +(other: String): String def ->[B](y: B): (Implicit.type, B) diff --git a/test/files/presentation/ping-pong.check b/test/files/presentation/ping-pong.check index 10d29bfed6..20f17aa7d0 100644 --- a/test/files/presentation/ping-pong.check +++ b/test/files/presentation/ping-pong.check @@ -2,7 +2,7 @@ reload: PingPong.scala askTypeCompletion at PingPong.scala(10,23) ================================================================================ -[response] askCompletionAt (10,23) +[response] askTypeCompletion at (10,23) retrieved 35 members [inaccessible] private[this] val ping: Ping [inaccessible] protected[package lang] def clone(): Object @@ -39,7 +39,7 @@ private[this] val name: String askTypeCompletion at PingPong.scala(19,20) ================================================================================ -[response] askCompletionAt (19,20) +[response] askTypeCompletion at (19,20) retrieved 35 members [inaccessible] protected[package lang] def clone(): Object [inaccessible] protected[package lang] def finalize(): Unit diff --git a/test/files/presentation/scope-completion-1.check b/test/files/presentation/scope-completion-1.check new file mode 100644 index 0000000000..63f956b239 --- /dev/null +++ b/test/files/presentation/scope-completion-1.check @@ -0,0 +1,19 @@ +reload: Completions.scala + +askScopeCompletion at Completions.scala(6,2) +================================================================================ +[response] askScopeCompletion at (6,2) +retrieved 3 members +class Completion1 extends AnyRef +def <init>(): test.Completion1 +object Completion2 +================================================================================ + +askScopeCompletion at Completions.scala(10,2) +================================================================================ +[response] askScopeCompletion at (10,2) +retrieved 3 members +class Completion1 extends AnyRef +def <init>(): test.Completion2.type +object Completion2 +================================================================================ diff --git a/test/files/presentation/scope-completion-1/Test.scala b/test/files/presentation/scope-completion-1/Test.scala new file mode 100644 index 0000000000..bec1131c4c --- /dev/null +++ b/test/files/presentation/scope-completion-1/Test.scala @@ -0,0 +1,3 @@ +import scala.tools.nsc.interactive.tests.InteractiveTest + +object Test extends InteractiveTest
\ No newline at end of file diff --git a/test/files/presentation/scope-completion-1/src/Completions.scala b/test/files/presentation/scope-completion-1/src/Completions.scala new file mode 100644 index 0000000000..c4eea6b261 --- /dev/null +++ b/test/files/presentation/scope-completion-1/src/Completions.scala @@ -0,0 +1,12 @@ +package test + +/* completion on empty class and object */ + +class Completion1 { + /*_*/ +} + +object Completion2 { + /*_*/ +} + diff --git a/test/files/presentation/scope-completion-2.check b/test/files/presentation/scope-completion-2.check new file mode 100644 index 0000000000..3a1dbd7cff --- /dev/null +++ b/test/files/presentation/scope-completion-2.check @@ -0,0 +1,35 @@ +reload: Completions.scala + +askScopeCompletion at Completions.scala(16,4) +================================================================================ +[response] askScopeCompletion at (16,4) +retrieved 11 members +class Completion1 extends AnyRef +def <init>(): test.Completion1 +def test: Unit +object Completion1 +private class Cc1 extends AnyRef +private class Co1 extends AnyRef +private def fc1: Int +private def fo1: Int +private[this] val c: test.Completion1 +private[this] val vc1: Int +private[this] val vo1: Int +================================================================================ + +askScopeCompletion at Completions.scala(32,4) +================================================================================ +[response] askScopeCompletion at (32,4) +retrieved 11 members +[inaccessible] private[this] val vc1: Int +class Completion1 extends AnyRef +def <init>(): test.Completion1.type +def test: Unit +object Completion1 +private class Cc1 extends AnyRef +private class Co1 extends AnyRef +private def fc1: Int +private def fo1: Int +private[this] val c: test.Completion1 +private[this] val vo1: Int +================================================================================ diff --git a/test/files/presentation/scope-completion-2/Test.scala b/test/files/presentation/scope-completion-2/Test.scala new file mode 100644 index 0000000000..bec1131c4c --- /dev/null +++ b/test/files/presentation/scope-completion-2/Test.scala @@ -0,0 +1,3 @@ +import scala.tools.nsc.interactive.tests.InteractiveTest + +object Test extends InteractiveTest
\ No newline at end of file diff --git a/test/files/presentation/scope-completion-2/src/Completions.scala b/test/files/presentation/scope-completion-2/src/Completions.scala new file mode 100644 index 0000000000..96d38f1b85 --- /dev/null +++ b/test/files/presentation/scope-completion-2/src/Completions.scala @@ -0,0 +1,35 @@ +package test + +/* private elements are visible in the companion class/object */ + +class Completion1 { + + import Completion1._ + + private val vc1 = 0 + private def fc1 = 0 + + private class Cc1 + + def test { + // needs to be done in a method, because of SI-7280 + /*_*/ + } +} + +object Completion1 { + + val c = new Completion1() + import c._ + + private val vo1 = 0 + private def fo1 = 0 + + private class Co1 + + def test { + // needs to be done in a method, because of SI-7280 + /*_*/ + } +} + diff --git a/test/files/presentation/scope-completion-3.check b/test/files/presentation/scope-completion-3.check new file mode 100644 index 0000000000..cf73e89a3b --- /dev/null +++ b/test/files/presentation/scope-completion-3.check @@ -0,0 +1,111 @@ +reload: Completions.scala + +askScopeCompletion at Completions.scala(75,2) +================================================================================ +[response] askScopeCompletion at (75,2) +retrieved 49 members +[inaccessible] private class Cb2 extends AnyRef +[inaccessible] private class Ct2 extends AnyRef +[inaccessible] private def fb2: Int +[inaccessible] private def ft2: Int +[inaccessible] private object Ob2 +[inaccessible] private object Ot2 +[inaccessible] private type tb2 = Completion1.this.tb2 +[inaccessible] private type tt2 = Completion1.this.tt2 +[inaccessible] private[this] val vb1: Int +[inaccessible] private[this] val vb2: Int +[inaccessible] private[this] val vt1: Int +[inaccessible] private[this] val vt2: Int +[inaccessible] private[this] var rb1: Int +[inaccessible] private[this] var rb2: Int +[inaccessible] private[this] var rt1: Int +[inaccessible] private[this] var rt2: Int +abstract class Base1 extends AnyRef +abstract trait Trait1 extends AnyRef +class Cb1 extends AnyRef +class Cc1 extends AnyRef +class Completion1 extends Base1 with Trait1 +class Ct1 extends AnyRef +def <init>(): test.Completion1 +def fb1: Int +def fc1: Int +def ft1: Int +object Completion2 +object Ob1 +object Oc1 +object Ot1 +override def fb3: Int +override def ft3: Int +override type tb3 = Completion1.this.tb3 +override type tt3 = Completion1.this.tt3 +private class Cc2 extends AnyRef +private def fc2: Int +private object Oc2 +private type tc2 = Completion1.this.tc2 +private[this] val vb3: Int +private[this] val vc1: Int +private[this] val vc2: Int +private[this] val vt3: Int +private[this] var rb3: Int +private[this] var rc1: Int +private[this] var rc2: Int +private[this] var rt3: Int +type tb1 = Completion1.this.tb1 +type tc1 = Completion1.this.tc1 +type tt1 = Completion1.this.tt1 +================================================================================ + +askScopeCompletion at Completions.scala(104,2) +================================================================================ +[response] askScopeCompletion at (104,2) +retrieved 49 members +[inaccessible] private class Cb2 extends AnyRef +[inaccessible] private class Ct2 extends AnyRef +[inaccessible] private def fb2: Int +[inaccessible] private def ft2: Int +[inaccessible] private object Ob2 +[inaccessible] private object Ot2 +[inaccessible] private type tb2 = test.Completion2.tb2 +[inaccessible] private type tt2 = test.Completion2.tt2 +[inaccessible] private[this] val vb1: Int +[inaccessible] private[this] val vb2: Int +[inaccessible] private[this] val vt1: Int +[inaccessible] private[this] val vt2: Int +[inaccessible] private[this] var rb1: Int +[inaccessible] private[this] var rb2: Int +[inaccessible] private[this] var rt1: Int +[inaccessible] private[this] var rt2: Int +abstract class Base1 extends AnyRef +abstract trait Trait1 extends AnyRef +class Cb1 extends AnyRef +class Co1 extends AnyRef +class Completion1 extends Base1 with Trait1 +class Ct1 extends AnyRef +def <init>(): test.Completion2.type +def fb1: Int +def fo1: Int +def ft1: Int +object Completion2 +object Ob1 +object Oo1 +object Ot1 +override def fb3: Int +override def ft3: Int +override type tb3 = test.Completion2.tb3 +override type tt3 = test.Completion2.tt3 +private class Co2 extends AnyRef +private def fo2: Int +private object Oo2 +private type to2 = test.Completion2.to2 +private[this] val vb3: Int +private[this] val vo1: Int +private[this] val vo2: Int +private[this] val vt3: Int +private[this] var rb3: Int +private[this] var ro1: Int +private[this] var ro2: Int +private[this] var rt3: Int +type tb1 = test.Completion2.tb1 +type to1 = test.Completion2.to1 +type tt1 = test.Completion2.tt1 +================================================================================ diff --git a/test/files/presentation/scope-completion-3/Test.scala b/test/files/presentation/scope-completion-3/Test.scala new file mode 100644 index 0000000000..bec1131c4c --- /dev/null +++ b/test/files/presentation/scope-completion-3/Test.scala @@ -0,0 +1,3 @@ +import scala.tools.nsc.interactive.tests.InteractiveTest + +object Test extends InteractiveTest
\ No newline at end of file diff --git a/test/files/presentation/scope-completion-3/src/Completions.scala b/test/files/presentation/scope-completion-3/src/Completions.scala new file mode 100644 index 0000000000..18cef1cefa --- /dev/null +++ b/test/files/presentation/scope-completion-3/src/Completions.scala @@ -0,0 +1,106 @@ +package test + +/* check availability of members defined locally and in hierachy */ + +abstract class Base1 { + + type tb1 = Int + val vb1 = 0 + var rb1 = 0 + def fb1 = 0 + class Cb1 + object Ob1 + + private type tb2 = Int + private val vb2 = 0 + private var rb2 = 0 + private def fb2 = 0 + private class Cb2 + private object Ob2 + + type tb3 + val vb3: Int + var rb3: Int + def fb3: Int +} + +trait Trait1 { + + type tt1 = Int + val vt1 = 0 + var rt1 = 0 + def ft1 = 0 + class Ct1 + object Ot1 + + private type tt2 = Int + private val vt2 = 0 + private var rt2 = 0 + private def ft2 = 0 + private class Ct2 + private object Ot2 + + type tt3 + val vt3: Int + var rt3: Int + def ft3: Int +} + +class Completion1 extends Base1 with Trait1 { + + type tc1 = Int + val vc1 = 0 + var rc1 = 0 + def fc1 = 0 + class Cc1 + object Oc1 + + private type tc2 = Int + private val vc2 = 0 + private var rc2 = 0 + private def fc2 = 0 + private class Cc2 + private object Oc2 + + override type tb3 = Int + override val vb3 = 12 + override var rb3 = 12 + override def fb3 = 12 + + override type tt3 = Int + override val vt3 = 12 + override var rt3 = 12 + override def ft3 = 12 + + /*_*/ +} + +object Completion2 extends Base1 with Trait1 { + + type to1 = Int + val vo1 = 0 + var ro1 = 0 + def fo1 = 0 + class Co1 + object Oo1 + + private type to2 = Int + private val vo2 = 0 + private var ro2 = 0 + private def fo2 = 0 + private class Co2 + private object Oo2 + + override type tb3 = Int + override val vb3 = 12 + override var rb3 = 12 + override def fb3 = 12 + + override type tt3 = Int + override val vt3 = 12 + override var rt3 = 12 + override def ft3 = 12 + + /*_*/ +} + diff --git a/test/files/presentation/scope-completion-4.check b/test/files/presentation/scope-completion-4.check new file mode 100644 index 0000000000..59c47464c4 --- /dev/null +++ b/test/files/presentation/scope-completion-4.check @@ -0,0 +1,293 @@ +reload: Completions.scala + +askScopeCompletion at Completions.scala(12,8) +================================================================================ +[response] askScopeCompletion at (12,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class ffc extends AnyRef +def <init>(): test.Completion1 +def f: Unit +def ff: Unit +def fff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(15,6) +================================================================================ +[response] askScopeCompletion at (15,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class ffc extends AnyRef +def <init>(): test.Completion1 +def f: Unit +def ff: Unit +def fff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(18,8) +================================================================================ +[response] askScopeCompletion at (18,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class ffc extends AnyRef +def <init>(): ffc +def f: Unit +def ff: Unit +def fff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(21,6) +================================================================================ +[response] askScopeCompletion at (21,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class ffc extends AnyRef +def <init>(): test.Completion1 +def f: Unit +def ff: Unit +def fff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(24,4) +================================================================================ +[response] askScopeCompletion at (24,4) +retrieved 6 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +def <init>(): test.Completion1 +def f: Unit +def ff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(29,8) +================================================================================ +[response] askScopeCompletion at (29,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class fcc extends AnyRef +def <init>(): fc +def f: Unit +def fcf: Unit +def ff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(32,6) +================================================================================ +[response] askScopeCompletion at (32,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class fcc extends AnyRef +def <init>(): fc +def f: Unit +def fcf: Unit +def ff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(35,8) +================================================================================ +[response] askScopeCompletion at (35,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class fcc extends AnyRef +def <init>(): fc.this.fcc +def f: Unit +def fcf: Unit +def ff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(38,6) +================================================================================ +[response] askScopeCompletion at (38,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +class fcc extends AnyRef +def <init>(): fc +def f: Unit +def fcf: Unit +def ff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(41,4) +================================================================================ +[response] askScopeCompletion at (41,4) +retrieved 6 members +class Completion1 extends AnyRef +class c extends AnyRef +class fc extends AnyRef +def <init>(): test.Completion1 +def f: Unit +def ff: Unit +================================================================================ + +askScopeCompletion at Completions.scala(44,2) +================================================================================ +[response] askScopeCompletion at (44,2) +retrieved 4 members +class Completion1 extends AnyRef +class c extends AnyRef +def <init>(): test.Completion1 +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(51,8) +================================================================================ +[response] askScopeCompletion at (51,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class ccc extends AnyRef +def <init>(): cc.this.ccc +def ccf: Unit +def cf: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(54,6) +================================================================================ +[response] askScopeCompletion at (54,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class ccc extends AnyRef +def <init>(): c.this.cc +def ccf: Unit +def cf: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(57,8) +================================================================================ +[response] askScopeCompletion at (57,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class ccc extends AnyRef +def <init>(): c.this.cc +def ccf: Unit +def cf: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(60,6) +================================================================================ +[response] askScopeCompletion at (60,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class ccc extends AnyRef +def <init>(): c.this.cc +def ccf: Unit +def cf: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(63,4) +================================================================================ +[response] askScopeCompletion at (63,4) +retrieved 6 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +def <init>(): Completion1.this.c +def cf: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(68,8) +================================================================================ +[response] askScopeCompletion at (68,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class cfc extends AnyRef +def <init>(): cfc +def cf: Unit +def cff: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(71,6) +================================================================================ +[response] askScopeCompletion at (71,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class cfc extends AnyRef +def <init>(): Completion1.this.c +def cf: Unit +def cff: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(74,8) +================================================================================ +[response] askScopeCompletion at (74,8) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class cfc extends AnyRef +def <init>(): Completion1.this.c +def cf: Unit +def cff: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(77,6) +================================================================================ +[response] askScopeCompletion at (77,6) +retrieved 8 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +class cfc extends AnyRef +def <init>(): Completion1.this.c +def cf: Unit +def cff: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(80,4) +================================================================================ +[response] askScopeCompletion at (80,4) +retrieved 6 members +class Completion1 extends AnyRef +class c extends AnyRef +class cc extends AnyRef +def <init>(): Completion1.this.c +def cf: Unit +def f: Unit +================================================================================ + +askScopeCompletion at Completions.scala(83,2) +================================================================================ +[response] askScopeCompletion at (83,2) +retrieved 4 members +class Completion1 extends AnyRef +class c extends AnyRef +def <init>(): test.Completion1 +def f: Unit +================================================================================ diff --git a/test/files/presentation/scope-completion-4/Test.scala b/test/files/presentation/scope-completion-4/Test.scala new file mode 100644 index 0000000000..bec1131c4c --- /dev/null +++ b/test/files/presentation/scope-completion-4/Test.scala @@ -0,0 +1,3 @@ +import scala.tools.nsc.interactive.tests.InteractiveTest + +object Test extends InteractiveTest
\ No newline at end of file diff --git a/test/files/presentation/scope-completion-4/src/Completions.scala b/test/files/presentation/scope-completion-4/src/Completions.scala new file mode 100644 index 0000000000..d11315720a --- /dev/null +++ b/test/files/presentation/scope-completion-4/src/Completions.scala @@ -0,0 +1,84 @@ +package test + +/* check that members defined in sub-block are not visible*/ + +class Completion1 { + + def f { + + def ff { + + def fff { + /*_*/ + } + + /*_*/ + + class ffc { + /*_*/ + } + + /*_*/ + } + + /*_*/ + + class fc { + + def fcf { + /*_*/ + } + + /*_*/ + + class fcc { + /*_*/ + } + + /*_*/ + } + + /*_*/ + } + + /*_*/ + + class c { + + class cc { + + class ccc { + /*_*/ + } + + /*_*/ + + def ccf { + /*_*/ + } + + /*_*/ + } + + /*_*/ + + def cf { + + class cfc { + /*_*/ + } + + /*_*/ + + def cff { + /*_*/ + } + + /*_*/ + } + + /*_*/ + } + + /*_*/ +} diff --git a/test/files/presentation/scope-completion-import.check b/test/files/presentation/scope-completion-import.check new file mode 100644 index 0000000000..d518b0c37a --- /dev/null +++ b/test/files/presentation/scope-completion-import.check @@ -0,0 +1,141 @@ +reload: Completions.scala + +askScopeCompletion at Completions.scala(15,4) +================================================================================ +[response] askScopeCompletion at (15,4) +retrieved 10 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo +def fCCC: Int +def fOOO: Int +object O +val o: test.O.type +================================================================================ + +askScopeCompletion at Completions.scala(19,4) +================================================================================ +[response] askScopeCompletion at (19,4) +retrieved 9 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo +def fCCC: Int +def fOOO: Int +object O +================================================================================ + +askScopeCompletion at Completions.scala(24,4) +================================================================================ +[response] askScopeCompletion at (24,4) +retrieved 9 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo +def fCCC: Int +object O +val c: test.C +================================================================================ + +askScopeCompletion at Completions.scala(27,5) +================================================================================ +[response] askScopeCompletion at (27,5) +retrieved 8 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo +object O +val c: test.C +================================================================================ + +askScopeCompletion at Completions.scala(30,5) +================================================================================ +[response] askScopeCompletion at (30,5) +retrieved 9 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo +def fCCC: Int +object O +val c: test.C +================================================================================ + +askScopeCompletion at Completions.scala(32,5) +================================================================================ +[response] askScopeCompletion at (32,5) +retrieved 10 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo +def fCCC: Int +def fOOO: Int +object O +val c: test.C +================================================================================ + +askScopeCompletion at Completions.scala(41,4) +================================================================================ +[response] askScopeCompletion at (41,4) +retrieved 10 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo_1 +def bar: Unit +def fCCC: Int +def fOOO: Int +object O +================================================================================ + +askScopeCompletion at Completions.scala(51,4) +================================================================================ +[response] askScopeCompletion at (51,4) +retrieved 11 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo_2 +def bar: Unit +def fCCC: Int +def fOOO: Int +object O +private[this] val o: test.O.type +================================================================================ + +askScopeCompletion at Completions.scala(61,4) +================================================================================ +[response] askScopeCompletion at (61,4) +retrieved 10 members +class C extends AnyRef +class Foo extends AnyRef +class Foo_1 extends AnyRef +class Foo_2 extends AnyRef +class Foo_3 extends AnyRef +def <init>(): test.Foo_3 +def bar: Unit +def fCCC: Int +object O +private[this] val c: test.C +================================================================================ diff --git a/test/files/presentation/scope-completion-import/Test.scala b/test/files/presentation/scope-completion-import/Test.scala new file mode 100644 index 0000000000..bec1131c4c --- /dev/null +++ b/test/files/presentation/scope-completion-import/Test.scala @@ -0,0 +1,3 @@ +import scala.tools.nsc.interactive.tests.InteractiveTest + +object Test extends InteractiveTest
\ No newline at end of file diff --git a/test/files/presentation/scope-completion-import/src/Completions.scala b/test/files/presentation/scope-completion-import/src/Completions.scala new file mode 100644 index 0000000000..6e08321283 --- /dev/null +++ b/test/files/presentation/scope-completion-import/src/Completions.scala @@ -0,0 +1,64 @@ +package test + +class C { + def fCCC : Int = 0 +} + +object O extends C { + def fOOO : Int = 0 +} + +class Foo { + { + val o = O + import o._ + /*_*/ + } + { + import O._ + /*_*/ + } + { + val c = new C + import c._ + /*_*/ + } + { + f/*_*/ + val c = new C + import c._ + f/*_*/ + import O._ + f/*_*/ + } +} + +class Foo_1 { + + import O._ + + def bar { + /*_*/ + } +} + +class Foo_2 { + + val o = O + import o._ + + def bar { + /*_*/ + } +} + +class Foo_3 { + + val c = new C + import c._ + + def bar { + /*_*/ + } +} + diff --git a/test/files/presentation/t1207.check b/test/files/presentation/t1207.check index 84bfd79d75..0eed4ece04 100644 --- a/test/files/presentation/t1207.check +++ b/test/files/presentation/t1207.check @@ -2,7 +2,7 @@ reload: Completions.scala askTypeCompletion at Completions.scala(10,15) ================================================================================ -[response] askCompletionAt (10,15) +[response] askTypeCompletion at (10,15) retrieved 3 members final package bongo final package lang @@ -11,7 +11,7 @@ final package util askTypeCompletion at Completions.scala(11,16) ================================================================================ -[response] askCompletionAt (11,16) +[response] askTypeCompletion at (11,16) retrieved 3 members final package bongo final package lang @@ -20,7 +20,7 @@ final package util askTypeCompletion at Completions.scala(12,19) ================================================================================ -[response] askCompletionAt (12,19) +[response] askTypeCompletion at (12,19) retrieved 3 members final package bongo final package lang @@ -29,7 +29,7 @@ final package util askTypeCompletion at Completions.scala(13,19) ================================================================================ -[response] askCompletionAt (13,19) +[response] askTypeCompletion at (13,19) retrieved 3 members final package bongo final package lang @@ -38,7 +38,7 @@ final package util askTypeCompletion at Completions.scala(14,23) ================================================================================ -[response] askCompletionAt (14,23) +[response] askTypeCompletion at (14,23) retrieved 3 members final package bongo final package lang @@ -47,7 +47,7 @@ final package util askTypeCompletion at Completions.scala(15,10) ================================================================================ -[response] askCompletionAt (15,10) +[response] askTypeCompletion at (15,10) retrieved 0 members ================================================================================ diff --git a/test/files/presentation/t5708.check b/test/files/presentation/t5708.check index 5f17c0b762..04806b5867 100644 --- a/test/files/presentation/t5708.check +++ b/test/files/presentation/t5708.check @@ -2,7 +2,7 @@ reload: Completions.scala askTypeCompletion at Completions.scala(17,9) ================================================================================ -[response] askCompletionAt (17,9) +[response] askTypeCompletion at (17,9) retrieved 39 members [inaccessible] private def privateM: String [inaccessible] private[this] val privateV: String diff --git a/test/files/presentation/t7915.check b/test/files/presentation/t7915.check new file mode 100644 index 0000000000..b18b4ddb55 --- /dev/null +++ b/test/files/presentation/t7915.check @@ -0,0 +1,11 @@ +reload: Foo.scala + +askHyperlinkPos for `Bar` at (7,11) Foo.scala +================================================================================ +[response] found askHyperlinkPos for `Bar` at (1,7) Foo.scala +================================================================================ + +askHyperlinkPos for `bar` at (7,22) Foo.scala +================================================================================ +[response] found askHyperlinkPos for `bar` at (2,7) Foo.scala +================================================================================ diff --git a/test/files/presentation/t7915/Test.scala b/test/files/presentation/t7915/Test.scala new file mode 100644 index 0000000000..c2f89bdb17 --- /dev/null +++ b/test/files/presentation/t7915/Test.scala @@ -0,0 +1,8 @@ +import scala.tools.nsc.interactive.tests.InteractiveTest + +object Test extends InteractiveTest { + override def runDefaultTests() { + sourceFiles foreach (src => askLoadedTyped(src).get) + super.runDefaultTests() + } +} diff --git a/test/files/presentation/t7915/src/Foo.scala b/test/files/presentation/t7915/src/Foo.scala new file mode 100644 index 0000000000..a4166ae5b4 --- /dev/null +++ b/test/files/presentation/t7915/src/Foo.scala @@ -0,0 +1,9 @@ +class Bar { + def bar(b: Int = 2) {} +} + +class Foo { + def foo() { + new Bar/*#*/().bar/*#*/() + } +} diff --git a/test/files/presentation/visibility.check b/test/files/presentation/visibility.check index 078e0a2342..217da34b9c 100644 --- a/test/files/presentation/visibility.check +++ b/test/files/presentation/visibility.check @@ -2,7 +2,7 @@ reload: Completions.scala askTypeCompletion at Completions.scala(14,12) ================================================================================ -[response] askCompletionAt (14,12) +[response] askTypeCompletion at (14,12) retrieved 37 members [inaccessible] private[this] def secretPrivateThis(): Unit def +(other: String): String @@ -42,7 +42,7 @@ protected[package lang] def finalize(): Unit askTypeCompletion at Completions.scala(16,11) ================================================================================ -[response] askCompletionAt (16,11) +[response] askTypeCompletion at (16,11) retrieved 37 members def +(other: String): String def ->[B](y: B): (accessibility.Foo, B) @@ -82,7 +82,7 @@ protected[package lang] def finalize(): Unit askTypeCompletion at Completions.scala(22,11) ================================================================================ -[response] askCompletionAt (22,11) +[response] askTypeCompletion at (22,11) retrieved 37 members [inaccessible] private def secretPrivate(): Unit def +(other: String): String @@ -122,7 +122,7 @@ protected[package lang] def finalize(): Unit askTypeCompletion at Completions.scala(28,10) ================================================================================ -[response] askCompletionAt (28,10) +[response] askTypeCompletion at (28,10) retrieved 37 members [inaccessible] private def secretPrivate(): Unit [inaccessible] private[this] def secretPrivateThis(): Unit @@ -162,7 +162,7 @@ protected[package accessibility] def secretProtectedInPackage(): Unit askTypeCompletion at Completions.scala(37,8) ================================================================================ -[response] askCompletionAt (37,8) +[response] askTypeCompletion at (37,8) retrieved 37 members [inaccessible] private def secretPrivate(): Unit [inaccessible] private[this] def secretPrivateThis(): Unit diff --git a/test/files/run/Course-2002-05.scala b/test/files/run/Course-2002-05.scala index e6764b92c8..80317bc757 100644 --- a/test/files/run/Course-2002-05.scala +++ b/test/files/run/Course-2002-05.scala @@ -3,15 +3,15 @@ //############################################################################ object M0 { - def partition[a](xs: List[a], pred: a => Boolean): Pair[List[a], List[a]] = { + def partition[a](xs: List[a], pred: a => Boolean): Tuple2[List[a], List[a]] = { if (xs.isEmpty) - Pair(List(),List()) + (List(),List()) else { val tailPartition = partition(xs.tail, pred); if (pred(xs.head)) - Pair(xs.head :: tailPartition._1, tailPartition._2) + (xs.head :: tailPartition._1, tailPartition._2) else - Pair(tailPartition._1, xs.head :: tailPartition._2) + (tailPartition._1, xs.head :: tailPartition._2) } } @@ -49,9 +49,9 @@ object M0 { //############################################################################ object M1 { - def partition[a](xs: List[a], pred: a => Boolean): Pair[List[a], List[a]] = { - xs.foldRight[Pair[List[a], List[a]]](Pair(List(), List())) { - (x, p) => if (pred (x)) Pair(x :: p._1, p._2) else Pair(p._1, x :: p._2) + def partition[a](xs: List[a], pred: a => Boolean): Tuple2[List[a], List[a]] = { + xs.foldRight[Tuple2[List[a], List[a]]]((List(), List())) { + (x, p) => if (pred (x)) (x :: p._1, p._2) else (p._1, x :: p._2) } } @@ -136,7 +136,7 @@ object M3 { def adjoinRow(placement: Placement): List[Placement] = range(1, n) .filter (column => isSafe(column, placement)) - .map (column => Pair(row, column) :: placement); + .map (column => (row, column) :: placement); placeQueens(row - 1) flatMap adjoinRow } diff --git a/test/files/run/Course-2002-06.scala b/test/files/run/Course-2002-06.scala index e4fb86a966..908a934041 100644 --- a/test/files/run/Course-2002-06.scala +++ b/test/files/run/Course-2002-06.scala @@ -55,7 +55,7 @@ abstract class Graphics(_width: Double, _height: Double) { } /** Draw a list of segments on the picture.*/ - def drawSegments(frm: Frame)(segments: List[Pair[Vector, Vector]]): Unit = + def drawSegments(frm: Frame)(segments: List[Tuple2[Vector, Vector]]): Unit = if (segments.isEmpty) () else { drawSegment(frm)(segments.head._1, segments.head._2); diff --git a/test/files/run/Course-2002-07.scala b/test/files/run/Course-2002-07.scala index 055ff74d81..2d9457653f 100644 --- a/test/files/run/Course-2002-07.scala +++ b/test/files/run/Course-2002-07.scala @@ -181,10 +181,10 @@ object M4 { object M5 { - def zipFun[a,b](xs:List[a], ys:List[b]):List[Pair[a,b]] = Pair(xs,ys) match { - case Pair(List(), _) => List() - case Pair(_, List()) => List() - case Pair(x :: xs1, y :: ys1) => Pair(x, y) :: zipFun(xs1, ys1) + def zipFun[a,b](xs:List[a], ys:List[b]):List[Tuple2[a,b]] = (xs,ys) match { + case (List(), _) => List() + case (_, List()) => List() + case (x :: xs1, y :: ys1) => (x, y) :: zipFun(xs1, ys1) } def test_zipFun[a,b](xs: List[a], ys: List[b]) = { @@ -216,9 +216,9 @@ object M5 { object M6 { - def zipFun[a,b](xs:List[a], ys:List[b]):List[Pair[a,b]] = (Pair(xs,ys): @unchecked) match { - // !!! case Pair(List(), _), Pair(_, List()) => List() - case Pair(x :: xs1, y :: ys1) => Pair(x, y) :: zipFun(xs1, ys1) + def zipFun[a,b](xs:List[a], ys:List[b]):List[Tuple2[a,b]] = ((xs,ys): @unchecked) match { + // !!! case (List(), _), (_, List()) => List() + case (x :: xs1, y :: ys1) => (x, y) :: zipFun(xs1, ys1) } def test_zipFun[a,b](xs: List[a], ys: List[b]) = { @@ -374,9 +374,9 @@ object M9 { object MA { - def lookup[k,v](xs: List[Pair[k,v]], k: k): v = xs match { + def lookup[k,v](xs: List[Tuple2[k,v]], k: k): v = xs match { case List() => sys.error("no value for " + k) - case Pair(k1,v1) :: xs1 => if (k1 == k) v1 else lookup(xs1, k) + case (k1,v1) :: xs1 => if (k1 == k) v1 else lookup(xs1, k) } trait Expr { @@ -437,8 +437,8 @@ object MA { val g1 = g0 derive x; Console.println("g (x) = " + g0); Console.println("g'(x) = " + g1); - Console.println("g (3) = " + evalvars(List(Pair("x",3)))(g0)); - Console.println("g'(3) = " + evalvars(List(Pair("x",3)))(g1)); + Console.println("g (3) = " + evalvars(List(("x",3)))(g0)); + Console.println("g'(3) = " + evalvars(List(("x",3)))(g1)); Console.println; } @@ -453,26 +453,26 @@ object Utils { if (y == 1) x else if (y % 2 == 0) power0(x*x,y/2) else x*power0(x, y-1); def power(x: Int, y: Int): Int = (x,y) match { - case Pair(0,0) => sys.error("power(0,0)") - case Pair(0,_) => 0 - case Pair(1,_) => 1 - case Pair(_,0) => 1 - case Pair(_,1) => x - case Pair(_,2) => x*x - case Pair(_,_) => if (y < 0) 1/power0(x,y) else power0(x,y) + case (0,0) => sys.error("power(0,0)") + case (0,_) => 0 + case (1,_) => 1 + case (_,0) => 1 + case (_,1) => x + case (_,2) => x*x + case (_,_) => if (y < 0) 1/power0(x,y) else power0(x,y) } def lookup(entries: List[(String,Int)], key: String): Int = entries match { case List() => sys.error("no value for " + key) - case Pair(k,v) :: _ if (k == key) => v + case (k,v) :: _ if (k == key) => v case _ :: rest => lookup(rest, key) } def compare(xs: List[String], ys: List[String]): Int = (xs, ys) match { - case Pair(List(), List()) => 0 - case Pair(List(), _ ) => -1 - case Pair(_ , List()) => +1 - case Pair(x::xs , y::ys ) => { + case (List(), List()) => 0 + case (List(), _ ) => -1 + case (_ , List()) => +1 + case (x::xs , y::ys ) => { val diff = x.compareTo(y); if (diff != 0) diff else compare(xs,ys) } @@ -508,18 +508,18 @@ object MB { private def +< (that: Expr): Boolean = (this +<? that) < 0; private def +<= (that: Expr): Boolean = (this +<? that) <= 0; - private def +<? (that: Expr): Int = Pair(this,that) match { - case Pair(Add(_,_), _ ) => 0 - case Pair(_ , Add(_,_)) => 0 - case Pair(_ , _ ) => compare(this.vars,that.vars) + private def +<? (that: Expr): Int = (this,that) match { + case (Add(_,_), _ ) => 0 + case (_ , Add(_,_)) => 0 + case (_ , _ ) => compare(this.vars,that.vars) } - def + (that: Expr): Expr = if (that +<= this) Pair(this,that) match { - case Pair(_ , Lit(0) ) => this - case Pair(Lit(l) , Lit(r) ) => Lit(l + r) - case Pair(_ , Add(rl,rr)) => (this + rl) + rr - case Pair(Add(ll,lr), _ ) if (lr +<= that) => ll + (that + lr) - case Pair(_ , _ ) => { + def + (that: Expr): Expr = if (that +<= this) (this,that) match { + case (_ , Lit(0) ) => this + case (Lit(l) , Lit(r) ) => Lit(l + r) + case (_ , Add(rl,rr)) => (this + rl) + rr + case (Add(ll,lr), _ ) if (lr +<= that) => ll + (that + lr) + case (_ , _ ) => { val l = this.term; val r = that.term; if (l equ r) Lit(this.count + that.count) * r else Add(this, that) @@ -528,41 +528,41 @@ object MB { private def *< (that: Expr): Boolean = (this *<? that) < 0; private def *<= (that: Expr): Boolean = (this *<? that) <= 0; - private def *<? (that: Expr): Int = Pair(this,that) match { - case Pair(Mul(_,_), _ ) => 0 - case Pair(_ , Mul(_,_)) => 0 - case Pair(Add(_,_), Add(_,_)) => 0 - case Pair(Add(_,_), _ ) => -1 - case Pair(_ , Add(_,_)) => +1 - case Pair(Lit(_) , Lit(_) ) => 0 - case Pair(Lit(_) , _ ) => -1 - case Pair(_ , Lit(_) ) => +1 - case Pair(Var(l) , Var(r) ) => l.compareTo(r) - case Pair(Var(_) , Pow(r,_)) => if (this *<= r) -1 else +1 - case Pair(Pow(l,_), Var(_) ) => if (l *< that) -1 else +1 - case Pair(Pow(l,_), Pow(r,_)) => l *<? r + private def *<? (that: Expr): Int = (this,that) match { + case (Mul(_,_), _ ) => 0 + case (_ , Mul(_,_)) => 0 + case (Add(_,_), Add(_,_)) => 0 + case (Add(_,_), _ ) => -1 + case (_ , Add(_,_)) => +1 + case (Lit(_) , Lit(_) ) => 0 + case (Lit(_) , _ ) => -1 + case (_ , Lit(_) ) => +1 + case (Var(l) , Var(r) ) => l.compareTo(r) + case (Var(_) , Pow(r,_)) => if (this *<= r) -1 else +1 + case (Pow(l,_), Var(_) ) => if (l *< that) -1 else +1 + case (Pow(l,_), Pow(r,_)) => l *<? r } - def * (that: Expr): Expr = if (this *<= that) Pair(this,that) match { - case Pair(Lit(0) , _ ) => this - case Pair(Lit(1) , _ ) => that - case Pair(Mul(ll,lr), r ) => ll * (lr * r) - case Pair(Add(ll,lr), r ) => ll * r + lr * r - case Pair(Lit(l) , Lit(r) ) => Lit(l * r) - case Pair(Var(_) , Var(_) ) if (this equ that) => Pow(this,2) - case Pair(Var(_) , Pow(r,n) ) if (this equ r) => Pow(this,n + 1) - case Pair(Pow(ll,lr), Pow(rl,rr)) if (ll equ rl) => Pow(ll,lr + rr) - case Pair(l , Mul(rl,rr)) if (rl *<= l) => (rl * l) * rr - case Pair(_ , _ ) => Mul(this,that) + def * (that: Expr): Expr = if (this *<= that) (this,that) match { + case (Lit(0) , _ ) => this + case (Lit(1) , _ ) => that + case (Mul(ll,lr), r ) => ll * (lr * r) + case (Add(ll,lr), r ) => ll * r + lr * r + case (Lit(l) , Lit(r) ) => Lit(l * r) + case (Var(_) , Var(_) ) if (this equ that) => Pow(this,2) + case (Var(_) , Pow(r,n) ) if (this equ r) => Pow(this,n + 1) + case (Pow(ll,lr), Pow(rl,rr)) if (ll equ rl) => Pow(ll,lr + rr) + case (l , Mul(rl,rr)) if (rl *<= l) => (rl * l) * rr + case (_ , _ ) => Mul(this,that) } else that * this; def ^ (that: Int): Expr = (this,that) match { - case Pair(_ ,1) => this - case Pair(Lit(i) ,n) => Lit(power(i,n)) - case Pair(Var(_) ,n) => Pow(this,n) - case Pair(Add(_,_),n) => this * (this ^ (n - 1)) - case Pair(Mul(l,r),n) => (l ^ n) * (r ^ n) - case Pair(Pow(e,m),n) => Pow(e,m + n) + case (_ ,1) => this + case (Lit(i) ,n) => Lit(power(i,n)) + case (Var(_) ,n) => Pow(this,n) + case (Add(_,_),n) => this * (this ^ (n - 1)) + case (Mul(l,r),n) => (l ^ n) * (r ^ n) + case (Pow(e,m),n) => Pow(e,m + n) } def derive(v: Var): Expr = this match { @@ -581,12 +581,12 @@ object MB { case Pow(l, r) => power(l.evaluate(vars), r) } - def equ(that: Expr): Boolean = Pair(this,that) match { - case Pair(Lit(l) ,Lit(r)) => l == r - case Pair(Var(l) ,Var(r)) => l == r - case Pair(Add(ll,lr),Add(rl,rr)) => (ll equ rl) && (lr equ rr) - case Pair(Mul(ll,lr),Mul(rl,rr)) => (ll equ rl) && (lr equ rr) - case Pair(Pow(ll,lr),Pow(rl,rr)) => (ll equ rl) && (lr == rr) + def equ(that: Expr): Boolean = (this,that) match { + case (Lit(l) ,Lit(r)) => l == r + case (Var(l) ,Var(r)) => l == r + case (Add(ll,lr),Add(rl,rr)) => (ll equ rl) && (lr equ rr) + case (Mul(ll,lr),Mul(rl,rr)) => (ll equ rl) && (lr equ rr) + case (Pow(ll,lr),Pow(rl,rr)) => (ll equ rl) && (lr == rr) case _ => false } @@ -667,7 +667,7 @@ object MB { Console.println; def check(n: String, f: Expr, x: Int, e: Int) { - val a: Int = f.evaluate(List(Pair("x",x))); + val a: Int = f.evaluate(List(("x",x))); val s: String = if (a == e) "ok" else "KO(" + e + ")"; Console.println(n + "(" + x + ") = " + a + " " + s); } diff --git a/test/files/run/Course-2002-08.scala b/test/files/run/Course-2002-08.scala index 38b8363661..5e21edaba3 100644 --- a/test/files/run/Course-2002-08.scala +++ b/test/files/run/Course-2002-08.scala @@ -163,7 +163,7 @@ object M5 { } abstract class Simulation() { - private type Agenda = List[Pair[Int, Action]]; + private type Agenda = List[Tuple2[Int, Action]]; private var agenda: Agenda = List(); private var curtime = 0; def currentTime: Int = curtime; @@ -171,17 +171,17 @@ object M5 { def afterDelay(delay: Int)(action: Action): Unit = { def insert(ag: Agenda, time: Int): Agenda = ag match { case List() => - List(Pair(time, action)) - case Pair(t, act) :: ag1 => - if (time < t) Pair(time, action) :: ag - else Pair(t, act) :: insert(ag1, time) + List((time, action)) + case (t, act) :: ag1 => + if (time < t) (time, action) :: ag + else (t, act) :: insert(ag1, time) } agenda = insert(agenda, curtime + delay) } private def next: Unit = agenda match { case List() => () - case Pair(time, action) :: ag1 => { + case (time, action) :: ag1 => { agenda = ag1; curtime = time; action(); @@ -413,7 +413,7 @@ object M5 { class Simulator() { type Action = () => Unit; - type Agenda = List[Pair[Int, Action]]; + type Agenda = List[Tuple2[Int, Action]]; private var agenda: Agenda = List(); private var curtime = 0; @@ -421,17 +421,17 @@ class Simulator() { def afterDelay(delay: Int)(action: Action) = { def insert(ag: Agenda, time: Int): Agenda = ag match { case List() => - List(Pair(time, action)) - case Pair(t, act) :: ag1 => - if (time < t) Pair(time, action) :: ag - else Pair(t, act) :: insert(ag1, time) + List((time, action)) + case (t, act) :: ag1 => + if (time < t) (time, action) :: ag + else (t, act) :: insert(ag1, time) } agenda = insert(agenda, curtime + delay) } def next: Unit = agenda match { case List() => () - case Pair(time, action) :: rest => { + case (time, action) :: rest => { agenda = rest; curtime = time; action(); @@ -567,8 +567,8 @@ class Main() extends CircuitSimulator() { demux(in, ctrl.reverse, out.reverse); probe("in", in); - for (Pair(x,c) <- range(0,n) zip ctrl) { probe("ctrl" + x, c) } - for (Pair(x,o) <- range(0,outNum) zip out) { probe("out" + x, o) } + for ((x,c) <- range(0,n) zip ctrl) { probe("ctrl" + x, c) } + for ((x,o) <- range(0,outNum) zip out) { probe("out" + x, o) } in.setSignal(true); run; diff --git a/test/files/run/Course-2002-09.scala b/test/files/run/Course-2002-09.scala index 87f91111d8..704f2ec0aa 100644 --- a/test/files/run/Course-2002-09.scala +++ b/test/files/run/Course-2002-09.scala @@ -13,11 +13,11 @@ object NoConstraint extends Constraint { } class Adder(a1: Quantity,a2: Quantity,sum: Quantity) extends Constraint { - def newValue = Triple(a1.getValue, a2.getValue, sum.getValue) match { - case Triple(Some(x1), Some(x2), _ ) => sum.setValue(x1 + x2, this) - case Triple(Some(x1), _ , Some(r)) => a2.setValue(r - x1, this) - case Triple(_ , Some(x2), Some(r)) => a1.setValue(r - x2, this) - case _ => + def newValue = (a1.getValue, a2.getValue, sum.getValue) match { + case (Some(x1), Some(x2), _ ) => sum.setValue(x1 + x2, this) + case (Some(x1), _ , Some(r)) => a2.setValue(r - x1, this) + case (_ , Some(x2), Some(r)) => a1.setValue(r - x2, this) + case _ => } def dropValue: Unit = { a1.forgetValue(this); a2.forgetValue(this); sum.forgetValue(this); @@ -29,13 +29,13 @@ class Adder(a1: Quantity,a2: Quantity,sum: Quantity) extends Constraint { class Multiplier(m1: Quantity, m2: Quantity, prod: Quantity) extends Constraint { - def newValue = Triple(m1.getValue, m2.getValue, prod.getValue) match { - case Triple(Some(0d), _ , _ ) => prod.setValue(0, this); - case Triple(_ , Some(0d), _ ) => prod.setValue(0, this); - case Triple(Some(x1), Some(x2), _ ) => prod.setValue(x1 * x2, this) - case Triple(Some(x1), _ , Some(r)) => m2.setValue(r / x1, this) - case Triple(_, Some(x2), Some(r)) => m1.setValue(r / x2, this) - case _ => + def newValue = (m1.getValue, m2.getValue, prod.getValue) match { + case (Some(0d), _ , _ ) => prod.setValue(0, this); + case (_ , Some(0d), _ ) => prod.setValue(0, this); + case (Some(x1), Some(x2), _ ) => prod.setValue(x1 * x2, this) + case (Some(x1), _ , Some(r)) => m2.setValue(r / x1, this) + case (_, Some(x2), Some(r)) => m1.setValue(r / x2, this) + case _ => } def dropValue: Unit = { m1.forgetValue(this); m2.forgetValue(this); prod.forgetValue(this); @@ -46,11 +46,11 @@ class Multiplier(m1: Quantity, m2: Quantity, prod: Quantity) } class Squarer(square: Quantity, root: Quantity) extends Constraint { - def newValue: Unit = Pair(square.getValue, root.getValue) match { - case Pair(Some(x), _ )if (x < 0) => sys.error("Square of negative number") - case Pair(Some(x), _ ) => root.setValue(Math.sqrt(x), this) - case Pair(_ , Some(x)) => square.setValue(x*x, this) - case _ => + def newValue: Unit = (square.getValue, root.getValue) match { + case (Some(x), _ )if (x < 0) => sys.error("Square of negative number") + case (Some(x), _ ) => root.setValue(Math.sqrt(x), this) + case (_ , Some(x)) => square.setValue(x*x, this) + case _ => } def dropValue: Unit = { square.forgetValue(this); root.forgetValue(this); @@ -60,9 +60,9 @@ class Squarer(square: Quantity, root: Quantity) extends Constraint { } class Eq(a: Quantity, b: Quantity) extends Constraint { - def newValue = (Pair(a.getValue, b.getValue): @unchecked) match { - case Pair(Some(x), _ ) => b.setValue(x, this); - case Pair(_ , Some(y)) => a.setValue(y, this); + def newValue = ((a.getValue, b.getValue): @unchecked) match { + case (Some(x), _ ) => b.setValue(x, this); + case (_ , Some(y)) => a.setValue(y, this); } def dropValue { a.forgetValue(this); b.forgetValue(this); diff --git a/test/files/run/Course-2002-13.scala b/test/files/run/Course-2002-13.scala index 4bd3614fb0..a596a33873 100644 --- a/test/files/run/Course-2002-13.scala +++ b/test/files/run/Course-2002-13.scala @@ -74,18 +74,18 @@ object Terms { val NoTerm = Con("<none>", List()); - def unify1(x: Term, y: Term, s: Subst): Option[Subst] = Pair(x, y) match { - case Pair(Var(a), Var(b)) if (a == b) => + def unify1(x: Term, y: Term, s: Subst): Option[Subst] = (x, y) match { + case (Var(a), Var(b)) if (a == b) => Some(s) - case Pair(Var(a), _) => lookup(s, a) match { + case (Var(a), _) => lookup(s, a) match { case Some(x1) => unify(x1, y, s) case None => if (y.tyvars contains a) None else Some(Binding(a, y) :: s) } - case Pair(_, Var(b)) => lookup(s, b) match { + case (_, Var(b)) => lookup(s, b) match { case Some(y1) => unify(x, y1, s) case None => if (x.tyvars contains b) None else Some(Binding(b, x) :: s) } - case Pair(Con(a, xs), Con(b, ys)) if (a == b) => + case (Con(a, xs), Con(b, ys)) if (a == b) => unify(xs, ys, s) case _ => None } @@ -96,9 +96,9 @@ object Terms { ss } - def unify(xs: List[Term], ys: List[Term], s: Subst): Option[Subst] = Pair(xs, ys) match { - case Pair(List(), List()) => Some(s) - case Pair(x :: xs1, y :: ys1) => + def unify(xs: List[Term], ys: List[Term], s: Subst): Option[Subst] = (xs, ys) match { + case (List(), List()) => Some(s) + case (x :: xs1, y :: ys1) => unify(x, y, s) match { case Some(s1) => unify(xs1, ys1, s1) case None => None diff --git a/test/files/run/bugs.scala b/test/files/run/bugs.scala index ba8449c299..02849b5817 100644 --- a/test/files/run/bugs.scala +++ b/test/files/run/bugs.scala @@ -46,7 +46,7 @@ object Bug135Test { def test(args: Array[String]) { val myMap:TreeMap[Int, String] = new TreeMap - val map1 = myMap + Pair(42, "The answer") + val map1 = myMap + ((42, "The answer")) println(map1.get(42)) } diff --git a/test/files/run/ctries-old/main.scala b/test/files/run/ctries-old/main.scala index f714bcdcdc..77161fed2f 100644 --- a/test/files/run/ctries-old/main.scala +++ b/test/files/run/ctries-old/main.scala @@ -38,7 +38,7 @@ trait Spec { var produced = false try body catch { - case e: Throwable => if (e.getClass == implicitly[ClassManifest[T]].erasure) produced = true + case e: Throwable => if (e.getClass == implicitly[ClassManifest[T]].runtimeClass) produced = true } finally { assert(produced, "Did not produce exception of type: " + implicitly[ClassManifest[T]]) } diff --git a/test/files/run/fors.check b/test/files/run/fors.check new file mode 100644 index 0000000000..b459f00b49 --- /dev/null +++ b/test/files/run/fors.check @@ -0,0 +1,28 @@ + +testOld +1 2 3 +2 +2 +3 +1 2 3 +1 2 3 +0 1 2 3 4 5 6 7 8 9 +0 2 4 6 8 +0 2 4 6 8 +a b c +b c +b c + +testNew +3 +1 2 3 +1 2 3 +0 1 2 3 4 5 6 7 8 9 +0 2 4 6 8 +0 2 4 6 8 +0 2 4 6 8 +0 2 4 6 8 +0 2 4 6 8 +0 2 4 6 8 +0 2 4 6 8 +a b c diff --git a/test/files/run/fors.scala b/test/files/run/fors.scala new file mode 100644 index 0000000000..c778df3e24 --- /dev/null +++ b/test/files/run/fors.scala @@ -0,0 +1,84 @@ +//############################################################################ +// for-comprehensions (old and new syntax) +//############################################################################ + +//############################################################################ + +object Test extends App { + val xs = List(1, 2, 3) + val ys = List('a, 'b, 'c) + + def it = 0 until 10 + + val ar = "abc".toCharArray + + /////////////////// old syntax /////////////////// + + def testOld { + println("\ntestOld") + + // lists + for (x <- xs) print(x + " "); println + for (x <- xs; + if x % 2 == 0) print(x + " "); println + for {x <- xs + if x % 2 == 0} print(x + " "); println + var n = 0 + for (_ <- xs) n += 1; println(n) + for ((x, y) <- xs zip ys) print(x + " "); println + for (p @ (x, y) <- xs zip ys) print(p._1 + " "); println + + // iterators + for (x <- it) print(x + " "); println + for (x <- it; + if x % 2 == 0) print(x + " "); println + for {x <- it + if x % 2 == 0} print(x + " "); println + + // arrays + for (x <- ar) print(x + " "); println + for (x <- ar; + if x.toInt > 97) print(x + " "); println + for {x <- ar + if x.toInt > 97} print(x + " "); println + + } + + /////////////////// new syntax /////////////////// + + def testNew { + println("\ntestNew") + + // lists + var n = 0 + for (_ <- xs) n += 1; println(n) + for ((x, y) <- xs zip ys) print(x + " "); println + for (p @ (x, y) <- xs zip ys) print(p._1 + " "); println + + // iterators + for (x <- it) print(x + " "); println + for (x <- it if x % 2 == 0) print(x + " "); println + for (x <- it; if x % 2 == 0) print(x + " "); println + for (x <- it; + if x % 2 == 0) print(x + " "); println + for (x <- it + if x % 2 == 0) print(x + " "); println + for {x <- it + if x % 2 == 0} print(x + " "); println + for (x <- it; + y = 2 + if x % y == 0) print(x + " "); println + for {x <- it + y = 2 + if x % y == 0} print(x + " "); println + + // arrays + for (x <- ar) print(x + " "); println + + } + + //////////////////////////////////////////////////// + + testOld + testNew +} diff --git a/test/files/run/getClassTest-old.scala b/test/files/run/getClassTest-old.scala index 789dd4d162..cd1b6b07f6 100644 --- a/test/files/run/getClassTest-old.scala +++ b/test/files/run/getClassTest-old.scala @@ -53,7 +53,7 @@ class MoreAnyRefs { @deprecated("Suppress warnings", since="2.11") object Test { def returnTypes[T: Manifest] = ( - manifest[T].erasure.getMethods.toList + manifest[T].runtimeClass.getMethods.toList filter (_.getName startsWith "f") sortBy (_.getName) map (m => m.getName + ": " + m.getGenericReturnType.toString) diff --git a/test/files/run/map_test.scala b/test/files/run/map_test.scala index 1ea864ed58..b76dfb4577 100644 --- a/test/files/run/map_test.scala +++ b/test/files/run/map_test.scala @@ -20,7 +20,7 @@ object Test extends App { val map2 = map1.updated(17,"A small random number") val map3 = map2.updated(666,"A bigger random number") val map4 = map3.updated(4711,"A big random number") - map1 == myMap + Pair(42, "The answer") + map1 == myMap + ((42, "The answer")) var i = 0 var map = map4 while(i < 43) { diff --git a/test/files/run/mutable-anyrefmap.scala b/test/files/run/mutable-anyrefmap.scala new file mode 100644 index 0000000000..ff615d0daf --- /dev/null +++ b/test/files/run/mutable-anyrefmap.scala @@ -0,0 +1,91 @@ +object Test extends App { + + import scala.collection.mutable.HashMap; + import scala.collection.mutable.AnyRefMap; + + val keys = Array( + null, "perch", "herring", "salmon", "pike", "cod", "" + ) + + val rn = new scala.util.Random(42L) + var arm = AnyRefMap.empty[String, Int] + val hm = HashMap.empty[String, Int] + + def checkConsistent = hm.forall{ case (k,v) => arm.get(k).exists(_ == v) } + + assert { + (0 to 10000).forall{ i => + val k = keys(rn.nextInt(keys.length)) + if (rn.nextInt(100) < 2) arm = arm.clone() + if (rn.nextInt(100) < 5) arm.repack() + if (rn.nextBoolean) { + hm += ((k, i)) + rn.nextInt(6) match { + case 0 => arm += ((k, i)) + case 1 => arm += (k, i) + case 2 => arm(k) = i + case 3 => arm.put(k,i) + case 4 => arm ++= List((k,i)) + case _ => if (!arm.contains(k)) arm.getOrElseUpdate(k,i) + else arm += (k,i) + } + } + else { + hm -= k + rn.nextInt(2) match { + case 0 => arm -= k + case _ => arm --= List(k) + } + } + checkConsistent + } + } + + assert { + val mapped = + arm.map{ case (k,v) => (if (k==null) "" else k+k) -> v.toString } + mapped.getClass == arm.getClass + } + + assert { + val arm2 = new AnyRefMap[java.lang.Integer,Unit](2000000) + for (i <- 0 until 1000000) arm2(java.lang.Integer.valueOf(i)) = () + + arm2.size == 1000000 && + (0 to 1100000 by 100000).map(java.lang.Integer.valueOf).forall(i => (arm2 contains i) == i < 1000000) + } + + arm = AnyRefMap("heron" -> 22, "dove" -> 5, "budgie" -> 0) + + assert{ + var s = "" + arm.foreachKey(s += _) + + s.length == "herondovebudgie".length && + s.contains("heron") && + s.contains("dove") && + s.contains("budgie") + } + + assert{ var s = 0L; arm.foreachValue(s += _); s == 27L } + + assert { + val m2 = arm.mapValuesNow(_+2) + arm.transformValues(_+2) + m2 == arm && !(m2 eq arm) && (for ((_,v) <- arm) yield v).sum == 33L + } + + assert { + val arm2 = new AnyRefMap[String, String](x => if (x==null) "null" else x) + arm2 += ("cod" -> "fish", "Rarity" -> "unicorn") + val hm2 = (new HashMap[String,String]) ++= arm2 + + List(null, "cod", "sparrow", "Rarity").forall(i => + arm2.get(i) == hm2.get(i) && + arm2.getOrElse(i, "") == hm2.getOrElse(i, "") && + arm2(i) == hm2.get(i).getOrElse(if (i==null) "null" else i.toString) && + arm2.getOrNull(i) == hm2.get(i).orNull + ) + } +} + diff --git a/test/files/run/mutable-longmap.scala b/test/files/run/mutable-longmap.scala new file mode 100644 index 0000000000..07fd80f6f0 --- /dev/null +++ b/test/files/run/mutable-longmap.scala @@ -0,0 +1,79 @@ +object Test extends App { + + import scala.collection.mutable.HashMap; + import scala.collection.mutable.LongMap; + + val keys = Array( + Long.MinValue, Int.MinValue - 1L, Int.MinValue, -9127, -1, + 0, 1, 9127, Int.MaxValue, Long.MaxValue + ) + + val rn = new scala.util.Random(42L) + var lm = LongMap.empty[Long] + val hm = HashMap.empty[Long,Long] + + def checkConsistent = hm.forall{ case (k,v) => lm.get(k).exists(_ == v) } + + assert { + (0 to 10000).forall{ i => + val k = keys(rn.nextInt(keys.length)) + if (rn.nextInt(100) < 2) lm = lm.clone() + if (rn.nextInt(100) < 5) lm.repack() + if (rn.nextBoolean) { + hm += ((k, i)) + rn.nextInt(6) match { + case 0 => lm += ((k, i)) + case 1 => lm += (k, i) + case 2 => lm(k) = i + case 3 => lm.put(k,i) + case 4 => lm ++= List((k,i)) + case _ => if (!lm.contains(k)) lm.getOrElseUpdate(k,i) + else lm += (k,i) + } + } + else { + hm -= k + rn.nextInt(2) match { + case 0 => lm -= k + case _ => lm --= List(k) + } + } + checkConsistent + } + } + + assert { + lm.map{ case (k,v) => -k*k -> v.toString }.getClass == lm.getClass + } + + assert { + val lm2 = new LongMap[Unit](2000000) + for (i <- 0 until 1000000) lm2(i) = () + + lm2.size == 1000000 && + (0 to 1100000 by 100000).forall(i => (lm2 contains i) == i < 1000000) + } + + lm = LongMap(8L -> 22L, -5L -> 5L, Long.MinValue -> 0L) + + assert{ var s = 0L; lm.foreachKey(s += _); s == Long.MinValue + 3 } + assert{ var s = 0L; lm.foreachValue(s += _); s == 27L } + assert { + val m2 = lm.mapValuesNow(_+2) + lm.transformValues(_+2) + m2 == lm && !(m2 eq lm) && (for ((_,v) <- lm) yield v).sum == 33L + } + + assert { + val lm2 = new LongMap[String](_.toString) + lm2 += (5L -> "fish", 0L -> "unicorn") + val hm2 = (new HashMap[Long,String]) ++= lm2 + + List(Long.MinValue, 0L, 1L, 5L).forall(i => + lm2.get(i) == hm2.get(i) && + lm2.getOrElse(i, "") == hm2.getOrElse(i, "") && + lm2(i) == hm2.get(i).getOrElse(i.toString) && + lm2.getOrNull(i) == hm2.get(i).orNull + ) + } +} diff --git a/test/files/run/patmatnew.scala b/test/files/run/patmatnew.scala index b212e10f8d..3c0d00dc6c 100644 --- a/test/files/run/patmatnew.scala +++ b/test/files/run/patmatnew.scala @@ -46,7 +46,7 @@ object Test { object SimpleUnapply { def run() { // from sortedmap, old version List((1, 2)).head match { - case kv@Pair(key, _) => kv.toString + " " + key.toString + case kv@(key, _) => kv.toString + " " + key.toString } } @@ -400,9 +400,9 @@ object Test { // these are exhaustive matches // should not generate any warnings def f[A](z: (Option[A], Option[A])) = z match { - case Pair(None, Some(x)) => 1 - case Pair(Some(x), None) => 2 - case Pair(Some(x), Some(y)) => 3 + case (None, Some(x)) => 1 + case (Some(x), None) => 2 + case (Some(x), Some(y)) => 3 case _ => 4 } @@ -419,9 +419,9 @@ object Test { } def h[A](x: (Option[A], Option[A])) = x match { - case Pair(None, _: Some[_]) => 1 - case Pair(_: Some[_], None) => 2 - case Pair(_: Some[_], _: Some[_]) => 3 + case (None, _: Some[_]) => 1 + case (_: Some[_], None) => 2 + case (_: Some[_], _: Some[_]) => 3 case _ => 4 } @@ -539,17 +539,17 @@ object Test { case class Operator(x: Int); val EQ = new Operator(2); - def analyze(x: Pair[Operator, Int]) = x match { - case Pair(EQ, 0) => "0" - case Pair(EQ, 1) => "1" - case Pair(EQ, 2) => "2" + def analyze(x: Tuple2[Operator, Int]) = x match { + case (EQ, 0) => "0" + case (EQ, 1) => "1" + case (EQ, 2) => "2" } def run() { - val x = Pair(EQ, 0); + val x = (EQ, 0); assertEquals("0", analyze(x)); // should print "0" - val y = Pair(EQ, 1); + val y = (EQ, 1); assertEquals("1", analyze(y)); // should print "1" - val z = Pair(EQ, 2); + val z = (EQ, 2); assertEquals("2", analyze(z)); // should print "2" } } diff --git a/test/files/run/repl-backticks.check b/test/files/run/repl-backticks.check new file mode 100644 index 0000000000..c0561abd7c --- /dev/null +++ b/test/files/run/repl-backticks.check @@ -0,0 +1,2 @@ +import java.lang.Thread.`yield` +import scala.`package`.Throwable diff --git a/test/files/run/repl-backticks.scala b/test/files/run/repl-backticks.scala new file mode 100644 index 0000000000..e40a8bc662 --- /dev/null +++ b/test/files/run/repl-backticks.scala @@ -0,0 +1,18 @@ +import scala.tools.nsc._ + +object Test { + val testCode = """ + import java.lang.Thread.`yield` + import scala.`package`.Throwable + + `yield` + """ + + def main(args: Array[String]) { + val settings = new Settings() + settings.classpath.value = System.getProperty("java.class.path") + val repl = new interpreter.IMain(settings) + repl.interpret(testCode) + } +} + diff --git a/test/files/run/t1500.check b/test/files/run/t1500.check new file mode 100644 index 0000000000..94a169333b --- /dev/null +++ b/test/files/run/t1500.check @@ -0,0 +1,3 @@ +defined class posingAs +resolve: [A, B](x: A @posingAs[B])B +x: Any = 7 diff --git a/test/files/run/t1500.scala b/test/files/run/t1500.scala new file mode 100644 index 0000000000..30c026f70f --- /dev/null +++ b/test/files/run/t1500.scala @@ -0,0 +1,46 @@ +import scala.tools.nsc._ + +object Test { + + /** + * Type inference overlooks constraints posed by type parameters in annotations on types. + */ + + val testCode = """ + + class posingAs[A] extends annotation.TypeConstraint + + def resolve[A,B](x: A @posingAs[B]): B = x.asInstanceOf[B] + + val x = resolve(7: @posingAs[Any]) + + """ + + def main(args: Array[String]) { + + val settings = new Settings() + settings.classpath.value = System.getProperty("java.class.path") + val tool = new interpreter.IMain(settings) + val global = tool.global + + import global._ + import definitions._ + + object checker extends AnnotationChecker { + + /** Check annotations to decide whether tpe1 <:< tpe2 */ + def annotationsConform(tpe1: Type, tpe2: Type): Boolean = { + + tpe1.annotations.forall(a1 => tpe2.annotations.forall(a2 => a1.atp <:< a2.atp)) + + } + } + + global.addAnnotationChecker(checker) + + tool.interpret(testCode) + + } + +} + diff --git a/test/files/run/t1501.check b/test/files/run/t1501.check new file mode 100644 index 0000000000..f0fa9112a5 --- /dev/null +++ b/test/files/run/t1501.check @@ -0,0 +1,3 @@ +defined class xyz +loopWhile: [T](cond: => Boolean)(body: => Unit @xyz[T])Unit @xyz[T] +test: ()Unit @xyz[Int] diff --git a/test/files/run/t1501.scala b/test/files/run/t1501.scala new file mode 100644 index 0000000000..ca6bf357fb --- /dev/null +++ b/test/files/run/t1501.scala @@ -0,0 +1,56 @@ +import scala.tools.nsc._ + +object Test { + + /** + * ... + */ + + val testCode = """ + + class xyz[A] extends annotation.TypeConstraint + + def loopWhile[T](cond: =>Boolean)(body: =>(Unit @xyz[T])): Unit @ xyz[T] = {{ + if (cond) {{ + body + loopWhile[T](cond)(body) + }} + }} + + def test() = {{ + var x = 7 + loopWhile(x != 0) {{ + x = x - 1 + (): @xyz[Int] + }} + }} + + """ + + def main(args: Array[String]) { + val settings = new Settings() + settings.classpath.value = System.getProperty("java.class.path") + val tool = new interpreter.IMain(settings) + val global = tool.global + + import global._ + import definitions._ + + object checker extends AnnotationChecker { + + /** Check annotations to decide whether tpe1 <:< tpe2 */ + def annotationsConform(tpe1: Type, tpe2: Type): Boolean = { + + tpe1.annotations.forall(a1 => tpe2.annotations.forall(a2 => a1.atp <:< a2.atp)) + + } + } + + global.addAnnotationChecker(checker) + + tool.interpret(testCode) + + } + +} + diff --git a/test/files/run/t3888.scala b/test/files/run/t3888.scala index 19771041fc..8701b42ff0 100644 --- a/test/files/run/t3888.scala +++ b/test/files/run/t3888.scala @@ -24,6 +24,6 @@ object Test { } } -class P extends Pair(1, 1) { +class P extends Tuple2(1, 1) { override def equals(x: Any) = true } diff --git a/test/files/run/t4124.check b/test/files/run/t4124.check new file mode 100644 index 0000000000..66a0092d93 --- /dev/null +++ b/test/files/run/t4124.check @@ -0,0 +1,4 @@ +hi +hi +bye +bye diff --git a/test/files/run/t4124.scala b/test/files/run/t4124.scala new file mode 100644 index 0000000000..9f35b57ce3 --- /dev/null +++ b/test/files/run/t4124.scala @@ -0,0 +1,24 @@ +import xml.Node + +object Test extends App { + val body: Node = <elem>hi</elem> + println ((body: AnyRef, "foo") match { + case (node: Node, "bar") => "bye" + case (ser: Serializable, "foo") => "hi" + }) + + println ((body, "foo") match { + case (node: Node, "bar") => "bye" + case (ser: Serializable, "foo") => "hi" + }) + + println ((body: AnyRef, "foo") match { + case (node: Node, "foo") => "bye" + case (ser: Serializable, "foo") => "hi" + }) + + println ((body: AnyRef, "foo") match { + case (node: Node, "foo") => "bye" + case (ser: Serializable, "foo") => "hi" + }) +} diff --git a/test/files/run/t6329_repl_bug.check b/test/files/run/t6329_repl_bug.check new file mode 100644 index 0000000000..44c41cfd03 --- /dev/null +++ b/test/files/run/t6329_repl_bug.check @@ -0,0 +1,17 @@ +Type in expressions to have them evaluated. +Type :help for more information. + +scala> import scala.reflect.runtime.universe._ +import scala.reflect.runtime.universe._ + +scala> import scala.reflect.runtime._ +import scala.reflect.runtime._ + +scala> classManifest[List[_]] +warning: there were 1 deprecation warning(s); re-run with -deprecation for details +res0: scala.reflect.ClassTag[List[_]] = scala.collection.immutable.List[<?>] + +scala> scala.reflect.classTag[List[_]] +res1: scala.reflect.ClassTag[List[_]] = scala.collection.immutable.List + +scala> diff --git a/test/files/run/t6329_repl_bug.pending b/test/files/run/t6329_repl_bug.scala index 9997d1771e..9997d1771e 100644 --- a/test/files/run/t6329_repl_bug.pending +++ b/test/files/run/t6329_repl_bug.scala diff --git a/test/files/run/t6329_vanilla_bug.check b/test/files/run/t6329_vanilla_bug.check new file mode 100644 index 0000000000..640d168a8a --- /dev/null +++ b/test/files/run/t6329_vanilla_bug.check @@ -0,0 +1,3 @@ +warning: there were 1 deprecation warning(s); re-run with -deprecation for details +scala.collection.immutable.List[<?>] +scala.collection.immutable.List diff --git a/test/files/run/t6329_vanilla_bug.pending b/test/files/run/t6329_vanilla_bug.scala index 404f90bf6e..404f90bf6e 100644 --- a/test/files/run/t6329_vanilla_bug.pending +++ b/test/files/run/t6329_vanilla_bug.scala diff --git a/test/files/run/t7985.scala b/test/files/run/t7985.scala new file mode 100644 index 0000000000..5fe270f9c0 --- /dev/null +++ b/test/files/run/t7985.scala @@ -0,0 +1,3 @@ +object Test extends App { + Array(1) match { case _: Array[scala.Int] => } +} diff --git a/test/files/run/t7985b.scala b/test/files/run/t7985b.scala new file mode 100644 index 0000000000..aaf649eb28 --- /dev/null +++ b/test/files/run/t7985b.scala @@ -0,0 +1,5 @@ +class a { type X = Int } + +object Test extends App { + Array(1) match { case _: Array[a#X] => } +} diff --git a/test/files/run/tailcalls.scala b/test/files/run/tailcalls.scala index e5d8891cc7..1653b14de9 100644 --- a/test/files/run/tailcalls.scala +++ b/test/files/run/tailcalls.scala @@ -169,7 +169,7 @@ class TailCall[S](s: S) { aux[T](x, y); } final def g3[T](x: Int, y: Int, zs: List[T]): Int = { - def aux[U](n: Int, v: Int, ls: List[Pair[T,U]]): Int = + def aux[U](n: Int, v: Int, ls: List[Tuple2[T,U]]): Int = if (n == 0) v else aux(n - 1, v - 1, ls); aux(x, y, Nil); } diff --git a/test/files/run/tcpoly_parseridioms.check b/test/files/run/tcpoly_parseridioms.check index ab829e0a0e..8bd0a086d6 100644 --- a/test/files/run/tcpoly_parseridioms.check +++ b/test/files/run/tcpoly_parseridioms.check @@ -4,8 +4,8 @@ It would fail on the following input: ParseResult() ^ tcpoly_parseridioms.scala:17: warning: match may not be exhaustive. It would fail on the following input: ParseResult() - def apply(in: Input): ParseResult[Pair[T, U]] = a(in) match { - ^ + def apply(in: Input): ParseResult[Tuple2[T, U]] = a(in) match { + ^ tcpoly_parseridioms.scala:30: warning: match may not be exhaustive. It would fail on the following input: ParseResult() case Failure(_, _) => b(in) match { diff --git a/test/files/run/tcpoly_parseridioms.scala b/test/files/run/tcpoly_parseridioms.scala index c8bcf693a1..d22f68b558 100644 --- a/test/files/run/tcpoly_parseridioms.scala +++ b/test/files/run/tcpoly_parseridioms.scala @@ -13,10 +13,10 @@ trait Parsers { } // sequence - def sq[T, U](a: => Parser[T], b: => Parser[U]): Parser[Pair[T, U]] = new Parser[Pair[T, U]] { - def apply(in: Input): ParseResult[Pair[T, U]] = a(in) match { + def sq[T, U](a: => Parser[T], b: => Parser[U]): Parser[Tuple2[T, U]] = new Parser[Tuple2[T, U]] { + def apply(in: Input): ParseResult[Tuple2[T, U]] = a(in) match { case Success(next, x) => b(next) match { - case Success(next2, y) => Success(next2, Pair(x,y)) + case Success(next2, y) => Success(next2, (x,y)) case Failure(_, msg) => Failure(in, msg) } case Failure(_, msg) => Failure(in, msg) @@ -49,7 +49,7 @@ trait Parsers { } } - def apply_++[s, tt](fun: Parser[s => tt], arg: Parser[s]): Parser[tt] = lift[Pair[s=>tt, s], tt]({case Pair(f, a) => f(a)})(sq(fun, arg)) + def apply_++[s, tt](fun: Parser[s => tt], arg: Parser[s]): Parser[tt] = lift[Tuple2[s=>tt, s], tt]({case (f, a) => f(a)})(sq(fun, arg)) def success[u](v: u): Parser[u] = new Parser[u] { def apply(in: Input) = Success(in, v) diff --git a/test/files/run/withIndex.scala b/test/files/run/withIndex.scala index 910b1f1f9e..ebf1941c95 100644 --- a/test/files/run/withIndex.scala +++ b/test/files/run/withIndex.scala @@ -11,7 +11,7 @@ object Test { Console.println(str.zipWithIndex.toList) assert { ary.zipWithIndex match { - case _: Array[Pair[_,_]] => true + case _: Array[Tuple2[_,_]] => true case _ => false } } diff --git a/test/files/scalacheck/CheckCollections.scala b/test/files/scalacheck/CheckCollections.scala index 108040b900..329d505b47 100644 --- a/test/files/scalacheck/CheckCollections.scala +++ b/test/files/scalacheck/CheckCollections.scala @@ -1,4 +1,4 @@ -import org.scalacheck.{ ConsoleReporter, Properties } +import org.scalacheck.Properties import org.scalacheck.Prop._ import scala.reflect.internal.util.Collections._ @@ -49,11 +49,4 @@ object Test extends Properties("reflect.internal.util.Collections") { for { (label, prop) <- tests } property(label) = prop - - import org.scalacheck.{ Test => STest } - - def runTests() = - STest.checkProperties( - STest.Params(testCallback = ConsoleReporter(0)), this) - } diff --git a/test/files/scalacheck/CheckEither.scala b/test/files/scalacheck/CheckEither.scala index 4d0cab4693..48f732a22d 100644 --- a/test/files/scalacheck/CheckEither.scala +++ b/test/files/scalacheck/CheckEither.scala @@ -1,10 +1,8 @@ -import org.scalacheck.{ Arbitrary, ConsoleReporter, Prop, Properties } +import org.scalacheck.{ Arbitrary, Prop, Properties } import org.scalacheck.Arbitrary.{arbitrary, arbThrowable} import org.scalacheck.Gen.oneOf -import org.scalacheck.util.StdRand import org.scalacheck.Prop._ -import org.scalacheck.Test.{Params, check} -import org.scalacheck.ConsoleReporter.testStatsEx +import org.scalacheck.Test.check import Function.tupled object Test extends Properties("Either") { @@ -178,10 +176,4 @@ object Test extends Properties("Either") { for ((label, prop) <- tests) { property(label) = prop } - - import org.scalacheck.{ Test => STest } - - def runTests() = { - STest.checkProperties(STest.Params(testCallback = ConsoleReporter(0)), this) - } } diff --git a/test/files/scalacheck/array-new.scala b/test/files/scalacheck/array-new.scala index e13a47a5d5..d8c69ead78 100644 --- a/test/files/scalacheck/array-new.scala +++ b/test/files/scalacheck/array-new.scala @@ -1,4 +1,4 @@ -import scala.reflect.{ClassTag, classTag} +import scala.reflect.ClassTag // new style: use ClassTag import org.scalacheck._ import Prop._ import Gen._ diff --git a/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala b/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala index c4b93dae48..7905a2ca15 100644 --- a/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala +++ b/test/files/scalacheck/quasiquotes/ArbitraryTreesAndNames.scala @@ -222,7 +222,7 @@ trait ArbitraryTreesAndNames { yield ValDef(mods, name, tpt, rhs) def genTree(size: Int): Gen[Tree] = - if (size <= 1) oneOf(EmptyTree, genTreeIsTerm(size), genTreeIsType(size)) + if (size <= 1) oneOf(EmptyTree: Gen[Tree], genTreeIsTerm(size), genTreeIsType(size)) else oneOf(genTree(1), // these trees are neither terms nor types genPackageDef(size - 1), genModuleDef(size - 1), @@ -273,8 +273,8 @@ trait ArbitraryTreesAndNames { def apply(universe: Universe, value: TreeIsType): universe.Tree = value.tree.asInstanceOf[universe.Tree] } - implicit def treeIsTerm2tree(tit: TreeIsTerm) = tit.tree - implicit def treeIsType2tree(tit: TreeIsType) = tit.tree + implicit def treeIsTerm2tree(tit: TreeIsTerm): Tree = tit.tree + implicit def treeIsType2tree(tit: TreeIsType): Tree = tit.tree implicit val arbConstant: Arbitrary[Constant] = Arbitrary(genConstant) implicit val arbModifiers: Arbitrary[Modifiers] = Arbitrary(genModifiers) diff --git a/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala b/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala index b2bce124ee..b331c4b6b6 100644 --- a/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala +++ b/test/files/scalacheck/quasiquotes/QuasiquoteProperties.scala @@ -18,13 +18,12 @@ trait Helpers { object simplify extends Transformer { object SimplifiedName { - def unapply[T <: Name](name: T): Option[T] = - name.toString.split("\\$").toSeq match { - case first :+ last if scala.util.Try(last.toInt).isSuccess && first.nonEmpty => - val value = first.mkString("", "$", "$") - Some((if (name.isTermName) TermName(value) else TypeName(value)).asInstanceOf[T]) - case _ => None - } + val st = scala.reflect.runtime.universe.asInstanceOf[scala.reflect.internal.SymbolTable] + val FreshName = new st.FreshNameExtractor + def unapply[T <: Name](name: T): Option[T] = name.asInstanceOf[st.Name] match { + case FreshName(prefix) => + Some((if (name.isTermName) TermName(prefix) else TypeName(prefix)).asInstanceOf[T]) + } } override def transform(tree: Tree): Tree = tree match { @@ -59,7 +58,7 @@ trait Helpers { } def assertThrows[T <: AnyRef](f: => Any)(implicit manifest: Manifest[T]): Unit = { - val clazz = manifest.erasure.asInstanceOf[Class[T]] + val clazz = manifest.runtimeClass.asInstanceOf[Class[T]] val thrown = try { f diff --git a/test/files/scalacheck/si4147.scala b/test/files/scalacheck/si4147.scala index 05507b1b18..72f6e9afd5 100644 --- a/test/files/scalacheck/si4147.scala +++ b/test/files/scalacheck/si4147.scala @@ -1,8 +1,6 @@ import org.scalacheck.Prop.{forAll, throws} import org.scalacheck.Properties -import org.scalacheck.ConsoleReporter.testStatsEx import org.scalacheck.Gen -import org.scalacheck.ConsoleReporter import collection.mutable @@ -66,5 +64,5 @@ object Test extends Properties("Mutable TreeSet") { } property("ordering must not be null") = - throws(mutable.TreeSet.empty[Int](null), classOf[NullPointerException]) + throws(classOf[NullPointerException])(mutable.TreeSet.empty[Int](null)) } diff --git a/test/files/scalacheck/t2460.scala b/test/files/scalacheck/t2460.scala index 196b43789f..ab2911447a 100644 --- a/test/files/scalacheck/t2460.scala +++ b/test/files/scalacheck/t2460.scala @@ -1,6 +1,5 @@ import org.scalacheck.Prop.forAll import org.scalacheck.Properties -import org.scalacheck.ConsoleReporter.testStatsEx import org.scalacheck.{Test => SCTest} import org.scalacheck.Gen @@ -25,8 +24,4 @@ object Test extends Properties("Regex : Ticket 2460") { ("numberOfGroup", numberOfGroup), ("nameOfGroup", nameOfGroup) ) - - /*tests foreach { - case (name, p) => testStatsEx(name, SCTest.check(p)) - }*/ } diff --git a/test/files/scalacheck/treeset.scala b/test/files/scalacheck/treeset.scala index 7fca3ed5e4..4b9b77dd7e 100644 --- a/test/files/scalacheck/treeset.scala +++ b/test/files/scalacheck/treeset.scala @@ -151,5 +151,5 @@ object Test extends Properties("TreeSet") { } property("ordering must not be null") = - throws(TreeSet.empty[Int](null), classOf[NullPointerException]) + throws(classOf[NullPointerException])(TreeSet.empty[Int](null)) } diff --git a/test/junit/scala/tools/nsc/symtab/FreshNameExtractorTest.scala b/test/junit/scala/tools/nsc/symtab/FreshNameExtractorTest.scala new file mode 100644 index 0000000000..cf09abdfff --- /dev/null +++ b/test/junit/scala/tools/nsc/symtab/FreshNameExtractorTest.scala @@ -0,0 +1,47 @@ +package scala.tools.nsc +package symtab + +import org.junit.Assert._ +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +import scala.tools.testing.AssertUtil.assertThrows +import scala.reflect.internal.util.FreshNameCreator + +@RunWith(classOf[JUnit4]) +class FreshNameExtractorTest { + object symbolTable extends SymbolTableForUnitTesting + import symbolTable._ + + val prefixes = List("foo$", "x$", "bar", "bippy$baz$") + + @Test + def extractionPreservesPrefix = + ("" :: prefixes).foreach { creatorPrefix => + prefixes.foreach { newPrefix => + val Creator = new FreshNameCreator(creatorPrefix) + val Extractor = new FreshNameExtractor(creatorPrefix) + val Extractor(extractedPrefix) = TermName(Creator.newName(newPrefix)) + assertEquals(newPrefix, extractedPrefix) + } + } + + @Test + def extractionFailsOnCreatorPrefixMismatch = { + val Creator = new FreshNameCreator(prefixes.head) + val Extractor = new FreshNameExtractor(prefixes.tail.head) + assertThrows[MatchError] { + val Extractor(_) = TermName(Creator.newName("foo")) + } + } + + @Test + def extractionsFailsIfNameDoesntEndWithNumber = { + val Creator = new FreshNameCreator(prefixes.head) + val Extractor = new FreshNameExtractor(prefixes.head) + assertThrows[MatchError] { + val Extractor(_) = TermName(Creator.newName("foo") + "bar") + } + } +}
\ No newline at end of file diff --git a/test/pending/run/reify_callccinterpreter.scala b/test/pending/run/reify_callccinterpreter.scala index d9f7736769..82c70da28f 100644 --- a/test/pending/run/reify_callccinterpreter.scala +++ b/test/pending/run/reify_callccinterpreter.scala @@ -43,15 +43,15 @@ object Test extends App { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]]; + type Environment = List[Tuple2[Name, Value]]; def lookup(x: Name, e: Environment): M[Value] = e match { case List() => unitM(Wrong) - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value): M[Value] = Pair(a, b) match { - case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + def add(a: Value, b: Value): M[Value] = (a, b) match { + case (Num(m), Num(n)) => unitM(Num(m + n)) case _ => unitM(Wrong) } @@ -67,12 +67,12 @@ object Test extends App { b <- interp(r, e); c <- add(a, b)) yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) case App(f, t) => for (a <- interp(f, e); b <- interp(t, e); c <- apply(a, b)) yield c - case Ccc(x, t) => callCC(k => interp(t, Pair(x, Fun(k)) :: e)) + case Ccc(x, t) => callCC(k => interp(t, (x, Fun(k)) :: e)) } def test(t: Term): String = showM(interp(t, List())) diff --git a/test/pending/run/reify_simpleinterpreter.scala b/test/pending/run/reify_simpleinterpreter.scala index 6cf87ea7c5..1f6d6c8da7 100644 --- a/test/pending/run/reify_simpleinterpreter.scala +++ b/test/pending/run/reify_simpleinterpreter.scala @@ -32,15 +32,15 @@ object Test extends App { override def toString() = "<function>" } - type Environment = List[Pair[Name, Value]] + type Environment = List[Tuple2[Name, Value]] def lookup(x: Name, e: Environment): M[Value] = e match { case List() => unitM(Wrong) - case Pair(y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) + case (y, b) :: e1 => if (x == y) unitM(b) else lookup(x, e1) } - def add(a: Value, b: Value): M[Value] = Pair(a, b) match { - case Pair(Num(m), Num(n)) => unitM(Num(m + n)) + def add(a: Value, b: Value): M[Value] = (a, b) match { + case (Num(m), Num(n)) => unitM(Num(m + n)) case _ => unitM(Wrong) } @@ -56,7 +56,7 @@ object Test extends App { b <- interp(r, e); c <- add(a, b)) yield c - case Lam(x, t) => unitM(Fun(a => interp(t, Pair(x, a) :: e))) + case Lam(x, t) => unitM(Fun(a => interp(t, (x, a) :: e))) case App(f, t) => for (a <- interp(f, e); b <- interp(t, e); c <- apply(a, b)) diff --git a/test/pending/shootout/fasta.scala b/test/pending/shootout/fasta.scala index 8b711083a5..ae99ba5936 100644 --- a/test/pending/shootout/fasta.scala +++ b/test/pending/shootout/fasta.scala @@ -5,7 +5,7 @@ import java.io._ -object fasta { +object fasta { def main(args: Array[String]) = { val ALU = @@ -18,31 +18,31 @@ object fasta { "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA" val _IUB = Array( - Pair('a', 0.27), - Pair('c', 0.12), - Pair('g', 0.12), - Pair('t', 0.27), - - Pair('B', 0.02), - Pair('D', 0.02), - Pair('H', 0.02), - Pair('K', 0.02), - Pair('M', 0.02), - Pair('N', 0.02), - Pair('R', 0.02), - Pair('S', 0.02), - Pair('V', 0.02), - Pair('W', 0.02), - Pair('Y', 0.02) + ('a', 0.27), + ('c', 0.12), + ('g', 0.12), + ('t', 0.27), + + ('B', 0.02), + ('D', 0.02), + ('H', 0.02), + ('K', 0.02), + ('M', 0.02), + ('N', 0.02), + ('R', 0.02), + ('S', 0.02), + ('V', 0.02), + ('W', 0.02), + ('Y', 0.02) ) val IUB = makeCumulative(_IUB) val _HomoSapiens = Array( - Pair('a', 0.3029549426680), - Pair('c', 0.1979883004921), - Pair('g', 0.1975473066391), - Pair('t', 0.3015094502008) + ('a', 0.3029549426680), + ('c', 0.1979883004921), + ('g', 0.1975473066391), + ('t', 0.3015094502008) ) val HomoSapiens = makeCumulative(_HomoSapiens) @@ -61,15 +61,15 @@ object fasta { s.writeRandomSequence(HomoSapiens,n*5) s.close - } + } - def makeCumulative(a: Array[Pair[Char,Double]]) = { + def makeCumulative(a: Array[Tuple2[Char,Double]]) = { var cp = 0.0 a map (frequency => - frequency match { - case Pair(code,percent) => - cp = cp + percent; new Frequency(code.toByte,cp) - } + frequency match { + case (code,percent) => + cp = cp + percent; new Frequency(code.toByte,cp) + } ) } @@ -79,7 +79,7 @@ object fasta { // We could use instances of Pair or Tuple2 but specific labels // make the code more readable than index numbers -class Frequency(_code: Byte, _percent: Double){ +class Frequency(_code: Byte, _percent: Double){ var code = _code; var percent = _percent; } @@ -101,13 +101,13 @@ class FastaOutputStream(out: OutputStream) extends BufferedOutputStream(out) { val m = if (n < LineLength) n else LineLength var i = 0 - while (i < m){ + while (i < m){ if (k == kn) k = 0 val b = alu(k) if (count < buf.length){ buf(count) = b; count = count + 1 } else { write(b) } // flush buffer k = k+1 - i = i+1 + i = i+1 } write(nl) @@ -122,11 +122,11 @@ class FastaOutputStream(out: OutputStream) extends BufferedOutputStream(out) { val m = if (n < LineLength) n else LineLength var i = 0 - while (i < m){ + while (i < m){ val b = selectRandom(distribution) if (count < buf.length){ buf(count) = b; count = count + 1 } else { write(b) } // flush buffer - i = i+1 + i = i+1 } if (count < buf.length){ buf(count) = nl; count = count + 1 } diff --git a/test/pending/shootout/revcomp.scala-2.scala b/test/pending/shootout/revcomp.scala-2.scala index 92260ad021..03fb25af1b 100644 --- a/test/pending/shootout/revcomp.scala-2.scala +++ b/test/pending/shootout/revcomp.scala-2.scala @@ -6,7 +6,7 @@ import java.io._ import scala.collection.mutable.Stack -object revcomp { +object revcomp { val IUB = IUBCodeComplements @@ -16,7 +16,7 @@ object revcomp { val a: Array[Byte] = new Array( 'z'.toByte ) for (indexValue <- code zip comp) - indexValue match { case Pair(i,v) => a(i) = v } + indexValue match { case (i,v) => a(i) = v } a } @@ -49,18 +49,18 @@ object revcomp { if (desc.length > 0) complementReverseWrite(desc, lines, w) w.close - } + } - def complementReverseWrite(desc: String, lines: LineStack, + def complementReverseWrite(desc: String, lines: LineStack, w: BufferedOutputStream) = { def inplaceComplementReverse(b: Array[Byte]) = { - var i = 0 + var i = 0 var j = b.length - 1 while (i < j){ - val swap = b(i) - b(i) = IUB( b(j) ) + val swap = b(i) + b(i) = IUB( b(j) ) b(j) = IUB( swap ) i = i + 1 j = j - 1 @@ -79,11 +79,11 @@ object revcomp { while (!lines.isEmpty) { val line = lines.pop inplaceComplementReverse(line) - + if (isSplitLine){ if (isFirstLine){ w.write(line); isFirstLine = false } else { w.write(line,0,n-k); w.write(nl); w.write(line,n-k,k) } - } + } else { w.write(line); w.write(nl) } } if (isSplitLine && !isFirstLine) w.write(nl) diff --git a/test/pending/shootout/revcomp.scala-3.scala b/test/pending/shootout/revcomp.scala-3.scala index ae12f0499b..39a0409127 100644 --- a/test/pending/shootout/revcomp.scala-3.scala +++ b/test/pending/shootout/revcomp.scala-3.scala @@ -6,7 +6,7 @@ import java.io._ import scala.collection.mutable.Stack -object revcomp { +object revcomp { def main(args: Array[String]) = { val out = new FastaOutputStream(System.out) val in = new FastaInputStream(System.in) @@ -17,12 +17,12 @@ object revcomp { in.close out.close - } + } } trait FastaByteStream { - val nl = '\n'.toByte + val nl = '\n'.toByte type Line = Array[Byte] type LineStack = Stack[Line] @@ -31,13 +31,13 @@ trait FastaByteStream { // extend the Java BufferedInputStream class -final class FastaInputStream(in: InputStream) +final class FastaInputStream(in: InputStream) extends BufferedInputStream(in) with FastaByteStream { val gt = '>'.toByte val sc = ';'.toByte - def readSequenceStack(): Pair[Line,LineStack] = { + def readSequenceStack(): Tuple2[Line,LineStack] = { var header: Line = null val lines: LineStack = new Stack @@ -49,14 +49,14 @@ final class FastaInputStream(in: InputStream) header = line } else { pos = pos - line.length - 1 // reposition to start of line - return Pair(header,lines) + return (header,lines) } } else { if (c != sc) lines push line // ';' } line = readLine() } - return Pair(header,lines) + return (header,lines) } def readLine() = { @@ -65,7 +65,7 @@ final class FastaInputStream(in: InputStream) else { mark(128) // mark the start of the line if (count == 0) read() // fill buffer - + var i = markpos while (i < count && buf(i) != nl) i = i + 1 @@ -74,11 +74,11 @@ final class FastaInputStream(in: InputStream) while (i < count && buf(i) != nl) i = i + 1 } - if (i < count){ + if (i < count){ bytes = new Array(i - markpos) System.arraycopy(buf, markpos, bytes, 0, i - markpos); pos = i+1 - } + } } bytes } @@ -87,7 +87,7 @@ final class FastaInputStream(in: InputStream) // extend the Java BufferedOutputStream class -final class FastaOutputStream(in: OutputStream) +final class FastaOutputStream(in: OutputStream) extends BufferedOutputStream(in) with FastaByteStream { private val IUB = IUBCodeComplements @@ -98,19 +98,19 @@ final class FastaOutputStream(in: OutputStream) val iub: Array[Byte] = new Array( 'z'.toByte ) for (indexValue <- code zip comp) - indexValue match { case Pair(i,v) => iub(i) = v } + indexValue match { case (i,v) => iub(i) = v } iub } - def writeReverseComplement(sequence: Pair[Line,LineStack]) = { + def writeReverseComplement(sequence: Tuple2[Line,LineStack]) = { def inplaceComplementReverse(b: Array[Byte]) = { - var i = 0 + var i = 0 var j = b.length - 1 while (i < j){ - val swap = b(i) - b(i) = IUB( b(j) ) + val swap = b(i) + b(i) = IUB( b(j) ) b(j) = IUB( swap ) i = i + 1 j = j - 1 @@ -119,7 +119,7 @@ final class FastaOutputStream(in: OutputStream) } sequence match { - case Pair(header,lines) => { + case (header,lines) => { write(header); write(nl) @@ -131,11 +131,11 @@ final class FastaOutputStream(in: OutputStream) while (!lines.isEmpty) { val line = lines.pop inplaceComplementReverse(line) - + if (isSplitLine){ - if (isFirstLine){ write(line); isFirstLine = false } + if (isFirstLine){ write(line); isFirstLine = false } else { write(line,0,LineLength-k); write(nl); write(line,LineLength-k,k) } - } + } else { write(line); write(nl) } } diff --git a/versions.properties b/versions.properties index 29cbbad884..76eea52681 100644 --- a/versions.properties +++ b/versions.properties @@ -1,13 +1,13 @@ -starr.version=2.11.0-M6 +starr.version=2.11.0-M7 starr.use.released=1 # These are the versions of the modules that go with this release. # These properties are used during PR validation and in dbuild builds. -scala.binary.version=2.11.0-M6 -partest.version.number=1.0.0-RC7 -scala-xml.version.number=1.0.0-RC6 -scala-parser-combinators.version.number=1.0.0-RC4 -scalacheck.version.number=1.10.1 +scala.binary.version=2.11.0-M7 +partest.version.number=1.0.0-RC8 +scala-xml.version.number=1.0.0-RC7 +scala-parser-combinators.version.number=1.0.0-RC5 +scalacheck.version.number=1.11.1 # TODO: modularize the compiler #scala-compiler-doc.version.number=1.0.0-RC1 |