diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 627afa4..1212821 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -4,12 +4,12 @@ jobs: test: strategy: matrix: - go-version: [1.17.x] + go-version: [1.22.x] platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} steps: - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: ${{ matrix.go-version }} - name: Checkout code diff --git a/astextract b/astextract new file mode 100755 index 0000000..1d6ee50 Binary files /dev/null and b/astextract differ diff --git a/astextract.go b/astextract.go index 227ee1c..4e155fc 100644 --- a/astextract.go +++ b/astextract.go @@ -6,9 +6,8 @@ import ( "fmt" "go/parser" "go/token" - "io/ioutil" - "log" "os" + "log" ) var outfile string @@ -40,7 +39,7 @@ func Main1() int { flag.Usage() } - content, err := ioutil.ReadFile(path) + content, err := os.ReadFile(path) if err != nil { log.Println(err) return 1 diff --git a/astextract_bin b/astextract_bin new file mode 100755 index 0000000..f39a7cd Binary files /dev/null and b/astextract_bin differ diff --git a/genfile.go b/genfile.go index 43b2d89..840e762 100644 --- a/genfile.go +++ b/genfile.go @@ -2,7 +2,6 @@ package astextract import ( "go/format" - "io/ioutil" "os" "path/filepath" ) @@ -42,5 +41,5 @@ func main() { return err } - return ioutil.WriteFile(outfile, formatted, 0644) + return os.WriteFile(outfile, formatted, 0644) } diff --git a/go.mod b/go.mod index 5d2a0ee..8995b7a 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,19 @@ module github.com/lu4p/astextract -go 1.18 +go 1.23 + +toolchain go1.24.2 require ( - github.com/maxence-charriere/go-app/v9 v9.3.3 - github.com/rogpeppe/go-internal v1.8.1 + github.com/maxence-charriere/go-app/v9 v9.8.0 + github.com/rogpeppe/go-internal v1.14.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e // indirect - gopkg.in/errgo.v2 v2.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/tools v0.26.0 // indirect ) replace github.com/maxence-charriere/go-app/v9 => github.com/lu4p/go-app/v9 v9.3.1-0.20220103192106-fe7419cd2814 diff --git a/go.sum b/go.sum index cf69f2c..bc7d1f4 100644 --- a/go.sum +++ b/go.sum @@ -3,21 +3,14 @@ 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= github.com/gomarkdown/markdown v0.0.0-20210408062403-ad838ccf8cdd/go.mod h1:aii0r/K0ZnHv7G0KF7xy1v0A7s2Ljrb5byB7MO5p6TU= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/lu4p/go-app/v9 v9.3.1-0.20220103192106-fe7419cd2814 h1:VsXbeFAu0vpHPZr2difwF0ZsSCQdT1J5M1KVZpGWNLM= github.com/lu4p/go-app/v9 v9.3.1-0.20220103192106-fe7419cd2814/go.mod h1:zo0n1kh4OMKn7P+MrTUUi7QwUMU2HOfHsZ293TITtxI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -25,13 +18,13 @@ golang.org/dl v0.0.0-20190829154251-82a15e2f2ead/go.mod h1:IUMfjQLJQd4UTqG1Z90te golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/print.go b/print.go index a82cfde..6463fb2 100644 --- a/print.go +++ b/print.go @@ -66,7 +66,8 @@ func PosFilter(name string, v reflect.Value) bool { blacklist := []string{ "If", "Return", "Func", "Opening", "Closing", "Colon", "Obj", "Struct", "Map", "For", "Star", "Case", "Begin", "Defer", "Go", - "Interface", "Select", "Struct", "Switch", "Arrow", + "Interface", "Select", "Struct", "Switch", "Arrow", "Range", + "FileStart", "FileEnd", } bracePos := []string{"brace", "paren", "brack"} diff --git a/testdata/scripts/generic_new.stdout b/testdata/scripts/generic_new.stdout new file mode 100644 index 0000000..e69de29 diff --git a/testdata/scripts/generics.txt b/testdata/scripts/generics.txt new file mode 100644 index 0000000..2130715 --- /dev/null +++ b/testdata/scripts/generics.txt @@ -0,0 +1,281 @@ +astextract generic.go +cmp stdout generic.stdout + +-- generic.go -- +package main + +import "fmt" + +func Sum[T int | int64 | float64](a, b T) T { + return a + b +} + +type Pair[T any] struct { + First, Second T +} + +func main() { + fmt.Println(Sum(3, 4)) + p := Pair[string]{First: "hello", Second: "world"} + fmt.Println(p.First, p.Second) +} + +-- generic.stdout -- +&ast.File { + Package: 1, + Name: &ast.Ident { + Name: "main", + }, + Decls: []ast.Decl { + &ast.GenDecl { + Tok: token.IMPORT, + Specs: []ast.Spec { + &ast.ImportSpec { + Path: &ast.BasicLit { + Kind: token.STRING, + Value: "\"fmt\"", + }, + }, + }, + }, + &ast.FuncDecl { + Name: &ast.Ident { + Name: "Sum", + }, + Type: &ast.FuncType { + TypeParams: &ast.FieldList { + List: []*ast.Field { + &ast.Field { + Names: []*ast.Ident { + &ast.Ident { + Name: "T", + }, + }, + Type: &ast.BinaryExpr { + X: &ast.BinaryExpr { + X: &ast.Ident { + Name: "int", + }, + Op: token.OR, + Y: &ast.Ident { + Name: "int64", + }, + }, + Op: token.OR, + Y: &ast.Ident { + Name: "float64", + }, + }, + }, + }, + }, + Params: &ast.FieldList { + List: []*ast.Field { + &ast.Field { + Names: []*ast.Ident { + &ast.Ident { + Name: "a", + }, + &ast.Ident { + Name: "b", + }, + }, + Type: &ast.Ident { + Name: "T", + }, + }, + }, + }, + Results: &ast.FieldList { + List: []*ast.Field { + &ast.Field { + Type: &ast.Ident { + Name: "T", + }, + }, + }, + }, + }, + Body: &ast.BlockStmt { + List: []ast.Stmt { + &ast.ReturnStmt { + Results: []ast.Expr { + &ast.BinaryExpr { + X: &ast.Ident { + Name: "a", + }, + Op: token.ADD, + Y: &ast.Ident { + Name: "b", + }, + }, + }, + }, + }, + }, + }, + &ast.GenDecl { + Tok: token.TYPE, + Specs: []ast.Spec { + &ast.TypeSpec { + Name: &ast.Ident { + Name: "Pair", + }, + TypeParams: &ast.FieldList { + List: []*ast.Field { + &ast.Field { + Names: []*ast.Ident { + &ast.Ident { + Name: "T", + }, + }, + Type: &ast.Ident { + Name: "any", + }, + }, + }, + }, + Type: &ast.StructType { + Fields: &ast.FieldList { + List: []*ast.Field { + &ast.Field { + Names: []*ast.Ident { + &ast.Ident { + Name: "First", + }, + &ast.Ident { + Name: "Second", + }, + }, + Type: &ast.Ident { + Name: "T", + }, + }, + }, + }, + }, + }, + }, + }, + &ast.FuncDecl { + Name: &ast.Ident { + Name: "main", + }, + Type: &ast.FuncType { + Params: &ast.FieldList {}, + }, + Body: &ast.BlockStmt { + List: []ast.Stmt { + &ast.ExprStmt { + X: &ast.CallExpr { + Fun: &ast.SelectorExpr { + X: &ast.Ident { + Name: "fmt", + }, + Sel: &ast.Ident { + Name: "Println", + }, + }, + Args: []ast.Expr { + &ast.CallExpr { + Fun: &ast.Ident { + Name: "Sum", + }, + Args: []ast.Expr { + &ast.BasicLit { + Kind: token.INT, + Value: "3", + }, + &ast.BasicLit { + Kind: token.INT, + Value: "4", + }, + }, + }, + }, + }, + }, + &ast.AssignStmt { + Lhs: []ast.Expr { + &ast.Ident { + Name: "p", + }, + }, + Tok: token.DEFINE, + Rhs: []ast.Expr { + &ast.CompositeLit { + Type: &ast.IndexExpr { + X: &ast.Ident { + Name: "Pair", + }, + Index: &ast.Ident { + Name: "string", + }, + }, + Elts: []ast.Expr { + &ast.KeyValueExpr { + Key: &ast.Ident { + Name: "First", + }, + Value: &ast.BasicLit { + Kind: token.STRING, + Value: "\"hello\"", + }, + }, + &ast.KeyValueExpr { + Key: &ast.Ident { + Name: "Second", + }, + Value: &ast.BasicLit { + Kind: token.STRING, + Value: "\"world\"", + }, + }, + }, + }, + }, + }, + &ast.ExprStmt { + X: &ast.CallExpr { + Fun: &ast.SelectorExpr { + X: &ast.Ident { + Name: "fmt", + }, + Sel: &ast.Ident { + Name: "Println", + }, + }, + Args: []ast.Expr { + &ast.SelectorExpr { + X: &ast.Ident { + Name: "p", + }, + Sel: &ast.Ident { + Name: "First", + }, + }, + &ast.SelectorExpr { + X: &ast.Ident { + Name: "p", + }, + Sel: &ast.Ident { + Name: "Second", + }, + }, + }, + }, + }, + }, + }, + }, + }, + Imports: []*ast.ImportSpec { + &ast.ImportSpec { + Path: &ast.BasicLit { + Kind: token.STRING, + Value: "\"fmt\"", + }, + }, + }, +} +