Macros de Scala: obtener una lista de símbolos de tipo para usar en tiempo de ejecución

¿Hay una manera de devolver unList deTypeSymbols para cada clase bajo un paquete utilizando macros?

Lo que estoy tratando de lograr es escribir una macro que emita algo equivalente a esta lista:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> case class MyClass1()
defined class MyClass1

scala> case class MyClass2()
defined class MyClass2

scala> val typeSymbols = List(typeOf[MyClass1].typeSymbol, typeOf[MyClass2].typeSymbol)
typeSymbols: List[reflect.runtime.universe.Symbol] = List(class MyClass1, class MyClass2)

Aquí está mi configuración:

Tengo un paquete llamadofoo, bajo los cuales se definen estos:

trait FooTrait

case class Bar() extends FooTrait 

case class Bar() extends FooTrait

Aquí está mi macro que obtiene todos los símbolos de tipo para las clases bajo foo que se extiendenFooTrait:

def allTypeSymbols_impl[T: c.WeakTypeTag](c: Context)(packageName: c.Expr[String]) = {
  import c.universe._

  // Get package name from the expression tree
  val Literal(Constant(name: String)) = packageName.tree

  // Get all classes under given package name
  val pkg = c.mirror.staticPackage(name)

  // Obtain type symbols for the classes - implementation omitted
  val types = getTypeSymbols(c.universe)(List(pkg))

  // Apply method for List. For easy readability in later applications
  val listApply = Select(reify(List).tree, newTermName("apply"))

  val result = types.map {
    t =>
      val typeName = c.Expr[TypeSymbol](Ident(t))
      println(s"Typename: $typeName, $t, ${t.toType}")

      reify(typeName.splice).tree
  }

  println(s"RESULT: ${showRaw(result)}")

  c.Expr[List[reflect.runtime.universe.TypeSymbol]](Apply(listApply, result.toList))
}

El primeroprintln huellas dactilares:

Typename: Expr[c.universe.TypeSymbol](Bar), class Bar, foo.Bar
Typename: Expr[c.universe.TypeSymbol](Baz), class Baz, foo.Baz

El segundo imprime:

RESULT: List(Ident(foo.Bar), Ident(foo.Baz))

Pero me sale este mensaje de error:

[error] no type parameters for method any2ArrowAssoc: (x: A)ArrowAssoc[A] exist so that it can be applied to arguments (<notype>)
[error]  --- because ---
[error] argument expression's type is not compatible with formal parameter type;
[error]  found   : <notype>
[error]  required: ?A
[error] Note that <none> extends Any, not AnyRef.
[error] Such types can participate in value classes, but instances
[error] cannot appear in singleton types or in reference comparisons.

¿Qué debo hacer para que esto funcione? Sospecho que tengo que escribir algo más en lugar deIdent, pero no pude averiguar qué.

Utilizando Scala 2.10.2.

¡Gracias por adelantado!

Respuestas a la pregunta(1)

Su respuesta a la pregunta