Skip to content

Expr.summon does not resolve opaque types #21199

Open
@joan38

Description

@joan38

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions