diff options
Diffstat (limited to 'test')
24 files changed, 203 insertions, 110 deletions
diff --git a/test/files/jvm/actmig-PinS_1.scala b/test/files/jvm/actmig-PinS_1.scala index 876688ca75..495852e812 100644 --- a/test/files/jvm/actmig-PinS_1.scala +++ b/test/files/jvm/actmig-PinS_1.scala @@ -9,7 +9,7 @@ import scala.concurrent.{ Promise, Await } object SillyActor { val startPromise = Promise[Boolean]() - val ref = MigrationSystem.actorOf(Props(() => new SillyActor, "akka.actor.default-stash-dispatcher")) + val ref = ActorDSL.actor(new SillyActor) } /* PinS, Listing 32.1: A simple actor @@ -27,7 +27,7 @@ class SillyActor extends Actor { object SeriousActor { val startPromise = Promise[Boolean]() - val ref = MigrationSystem.actorOf(Props(() => new SeriousActor, "akka.actor.default-stash-dispatcher")) + val ref = ActorDSL.actor(new SeriousActor) } class SeriousActor extends Actor { @@ -72,7 +72,7 @@ object Test extends App { /* PinS, Listing 32.2: An actor that calls receive */ - def makeEchoActor(): ActorRef = MigrationSystem.actorOf(Props(() => new Actor { + def makeEchoActor(): ActorRef = ActorDSL.actor(new Actor { def act() { while (true) { receive { @@ -83,20 +83,20 @@ object Test extends App { } } } - }, "akka.actor.default-stash-dispatcher")) + }) /* PinS, page 696 */ - def makeIntActor(): ActorRef = MigrationSystem.actorOf(Props(() => new Actor { + def makeIntActor(): ActorRef = ActorDSL.actor(new Actor { def act() { receive { case x: Int => // I only want Ints println("Got an Int: " + x) } } - }, "akka.actor.default-stash-dispatcher")) + }) - MigrationSystem.actorOf(Props(() => new Actor { + ActorDSL.actor(new Actor { def act() { trapExit = true link(SillyActor.ref) @@ -109,15 +109,14 @@ object Test extends App { case Exit(_: SeriousActor, _) => val seriousPromise2 = Promise[Boolean]() // PinS, page 694 - val seriousActor2 = MigrationSystem.actorOf(Props(() => + val seriousActor2 = ActorDSL.actor( new Actor { def act() { for (i <- 1 to 5) println("That is the question.") seriousPromise2.success(true) } - } - , "akka.actor.default-stash-dispatcher")) + }) Await.ready(seriousPromise2.future, 5 seconds) val echoActor = makeEchoActor() @@ -136,5 +135,5 @@ object Test extends App { } } } - }, "akka.actor.default-stash-dispatcher")) + }) } diff --git a/test/files/jvm/actmig-PinS_2.scala b/test/files/jvm/actmig-PinS_2.scala index 7d12578f71..508525463f 100644 --- a/test/files/jvm/actmig-PinS_2.scala +++ b/test/files/jvm/actmig-PinS_2.scala @@ -9,7 +9,7 @@ import scala.concurrent.{ Promise, Await } object SillyActor { val startPromise = Promise[Boolean]() - val ref = MigrationSystem.actorOf(Props(() => new SillyActor, "default-stash-dispatcher")) + val ref = ActorDSL.actor(new SillyActor) } /* PinS, Listing 32.1: A simple actor @@ -29,7 +29,7 @@ class SillyActor extends StashingActor { object SeriousActor { val startPromise = Promise[Boolean]() - val ref = MigrationSystem.actorOf(Props(() => new SeriousActor, "default-stash-dispatcher")) + val ref = ActorDSL.actor(new SeriousActor) } class SeriousActor extends StashingActor { @@ -44,7 +44,7 @@ class SeriousActor extends StashingActor { /* PinS, Listing 32.3: An actor that calls react */ object NameResolver { - val ref = MigrationSystem.actorOf(Props(() => new NameResolver, "default-stash-dispatcher")) + val ref = ActorDSL.actor(new NameResolver) } class NameResolver extends StashingActor { @@ -80,7 +80,7 @@ object Test extends App { /* PinS, Listing 32.2: An actor that calls receive */ - def makeEchoActor(): ActorRef = MigrationSystem.actorOf(Props(() => + def makeEchoActor(): ActorRef = ActorDSL.actor( new StashingActor { def receive = { case _ => println("Nop") } @@ -94,11 +94,11 @@ object Test extends App { } } } - }, "default-stash-dispatcher")) + }) /* PinS, page 696 */ - def makeIntActor(): ActorRef = MigrationSystem.actorOf(Props(() =>new StashingActor { + def makeIntActor(): ActorRef = ActorDSL.actor(new StashingActor { def receive = { case _ => println("Nop") } @@ -108,9 +108,9 @@ object Test extends App { println("Got an Int: " + x) } } - }, "default-stash-dispatcher")) + }) - MigrationSystem.actorOf(Props(() => new StashingActor { + ActorDSL.actor(new StashingActor { def receive = { case _ => println("Nop") } @@ -126,7 +126,7 @@ object Test extends App { case Exit(_: SeriousActor, _) => val seriousPromise2 = Promise[Boolean]() // PinS, page 694 - val seriousActor2 = MigrationSystem.actorOf(Props(() =>{ + val seriousActor2 = ActorDSL.actor( new StashingActor { def receive = { case _ => println("Nop") } @@ -136,8 +136,7 @@ object Test extends App { println("That is the question.") seriousPromise2.success(true) } - } - }, "default-stash-dispatcher")) + }) Await.ready(seriousPromise2.future, 5 seconds) val echoActor = makeEchoActor() @@ -156,5 +155,5 @@ object Test extends App { } } } - }, "default-stash-dispatcher")) + }) } diff --git a/test/files/jvm/actmig-PinS_3.scala b/test/files/jvm/actmig-PinS_3.scala index c2943008b0..6c6ec6789b 100644 --- a/test/files/jvm/actmig-PinS_3.scala +++ b/test/files/jvm/actmig-PinS_3.scala @@ -7,10 +7,9 @@ import scala.actors.migration._ import scala.concurrent.duration._ import scala.concurrent.{ Promise, Await } - object SillyActor { val startPromise = Promise[Boolean]() - val ref = MigrationSystem.actorOf(Props(() => new SillyActor, "default-stash-dispatcher")) + val ref = ActorDSL.actor(new SillyActor) } /* PinS, Listing 32.1: A simple actor @@ -32,7 +31,7 @@ class SillyActor extends StashingActor { object SeriousActor { val startPromise = Promise[Boolean]() - val ref = MigrationSystem.actorOf(Props(() => new SeriousActor, "default-stash-dispatcher")) + val ref = ActorDSL.actor(new SeriousActor) } class SeriousActor extends StashingActor { @@ -48,7 +47,7 @@ class SeriousActor extends StashingActor { /* PinS, Listing 32.3: An actor that calls react */ object NameResolver { - val ref = MigrationSystem.actorOf(Props(() => new NameResolver, "default-stash-dispatcher")) + val ref = ActorDSL.actor(new NameResolver) } class NameResolver extends StashingActor { @@ -78,7 +77,7 @@ object Test extends App { /* PinS, Listing 32.2: An actor that calls receive */ - def makeEchoActor(): ActorRef = MigrationSystem.actorOf(Props(() => new StashingActor { + def makeEchoActor(): ActorRef = ActorDSL.actor(new StashingActor { def receive = { // how to handle receive case 'stop => @@ -86,11 +85,11 @@ object Test extends App { case msg => println("received message: " + msg) } - }, "default-stash-dispatcher")) + }) /* PinS, page 696 */ - def makeIntActor(): ActorRef = MigrationSystem.actorOf(Props(() => new StashingActor { + def makeIntActor(): ActorRef = ActorDSL.actor(new StashingActor { def receive = { case x: Int => // I only want Ints @@ -99,9 +98,9 @@ object Test extends App { context.stop(self) case _ => stash() } - }, "default-stash-dispatcher")) + }) - MigrationSystem.actorOf(Props(() => new StashingActor { + ActorDSL.actor(new StashingActor { val silly = SillyActor.ref override def preStart() { @@ -119,7 +118,7 @@ object Test extends App { case Terminated(`serious`) => val seriousPromise2 = Promise[Boolean]() // PinS, page 694 - val seriousActor2 = MigrationSystem.actorOf(Props(() => { + val seriousActor2 = ActorDSL.actor( new StashingActor { def receive = { case _ => context.stop(self) } @@ -130,8 +129,7 @@ object Test extends App { seriousPromise2.success(true) context.stop(self) } - } - }, "default-stash-dispatcher")) + }) Await.ready(seriousPromise2.future, 5 seconds) val echoActor = makeEchoActor() @@ -162,5 +160,5 @@ object Test extends App { println("Stash 3 " + m) stash(m) } - }, "default-stash-dispatcher")) + }) } diff --git a/test/files/jvm/actmig-instantiation.check b/test/files/jvm/actmig-instantiation.check index 4c13d5c0a1..08ef979794 100644 --- a/test/files/jvm/actmig-instantiation.check +++ b/test/files/jvm/actmig-instantiation.check @@ -1,5 +1,5 @@ -OK error: java.lang.RuntimeException: In order to create StashingActor one must use actorOf. -OK error: java.lang.RuntimeException: Only one actor can be created per actorOf call. +OK error: java.lang.RuntimeException: In order to create a StashingActor one must use the ActorDSL object +OK error: java.lang.RuntimeException: Cannot create more than one actor 0 100 200 diff --git a/test/files/jvm/actmig-instantiation.scala b/test/files/jvm/actmig-instantiation.scala index d54dff9558..2e3ffc3c30 100644 --- a/test/files/jvm/actmig-instantiation.scala +++ b/test/files/jvm/actmig-instantiation.scala @@ -2,7 +2,6 @@ * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov. */ -import scala.actors.migration.MigrationSystem._ import scala.actors.migration._ import scala.actors.Actor._ import scala.actors._ @@ -35,53 +34,53 @@ object Test { a1 ! 100 // simple instantiation - val a2 = MigrationSystem.actorOf(Props(() => new TestStashingActor, "akka.actor.default-stash-dispatcher")) + val a2 = ActorDSL.actor(new TestStashingActor) a2 ! 200 toStop += a2 // actor of with scala actor - val a3 = MigrationSystem.actorOf(Props(() => actor { + val a3 = ActorDSL.actor(actor { react { case v: Int => Test.append(v); Test.latch.countDown() } - }, "akka.actor.default-stash-dispatcher")) + }) a3 ! 300 // using the manifest - val a4 = MigrationSystem.actorOf(Props(() => new TestStashingActor, "akka.actor.default-stash-dispatcher")) + val a4 = ActorDSL.actor(new TestStashingActor) a4 ! 400 toStop += a4 // deterministic part of a test - // creation without actorOf + // creation without actor try { val a3 = new TestStashingActor a3 ! -1 } catch { - case e => println("OK error: " + e) + case e: Throwable => println("OK error: " + e) } - // actorOf double creation + // actor double creation try { - val a3 = MigrationSystem.actorOf(Props(() => { + val a3 = ActorDSL.actor({ new TestStashingActor new TestStashingActor - }, "akka.actor.default-stash-dispatcher")) + }) a3 ! -1 } catch { - case e => println("OK error: " + e) + case e: Throwable => println("OK error: " + e) } - // actorOf nesting + // actor nesting try { - val a5 = MigrationSystem.actorOf(Props(() => { - val a6 = MigrationSystem.actorOf(Props(() => new TestStashingActor, "akka.actor.default-stash-dispatcher")) + val a5 = ActorDSL.actor({ + val a6 = ActorDSL.actor(new TestStashingActor) toStop += a6 new TestStashingActor - }, "akka.actor.default-stash-dispatcher")) + }) a5 ! 500 toStop += a5 } catch { - case e => println("Should not throw an exception: " + e) + case e: Throwable => println("Should not throw an exception: " + e) } // output @@ -93,4 +92,4 @@ object Test { buff.sorted.foreach(println) toStop.foreach(_ ! PoisonPill) } -}
\ No newline at end of file +} diff --git a/test/files/jvm/actmig-loop-react.scala b/test/files/jvm/actmig-loop-react.scala index 7f4c6f96dc..c9a3664526 100644 --- a/test/files/jvm/actmig-loop-react.scala +++ b/test/files/jvm/actmig-loop-react.scala @@ -2,7 +2,6 @@ * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov. */ -import scala.actors.migration.MigrationSystem._ import scala.actors.Actor._ import scala.actors._ import scala.actors.migration._ @@ -40,7 +39,7 @@ object Test { Await.ready(finishedLWCR1.future, 5 seconds) // Loop with Condition Snippet - migrated - val myAkkaActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myAkkaActor = ActorDSL.actor(new StashingActor { def receive = { case x: Int => @@ -51,7 +50,7 @@ object Test { context.stop(self) } } - }, "default-stashing-dispatcher")) + }) myAkkaActor ! 1 myAkkaActor ! 42 } @@ -88,7 +87,7 @@ object Test { Await.ready(finishedTNR1.future, 5 seconds) // Loop with Condition Snippet - migrated - val myAkkaActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myAkkaActor = ActorDSL.actor(new StashingActor { def receive = { case x: Int => @@ -107,7 +106,7 @@ object Test { context.unbecome() }).orElse { case x => stash() }) } - }, "default-stashing-dispatcher")) + }) myAkkaActor ! 1 myAkkaActor ! "I am a String" @@ -117,7 +116,7 @@ object Test { def exceptionHandling() = { // Stashing actor with act and exception handler - val myActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myActor = ActorDSL.actor(new StashingActor { def receive = { case _ => println("Dummy method.") } override def act() = { @@ -138,7 +137,7 @@ object Test { case x: Exception => println("scala got exception") } - }, "default-stashing-dispatcher")) + }) myActor ! "work" myActor ! "fail" @@ -146,7 +145,7 @@ object Test { Await.ready(finishedEH1.future, 5 seconds) // Stashing actor in Akka style - val myAkkaActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myAkkaActor = ActorDSL.actor(new StashingActor { def receive = PFCatch({ case "fail" => throw new Exception("failed") @@ -156,14 +155,14 @@ object Test { finishedEH.success(true) context.stop(self) }, { case x: Exception => println("akka got exception") }) - }, "default-stashing-dispatcher")) + }) myAkkaActor ! "work" myAkkaActor ! "fail" myAkkaActor ! "die" } - def main(args: Array[String]) = { + def main(args: Array[String]): Unit = { testLoopWithConditionReact() Await.ready(finishedLWCR.future, 5 seconds) exceptionHandling() diff --git a/test/files/jvm/actmig-public-methods.scala b/test/files/jvm/actmig-public-methods.scala index 58d7a1a9d4..8891c80668 100644 --- a/test/files/jvm/actmig-public-methods.scala +++ b/test/files/jvm/actmig-public-methods.scala @@ -5,7 +5,6 @@ import scala.collection.mutable.ArrayBuffer import scala.actors.Actor._ import scala.actors._ -import scala.actors.migration.MigrationSystem import scala.util.continuations._ import java.util.concurrent.{ TimeUnit, CountDownLatch } @@ -71,4 +70,4 @@ object Test { buff.sorted.foreach(println) toStop.foreach(_ ! 'stop) } -}
\ No newline at end of file +} diff --git a/test/files/jvm/actmig-public-methods_1.scala b/test/files/jvm/actmig-public-methods_1.scala index 15516a5d51..db21ab983c 100644 --- a/test/files/jvm/actmig-public-methods_1.scala +++ b/test/files/jvm/actmig-public-methods_1.scala @@ -28,7 +28,7 @@ object Test { def main(args: Array[String]) = { - val respActor = MigrationSystem.actorOf(Props(() => actor { + val respActor = ActorDSL.actor(actor { loop { react { case (x: String, time: Long) => @@ -41,7 +41,7 @@ object Test { exit() } } - }, "akka.actor.default-stash-dispatcher")) + }) toStop += respActor diff --git a/test/files/jvm/actmig-react-receive.scala b/test/files/jvm/actmig-react-receive.scala index 6adeac8b52..bf70ce0c46 100644 --- a/test/files/jvm/actmig-react-receive.scala +++ b/test/files/jvm/actmig-react-receive.scala @@ -2,7 +2,6 @@ * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov. */ -import scala.actors.migration.MigrationSystem._ import scala.actors.Actor._ import scala.actors._ import scala.actors.migration._ @@ -39,7 +38,7 @@ object Test { Await.ready(finishedRSC1.future, 5 seconds) // React Snippet - migrated - val myAkkaActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myAkkaActor = ActorDSL.actor(new StashingActor { override def preStart() = { println("do before") } @@ -63,7 +62,7 @@ object Test { finishedRSC.success(true) } - }, "default-stashing-dispatcher")) + }) myAkkaActor ! 1 myAkkaActor ! "1" Await.ready(finishedRSC.future, 5 seconds) @@ -88,7 +87,7 @@ object Test { Await.ready(finishedRS1.future, 5 seconds) // React Snippet - migrated - val myAkkaActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myAkkaActor = ActorDSL.actor(new StashingActor { override def preStart() = { println("do before") } @@ -105,7 +104,7 @@ object Test { finishedRS.success(true) } - }, "default-stashing-dispatcher")) + }) myAkkaActor ! 1 Await.ready(finishedRS.future, 5 seconds) diff --git a/test/files/jvm/actmig-react-within.scala b/test/files/jvm/actmig-react-within.scala index 43350ef120..3057398cb5 100644 --- a/test/files/jvm/actmig-react-within.scala +++ b/test/files/jvm/actmig-react-within.scala @@ -2,7 +2,6 @@ * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov. */ -import scala.actors.migration.MigrationSystem._ import scala.actors.Actor._ import scala.actors._ import scala.actors.migration._ @@ -27,7 +26,7 @@ object Test { } } - val myActor = MigrationSystem.actorOf(Props(() => new StashingActor { + val myActor = ActorDSL.actor(new StashingActor { context.setReceiveTimeout(1 millisecond) def receive = { case ReceiveTimeout => @@ -37,7 +36,7 @@ object Test { case _ => println("Should not occur.") } - }, "default-stashing-dispatcher")) + }) } def main(args: Array[String]) = { diff --git a/test/files/jvm/actmig-receive.scala b/test/files/jvm/actmig-receive.scala index 03dc1be63b..308643cf41 100644 --- a/test/files/jvm/actmig-receive.scala +++ b/test/files/jvm/actmig-receive.scala @@ -2,7 +2,6 @@ * NOTE: Code snippets from this test are included in the Actor Migration Guide. In case you change * code in these tests prior to the 2.10.0 release please send the notification to @vjovanov. */ -import scala.actors.migration.MigrationSystem._ import scala.actors.Actor._ import scala.actors._ import scala.actors.migration._ diff --git a/test/files/neg/t5845.check b/test/files/neg/t5845.check index c0b402fccb..8c6100d6de 100644 --- a/test/files/neg/t5845.check +++ b/test/files/neg/t5845.check @@ -1,4 +1,7 @@ +t5845.scala:9: error: value +++ is not a member of Int + println(5 +++ 5) + ^ t5845.scala:15: error: value +++ is not a member of Int println(5 +++ 5) ^ -one error found +two errors found diff --git a/test/files/pos/t4881.scala b/test/files/pos/t4881.scala deleted file mode 100644 index 46cfad9793..0000000000 --- a/test/files/pos/t4881.scala +++ /dev/null @@ -1,31 +0,0 @@ -class Contra[-T] -trait A -trait B extends A -trait C extends B - -// test improved variance inference: first try formals to see in which variance positions the type param appears; -// only when that fails to determine variance, look at result type -object Test { - def contraLBUB[a >: C <: A](): Contra[a] = null - def contraLB[a >: C](): Contra[a] = null - -{ - val x = contraLBUB() //inferred Contra[C] instead of Contra[A] - val x1: Contra[A] = x -} - -{ - val x = contraLB() //inferred Contra[C] instead of Contra[Any] - val x1: Contra[Any] = x -} - -{ - val x = contraLBUB // make sure it does the same thing as its ()-less counterpart - val x1: Contra[A] = x -} - -{ - val x = contraLB - val x1: Contra[Any] = x -} -} diff --git a/test/files/pos/t6311.scala b/test/files/pos/t6311.scala new file mode 100644 index 0000000000..d27ad2f502 --- /dev/null +++ b/test/files/pos/t6311.scala @@ -0,0 +1,5 @@ +class A { + def fooMinimal[T, Coll <: Traversable[T]](msg: String)(param1: Traversable[T])(param2: Coll): Traversable[T] = throw new Exception() + + fooMinimal("")(List(1))(List(2)) +} diff --git a/test/files/run/fail-non-value-types.check b/test/files/run/fail-non-value-types.check new file mode 100644 index 0000000000..714dce2c50 --- /dev/null +++ b/test/files/run/fail-non-value-types.check @@ -0,0 +1,3 @@ +[B, That](f: A => B)(implicit cbf: ImaginaryCanBuildFrom[CompletelyIndependentList.this.Repr,B,That])That +[B, That](f: Int => B)(implicit cbf: ImaginaryCanBuildFrom[CompletelyIndependentList[Int]#Repr,B,That])That +()CompletelyIndependentList[A] diff --git a/test/files/run/fail-non-value-types.scala b/test/files/run/fail-non-value-types.scala new file mode 100644 index 0000000000..51198a5f31 --- /dev/null +++ b/test/files/run/fail-non-value-types.scala @@ -0,0 +1,40 @@ +import scala.reflect.runtime.universe._ + +class ImaginaryCanBuildFrom[-From, -Elem, +To] +class CompletelyIndependentList[+A] { + type Repr <: CompletelyIndependentList[A] + def map[B, That](f: A => B)(implicit cbf: ImaginaryCanBuildFrom[Repr, B, That]): That = ??? + def distinct(): CompletelyIndependentList[A] = ??? +} + +object Test { + var failed = false + def expectFailure[T](body: => T): Boolean = { + try { val res = body ; failed = true ; println(res + " failed to fail.") ; false } + catch { case _: AssertionError => true } + } + + /** Attempt to use a method type as a type argument - expect failure. */ + def tcon[T: TypeTag](args: Type*) = appliedType(typeOf[T].typeConstructor, args.toList) + + def cil = typeOf[CompletelyIndependentList[Int]] + def map = cil.member("map": TermName).asMethod + def distinct = cil.member("distinct": TermName).asMethod + + def main(args: Array[String]): Unit = { + // Need the assert in there to fail. + // expectFailure(println(tcon[CompletelyIndependentList[Int]](map))) + // expectFailure(tcon[CompletelyIndependentList[Int]](distinct)) + + // Why is the first map signature printing showing an + // uninitialized symbol? + // + // [B <: <?>, That <: <?>](f: <?>)(implicit cbf: <?>)That + // + + println(map.typeSignature) + println(map.typeSignatureIn(cil)) + println(distinct.typeSignature) + if (failed) sys.exit(1) + } +} diff --git a/test/files/run/macro-reify-type.check b/test/files/run/macro-reify-type.check new file mode 100644 index 0000000000..ea5e70e10d --- /dev/null +++ b/test/files/run/macro-reify-type.check @@ -0,0 +1 @@ +[B, That](f: Int => B)(implicit bf: scala.collection.generic.CanBuildFrom[List[Int],B,That])That
\ No newline at end of file diff --git a/test/files/run/macro-reify-type.flags b/test/files/run/macro-reify-type.flags new file mode 100644 index 0000000000..cd66464f2f --- /dev/null +++ b/test/files/run/macro-reify-type.flags @@ -0,0 +1 @@ +-language:experimental.macros
\ No newline at end of file diff --git a/test/files/run/macro-reify-type/Macros_1.scala b/test/files/run/macro-reify-type/Macros_1.scala new file mode 100644 index 0000000000..06de05735d --- /dev/null +++ b/test/files/run/macro-reify-type/Macros_1.scala @@ -0,0 +1,27 @@ +import scala.reflect.macros.Context +import scala.reflect.runtime.{universe => ru} + +object StaticReflect { + def method[A](name: String): ru.Type = macro methodImpl[A] + + def methodImpl[A: c.WeakTypeTag](c: Context)(name: c.Expr[String]): c.Expr[ru.Type] = { + import c.universe._ + + val nameName: TermName = name.tree match { + case Literal(Constant(str: String)) => newTermName(str) + case _ => c.error(c.enclosingPosition, s"Method name not constant.") ; return reify(ru.NoType) + } + val clazz = weakTypeOf[A] + + clazz member nameName match { + case NoSymbol => c.error(c.enclosingPosition, s"No member called $nameName in $clazz.") ; reify(ru.NoType) + case member => + val mtpe = member typeSignatureIn clazz + val mtag = c.reifyType(treeBuild.mkRuntimeUniverseRef, Select(treeBuild.mkRuntimeUniverseRef, newTermName("rootMirror")), mtpe) + val mtree = Select(mtag, newTermName("tpe")) + + c.Expr[ru.Type](mtree) + } + } + +} diff --git a/test/files/run/macro-reify-type/Test_2.scala b/test/files/run/macro-reify-type/Test_2.scala new file mode 100644 index 0000000000..9beaf98681 --- /dev/null +++ b/test/files/run/macro-reify-type/Test_2.scala @@ -0,0 +1,21 @@ +import StaticReflect._ + +object Test extends App { + //println(method[List[Int]]("distinct")) + println(method[List[Int]]("map")) + //val $u: scala.reflect.runtime.universe.type = scala.reflect.runtime.universe; + //val $m: $u.Mirror = scala.reflect.runtime.universe.rootMirror; + //import $u._, $m._, Flag._ + //val tpe = { + // val symdef$B2 = build.newNestedSymbol(build.selectTerm(staticClass("scala.collection.TraversableLike"), "map"), newTypeName("B"), NoPosition, DEFERRED | PARAM, false); + // val symdef$That2 = build.newNestedSymbol(build.selectTerm(staticClass("scala.collection.TraversableLike"), "map"), newTypeName("That"), NoPosition, DEFERRED | PARAM, false); + // val symdef$f2 = build.newNestedSymbol(build.selectTerm(staticClass("scala.collection.TraversableLike"), "map"), newTermName("f"), NoPosition, PARAM, false); + // val symdef$bf2 = build.newNestedSymbol(build.selectTerm(staticClass("scala.collection.TraversableLike"), "map"), newTermName("bf"), NoPosition, IMPLICIT | PARAM, false); + // build.setTypeSignature(symdef$B2, TypeBounds(staticClass("scala.Nothing").asType.toTypeConstructor, staticClass("scala.Any").asType.toTypeConstructor)); + // build.setTypeSignature(symdef$That2, TypeBounds(staticClass("scala.Nothing").asType.toTypeConstructor, staticClass("scala.Any").asType.toTypeConstructor)); + // build.setTypeSignature(symdef$f2, TypeRef(ThisType(staticPackage("scala").asModule.moduleClass), staticClass("scala.Function1"), List(staticClass("scala.Int").asType.toTypeConstructor, TypeRef(NoPrefix, symdef$B2, List())))); + // build.setTypeSignature(symdef$bf2, TypeRef(ThisType(staticPackage("scala.collection.generic").asModule.moduleClass), staticClass("scala.collection.generic.CanBuildFrom"), List(TypeRef(ThisType(staticPackage("scala.collection.immutable").asModule.moduleClass), staticClass("scala.collection.immutable.List"), List(staticClass("scala.Int").asType.toTypeConstructor)), TypeRef(NoPrefix, symdef$B2, List()), TypeRef(NoPrefix, symdef$That2, List())))); + // PolyType(List(symdef$B2, symdef$That2), MethodType(List(symdef$f2), MethodType(List(symdef$bf2), TypeRef(NoPrefix, symdef$That2, List())))) + //} + //println(tpe) +}
\ No newline at end of file diff --git a/test/files/run/showraw_nosymbol.check b/test/files/run/showraw_nosymbol.check new file mode 100644 index 0000000000..c54fe74717 --- /dev/null +++ b/test/files/run/showraw_nosymbol.check @@ -0,0 +1 @@ +NoSymbol diff --git a/test/files/run/showraw_nosymbol.scala b/test/files/run/showraw_nosymbol.scala new file mode 100644 index 0000000000..fbdc1591c9 --- /dev/null +++ b/test/files/run/showraw_nosymbol.scala @@ -0,0 +1,5 @@ +import scala.reflect.runtime.universe._ + +object Test extends App { + println(showRaw(NoSymbol)) +}
\ No newline at end of file diff --git a/test/files/run/t6380.check b/test/files/run/t6380.check new file mode 100644 index 0000000000..912525ed66 --- /dev/null +++ b/test/files/run/t6380.check @@ -0,0 +1,7 @@ +List(class java.lang.Exception) +List(class java.lang.Throwable) +List(class java.lang.RuntimeException) +List(class java.lang.IllegalArgumentException, class java.util.NoSuchElementException) +List(class java.lang.IndexOutOfBoundsException, class java.lang.IndexOutOfBoundsException) +List(class java.lang.IllegalStateException, class java.lang.IllegalStateException) +List(class java.lang.NullPointerException, class java.lang.NullPointerException) diff --git a/test/files/run/t6380.scala b/test/files/run/t6380.scala new file mode 100644 index 0000000000..0e264d9175 --- /dev/null +++ b/test/files/run/t6380.scala @@ -0,0 +1,20 @@ +object Test extends App { + classOf[Foo].getDeclaredMethods().sortBy(_.getName).map(_.getExceptionTypes.sortBy(_.getName).toList).toList.foreach(println) +} + +class Foo { + @throws[Exception] + def bar1 = ??? + @throws[Throwable]("always") + def bar2 = ??? + @throws(classOf[RuntimeException]) + def bar3 = ??? + @throws[IllegalArgumentException] @throws[NoSuchElementException] + def bar4 = ??? + @throws(classOf[IndexOutOfBoundsException]) @throws(classOf[IndexOutOfBoundsException]) + def bar5 = ??? + @throws[IllegalStateException]("Cause") @throws[IllegalStateException] + def bar6 = ??? + @throws[NullPointerException]("Cause A") @throws[NullPointerException]("Cause B") + def bar7 = ??? +}
\ No newline at end of file |