Thanks for looking at it :smile:

Could you elaborate more on how the `SetLines` would work on a 
`token.FileSet`? I thought that `SetLines` is only for the `os.File` types 
:sweat: Do you mean that I should create offsets (using SetLines) before I 
create the FileSet out of it?

reference 
code: 
https://github.com/tjgurwara99/constr/blob/0e0f8952c652b7a7a10b7238daed90132b924084/construct.go#L31

On Tuesday, 25 October 2022 at 01:07:23 UTC+1 david....@gmail.com wrote:

> On Sat, Oct 22, 2022 at 10:00 PM Tajmeet Singh <tjgur...@gmail.com> wrote:
>
>> Hello,
>>
>> I've been working on a utility to generate constructors for me when I 
>> provide it with a path to the file containing the struct and it `Ident`. 
>> The idea was that I would just create a ast.Node (FuncDecl) with all the 
>> necessary fields but I'm not able to figure out the positioning of the 
>> commas.
>>
>> The function that I'm working on looks something like this:
>>
>> ```Go
>> func generateConstructor(typeName string, fields ...*ast.Field) 
>> *ast.FuncDecl {
>>     var elts []ast.Expr
>>
>>     for _, field := range fields {
>>         elts = append(elts, &ast.KeyValueExpr{
>>             Key:   field.Names[0],
>>             Value: field.Names[0],
>>         })
>>     }
>>     return &ast.FuncDecl{
>>         Doc:  nil,
>>         Recv: nil,
>>         Name: ast.NewIdent("New" + typeName),
>>         Type: &ast.FuncType{
>>             TypeParams: nil,
>>             Params: &ast.FieldList{
>>                 List: fields,
>>             },
>>             Results: nil,
>>         },
>>         Body: &ast.BlockStmt{
>>             Lbrace: 1,
>>             List: []ast.Stmt{
>>                 &ast.ReturnStmt{
>>                     Results: []ast.Expr{
>>                         &ast.UnaryExpr{
>>                             Op: token.AND,
>>                             X: &ast.CompositeLit{
>>                                 Type:   ast.NewIdent(typeName),
>>                                 Elts:   elts,
>>                                 Rbrace: 1,
>>                             },
>>                         },
>>                     },
>>                 },
>>             },
>>             Rbrace: 2,
>>         },
>>     }
>> }
>> ```
>>
>> And when I provide it with a struct like this:
>>
>> ```Go
>> type Data struct {
>>     something string
>>     data      string
>>     dd        int
>> }
>> ```
>> I get this when I do `format.Node` on the generated node `functionDecl`.
>>
>> ```Go
>> func NewData(something string,
>>     data string,
>>     dd int) {
>>     return &Data{something: something,
>>         data: data,
>>         dd: dd}
>> }
>> ```
>>
>> However, I was thinking that it would look something like this.
>>
>> ```Go
>> func NewData(something string,
>>     data string,
>>     dd int,
>> ) {
>>     return &Data{something: something,
>>         data: data,
>>         dd: dd,
>>     }
>> }
>> ```
>> (wishful thinking :joy:)
>>
>> Anyways, I tried to figure out how the `token.COMMA` is used in the 
>> parser and how the ast is affected but I couldn't figure it out. Maybe it 
>> is related to the `Lbrace` and `Rbrace` values which I'm deliberately 
>> missing. Any help would be much appreciated :smile: :pray:
>>
>
> Looking at the code, I think you're on the right track with Rbrace's 
> location being the determining factor when to insert a comma and move put 
> the closing brace on a new line.
> My recommendation would be to use `SetLines` 
> <https://pkg.go.dev/go/token@go1.19.2#File.SetLines> on the (hopefully 
> clean) `token.FileSet` you're passing to `format.Node` to declare some 
> new-line offsets. I don't think the offsets have to make sense as they 
> would in a file that was parsed, but the formatter needs to see the last 
> expression and close brace as being on different lines
>  
> The type-switch line that handles CompositeLit's call handling insertions: 
> https://cs.opensource.google/go/go/+/refs/tags/go1.19.2:src/go/printer/nodes.go;l=1021;drc=7e72d384d66f48a78289edc6a7d1dc6ab878f990
> The lines that handle making the decision about inserting a new line: 
> https://cs.opensource.google/go/go/+/refs/tags/go1.19.2:src/go/printer/nodes.go;l=297-299;drc=a1901f898bc05aac966edd247ff122f52fbb8d2e
>
>>  
>> PS: I'm not aware of any utility out there so have to roll my own :joy: 
>> and learn whilst at it; if people are aware of it, please let me know and 
>> I'll inspect their code and figure things out :smile:
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/ffa312d0-5652-4c2d-9c71-c74bc4bfc56bn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/ffa312d0-5652-4c2d-9c71-c74bc4bfc56bn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/ca7fa4ed-247c-42fa-baa3-81a905ae1ecdn%40googlegroups.com.

Reply via email to