From a555d50844626c94b8714d7f02cd71b196aed087 Mon Sep 17 00:00:00 2001 From: aq17 Date: Wed, 5 Apr 2023 12:02:29 -0700 Subject: [PATCH 1/2] wip fix embed gen --- migrations/migrations.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/migrations/migrations.go b/migrations/migrations.go index ae0b6b3..dfc36da 100644 --- a/migrations/migrations.go +++ b/migrations/migrations.go @@ -33,8 +33,8 @@ func AddAutoAliasingSourceCode(fset *token.FileSet, file *ast.File, savePath str c.Replace(x) } case *ast.GenDecl: - if x.Tok == token.IMPORT { - c.InsertAfter(&ast.GenDecl{ + if x.Tok == token.CONST { + c.InsertBefore(&ast.GenDecl{ Doc: &ast.CommentGroup{ List: []*ast.Comment{ {Text: "go:embed cmd/pulumi-resource-databricks/bridge-metadata.json"}, From 28e5dec7ced0364019419287aaeb91aac0492d5a Mon Sep 17 00:00:00 2001 From: aq17 Date: Wed, 12 Apr 2023 13:33:15 -0700 Subject: [PATCH 2/2] use dst pkg --- go.mod | 3 +- go.sum | 14 ++-- main.go | 7 +- migrations/migrations.go | 143 +++++++++++++++++++++------------------ 4 files changed, 92 insertions(+), 75 deletions(-) diff --git a/go.mod b/go.mod index a739614..119c58e 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,10 @@ go 1.19 require ( github.com/Masterminds/semver/v3 v3.2.0 github.com/briandowns/spinner v1.20.0 + github.com/dave/dst v0.27.2 github.com/pulumi/pulumi/sdk/v3 v3.53.1 github.com/spf13/cobra v1.6.1 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 - golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e gopkg.in/yaml.v3 v3.0.1 ) @@ -22,4 +22,5 @@ require ( github.com/stretchr/testify v1.8.1 // indirect golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24 // indirect golang.org/x/term v0.1.0 // indirect + golang.org/x/tools v0.1.12 // indirect ) diff --git a/go.sum b/go.sum index 6ded4a2..bc25395 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,9 @@ github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/briandowns/spinner v1.20.0 h1:GQq1Yf1KyzYT8CY19GzWrDKP6hYOFB6J72Ks7d8aO1U= github.com/briandowns/spinner v1.20.0/go.mod h1:TcwZHb7Wb6vn/+bcVv1UXEzaA4pLS7yznHlkY/HzH44= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/dave/dst v0.27.2 h1:4Y5VFTkhGLC1oddtNwuxxe36pnyLxMFXT51FOzH8Ekc= +github.com/dave/dst v0.27.2/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.5.0 h1:HmgPN93bVDpkQyYbqhCHj5QlgvUkvEOzMyEvKLgCRrg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -27,6 +30,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pulumi/pulumi/sdk/v3 v3.53.1 h1:fTYqe0fQiGshlOuHwpjOqQOb2SW3CSqXteeGcAuO+Bk= github.com/pulumi/pulumi/sdk/v3 v3.53.1/go.mod h1:IYcBrkAwKEGRVq7R1ne3XJKB5bcux5eL3M/zqco7d6Y= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -38,12 +42,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -54,10 +54,8 @@ golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24 h1:TyKJRhyo17yWxOMCTHKWrc5rd golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e h1:aZzprAO9/8oim3qStq3wc1Xuxx4QmAGriC4VU4ojemQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index d0e5262..e235c8c 100644 --- a/main.go +++ b/main.go @@ -23,6 +23,7 @@ import ( "gopkg.in/yaml.v3" semver "github.com/Masterminds/semver/v3" + "github.com/dave/dst/decorator" "github.com/pulumi/pulumi/sdk/v3/go/common/util/contract" "github.com/spf13/cobra" @@ -1574,7 +1575,11 @@ func AddAutoAliasing(ctx Context, repo ProviderRepo, providerName string) (step. if err != nil { return "failed to parse resources.go", err } - changesMade, err = migrations.AddAutoAliasingSourceCode(fset, file, fmt.Sprintf("%s/resources.go", *repo.providerDir())) + dstFile, err := decorator.DecorateFile(fset, file) + if err != nil { + return "failed to parse resources.go", err + } + changesMade, err = migrations.AddAutoAliasingSourceCode(fset, dstFile, fmt.Sprintf("%s/resources.go", *repo.providerDir())) return "", err })) if changesMade { diff --git a/migrations/migrations.go b/migrations/migrations.go index dfc36da..610b58f 100644 --- a/migrations/migrations.go +++ b/migrations/migrations.go @@ -1,12 +1,13 @@ package migrations import ( - "go/ast" - "go/printer" "go/token" "os" - "golang.org/x/tools/go/ast/astutil" + "github.com/dave/dst" + "github.com/dave/dst/decorator" + "github.com/dave/dst/decorator/resolver/gopackages" + "github.com/dave/dst/dstutil" ) const ( @@ -14,102 +15,103 @@ const ( ContractPkg = "github.com/pulumi/pulumi/sdk/v3/go/common/util/contract" ) -func AddAutoAliasingSourceCode(fset *token.FileSet, file *ast.File, savePath string) (bool, error) { +func AddAutoAliasingSourceCode(fset *token.FileSet, file *dst.File, savePath string) (bool, error) { changesMade := false - changesMade = astutil.AddImport(fset, file, TfBridgeXPkg) - changesMade = astutil.AddImport(fset, file, ContractPkg) || changesMade - changesMade = astutil.AddNamedImport(fset, file, "_", "embed") || changesMade + // changesMade = astutil.AddImport(fset, file, TfBridgeXPkg) + // changesMade = astutil.AddImport(fset, file, ContractPkg) || changesMade + // changesMade = astutil.AddNamedImport(fset, file, "_", "embed") || changesMade applied := false - astutil.Apply(file, nil, func(c *astutil.Cursor) bool { + dstutil.Apply(file, nil, func(c *dstutil.Cursor) bool { n := c.Node() switch x := n.(type) { - case *ast.ImportSpec: - if x.Path.Value == "\"embed\"" { - x.Comment = &ast.CommentGroup{List: []*ast.Comment{ - {Text: "embed package not used directly"}, - }} - c.Replace(x) - } - case *ast.GenDecl: + case *dst.ImportSpec: + c.InsertBefore(&dst.ImportSpec{Path: &dst.BasicLit{Value: TfBridgeXPkg}}) + c.InsertBefore(&dst.ImportSpec{Path: &dst.BasicLit{Value: ContractPkg}}) + embedImp := dst.ImportSpec{Path: &dst.BasicLit{Value: "_ embed"}} + embedImp.Decs.Start.Append("embed package blank import") + c.InsertBefore(&embedImp) + case *dst.GenDecl: if x.Tok == token.CONST { - c.InsertBefore(&ast.GenDecl{ - Doc: &ast.CommentGroup{ - List: []*ast.Comment{ - {Text: "go:embed cmd/pulumi-resource-databricks/bridge-metadata.json"}, - }, - }, + d := &dst.GenDecl{ + // Doc: &dst.CommentGroup{ + // List: []*dst.Comment{ + // {Text: "go:embed cmd/pulumi-resource-databricks/bridge-metadata.json"}, + // }, + // }, Tok: token.VAR, - Specs: []ast.Spec{ - &ast.ValueSpec{ - Names: []*ast.Ident{{Name: "metadata", Obj: &ast.Object{Kind: ast.Var, Name: "metadata"}}}, - Type: &ast.ArrayType{Elt: &ast.Ident{Name: "byte"}}, + Specs: []dst.Spec{ + &dst.ValueSpec{ + Names: []*dst.Ident{{Name: "metadata", Obj: &dst.Object{Kind: dst.Var, Name: "metadata"}}}, + Type: &dst.ArrayType{Elt: &dst.Ident{Name: "byte"}}, }, }, - }) + } + d.Decs.Start.Append("go:embed cmd/pulumi-resource-databricks/bridge-metadata.json") + c.InsertBefore(d) } - case *ast.CompositeLit: - if s, ok := x.Type.(*ast.SelectorExpr); ok && s.Sel.Name == "ProviderInfo" { - x.Elts = append(x.Elts, &ast.KeyValueExpr{ - Key: &ast.Ident{Name: "MetadataInfo"}, - Value: &ast.CallExpr{ - Fun: &ast.SelectorExpr{ - X: &ast.Ident{Name: "tfbridge"}, - Sel: &ast.Ident{Name: "NewProviderMetadata"}, + case *dst.CompositeLit: + if s, ok := x.Type.(*dst.SelectorExpr); ok && s.Sel.Name == "ProviderInfo" { + x.Elts = append(x.Elts, &dst.KeyValueExpr{ + Key: &dst.Ident{Name: "MetadataInfo"}, + Value: &dst.CallExpr{ + Fun: &dst.SelectorExpr{ + X: &dst.Ident{Name: "tfbridge"}, + Sel: &dst.Ident{Name: "NewProviderMetadata"}, }, - Args: []ast.Expr{&ast.Ident{Name: "metadata"}}, + Args: []dst.Expr{&dst.Ident{Name: "metadata"}}, }, }) } - case *ast.AssignStmt: + case *dst.AssignStmt: if len(x.Rhs) == 1 { - if c, ok := x.Rhs[0].(*ast.CallExpr); ok { - if s, ok := c.Fun.(*ast.SelectorExpr); ok && s.Sel.Name == "AutoAliasing" { + if c, ok := x.Rhs[0].(*dst.CallExpr); ok { + if s, ok := c.Fun.(*dst.SelectorExpr); ok && s.Sel.Name == "AutoAliasing" { applied = true return true } } } - case *ast.ExprStmt: - var id *ast.SelectorExpr - call, ok := x.X.(*ast.CallExpr) + case *dst.ExprStmt: + var id *dst.SelectorExpr + call, ok := x.X.(*dst.CallExpr) if ok { - id, ok = call.Fun.(*ast.SelectorExpr) + id, ok = call.Fun.(*dst.SelectorExpr) } if ok { if id.Sel.Name == "SetAutonaming" && !applied { - c.InsertBefore(&ast.AssignStmt{ + c.InsertBefore(&dst.AssignStmt{ Tok: token.DEFINE, - Lhs: []ast.Expr{&ast.Ident{Name: "err", Obj: &ast.Object{Kind: ast.Var, Name: "err"}}}, - Rhs: []ast.Expr{&ast.CallExpr{ - Fun: &ast.SelectorExpr{ - X: &ast.Ident{Name: "x"}, - Sel: &ast.Ident{Name: "AutoAliasing"}, + Lhs: []dst.Expr{&dst.Ident{Name: "err", Obj: &dst.Object{Kind: dst.Var, Name: "err"}}}, + Rhs: []dst.Expr{&dst.CallExpr{ + Fun: &dst.SelectorExpr{ + X: &dst.Ident{Name: "x"}, + Sel: &dst.Ident{Name: "AutoAliasing"}, }, - Args: []ast.Expr{ - &ast.UnaryExpr{ + Args: []dst.Expr{ + &dst.UnaryExpr{ Op: token.AND, - X: &ast.Ident{Name: "prov", Obj: &ast.Object{Kind: ast.Var, Name: "prov"}}, + X: &dst.Ident{Name: "prov", Obj: &dst.Object{Kind: dst.Var, Name: "prov"}}, }, - &ast.CallExpr{ - Fun: &ast.SelectorExpr{ - X: &ast.Ident{Name: "prov", Obj: &ast.Object{Kind: ast.Var, Name: "prov"}}, - Sel: &ast.Ident{Name: "GetMetadata"}, + &dst.CallExpr{ + Fun: &dst.SelectorExpr{ + X: &dst.Ident{Name: "prov", Obj: &dst.Object{Kind: dst.Var, Name: "prov"}}, + Sel: &dst.Ident{Name: "GetMetadata"}, }, }, }, }}, }) - c.InsertBefore(&ast.ExprStmt{ - X: &ast.CallExpr{ - Fun: &ast.SelectorExpr{ - X: &ast.Ident{Name: "contract"}, - Sel: &ast.Ident{Name: "AssertNoErrorf"}, + c.InsertBefore(&dst.ExprStmt{ + X: &dst.CallExpr{ + Fun: &dst.SelectorExpr{ + X: &dst.Ident{Name: "contract"}, + Sel: &dst.Ident{Name: "AssertNoErrorf"}, }, - Args: []ast.Expr{ - &ast.Ident{Name: "err", Obj: &ast.Object{Kind: ast.Var, Name: "err"}}, - &ast.BasicLit{Kind: token.STRING, Value: "\"auto aliasing apply failed\""}, + Args: []dst.Expr{ + &dst.Ident{Name: "err", Obj: &dst.Object{Kind: dst.Var, Name: "err"}}, + &dst.BasicLit{Kind: token.STRING, Value: "\"auto aliasing apply failed\""}, }, }}) changesMade = true @@ -121,6 +123,17 @@ func AddAutoAliasingSourceCode(fset *token.FileSet, file *ast.File, savePath str }) out, err := os.Create(savePath) - err = printer.Fprint(out, fset, file) + if err != nil { + return false, err + } + restorer := decorator.NewRestorerWithImports("st", gopackages.New("")) + err = restorer.Fprint(out, file) + if err != nil { + return false, err + } + + // decorator.Print(file) + // dst.Fprint(out, file, nil) + // // printer.Fprint(out, fset, file) return changesMade, err }