github.com/flyinox/gosm@v0.0.0-20171117061539-16768cb62077/src/go/doc/doc.go (about)

     1  // Copyright 2009 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 doc extracts source code documentation from a Go AST.
     6  package doc
     7  
     8  import (
     9  	"go/ast"
    10  	"go/token"
    11  )
    12  
    13  // Package is the documentation for an entire package.
    14  type Package struct {
    15  	Doc        string
    16  	Name       string
    17  	ImportPath string
    18  	Imports    []string
    19  	Filenames  []string
    20  	Notes      map[string][]*Note
    21  
    22  	// Deprecated: For backward compatibility Bugs is still populated,
    23  	// but all new code should use Notes instead.
    24  	Bugs []string
    25  
    26  	// declarations
    27  	Consts []*Value
    28  	Types  []*Type
    29  	Vars   []*Value
    30  	Funcs  []*Func
    31  }
    32  
    33  // Value is the documentation for a (possibly grouped) var or const declaration.
    34  type Value struct {
    35  	Doc   string
    36  	Names []string // var or const names in declaration order
    37  	Decl  *ast.GenDecl
    38  
    39  	order int
    40  }
    41  
    42  // Type is the documentation for a type declaration.
    43  type Type struct {
    44  	Doc  string
    45  	Name string
    46  	Decl *ast.GenDecl
    47  
    48  	// associated declarations
    49  	Consts  []*Value // sorted list of constants of (mostly) this type
    50  	Vars    []*Value // sorted list of variables of (mostly) this type
    51  	Funcs   []*Func  // sorted list of functions returning this type
    52  	Methods []*Func  // sorted list of methods (including embedded ones) of this type
    53  }
    54  
    55  // Func is the documentation for a func declaration.
    56  type Func struct {
    57  	Doc  string
    58  	Name string
    59  	Decl *ast.FuncDecl
    60  
    61  	// methods
    62  	// (for functions, these fields have the respective zero value)
    63  	Recv  string // actual   receiver "T" or "*T"
    64  	Orig  string // original receiver "T" or "*T"
    65  	Level int    // embedding level; 0 means not embedded
    66  }
    67  
    68  // A Note represents a marked comment starting with "MARKER(uid): note body".
    69  // Any note with a marker of 2 or more upper case [A-Z] letters and a uid of
    70  // at least one character is recognized. The ":" following the uid is optional.
    71  // Notes are collected in the Package.Notes map indexed by the notes marker.
    72  type Note struct {
    73  	Pos, End token.Pos // position range of the comment containing the marker
    74  	UID      string    // uid found with the marker
    75  	Body     string    // note body text
    76  }
    77  
    78  // Mode values control the operation of New.
    79  type Mode int
    80  
    81  const (
    82  	// extract documentation for all package-level declarations,
    83  	// not just exported ones
    84  	AllDecls Mode = 1 << iota
    85  
    86  	// show all embedded methods, not just the ones of
    87  	// invisible (unexported) anonymous fields
    88  	AllMethods
    89  )
    90  
    91  // New computes the package documentation for the given package AST.
    92  // New takes ownership of the AST pkg and may edit or overwrite it.
    93  //
    94  func New(pkg *ast.Package, importPath string, mode Mode) *Package {
    95  	var r reader
    96  	r.readPackage(pkg, mode)
    97  	r.computeMethodSets()
    98  	r.cleanupTypes()
    99  	return &Package{
   100  		Doc:        r.doc,
   101  		Name:       pkg.Name,
   102  		ImportPath: importPath,
   103  		Imports:    sortedKeys(r.imports),
   104  		Filenames:  r.filenames,
   105  		Notes:      r.notes,
   106  		Bugs:       noteBodies(r.notes["BUG"]),
   107  		Consts:     sortedValues(r.values, token.CONST),
   108  		Types:      sortedTypes(r.types, mode&AllMethods != 0),
   109  		Vars:       sortedValues(r.values, token.VAR),
   110  		Funcs:      sortedFuncs(r.funcs, true),
   111  	}
   112  }