Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NewFile from bytes or ast #44

Open
vetcher opened this issue Oct 1, 2018 · 9 comments
Open

NewFile from bytes or ast #44

vetcher opened this issue Oct 1, 2018 · 9 comments

Comments

@vetcher
Copy link
Contributor

vetcher commented Oct 1, 2018

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 vetcher changed the title NewFile from bytes NewFile from bytes or ast Oct 1, 2018
@dave
Copy link
Owner

dave commented Oct 1, 2018

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
Copy link
Owner

dave commented Oct 1, 2018

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.

@vetcher
Copy link
Contributor Author

vetcher commented Oct 1, 2018

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.

@dave
Copy link
Owner

dave commented Oct 1, 2018

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

@vetcher
Copy link
Contributor Author

vetcher commented Oct 1, 2018

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

@dave
Copy link
Owner

dave commented Oct 1, 2018

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

@ghost
Copy link

ghost commented Oct 5, 2018

@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.

@dave
Copy link
Owner

dave commented Oct 5, 2018

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
Copy link
Owner

dave commented Oct 5, 2018

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...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants