Closed
Description
Minimized code
file M:
package a
import scala.quoted._
import scala.concurrent._
object M {
inline def resolveInMacros[F[_],T](f: Future[T]):Conversion[Future[T],F[T]] =
${ resolveInMacrosImpl[F,T]('f) }
def resolveInMacrosImpl[F[_]:Type,T:Type](f:Expr[Future[T]])(using qctx:QuoteContext):Expr[
Conversion[Future[T],F[T]]]={
import qctx.tasty._
val conversion = TypeIdent(Symbol.classSymbol("scala.Conversion")).tpe
val inFuture = f.unseal.tpe.widen
val tType = summon[quoted.Type[T]].unseal.tpe
val fType = summon[quoted.Type[F]].unseal.tpe
val inCB = AppliedType(fType,List(tType)).simplified
val taConversion = AppliedType(conversion,List(inFuture, inCB))
searchImplicit(taConversion) match
case implSuccess: ImplicitSearchSuccess =>
implSuccess.tree.seal.asInstanceOf[Expr[Conversion[Future[T],F[T]]]]
case implFailure: ImplicitSearchFailure =>
println(s"searchFailure: ${implFailure.explanation}")
throw new RuntimeException("implicit search failed")
}
}
file O.scala:
package a
import scala.language.implicitConversions
import scala.concurrent._
trait CB[T]
given myConversion[T] as Conversion[Future[T],CB[T]] = (ft => ???)
object O {
def main(argvs: Array[String]): Unit = {
val p = Promise[Int]()
//val cbp = summon[Conversion[Future[Int],CB[Int]]] //works
val cbp = M.resolveInMacros[CB,Int](p.future)
val x = cbp(p.future)
}
}
Output
[info] Compiling 2 Scala sources to /Users/rssh/tests/scala-misc/dotty/resolve-conversion/resolve-conversion/target/scala-0.26/classes ...
searchFailure: no implicit values were found that match type Conversion[scala.concurrent.Future[Int], a.CB[Int]]
[error] -- Error: /Users/rssh/tests/scala-misc/dotty/resolve-conversion/resolve-conversion/src/main/scala/a/O.scala:15:39
[error] 15 | val cbp = M.resolveInMacros[CB,Int](p.future)
[error] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[error] | Exception occurred while executing macro expansion.
[error] | java.lang.RuntimeException: implicit search failed
[error] | at a.M$.resolveInMacrosImpl(M.scala:26)
[error] |
[error] | This location contains code that was inlined from O.scala:15
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
Expectation
It should compile. (sbt project is attached)
resolve-conversion.tar.gz