diff --git a/project/MimaFilters.scala b/project/MimaFilters.scala index e7351aa1b6d5..caf812cfbf1a 100644 --- a/project/MimaFilters.scala +++ b/project/MimaFilters.scala @@ -10,6 +10,7 @@ object MimaFilters extends AutoPlugin { object autoImport { val mimaReferenceVersion = settingKey[Option[String]]("Scala version number to run MiMa against") } + import autoImport._ override val globalSettings = Seq( @@ -43,6 +44,10 @@ object MimaFilters extends AutoPlugin { ProblemFilters.exclude[MissingClassProblem]("scala.collection.generic.CommonErrors"), ProblemFilters.exclude[MissingClassProblem]("scala.collection.generic.CommonErrors$"), + //ADD: Await#CompletedFuture is not a public API + ProblemFilters.exclude[MissingClassProblem]("scala.concurrent.Await$CompletedFuture$"), + ProblemFilters.exclude[MissingClassProblem]("scala.collection.generic.CommonErrors$"), + // scala/scala#10937 ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.LazyList#LazyBuilder#DeferredState.eval"), ProblemFilters.exclude[MissingClassProblem](s"scala.collection.immutable.LazyList$$State"), @@ -82,9 +87,9 @@ object MimaFilters extends AutoPlugin { ) val mimaSettings: Seq[Setting[_]] = Def.settings( - mimaPreviousArtifacts := mimaReferenceVersion.value.map(organization.value % name.value % _).toSet, - mimaCheckDirection := "both", - mimaBinaryIssueFilters ++= mimaFilters, -// mimaReportSignatureProblems := true, // TODO: enable + mimaPreviousArtifacts := mimaReferenceVersion.value.map(organization.value % name.value % _).toSet, + mimaCheckDirection := "both", + mimaBinaryIssueFilters ++= mimaFilters, + // mimaReportSignatureProblems := true, // TODO: enable ) } diff --git a/src/library/scala/concurrent/package.scala b/src/library/scala/concurrent/package.scala index d648a1c90a15..3dbbc4508957 100644 --- a/src/library/scala/concurrent/package.scala +++ b/src/library/scala/concurrent/package.scala @@ -125,6 +125,9 @@ package object concurrent { } package concurrent { + + import scala.util.Try + /** * This marker trait is used by [[Await]] to ensure that [[Awaitable.ready]] and [[Awaitable.result]] * are not directly called by user code. An implicit instance of this trait is only available when @@ -170,7 +173,7 @@ package concurrent { @throws(classOf[TimeoutException]) @throws(classOf[InterruptedException]) final def ready[T](awaitable: Awaitable[T], atMost: Duration): awaitable.type = awaitable match { - case f: Future[T] if f.isCompleted => awaitable.ready(atMost)(AwaitPermission) + case f: Future[T] if f.isCompleted => awaitable case _ => blocking(awaitable.ready(atMost)(AwaitPermission)) } @@ -197,8 +200,12 @@ package concurrent { @throws(classOf[TimeoutException]) @throws(classOf[InterruptedException]) final def result[T](awaitable: Awaitable[T], atMost: Duration): T = awaitable match { - case f: Future[T] if f.isCompleted => f.result(atMost)(AwaitPermission) + case CompletedFuture(result) => result.get.asInstanceOf[T] case _ => blocking(awaitable.result(atMost)(AwaitPermission)) } + + private[this] object CompletedFuture { + def unapply[T](f: Future[T]): Option[Try[T]] = f.value + } } }