Open
Description
Compiler version
Issue reproduced in 3.4.2
and 3.5.0-RC4
.
Minimized code
Please check the min repro repo https://github.com/joan38/macro-summon-bug
inline def summonValuesInPackage(inline packageName: String): Seq[?] = ${ summonValuesInPackageImpl('packageName) }
private def summonValuesInPackageImpl(packageName: Expr[String])(using Quotes): Expr[Seq[?]] =
import quotes.reflect.*
def findAllTypesInPackage(pkg: Symbol): Seq[TypeRepr] =
pkg.declarations.flatMap:
case sym if sym.isPackageDef || (sym.isValDef && sym.flags.is(Flags.Module)) =>
findAllTypesInPackage(sym) // Recurse
case sym if sym.isTypeDef => Seq(sym.typeRef.dealiasKeepOpaques) // Include
case _ => Seq.empty // Skip
// Get the package where we will look for types
val typesPackage = Symbol.requiredPackage(packageName.valueOrAbort)
// Find all types in the package and summon them
val values = findAllTypesInPackage(typesPackage).flatMap: typeRepr =>
typeRepr.asType match
case '[t] => Expr.summon[t] // This does not seem to work when `t` is an opaque type
Expr.ofSeq(values)
Output
Gives only MyCaseClass
instances (not sure why 3 times but that's a different issue):
ArraySeq(MyCaseClass(), MyCaseClass(), MyCaseClass())
Expectation
Expr.summon[t]
should resolve opaque type too:
ArraySeq(MyCaseClass(), MyCaseClass(), MyCaseClass(), true, true, true)
Thanks