From 3ab145669a04a2aa6658b6bc18b8dff8dbad9d47 Mon Sep 17 00:00:00 2001 From: acehinnnqru Date: Fri, 5 Dec 2025 11:53:03 +0800 Subject: [PATCH 1/4] feat(go): return empty map when current go module has no deps --- lang/golang/parser/parser.go | 4 ++++ lang/golang/parser/utils.go | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/lang/golang/parser/parser.go b/lang/golang/parser/parser.go index f5940c9..81a98a8 100644 --- a/lang/golang/parser/parser.go +++ b/lang/golang/parser/parser.go @@ -154,6 +154,10 @@ func getDeps(dir string) (map[string]string, error) { return nil, fmt.Errorf("failed to execute 'go mod tidy', err: %v, output: %s", err, string(output)) } + if hasNoDeps(filepath.Join(dir, "go.mod")) { + return map[string]string{}, nil + } + cmd = exec.Command("go", "list", "-json", "all") cmd.Dir = dir output, err = cmd.CombinedOutput() diff --git a/lang/golang/parser/utils.go b/lang/golang/parser/utils.go index 0f9ad39..e11d9bc 100644 --- a/lang/golang/parser/utils.go +++ b/lang/golang/parser/utils.go @@ -32,6 +32,7 @@ import ( "github.com/Knetic/govaluate" . "github.com/cloudwego/abcoder/lang/uniast" + "golang.org/x/mod/modfile" ) func shouldIgnoreDir(path string) bool { @@ -152,6 +153,15 @@ func getPackageAlias(importPath string) string { return alias } +func hasNoDeps(modFilePath string) bool { + mod, err := modfile.Parse(modFilePath, nil, nil) + if err != nil { + return false + } + + return len(mod.Require) == 0 +} + func getModuleName(modFilePath string) (string, []byte, error) { file, err := os.Open(modFilePath) if err != nil { From 0317d31a918347dc871fd060e35a492d1cbb39ed Mon Sep 17 00:00:00 2001 From: acehinnnqru Date: Fri, 5 Dec 2025 12:07:04 +0800 Subject: [PATCH 2/4] fix(go): read modfile correct; use modfile.ModulePath to get module path --- lang/golang/parser/utils.go | 40 ++++++++++--------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/lang/golang/parser/utils.go b/lang/golang/parser/utils.go index e11d9bc..d21107f 100644 --- a/lang/golang/parser/utils.go +++ b/lang/golang/parser/utils.go @@ -15,14 +15,11 @@ package parser import ( - "bufio" - "bytes" "container/list" "fmt" "go/ast" "go/build" "go/types" - "io" "os" "os/exec" "path" @@ -154,41 +151,26 @@ func getPackageAlias(importPath string) string { } func hasNoDeps(modFilePath string) bool { - mod, err := modfile.Parse(modFilePath, nil, nil) + content, err := os.ReadFile(modFilePath) if err != nil { return false } - return len(mod.Require) == 0 -} - -func getModuleName(modFilePath string) (string, []byte, error) { - file, err := os.Open(modFilePath) - if err != nil { - return "", nil, fmt.Errorf("failed to open file: %v", err) - } - defer file.Close() - data, err := io.ReadAll(file) + modf, err := modfile.Parse(modFilePath, content, nil) if err != nil { - return "", nil, fmt.Errorf("failed to read file: %v", err) - } - scanner := bufio.NewScanner(bytes.NewBuffer(data)) - for scanner.Scan() { - line := scanner.Text() - if strings.HasPrefix(line, "module") { - // Assuming 'module' keyword is followed by module name - parts := strings.Split(line, " ") - if len(parts) > 1 { - return parts[1], data, nil - } - } + return false } - if err := scanner.Err(); err != nil { - return "", data, fmt.Errorf("failed to scan file: %v", err) + return len(modf.Require) == 0 +} + +func getModuleName(modFilePath string) (string, error) { + content, err := os.ReadFile(modFilePath) + if err != nil { + return "", fmt.Errorf("failed to read file: %s", err.Error()) } - return "", data, nil + return modfile.ModulePath(content), nil } func isGoBuiltins(name string) bool { From 8f973f03f514c0df943f98f9a453bcadef06b576 Mon Sep 17 00:00:00 2001 From: acehinnnqru Date: Fri, 5 Dec 2025 12:08:07 +0800 Subject: [PATCH 3/4] chore(go): wrap error --- go.mod | 2 +- lang/golang/parser/parser.go | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 38a263d..58677e2 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.23.4 require ( github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible - github.com/bytedance/sonic v1.14.1 github.com/cloudwego/eino v0.3.52 github.com/cloudwego/eino-ext/components/model/ark v0.1.16 github.com/cloudwego/eino-ext/components/model/claude v0.1.1 @@ -43,6 +42,7 @@ require ( github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.14.1 // indirect github.com/bytedance/sonic/loader v0.3.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect diff --git a/lang/golang/parser/parser.go b/lang/golang/parser/parser.go index 81a98a8..3e9f81d 100644 --- a/lang/golang/parser/parser.go +++ b/lang/golang/parser/parser.go @@ -99,10 +99,12 @@ func (p *GoParser) collectGoMods(startDir string) error { if err != nil || !strings.HasSuffix(path, "go.mod") { return nil } - name, _, err := getModuleName(path) + + name, err := getModuleName(path) if err != nil { - return err + return fmt.Errorf("failed to get module name: %s", err.Error()) } + rel, err := filepath.Rel(p.homePageDir, filepath.Dir(path)) if err != nil { return fmt.Errorf("module path %v is not in the repo", path) From b2d0c5b776e45d3a9092614b31f8fd537f95e48a Mon Sep 17 00:00:00 2001 From: acehinnnqru Date: Fri, 5 Dec 2025 13:00:50 +0800 Subject: [PATCH 4/4] chore(go): use %w to wrap error instead of %s --- lang/golang/parser/parser.go | 2 +- lang/golang/parser/utils.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lang/golang/parser/parser.go b/lang/golang/parser/parser.go index 3e9f81d..a236472 100644 --- a/lang/golang/parser/parser.go +++ b/lang/golang/parser/parser.go @@ -102,7 +102,7 @@ func (p *GoParser) collectGoMods(startDir string) error { name, err := getModuleName(path) if err != nil { - return fmt.Errorf("failed to get module name: %s", err.Error()) + return fmt.Errorf("failed to get module name: %w", err) } rel, err := filepath.Rel(p.homePageDir, filepath.Dir(path)) diff --git a/lang/golang/parser/utils.go b/lang/golang/parser/utils.go index d21107f..23910b6 100644 --- a/lang/golang/parser/utils.go +++ b/lang/golang/parser/utils.go @@ -167,7 +167,7 @@ func hasNoDeps(modFilePath string) bool { func getModuleName(modFilePath string) (string, error) { content, err := os.ReadFile(modFilePath) if err != nil { - return "", fmt.Errorf("failed to read file: %s", err.Error()) + return "", fmt.Errorf("failed to read file: %w", err) } return modfile.ModulePath(content), nil