jennifer icon indicating copy to clipboard operation
jennifer copied to clipboard

NewFile from bytes or ast

Open vetcher opened this issue 7 years ago • 9 comments

Hi @dave, what you think about adding constructor for *jen.File, like NewFileFromSource() or NewFileFromAst(*ast.File), to create file from existing files or asts?

My use cases:

  1. I want to append missing functions to implement existing interface.
  2. I trying to make pluggable generator, in which each plugin can modify the previous.

vetcher avatar Oct 01 '18 15:10 vetcher

I don't think jennifer is the right tool for this. Manipulating existing files is a problem, and one I'm currently working on with https://github.com/dave/dst

dave avatar Oct 01 '18 15:10 dave

Once the dst package is all working, I'm planing to align dst and jennifer a bit better, so it'll be simple to load a source file, and replace or modify sections using jennifer syntax. That's a while off yet though.

dave avatar Oct 01 '18 15:10 dave

Problem in manipulating with ast is that it binded to FileSet and adding some nodes to existing tree is hard to work and render properly. Idk how to add to ast.File and token.FileSet at the same time correctly. I write https://github.com/vetcher/go-astra to make life easier, but it does not work with function's bodies.

vetcher avatar Oct 01 '18 15:10 vetcher

That's exactly what https://github.com/dave/dst will solve.

dave avatar Oct 01 '18 15:10 dave

Oh, it will be great. But anyway I will fork this one and make all what I mention in topic, because right now it's an easiest way to render imports properly. Just want to ask you first

vetcher avatar Oct 01 '18 16:10 vetcher

Sure go ahead. I'm interested to see what you come up with...

dave avatar Oct 01 '18 16:10 dave

@dave dst looks great. I hit this problem with a code generator and ended up doing an almighty hack of outputting comments into the generated code so that on a 2nd parse i can see what is the human code and what is the code generated code.

DST will open doors to some very interesting possibilities ! thanks for doing this.

ghost avatar Oct 05 '18 07:10 ghost

Thanks! I've got some big plans for this project... Imagine something like:

parser.Parse("foo.go").Search(
    nodes.OfType(nodes.CallExpr),
    nodes.HasParent().OfType(nodes.ExprStmt).HasId("foo"),
).ReplaceWith(
    jen.Qual("bar", "Foo").Call(),
)

... basically a DSL to query and replace bits of the AST, using jennifer syntax to craft the new code. I'll probably do a full re-write of jennifer to support this that uses DST under the hood.

Feel free to join me in the #dst Gophers Slack room to chat about it.

dave avatar Oct 05 '18 07:10 dave

I'd love some feedback on how the dst package works in the real-world...

I've been dog-fooding it myself in https://github.com/dave/forky... Forky uses go/types quite extensively which is quite closely bound to go/ast so I'm playing with forking go/types to use dst... tricky though because go/types needs the position of nodes in a few places...

dave avatar Oct 05 '18 08:10 dave