Skip to content

Commit 3ff8c54

Browse files
fix: handle return values in generate-nodebug
This basically matched the existing nodebug version of gserver/component, modulo generated comments.
1 parent 34985c4 commit 3ff8c54

File tree

4 files changed

+111
-5
lines changed

4 files changed

+111
-5
lines changed

gassert/cmd/generate-nodebug/main.go

+32-3
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,19 @@ package %s`, srcName, f.Name.Name)
159159
if err := printer.Fprint(w, fset, fd); err != nil {
160160
return err
161161
}
162-
// We fully removed the function body, so now put empty braces in place.
163-
if _, err := io.WriteString(w, " {}"); err != nil {
164-
return err
162+
// We fully removed the function body.
163+
// Whether we leave the body empty or put a naked return,
164+
// depends on whether the function has any return values.
165+
if fd.Type.Results == nil {
166+
if _, err := io.WriteString(w, " {}"); err != nil {
167+
return err
168+
}
169+
} else {
170+
// There are results, but we can already be sure they are named,
171+
// so a naked return suffices here.
172+
if _, err := io.WriteString(w, " {\n\treturn\n}"); err != nil {
173+
return err
174+
}
165175
}
166176
}
167177

@@ -188,6 +198,25 @@ func stripFunction(fd *ast.FuncDecl) {
188198
}
189199
}
190200

201+
// We don't modify the params at all.
202+
// If they are named, we keep the names for readability,
203+
// and if not, we don't care.
204+
205+
if fd.Type.Results != nil {
206+
for _, field := range fd.Type.Results.List {
207+
// Zero-length names means the return value is unnamed.
208+
// That is the only time we want to replace the name with an underscore,
209+
// in order to use a naked return.
210+
// Otherwise we keep the existing names.
211+
if len(field.Names) == 0 {
212+
field.Names = []*ast.Ident{
213+
// We aren't marking the position, but it seems to work fine.
214+
&ast.Ident{Name: "_"},
215+
}
216+
}
217+
}
218+
}
219+
191220
// TODO: there are probably comments that would currently leak through,
192221
// if they are next to fd.Type.TypeParams or fd.Type.Results.
193222
}

gassert/cmd/generate-nodebug/main_test.go

+75
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,78 @@ func invariantThirdParty(a pkg1.A) {}
296296

297297
require.Equal(t, exp, out.String())
298298
}
299+
300+
func TestRewriteSource_functionsWithReturnValues(t *testing.T) {
301+
t.Parallel()
302+
303+
src := []byte(`//go:build debug
304+
305+
package pathological
306+
307+
import (
308+
"io"
309+
"errors"
310+
311+
"example.com/pkg1"
312+
"example.com/pkg2"
313+
)
314+
315+
func invariantReaderNamedReturns(r io.Reader) (n int, err error) {
316+
return 1, errors.New("uh oh")
317+
}
318+
319+
func invariantReaderUnnamedReturns(r io.Reader) (int, error) {
320+
return 2, nil
321+
}
322+
323+
func invariantMultipleUnnamedReturnsSameType() (string, string, string) {
324+
return "", "", ""
325+
}
326+
327+
func invariantMultipleNamedReturnsSameType() (a, b uint) {
328+
return 10, 20
329+
}
330+
331+
func invariantWriterBareSingleReturn(w io.Writer) pkg1.A {
332+
return pkg2.DoSomething(w)
333+
}
334+
`)
335+
336+
var out bytes.Buffer
337+
require.NoError(t, RewriteSource("r_debug.go", src, &out))
338+
339+
exp := `//go:build !debug
340+
341+
// Code generated by github.com/rollchains/gordian/gassert/cmd/generate-nodebug r_debug.go; DO NOT EDIT.
342+
343+
package pathological
344+
345+
import (
346+
"io"
347+
348+
"example.com/pkg1"
349+
)
350+
351+
func invariantReaderNamedReturns(r io.Reader) (n int, err error) {
352+
return
353+
}
354+
355+
func invariantReaderUnnamedReturns(r io.Reader) (_ int, _ error) {
356+
return
357+
}
358+
359+
func invariantMultipleUnnamedReturnsSameType() (_ string, _ string, _ string) {
360+
return
361+
}
362+
363+
func invariantMultipleNamedReturnsSameType() (a, b uint) {
364+
return
365+
}
366+
367+
func invariantWriterBareSingleReturn(w io.Writer) (_ pkg1.A) {
368+
return
369+
}
370+
`
371+
372+
require.Equal(t, exp, out.String())
373+
}

gcosmos/gserver/component.go

+2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ import (
4040
"github.com/spf13/viper"
4141
)
4242

43+
//go:generate go run github.com/rollchains/gordian/gassert/cmd/generate-nodebug component_debug.go
44+
4345
// The various interfaces we expect a Component to satisfy.
4446
var (
4547
_ serverv2.ServerComponent[transaction.Tx] = (*Component)(nil)

gcosmos/gserver/component_nodebug.go

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)