gopkg.in/alecthomas/gometalinter.v3@v3.0.0/_linters/src/golang.org/x/tools/go/gcexportdata/main.go (about)

     1  // Copyright 2017 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  // +build ignore
     6  
     7  // The gcexportdata command is a diagnostic tool that displays the
     8  // contents of gc export data files.
     9  package main
    10  
    11  import (
    12  	"flag"
    13  	"fmt"
    14  	"go/token"
    15  	"go/types"
    16  	"log"
    17  	"os"
    18  
    19  	"golang.org/x/tools/go/gcexportdata"
    20  	"golang.org/x/tools/go/types/typeutil"
    21  )
    22  
    23  func main() {
    24  	log.SetPrefix("gcexportdata: ")
    25  	log.SetFlags(0)
    26  	flag.Usage = func() {
    27  		fmt.Fprintln(os.Stderr, "usage: gcexportdata file.a")
    28  	}
    29  	flag.Parse()
    30  	if flag.NArg() != 1 {
    31  		flag.Usage()
    32  		os.Exit(2)
    33  	}
    34  	filename := flag.Args()[0]
    35  
    36  	f, err := os.Open(filename)
    37  	if err != nil {
    38  		log.Fatal(err)
    39  	}
    40  
    41  	r, err := gcexportdata.NewReader(f)
    42  	if err != nil {
    43  		log.Fatalf("%s: %s", filename, err)
    44  	}
    45  
    46  	// Decode the package.
    47  	imports := make(map[string]*types.Package)
    48  	fset := token.NewFileSet()
    49  	pkg, err := gcexportdata.Read(r, fset, imports, "dummy")
    50  	if err != nil {
    51  		log.Fatal("%s: %s", filename, err)
    52  	}
    53  
    54  	// Print all package-level declarations, including non-exported ones.
    55  	fmt.Printf("package %s\n", pkg.Name())
    56  	for _, imp := range pkg.Imports() {
    57  		fmt.Printf("import %q\n", imp.Path())
    58  	}
    59  	qual := func(p *types.Package) string {
    60  		if pkg == p {
    61  			return ""
    62  		}
    63  		return p.Name()
    64  	}
    65  	scope := pkg.Scope()
    66  	for _, name := range scope.Names() {
    67  		obj := scope.Lookup(name)
    68  		fmt.Printf("%s: %s\n",
    69  			fset.Position(obj.Pos()),
    70  			types.ObjectString(obj, qual))
    71  
    72  		// For types, print each method.
    73  		if _, ok := obj.(*types.TypeName); ok {
    74  			for _, method := range typeutil.IntuitiveMethodSet(obj.Type(), nil) {
    75  				fmt.Printf("%s: %s\n",
    76  					fset.Position(method.Obj().Pos()),
    77  					types.SelectionString(method, qual))
    78  			}
    79  		}
    80  	}
    81  }