Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / go / types / typeutil / example_test.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/types/typeutil/example_test.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/go/types/typeutil/example_test.go
new file mode 100644 (file)
index 0000000..86c4d44
--- /dev/null
@@ -0,0 +1,67 @@
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package typeutil_test
+
+import (
+       "fmt"
+       "go/ast"
+       "go/parser"
+       "go/token"
+       "go/types"
+       "sort"
+
+       "golang.org/x/tools/go/types/typeutil"
+)
+
+func ExampleMap() {
+       const source = `package P
+
+var X []string
+var Y []string
+
+const p, q = 1.0, 2.0
+
+func f(offset int32) (value byte, ok bool)
+func g(rune) (uint8, bool)
+`
+
+       // Parse and type-check the package.
+       fset := token.NewFileSet()
+       f, err := parser.ParseFile(fset, "P.go", source, 0)
+       if err != nil {
+               panic(err)
+       }
+       pkg, err := new(types.Config).Check("P", fset, []*ast.File{f}, nil)
+       if err != nil {
+               panic(err)
+       }
+
+       scope := pkg.Scope()
+
+       // Group names of package-level objects by their type.
+       var namesByType typeutil.Map // value is []string
+       for _, name := range scope.Names() {
+               T := scope.Lookup(name).Type()
+
+               names, _ := namesByType.At(T).([]string)
+               names = append(names, name)
+               namesByType.Set(T, names)
+       }
+
+       // Format, sort, and print the map entries.
+       var lines []string
+       namesByType.Iterate(func(T types.Type, names interface{}) {
+               lines = append(lines, fmt.Sprintf("%s   %s", names, T))
+       })
+       sort.Strings(lines)
+       for _, line := range lines {
+               fmt.Println(line)
+       }
+
+       // Output:
+       // [X Y]   []string
+       // [f g]   func(offset int32) (value byte, ok bool)
+       // [p q]   untyped float
+}