Dans un Compilateur Scala Plugin, je suis en train de créer une nouvelle classe qui mettent en œuvre une pré-existante de trait. Jusqu'à présent, mon code ressemble à ceci:
def trait2Impl(original: ClassDef, newName: String): ClassDef = {
val impl = original.impl
// Seems OK to have same self, but does not make sense to me ...
val self = impl.self
// TODO: implement methods ...
val body = impl.body
// We implement original
val parents = original :: impl.parents
val newImpl = treeCopy.Template(impl, parents, self, body)
val name = newTypeName(newName)
// We are a syntheic class, not a user-defined trait
val mods = (original.mods | SYNTHETIC) &~ TRAIT
val tp = original.tparams
val result = treeCopy.ClassDef(original, mods, name, tp, newImpl)
// Same Package?
val owner = original.symbol.owner
// New symbol. What's a Position good for?
val symbol = new TypeSymbol(owner, NoPosition, name)
result.setSymbol(symbol)
symbol.setFlag(SYNTHETIC)
symbol.setFlag(ABSTRACT)
symbol.resetFlag(INTERFACE)
symbol.resetFlag(TRAIT)
owner.info.decls.enter(symbol)
result
}
Mais il ne semble pas pour obtenir ajouté au package. Je soupçonne que c'est parce qu'en fait, le package a "traversé" avant le trait de caractère qui provoque la génération, et/ou parce que les "override def de transformation(de l'arbre: Arbre): Arbre de la" méthode de la TypingTransformer ne peut que retourner un Arbre pour chaque Arbre qu'il reçoit, il ne peut donc pas vraiment produire un nouvel Arbre, mais seulement de modifier un.
Alors, comment voulez-vous ajouter une nouvelle Classe d'un package existant? Peut-être que ça marcherait si j'ai transformé le paquet lors de la "transformation(Arbre)" il obtient, mais je-je ne sais pas le contenu de la liasse, de sorte que je ne peut pas générer la nouvelle Classe de ce début (ou pourrais-je?). Ou peut-être que c'est lié à la "Position" paramètre du Symbole?
Jusqu'à présent, j'ai trouvé plusieurs exemples où les Arbres sont modifiés, mais aucun où une Classe entièrement nouvelle est créée dans un Compilateur Plugin.