2 votes

Implémentation de Materialize dans le package

Lors de l'utilisation d'une macro pour concrétiser une implémentation d'un trait, j'aimerais créer cette implémentation au sein d'un package afin qu'elle ait accès à d'autres classes du package en visibilité package-private.

trait MyTrait[T]

object MyTrait {
  implicit def materialize[T]: MyTrait[T] = macro materializeImpl[T]

  def materializeImpl[T : c.WeakTypeTag](c: blackbox.Context): c.Expr[MyTrait[T]] = {
    val tt = weakTypeTag[T]
    c.Expr[MyTrait[T]](q"new MyTrait[$tt] {}")
  }
}

Est-il possible de concrétiser new MyTrait[$tt] {} dans un package particulier ?

0voto

Alexey Romanov Points 39124

Une macro doit se développer en un AST qui se compilerait à l'endroit où l'appel de macro se trouve. Étant donné que les déclarations package ne sont autorisées qu'au niveau supérieur, et que les appels de méthode ne sont pas autorisés à cet endroit, l'arbre développé ne peut rien créer dans un autre package.

0voto

SergGr Points 1288

Comme l'a souligné Alexey Romanov, cela n'est pas possible directement. Cependant, si vous n'appelez que quelques méthodes (et si vous utilisez des macros, c'est très probablement le cas), un contournement possible (mais pas parfait) pourrait consister à créer une classe abstraite publique ou un trait qui étend le trait cible et "publie" toutes les méthodes package privées requises comme des proxies protected. Ainsi, vous pouvez créer des instances dans votre macro en héritant de cette classe abstraite plutôt que du trait. Évidemment, cette astuce "dévoile" effectivement ces méthodes à tout le monde, mais grâce à la réflexion, n'importe qui peut appeler n'importe quelle méthode s'il le souhaite vraiment. Abuser de cette astuce montrera un effort délibéré pour contourner votre séparation, comme l'utilisation de la réflexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X