diff options
author | Lukas Rytz <lukas.rytz@typesafe.com> | 2016-03-23 09:52:18 +0100 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@typesafe.com> | 2016-03-23 09:52:18 +0100 |
commit | 4ef14294453c43420e0e1a2ac984ba4a2d8b8dca (patch) | |
tree | 8b4aac09b51e6484fb3d6292838262d7d64fa7da | |
parent | 46595fb5fb4c548d52e39969aa58c69c30953bec (diff) | |
parent | d832346268779090f08afad649a337ca571efc37 (diff) | |
download | scala-4ef14294453c43420e0e1a2ac984ba4a2d8b8dca.tar.gz scala-4ef14294453c43420e0e1a2ac984ba4a2d8b8dca.tar.bz2 scala-4ef14294453c43420e0e1a2ac984ba4a2d8b8dca.zip |
Merge pull request #5056 from viktorklang/wip-SI9488-Future.toString-√
SI-9488 - adds the same default toString format to Scala Futures as 2…
-rw-r--r-- | bincompat-backward.whitelist.conf | 6 | ||||
-rw-r--r-- | bincompat-forward.whitelist.conf | 6 | ||||
-rw-r--r-- | src/library/scala/concurrent/impl/Promise.scala | 4 | ||||
-rw-r--r-- | test/files/jvm/future-spec/FutureTests.scala | 20 |
4 files changed, 34 insertions, 2 deletions
diff --git a/bincompat-backward.whitelist.conf b/bincompat-backward.whitelist.conf index 0d85590b41..0770b3cb95 100644 --- a/bincompat-backward.whitelist.conf +++ b/bincompat-backward.whitelist.conf @@ -217,6 +217,12 @@ filter { { matchName="scala.concurrent.impl.Promise$DefaultPromise" problemName=MissingTypesProblem + }, + // SI-9488: Due to SI-8362 above, toString was silently changed to the AtomicReference toString implementation, + // This is fixed by SI-9488, and this should be safe since the class in question is stdlib internal. + { + matchName="scala.concurrent.impl.Promise.toString" + problemName=MissingMethodProblem } ] } diff --git a/bincompat-forward.whitelist.conf b/bincompat-forward.whitelist.conf index a9fbaa7b87..c6cffee846 100644 --- a/bincompat-forward.whitelist.conf +++ b/bincompat-forward.whitelist.conf @@ -381,6 +381,12 @@ filter { { matchName="scala.concurrent.impl.Promise$DefaultPromise" problemName=MissingTypesProblem + }, + // SI-9488: Due to SI-8362 above, toString was silently changed to the AtomicReference toString implementation, + // This is fixed by SI-9488, and this should be safe since the class in question is stdlib internal. + { + matchName="scala.concurrent.impl.Promise.toString" + problemName=MissingMethodProblem } ] } diff --git a/src/library/scala/concurrent/impl/Promise.scala b/src/library/scala/concurrent/impl/Promise.scala index b15601058e..6d2fc5c87c 100644 --- a/src/library/scala/concurrent/impl/Promise.scala +++ b/src/library/scala/concurrent/impl/Promise.scala @@ -19,6 +19,10 @@ import java.util.concurrent.locks.AbstractQueuedSynchronizer private[concurrent] trait Promise[T] extends scala.concurrent.Promise[T] with scala.concurrent.Future[T] { def future: this.type = this + override def toString: String = value match { + case Some(result) => "Future("+result+")" + case None => "Future(<not completed>)" + } } /* Precondition: `executor` is prepared, i.e., `executor` has been returned from invocation of `prepare` on some other `ExecutionContext`. diff --git a/test/files/jvm/future-spec/FutureTests.scala b/test/files/jvm/future-spec/FutureTests.scala index a290af9cd3..efe9c59d7a 100644 --- a/test/files/jvm/future-spec/FutureTests.scala +++ b/test/files/jvm/future-spec/FutureTests.scala @@ -24,7 +24,7 @@ class FutureTests extends MinimalScalaTest { "A future with custom ExecutionContext" should { "shouldHandleThrowables" in { val ms = new mutable.HashSet[Throwable] with mutable.SynchronizedSet[Throwable] - implicit val ec = scala.concurrent.ExecutionContext.fromExecutor(new scala.concurrent.forkjoin.ForkJoinPool(), { + implicit val ec = scala.concurrent.ExecutionContext.fromExecutorService(new scala.concurrent.forkjoin.ForkJoinPool(), { t => ms += t }) @@ -64,7 +64,7 @@ class FutureTests extends MinimalScalaTest { Await.ready(waiting, 2000 millis) ms.size mustBe (4) - //FIXME should check + ec.shutdownNow() } } @@ -543,6 +543,22 @@ class FutureTests extends MinimalScalaTest { Await.ready(f, defaultTimeout).value.get.toString mustBe expected.toString } + "should have a decent toString representation" in { + val i = scala.concurrent.forkjoin.ThreadLocalRandom.current.nextInt() + val e = new Exception(i.toString) + val successString = "Future(Success("+i+"))" + val failureString = "Future(Failure("+e+"))" + val notCompletedString = "Future(<not completed>)" + + Future.successful(i).toString mustBe successString + Future.failed[Int](e).toString mustBe failureString + Promise[Int]().toString mustBe notCompletedString + Promise[Int]().success(i).toString mustBe successString + Promise[Int]().failure(e).toString mustBe failureString + Await.ready(Future(i)(ExecutionContext.global), defaultTimeout).toString mustBe successString + Await.ready(Future(throw e)(ExecutionContext.global), defaultTimeout).toString mustBe failureString + } + } } |