diff --git a/cmd/gtrace/writer.go b/cmd/gtrace/writer.go index 83acefd..351c6dc 100644 --- a/cmd/gtrace/writer.go +++ b/cmd/gtrace/writer.go @@ -173,6 +173,9 @@ func (w *Writer) typeImports(dst []dep, t types.Type) []dep { if p, ok := t.(*types.Pointer); ok { return w.typeImports(dst, p.Elem()) } + if p, ok := t.(*types.Slice); ok { + return w.typeImports(dst, p.Elem()) + } n, ok := t.(*types.Named) if !ok { return dst diff --git a/test/test_imports_pointer.go b/test/test_imports_pointer.go new file mode 100644 index 0000000..35f3ffe --- /dev/null +++ b/test/test_imports_pointer.go @@ -0,0 +1,13 @@ +package test + +import "github.com/gobwas/gtrace/test/internal" + +//go:generate gtrace -v + +//gtrace:gen +//gtrace:set shortcut +// NOTE: must compile without unused imports error. +type TracePointer struct { + OnSomethingA func(Type) + OnSomethingB func(*internal.Type) +} diff --git a/test/test_imports_pointer_gtrace.go b/test/test_imports_pointer_gtrace.go new file mode 100644 index 0000000..8554eb9 --- /dev/null +++ b/test/test_imports_pointer_gtrace.go @@ -0,0 +1,68 @@ +// Code generated by gtrace. DO NOT EDIT. + +package test + +import ( + "bytes" + + "github.com/gobwas/gtrace/test/internal" +) + +// Compose returns a new TracePointer which has functional fields composed +// both from t and x. +func (t TracePointer) Compose(x TracePointer) (ret TracePointer) { + switch { + case t.OnSomethingA == nil: + ret.OnSomethingA = x.OnSomethingA + case x.OnSomethingA == nil: + ret.OnSomethingA = t.OnSomethingA + default: + h1 := t.OnSomethingA + h2 := x.OnSomethingA + ret.OnSomethingA = func(t Type) { + h1(t) + h2(t) + } + } + switch { + case t.OnSomethingB == nil: + ret.OnSomethingB = x.OnSomethingB + case x.OnSomethingB == nil: + ret.OnSomethingB = t.OnSomethingB + default: + h1 := t.OnSomethingB + h2 := x.OnSomethingB + ret.OnSomethingB = func(t *internal.Type) { + h1(t) + h2(t) + } + } + return ret +} +func (t TracePointer) onSomethingA(t1 Type) { + fn := t.OnSomethingA + if fn == nil { + return + } + fn(t1) +} +func (t TracePointer) onSomethingB(t1 *internal.Type) { + fn := t.OnSomethingB + if fn == nil { + return + } + fn(t1) +} +func tracePointerOnSomethingA(t TracePointer, e Embeded, s string, integer int, boolean bool, e1 error, r bytes.Reader) { + var p Type + p.Embeded = e + p.String = s + p.Integer = integer + p.Boolean = boolean + p.Error = e1 + p.Reader = r + t.onSomethingA(p) +} +func tracePointerOnSomethingB(t TracePointer, t1 *internal.Type) { + t.onSomethingB(t1) +} diff --git a/test/test_imports_slice.go b/test/test_imports_slice.go new file mode 100644 index 0000000..74bbdd8 --- /dev/null +++ b/test/test_imports_slice.go @@ -0,0 +1,13 @@ +package test + +import "github.com/gobwas/gtrace/test/internal" + +//go:generate gtrace -v + +//gtrace:gen +//gtrace:set shortcut +// NOTE: must compile without unused imports error. +type TraceArray struct { + OnSomethingA func(Type) + OnSomethingB func([]internal.Type) +} diff --git a/test/test_imports_slice_gtrace.go b/test/test_imports_slice_gtrace.go new file mode 100644 index 0000000..cf4e997 --- /dev/null +++ b/test/test_imports_slice_gtrace.go @@ -0,0 +1,68 @@ +// Code generated by gtrace. DO NOT EDIT. + +package test + +import ( + "bytes" + + "github.com/gobwas/gtrace/test/internal" +) + +// Compose returns a new TraceArray which has functional fields composed +// both from t and x. +func (t TraceArray) Compose(x TraceArray) (ret TraceArray) { + switch { + case t.OnSomethingA == nil: + ret.OnSomethingA = x.OnSomethingA + case x.OnSomethingA == nil: + ret.OnSomethingA = t.OnSomethingA + default: + h1 := t.OnSomethingA + h2 := x.OnSomethingA + ret.OnSomethingA = func(t Type) { + h1(t) + h2(t) + } + } + switch { + case t.OnSomethingB == nil: + ret.OnSomethingB = x.OnSomethingB + case x.OnSomethingB == nil: + ret.OnSomethingB = t.OnSomethingB + default: + h1 := t.OnSomethingB + h2 := x.OnSomethingB + ret.OnSomethingB = func(t []internal.Type) { + h1(t) + h2(t) + } + } + return ret +} +func (t TraceArray) onSomethingA(t1 Type) { + fn := t.OnSomethingA + if fn == nil { + return + } + fn(t1) +} +func (t TraceArray) onSomethingB(t1 []internal.Type) { + fn := t.OnSomethingB + if fn == nil { + return + } + fn(t1) +} +func traceArrayOnSomethingA(t TraceArray, e Embeded, s string, integer int, boolean bool, e1 error, r bytes.Reader) { + var p Type + p.Embeded = e + p.String = s + p.Integer = integer + p.Boolean = boolean + p.Error = e1 + p.Reader = r + t.onSomethingA(p) +} +func traceArrayOnSomethingB(t TraceArray, t1 []internal.Type) { + t.onSomethingB(t1) +}