Criei um exemplo de anotação de macro para testar se consigo corresponder corretamente a uma classe de caso TypeDef para modificá-la posteriormente, mas ela não corresponde, embora tudo pareça bem e compila, aqui está a aparência:
import scala.annotation.{MacroAnnotation, experimental}
import scala.quoted.*
object Macros:
@experimental
class table extends MacroAnnotation:
def transform(using Quotes)(tree: quotes.reflect.Definition): List[quotes.reflect.Definition] =
import quotes.reflect.*
tree match
case td @ TypeDef(_, _) =>
report.error(s"from macro annotation1 ${td.symbol}")
List(tree)
case _ =>
report.error(s"from macro annotation2 $tree")
List(tree)
Exemplo de classe case onde apliquei:
@experimental @table
case class Person(firstName: String, lastName: String)
Ele sempre executa a segunda mensagem, o que significa que não consegui corresponder ao TypeDef.
o que estou perdendo? Alguma importação adicional necessária?
Também tentei tree.isInstanceOf[TypeDef]}
e isso retorna true como esperado, tornando ainda mais complicado entender porque a correspondência não funcionou.
Se você verificar a estrutura da árvore,
Printer.TreeStructure.show(tree)
verá que Person é ClassDef. Em seguida, o código a seguir corresponderá ao primeiro braçoUm TypeDef será encontrado se você adicionar uma definição de tipo dentro de sua
Person
classe.Exemplo
Saída TreeStructure.show