diff options
| author | Josh Bleecher Snyder <josh@tailscale.com> | 2021-09-16 16:24:50 -0700 |
|---|---|---|
| committer | Josh Bleecher Snyder <josharian@gmail.com> | 2021-09-17 16:46:08 -0700 |
| commit | d8a8f700007a67fc369af17c1e4c157754436977 (patch) | |
| tree | 53478f9b660e302ec9a700f5024d2e66299d699e /util/codegen/codegen.go | |
| parent | 367a973dc224910a4e31ed58a0a961076c280e8a (diff) | |
| download | tailscale-d8a8f700007a67fc369af17c1e4c157754436977.tar.xz tailscale-d8a8f700007a67fc369af17c1e4c157754436977.zip | |
util/codegen: add NamedTypes
And use it in cmd/cloner.
Signed-off-by: Josh Bleecher Snyder <josh@tailscale.com>
Diffstat (limited to 'util/codegen/codegen.go')
| -rw-r--r-- | util/codegen/codegen.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/util/codegen/codegen.go b/util/codegen/codegen.go index 95302440b..013170735 100644 --- a/util/codegen/codegen.go +++ b/util/codegen/codegen.go @@ -8,9 +8,13 @@ package codegen import ( "bytes" "fmt" + "go/ast" "go/format" + "go/token" "go/types" "os" + + "golang.org/x/tools/go/packages" ) // WriteFormatted writes code to path. @@ -41,6 +45,32 @@ func WriteFormatted(code []byte, path string) error { return nil } +// NamedTypes returns all named types in pkg, keyed by their type name. +func NamedTypes(pkg *packages.Package) map[string]*types.Named { + nt := make(map[string]*types.Named) + for _, file := range pkg.Syntax { + for _, d := range file.Decls { + decl, ok := d.(*ast.GenDecl) + if !ok || decl.Tok != token.TYPE { + continue + } + for _, s := range decl.Specs { + spec, ok := s.(*ast.TypeSpec) + if !ok { + continue + } + typeNameObj := pkg.TypesInfo.Defs[spec.Name] + typ, ok := typeNameObj.Type().(*types.Named) + if !ok { + continue + } + nt[spec.Name.Name] = typ + } + } + } + return nt +} + // AssertStructUnchanged generates code that asserts at compile time that type t is unchanged. // tname is the named type corresponding to t. // ctx is a single-word context for this assertion, such as "Clone". |
