| 1 | // Copyright 2014 The Go Authors. All rights reserved. |
|---|---|
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package typeutil_test |
| 6 | |
| 7 | import ( |
| 8 | "fmt" |
| 9 | "go/ast" |
| 10 | "go/parser" |
| 11 | "go/token" |
| 12 | "go/types" |
| 13 | "sort" |
| 14 | |
| 15 | "golang.org/x/tools/go/types/typeutil" |
| 16 | ) |
| 17 | |
| 18 | func ExampleMap() { |
| 19 | const source = `package P |
| 20 | |
| 21 | var X []string |
| 22 | var Y []string |
| 23 | |
| 24 | const p, q = 1.0, 2.0 |
| 25 | |
| 26 | func f(offset int32) (value byte, ok bool) |
| 27 | func g(rune) (uint8, bool) |
| 28 | ` |
| 29 | |
| 30 | // Parse and type-check the package. |
| 31 | fset := token.NewFileSet() |
| 32 | f, err := parser.ParseFile(fset, "P.go", source, 0) |
| 33 | if err != nil { |
| 34 | panic(err) |
| 35 | } |
| 36 | pkg, err := new(types.Config).Check("P", fset, []*ast.File{f}, nil) |
| 37 | if err != nil { |
| 38 | panic(err) |
| 39 | } |
| 40 | |
| 41 | scope := pkg.Scope() |
| 42 | |
| 43 | // Group names of package-level objects by their type. |
| 44 | var namesByType typeutil.Map // value is []string |
| 45 | for _, name := range scope.Names() { |
| 46 | T := scope.Lookup(name).Type() |
| 47 | |
| 48 | names, _ := namesByType.At(T).([]string) |
| 49 | names = append(names, name) |
| 50 | namesByType.Set(T, names) |
| 51 | } |
| 52 | |
| 53 | // Format, sort, and print the map entries. |
| 54 | var lines []string |
| 55 | namesByType.Iterate(func(T types.Type, names interface{}) { |
| 56 | lines = append(lines, fmt.Sprintf("%s %s", names, T)) |
| 57 | }) |
| 58 | sort.Strings(lines) |
| 59 | for _, line := range lines { |
| 60 | fmt.Println(line) |
| 61 | } |
| 62 | |
| 63 | // Output: |
| 64 | // [X Y] []string |
| 65 | // [f g] func(offset int32) (value byte, ok bool) |
| 66 | // [p q] untyped float |
| 67 | } |
| 68 |
Members