(pkg string, p toolExecParams)
| 160 | } |
| 161 | |
| 162 | func (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) |
no test coverage detected