From b00bc18b8f86a27aaff5e67a25f31fe2e9d4c338 Mon Sep 17 00:00:00 2001 From: nobishino Date: Fri, 2 Jul 2021 22:49:27 +0900 Subject: [PATCH 01/11] Fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b5110e7..7683cd6 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ skeleton creates skeleton codes for a modularized static analysis tool with [x/tools/go/analysis](https://golang.org/x/tools/go/analysis) package. -## x/tools/go/analysis pacakge +## x/tools/go/analysis package [x/tools/go/analysis](https://golang.org/x/tools/go/analysis) package provides a type `analysis.Analyzer` which is unit of analyzers in modularized static analysis tool. From a5d8f7fa67e2401d6ffba405fae3cb6470907960 Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 21:56:39 +0900 Subject: [PATCH 02/11] Fix checker of codegen --- v2/skeleton/skeleton.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/v2/skeleton/skeleton.go b/v2/skeleton/skeleton.go index 331e209..3687c2c 100644 --- a/v2/skeleton/skeleton.go +++ b/v2/skeleton/skeleton.go @@ -73,13 +73,9 @@ func (s *Skeleton) parseFlag(args []string, info *Info) (*flag.FlagSet, error) { flags.PrintDefaults() } flags.Var(&info.Checker, "checker", "[unit,single,multi]") - if info.Checker == "" { - info.Checker = CheckerUnit - } + flags.Var(&info.Kind, "kind", "[inspect,ssa,codegen]") - if info.Kind == "" { - info.Kind = KindInspect - } + flags.BoolVar(&info.Cmd, "cmd", true, "create main file") flags.BoolVar(&info.Plugin, "plugin", false, "create golangci-lint plugin") flags.StringVar(&info.Pkg, "pkg", "", "package name") @@ -88,6 +84,19 @@ func (s *Skeleton) parseFlag(args []string, info *Info) (*flag.FlagSet, error) { return nil, err } + if info.Kind == "" { + info.Kind = KindInspect + } + + if info.Checker == "" { + switch info.Kind { + case KindCodegen: + info.Checker = CheckerSingle + default: + info.Checker = CheckerUnit + } + } + return flags, nil } From a82d252af0d686ab55b254104e55029dfb487f87 Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 21:58:54 +0900 Subject: [PATCH 03/11] Version up --- v2/version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v2/version.txt b/v2/version.txt index b02d37b..f256be6 100644 --- a/v2/version.txt +++ b/v2/version.txt @@ -1 +1 @@ -v2.0.2 \ No newline at end of file +v2.0.3 From b34bec7be325525c69d3428548dd5ea93f405d5f Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 22:16:05 +0900 Subject: [PATCH 04/11] Execute goimports --- v2/go.sum | 1 + v2/skeleton/generator.go | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/v2/go.sum b/v2/go.sum index 51bbdad..fb350d5 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -16,6 +16,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/v2/skeleton/generator.go b/v2/skeleton/generator.go index af752da..9a7e531 100644 --- a/v2/skeleton/generator.go +++ b/v2/skeleton/generator.go @@ -3,9 +3,11 @@ package skeleton import ( "bytes" "io/fs" + "path/filepath" "text/template" "github.com/josharian/txtarfs" + "golang.org/x/tools/imports" "golang.org/x/tools/txtar" ) @@ -18,7 +20,21 @@ func (g *Generator) Run(info *Info) (fs.FS, error) { if err := g.template().Execute(&buf, info); err != nil { return nil, err } - return txtarfs.As(txtar.Parse(buf.Bytes())), nil + ar := txtar.Parse(buf.Bytes()) + for i := range ar.Files { + if filepath.Ext(ar.Files[i].Name) != ".go" || len(ar.Files[i].Data) == 0 { + continue + } + opt := &imports.Options{ + FormatOnly: true, + } + src, err := imports.Process(ar.Files[i].Name, ar.Files[i].Data, opt) + if err != nil { + return nil, err + } + ar.Files[i].Data = src + } + return txtarfs.As(ar), nil } func (g *Generator) template() *template.Template { From 296b75b22d2e628af5fe71f7aa130adfdff8bec9 Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 22:23:20 +0900 Subject: [PATCH 05/11] Add prefix to module path --- v2/skeleton/skeleton.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/v2/skeleton/skeleton.go b/v2/skeleton/skeleton.go index 331e209..b503bb0 100644 --- a/v2/skeleton/skeleton.go +++ b/v2/skeleton/skeleton.go @@ -47,6 +47,9 @@ func (s *Skeleton) Run(version string, args []string) int { } info.Path = flags.Arg(0) + if prefix := os.Getenv("SKELETON_PREFIX"); prefix != "" { + info.Path = path.Join(prefix, info.Path) + } // allow package name only if module.CheckImportPath(info.Path) != nil { flags.Usage() From 7b11ff46d536791f7bf10857424ac92ee30ba642 Mon Sep 17 00:00:00 2001 From: Takuya Ueda Date: Mon, 12 Jul 2021 22:25:41 +0900 Subject: [PATCH 06/11] Create testandvet.yml --- .github/workflows/testandvet.yml | 51 ++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/testandvet.yml diff --git a/.github/workflows/testandvet.yml b/.github/workflows/testandvet.yml new file mode 100644 index 0000000..1c2f1b8 --- /dev/null +++ b/.github/workflows/testandvet.yml @@ -0,0 +1,51 @@ +name: Test and Vet + +on: + push: + branches: + - main + pull_request: + branches: + - main + release: + types: + - published + - created + - edited + +defaults: + run: + shell: bash + +jobs: + test: + runs-on: ubuntu-20.04 + + steps: + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: 1.16.x + + - name: Checkout code + uses: actions/checkout@v2 + + - name: Cache Go module and build cache + uses: actions/cache@v2 + with: + key: go-${{ hashFiles('**/go.sum') }} + path: | + ~/go/pkg/mod + restore-keys: | + go- + + - name: Install tennvet + run: | + GOBIN=$(pwd) go install github.com/tenntenn/tennvet@latest + + - name: Test and vet + run: | + cd v2 + go vet ./... + go vet -vettool=$(pwd)/tennvet ./... + go test -v -race ./... From 798f1c7c921d7a8afded8bbf445801a90b49134d Mon Sep 17 00:00:00 2001 From: Takuya Ueda Date: Mon, 12 Jul 2021 22:28:06 +0900 Subject: [PATCH 07/11] Update testandvet.yml --- .github/workflows/testandvet.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/testandvet.yml b/.github/workflows/testandvet.yml index 1c2f1b8..92d6ce0 100644 --- a/.github/workflows/testandvet.yml +++ b/.github/workflows/testandvet.yml @@ -7,6 +7,7 @@ on: pull_request: branches: - main + - release-v2.*.* release: types: - published From 0b61dcf5605f4b3643346ff4c354ebf48bd2401e Mon Sep 17 00:00:00 2001 From: Takuya Ueda Date: Mon, 12 Jul 2021 22:30:12 +0900 Subject: [PATCH 08/11] Update testandvet.yml --- .github/workflows/testandvet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testandvet.yml b/.github/workflows/testandvet.yml index 92d6ce0..17fd183 100644 --- a/.github/workflows/testandvet.yml +++ b/.github/workflows/testandvet.yml @@ -42,7 +42,7 @@ jobs: - name: Install tennvet run: | - GOBIN=$(pwd) go install github.com/tenntenn/tennvet@latest + GOBIN=$(pwd)/v2 go install github.com/tenntenn/tennvet@latest - name: Test and vet run: | From a5326ff5ce08b9fde9824f7f1562d7bbfe18ff0f Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 22:31:35 +0900 Subject: [PATCH 09/11] gofmt --- v2/skeleton/fs.go | 2 +- v2/skeleton/info.go | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/v2/skeleton/fs.go b/v2/skeleton/fs.go index 581a995..4957423 100644 --- a/v2/skeleton/fs.go +++ b/v2/skeleton/fs.go @@ -133,7 +133,7 @@ func create(prompt *Prompt, path string, policy overwritePolicy) (io.WriteCloser exist, err := isExist(path) if err != nil { return nil, err - } + } if !exist { return os.Create(path) diff --git a/v2/skeleton/info.go b/v2/skeleton/info.go index 42962d7..1aa3a76 100644 --- a/v2/skeleton/info.go +++ b/v2/skeleton/info.go @@ -1,10 +1,10 @@ package skeleton type Info struct { - Kind Kind - Checker Checker - Pkg string - Path string - Cmd bool - Plugin bool + Kind Kind + Checker Checker + Pkg string + Path string + Cmd bool + Plugin bool } From 3f55cdb78d6e2ce97daf4b945bf353d7fa41ee23 Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 22:39:24 +0900 Subject: [PATCH 10/11] Check stderr --- v2/skeleton/skeleton_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/v2/skeleton/skeleton_test.go b/v2/skeleton/skeleton_test.go index c08ac35..06b3f1d 100644 --- a/v2/skeleton/skeleton_test.go +++ b/v2/skeleton/skeleton_test.go @@ -75,6 +75,10 @@ func TestSkeletonRun(t *testing.T) { t.Errorf("exit code want %d got %d", tt.wantExitCode, gotExitCode) } + if tt.wantExitCode == 0 && errout.String() != "" { + t.Error("exit code want 0 but error messages are outputed", errout.String()) + } + if tt.wantOutput != "" && out.String() != tt.wantOutput { t.Errorf("output want %s got %s", tt.wantOutput, out.String()) } From 671d79e09d882158a0b5ae8d9a5e9d3d03844787 Mon Sep 17 00:00:00 2001 From: tenntenn Date: Mon, 12 Jul 2021 22:48:02 +0900 Subject: [PATCH 11/11] Fix goimports --- v2/skeleton/generator.go | 4 +++- v2/skeleton/testdata/nooption.golden | 1 - v2/skeleton/testdata/onlypkgname.golden | 3 ++- v2/skeleton/testdata/overwrite-cancel.golden | 1 - v2/skeleton/testdata/overwrite-confirm-no.golden | 1 - v2/skeleton/testdata/overwrite-confirm-yes.golden | 1 - v2/skeleton/testdata/overwrite-force.golden | 1 - v2/skeleton/testdata/overwrite-newonly.golden | 1 - v2/skeleton/testdata/plugin.golden | 1 - 9 files changed, 5 insertions(+), 9 deletions(-) diff --git a/v2/skeleton/generator.go b/v2/skeleton/generator.go index 9a7e531..ea971c2 100644 --- a/v2/skeleton/generator.go +++ b/v2/skeleton/generator.go @@ -22,10 +22,12 @@ func (g *Generator) Run(info *Info) (fs.FS, error) { } ar := txtar.Parse(buf.Bytes()) for i := range ar.Files { - if filepath.Ext(ar.Files[i].Name) != ".go" || len(ar.Files[i].Data) == 0 { + if filepath.Ext(ar.Files[i].Name) != ".go" || + len(bytes.TrimSpace(ar.Files[i].Data)) == 0 { continue } opt := &imports.Options{ + Comments: true, FormatOnly: true, } src, err := imports.Process(ar.Files[i].Name, ar.Files[i].Data, opt) diff --git a/v2/skeleton/testdata/nooption.golden b/v2/skeleton/testdata/nooption.golden index 99e4bc9..962e4a8 100644 --- a/v2/skeleton/testdata/nooption.golden +++ b/v2/skeleton/testdata/nooption.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example diff --git a/v2/skeleton/testdata/onlypkgname.golden b/v2/skeleton/testdata/onlypkgname.golden index cff2857..3ece762 100644 --- a/v2/skeleton/testdata/onlypkgname.golden +++ b/v2/skeleton/testdata/onlypkgname.golden @@ -3,11 +3,11 @@ package main import ( "example" + "golang.org/x/tools/go/analysis/unitchecker" ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example @@ -56,6 +56,7 @@ import ( "testing" "example" + "github.com/gostaticanalysis/testutil" "golang.org/x/tools/go/analysis/analysistest" ) diff --git a/v2/skeleton/testdata/overwrite-cancel.golden b/v2/skeleton/testdata/overwrite-cancel.golden index d1c14c8..a8d057c 100644 --- a/v2/skeleton/testdata/overwrite-cancel.golden +++ b/v2/skeleton/testdata/overwrite-cancel.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example diff --git a/v2/skeleton/testdata/overwrite-confirm-no.golden b/v2/skeleton/testdata/overwrite-confirm-no.golden index d1c14c8..a8d057c 100644 --- a/v2/skeleton/testdata/overwrite-confirm-no.golden +++ b/v2/skeleton/testdata/overwrite-confirm-no.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example diff --git a/v2/skeleton/testdata/overwrite-confirm-yes.golden b/v2/skeleton/testdata/overwrite-confirm-yes.golden index 99e4bc9..962e4a8 100644 --- a/v2/skeleton/testdata/overwrite-confirm-yes.golden +++ b/v2/skeleton/testdata/overwrite-confirm-yes.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example diff --git a/v2/skeleton/testdata/overwrite-force.golden b/v2/skeleton/testdata/overwrite-force.golden index 99e4bc9..962e4a8 100644 --- a/v2/skeleton/testdata/overwrite-force.golden +++ b/v2/skeleton/testdata/overwrite-force.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example diff --git a/v2/skeleton/testdata/overwrite-newonly.golden b/v2/skeleton/testdata/overwrite-newonly.golden index d1c14c8..a8d057c 100644 --- a/v2/skeleton/testdata/overwrite-newonly.golden +++ b/v2/skeleton/testdata/overwrite-newonly.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example diff --git a/v2/skeleton/testdata/plugin.golden b/v2/skeleton/testdata/plugin.golden index 2bfaf1c..bd6eb3f 100644 --- a/v2/skeleton/testdata/plugin.golden +++ b/v2/skeleton/testdata/plugin.golden @@ -7,7 +7,6 @@ import ( ) func main() { unitchecker.Main(example.Analyzer) } - -- example/example.go -- package example