cmd/viewer: add flag to support Clone generation without Views

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2022-08-17 16:56:56 -05:00 committed by Brad Fitzpatrick
parent 9ae1161e85
commit 0de66386d4
4 changed files with 32 additions and 2 deletions

View File

@ -10,7 +10,7 @@
"net/netip"
)
//go:generate go run tailscale.com/cmd/viewer --type=StructWithPtrs,StructWithoutPtrs,Map,StructWithSlices
//go:generate go run tailscale.com/cmd/viewer --type=StructWithPtrs,StructWithoutPtrs,Map,StructWithSlices,OnlyGetClone --clone-only-type=OnlyGetClone
type StructWithoutPtrs struct {
Int int
@ -58,3 +58,7 @@ type StructWithSlices struct {
Prefixes []netip.Prefix
Data []byte
}
type OnlyGetClone struct {
SinViewerPorFavor bool
}

View File

@ -196,3 +196,19 @@ func (src *StructWithSlices) Clone() *StructWithSlices {
Prefixes []netip.Prefix
Data []byte
}{})
// Clone makes a deep copy of OnlyGetClone.
// The result aliases no memory with the original.
func (src *OnlyGetClone) Clone() *OnlyGetClone {
if src == nil {
return nil
}
dst := new(OnlyGetClone)
*dst = *src
return dst
}
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
var _OnlyGetCloneCloneNeedsRegeneration = OnlyGetClone(struct {
SinViewerPorFavor bool
}{})

View File

@ -15,7 +15,7 @@
"tailscale.com/types/views"
)
//go:generate go run tailscale.com/cmd/cloner -clonefunc=false -type=StructWithPtrs,StructWithoutPtrs,Map,StructWithSlices
//go:generate go run tailscale.com/cmd/cloner -clonefunc=false -type=StructWithPtrs,StructWithoutPtrs,Map,StructWithSlices,OnlyGetClone
// View returns a readonly view of StructWithPtrs.
func (p *StructWithPtrs) View() StructWithPtrsView {

View File

@ -327,6 +327,8 @@ func genView(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named, thi
flagTypes = flag.String("type", "", "comma-separated list of types; required")
flagBuildTags = flag.String("tags", "", "compiler build tags to apply")
flagCloneFunc = flag.Bool("clonefunc", false, "add a top-level Clone func")
flagCloneOnlyTypes = flag.String("clone-only-type", "", "comma-separated list of types (a subset of --type) that should only generate a go:generate clone line and not actual views")
)
func main() {
@ -353,10 +355,18 @@ func main() {
}
it := codegen.NewImportTracker(pkg.Types)
cloneOnlyType := map[string]bool{}
for _, t := range strings.Split(*flagCloneOnlyTypes, ",") {
cloneOnlyType[t] = true
}
buf := new(bytes.Buffer)
fmt.Fprintf(buf, "//go:generate go run tailscale.com/cmd/cloner %s\n\n", strings.Join(flagArgs, " "))
runCloner := false
for _, typeName := range typeNames {
if cloneOnlyType[typeName] {
continue
}
typ, ok := namedTypes[typeName]
if !ok {
log.Fatalf("could not find type %s", typeName)