Skip to content

Commit 9b0fc8a

Browse files
erudenkoclaude
andauthored
perf(codegen): replace source importer with gcexportdata for ~1000x faster type resolution (MadAppGang#58)
* perf(codegen): replace source importer with gcexportdata for ~1000x faster type resolution The type resolver previously used importer.ForCompiler("source") which recursively parses all transitive dependencies from .go source files. For large dependency graphs (e.g., Cosmos SDK), this took 15+ minutes. Now uses gcexportdata to read pre-compiled type data from Go's build cache via `go list -export -deps`. Benchmarks show: - go list -export -deps: ~42ms (finds all dependency export files) - gcexportdata.Read() for all deps: ~23ms - Cached (second call, same process): 750ns The gcExportImporter also caches `go list` results across multiple NewTypeResolver calls, eliminating the duplicate invocation between Phase 0 (semantic validation) and Step 2.1 (error propagation). Falls back to source importer if `go list -export` fails. Addresses MadAppGang#38 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(codegen): remove GOFLAGS clearing and capture go list stderr Review feedback from 6-model team review: - Remove GOFLAGS= override that broke vendor mode projects - Capture go list stderr for better error diagnostics - File descriptor leak was a false positive (os.Open error IS checked before defer f.Close() is registered) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 50826b2 commit 9b0fc8a

1 file changed

Lines changed: 4 additions & 2 deletions

File tree

pkg/codegen/gc_export_importer.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,13 @@ func NewGCExportImporter(fset *token.FileSet, workingDir string, patterns ...str
106106

107107
cmd := exec.Command("go", args...)
108108
cmd.Dir = workingDir
109-
cmd.Env = append(os.Environ(), "GOFLAGS=") // Clear GOFLAGS to avoid interference
109+
110+
var stderr bytes.Buffer
111+
cmd.Stderr = &stderr
110112

111113
output, err := cmd.Output()
112114
if err != nil {
113-
return nil, fmt.Errorf("gcExportImporter: go list failed: %w", err)
115+
return nil, fmt.Errorf("gcExportImporter: go list failed: %w (stderr: %s)", err, stderr.String())
114116
}
115117

116118
// Parse the streaming JSON output (one object per package, NOT a JSON array)

0 commit comments

Comments
 (0)