KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
In a Scala Compiler Plugin, I'm trying to create a new class that implement a pre-existing trait. So far my code looks like this: 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 } But it doesn't seem to get added to the package. I suspect that is because actually the package got "traversed" before the trait that causes the generation, and/or because the "override def transform(tree: Tree): Tree" method of the TypingTransformer can only return one Tree, for every Tree that it receives, so it cannot actually produce a new Tree, but only modify one. So, how do you add a new Class to an existing package? Maybe it would work if I transformed the package when "transform(Tree)" gets it, but I that point I don't know the content of the package yet, so I cannot generate the new Class this early (or could I?). Or maybe it's related to the "Position" parameter of the Symbol? So far I found several examples where Trees are modified, but none where a completely new Class is created in a Compile
Tags (comma-separated)
Save Edits
Cancel