MCPcopy Create free account
hub / github.com/bracesdev/errtrace / rewriteCompile

Method rewriteCompile

cmd/errtrace/toolexec.go:162–236  ·  view source on GitHub ↗
(pkg string, p toolExecParams)

Source from the content-addressed store, hash-verified

160}
161
162func (cmd *mainCmd) rewriteCompile(pkg string, p toolExecParams) (exitCode int, _ error) {
163 var canRewrite, needRewrite bool
164 parsed := make(map[string]parsedFile)
165 for _, arg := range p.ToolArgs {
166 if !isGoFile(arg) {
167 continue
168 }
169
170 contents, err := os.ReadFile(arg)
171 if err != nil {
172 return -1, errtrace.Wrap(err)
173 }
174
175 f, err := cmd.parseFile(arg, contents, rewriteOpts{})
176 if err != nil {
177 return -1, errtrace.Wrap(err)
178 }
179 parsed[arg] = f
180
181 // TODO: Support an "unsafe" mode to rewrite packages without errtrace imports.
182 if f.importsErrtrace {
183 canRewrite = true
184 }
185 if len(f.inserts) > 0 {
186 needRewrite = true
187 }
188 }
189
190 if !needRewrite {
191 return cmd.runOriginal(p), nil
192 }
193
194 if !canRewrite {
195 if p.requiredPackage(pkg) {
196 logf(cmd.Stderr, "errtrace required package %v missing errtrace import, needs rewrite", pkg)
197 return 1, nil
198 }
199 return cmd.runOriginal(p), nil
200 }
201
202 // Use a temporary directory per-package that is rewritten.
203 tempDir, err := os.MkdirTemp("", filepath.Base(pkg))
204 if err != nil {
205 return -1, errtrace.Wrap(err)
206 }
207 defer os.RemoveAll(tempDir) //nolint:errcheck // best-effort removal of temp files.
208
209 newArgs := make([]string, 0, len(p.ToolArgs))
210 for _, arg := range p.ToolArgs {
211 f, ok := parsed[arg]
212 if !ok || len(f.inserts) == 0 {
213 newArgs = append(newArgs, arg)
214 continue
215 }
216
217 // Add a //line directive so the original filepath is used in errors and panics.
218 var out bytes.Buffer
219 _, _ = fmt.Fprintf(&out, "//line %v:1\n", arg)

Callers 1

toolExecRewriteMethod · 0.95

Calls 7

parseFileMethod · 0.95
runOriginalMethod · 0.95
rewriteFileMethod · 0.95
WrapFunction · 0.92
isGoFileFunction · 0.85
logfFunction · 0.85
requiredPackageMethod · 0.80

Tested by

no test coverage detected