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 f5940c9..a236472 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: %w", err) } + rel, err := filepath.Rel(p.homePageDir, filepath.Dir(path)) if err != nil { return fmt.Errorf("module path %v is not in the repo", path) @@ -154,6 +156,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..23910b6 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" @@ -32,6 +29,7 @@ import ( "github.com/Knetic/govaluate" . "github.com/cloudwego/abcoder/lang/uniast" + "golang.org/x/mod/modfile" ) func shouldIgnoreDir(path string) bool { @@ -152,33 +150,27 @@ func getPackageAlias(importPath string) string { return alias } -func getModuleName(modFilePath string) (string, []byte, error) { - file, err := os.Open(modFilePath) +func hasNoDeps(modFilePath string) bool { + content, err := os.ReadFile(modFilePath) if err != nil { - return "", nil, fmt.Errorf("failed to open file: %v", err) + return false } - 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: %w", err) } - return "", data, nil + return modfile.ModulePath(content), nil } func isGoBuiltins(name string) bool {