github.com/april1989/origin-go-tools@v0.0.32/cmd/guru/serial/serial.go (about)

     1  // Copyright 2013 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 serial defines the guru's schema for -json output.
     6  //
     7  // The output of a guru query is a stream of one or more JSON objects.
     8  // This table shows the types of objects in the result stream for each
     9  // query type.
    10  //
    11  //      Query      Result stream
    12  //      -----      -------------
    13  //      callees    Callees
    14  //      callers    Caller ...
    15  //      callstack  CallStack
    16  //      definition Definition
    17  //      describe   Describe
    18  //      freevars   FreeVar ...
    19  //      implements Implements
    20  //      peers      Peers
    21  //      pointsto   PointsTo ...
    22  //      referrers  ReferrersInitial ReferrersPackage ...
    23  //      what       What
    24  //      whicherrs  WhichErrs
    25  //
    26  // All 'pos' strings in the output are of the form "file:line:col",
    27  // where line is the 1-based line number and col is the 1-based byte index.
    28  package serial
    29  
    30  // A Peers is the result of a 'peers' query.
    31  // If Allocs is empty, the selected channel can't point to anything.
    32  type Peers struct {
    33  	Pos      string   `json:"pos"`                // location of the selected channel op (<-)
    34  	Type     string   `json:"type"`               // type of the selected channel
    35  	Allocs   []string `json:"allocs,omitempty"`   // locations of aliased make(chan) ops
    36  	Sends    []string `json:"sends,omitempty"`    // locations of aliased ch<-x ops
    37  	Receives []string `json:"receives,omitempty"` // locations of aliased <-ch ops
    38  	Closes   []string `json:"closes,omitempty"`   // locations of aliased close(ch) ops
    39  }
    40  
    41  // A "referrers" query emits a ReferrersInitial object followed by zero or
    42  // more ReferrersPackage objects, one per package that contains a reference.
    43  type (
    44  	ReferrersInitial struct {
    45  		ObjPos string `json:"objpos,omitempty"` // location of the definition
    46  		Desc   string `json:"desc"`             // description of the denoted object
    47  	}
    48  	ReferrersPackage struct {
    49  		Package string `json:"package"`
    50  		Refs    []Ref  `json:"refs"` // non-empty list of references within this package
    51  	}
    52  	Ref struct {
    53  		Pos  string `json:"pos"`  // location of all references
    54  		Text string `json:"text"` // text of the referring line
    55  	}
    56  )
    57  
    58  // A Definition is the result of a 'definition' query.
    59  type Definition struct {
    60  	ObjPos string `json:"objpos,omitempty"` // location of the definition
    61  	Desc   string `json:"desc"`             // description of the denoted object
    62  }
    63  
    64  // A Callees is the result of a 'callees' query.
    65  //
    66  // Callees is nonempty unless the call was a dynamic call on a
    67  // provably nil func or interface value.
    68  type (
    69  	Callees struct {
    70  		Pos     string    `json:"pos"`  // location of selected call site
    71  		Desc    string    `json:"desc"` // description of call site
    72  		Callees []*Callee `json:"callees"`
    73  	}
    74  	Callee struct {
    75  		Name string `json:"name"` // full name of called function
    76  		Pos  string `json:"pos"`  // location of called function
    77  	}
    78  )
    79  
    80  // A Caller is one element of the slice returned by a 'callers' query.
    81  // (Callstack also contains a similar slice.)
    82  //
    83  // The root of the callgraph has an unspecified "Caller" string.
    84  type Caller struct {
    85  	Pos    string `json:"pos,omitempty"` // location of the calling function
    86  	Desc   string `json:"desc"`          // description of call site
    87  	Caller string `json:"caller"`        // full name of calling function
    88  }
    89  
    90  // A CallStack is the result of a 'callstack' query.
    91  // It indicates an arbitrary path from the root of the callgraph to
    92  // the query function.
    93  //
    94  // If the Callers slice is empty, the function was unreachable in this
    95  // analysis scope.
    96  type CallStack struct {
    97  	Pos     string   `json:"pos"`     // location of the selected function
    98  	Target  string   `json:"target"`  // the selected function
    99  	Callers []Caller `json:"callers"` // enclosing calls, innermost first.
   100  }
   101  
   102  // A FreeVar is one element of the slice returned by a 'freevars'
   103  // query.  Each one identifies an expression referencing a local
   104  // identifier defined outside the selected region.
   105  type FreeVar struct {
   106  	Pos  string `json:"pos"`  // location of the identifier's definition
   107  	Kind string `json:"kind"` // one of {var,func,type,const,label}
   108  	Ref  string `json:"ref"`  // referring expression (e.g. "x" or "x.y.z")
   109  	Type string `json:"type"` // type of the expression
   110  }
   111  
   112  // An Implements contains the result of an 'implements' query.
   113  // It describes the queried type, the set of named non-empty interface
   114  // types to which it is assignable, and the set of named/*named types
   115  // (concrete or non-empty interface) which may be assigned to it.
   116  //
   117  type Implements struct {
   118  	T                 ImplementsType   `json:"type,omitempty"`    // the queried type
   119  	AssignableTo      []ImplementsType `json:"to,omitempty"`      // types assignable to T
   120  	AssignableFrom    []ImplementsType `json:"from,omitempty"`    // interface types assignable from T
   121  	AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T
   122  
   123  	// The following fields are set only if the query was a method.
   124  	// Assignable{To,From,FromPtr}Method[i] is the corresponding
   125  	// method of type Assignable{To,From,FromPtr}[i], or blank
   126  	// {"",""} if that type lacks the method.
   127  	Method                  *DescribeMethod  `json:"method,omitempty"` //  the queried method
   128  	AssignableToMethod      []DescribeMethod `json:"to_method,omitempty"`
   129  	AssignableFromMethod    []DescribeMethod `json:"from_method,omitempty"`
   130  	AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"`
   131  }
   132  
   133  // An ImplementsType describes a single type as part of an 'implements' query.
   134  type ImplementsType struct {
   135  	Name string `json:"name"` // full name of the type
   136  	Pos  string `json:"pos"`  // location of its definition
   137  	Kind string `json:"kind"` // "basic", "array", etc
   138  }
   139  
   140  // A SyntaxNode is one element of a stack of enclosing syntax nodes in
   141  // a "what" query.
   142  type SyntaxNode struct {
   143  	Description string `json:"desc"`  // description of syntax tree
   144  	Start       int    `json:"start"` // start byte offset, 0-based
   145  	End         int    `json:"end"`   // end byte offset
   146  }
   147  
   148  // A What is the result of the "what" query, which quickly identifies
   149  // the selection, parsing only a single file.  It is intended for use
   150  // in low-latency GUIs.
   151  type What struct {
   152  	Enclosing  []SyntaxNode `json:"enclosing"`            // enclosing nodes of syntax tree
   153  	Modes      []string     `json:"modes"`                // query modes enabled for this selection.
   154  	SrcDir     string       `json:"srcdir,omitempty"`     // $GOROOT src directory containing queried package
   155  	ImportPath string       `json:"importpath,omitempty"` // import path of queried package
   156  	Object     string       `json:"object,omitempty"`     // name of identified object, if any
   157  	SameIDs    []string     `json:"sameids,omitempty"`    // locations of references to same object
   158  }
   159  
   160  // A PointsToLabel describes a pointer analysis label.
   161  //
   162  // A "label" is an object that may be pointed to by a pointer, map,
   163  // channel, 'func', slice or interface.  Labels include:
   164  //    - functions
   165  //    - globals
   166  //    - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s))
   167  //    - stack- and heap-allocated variables (including composite literals)
   168  //    - arrays allocated by append()
   169  //    - channels, maps and arrays created by make()
   170  //    - and their subelements, e.g. "alloc.y[*].z"
   171  //
   172  type PointsToLabel struct {
   173  	Pos  string `json:"pos"`  // location of syntax that allocated the object
   174  	Desc string `json:"desc"` // description of the label
   175  }
   176  
   177  // A PointsTo is one element of the result of a 'pointsto' query on an
   178  // expression.  It describes a single pointer: its type and the set of
   179  // "labels" it points to.
   180  //
   181  // If the pointer is of interface type, it will have one PTS entry
   182  // describing each concrete type that it may contain.  For each
   183  // concrete type that is a pointer, the PTS entry describes the labels
   184  // it may point to.  The same is true for reflect.Values, except the
   185  // dynamic types needn't be concrete.
   186  //
   187  type PointsTo struct {
   188  	Type    string          `json:"type"`              // (concrete) type of the pointer
   189  	NamePos string          `json:"namepos,omitempty"` // location of type defn, if Named
   190  	Labels  []PointsToLabel `json:"labels,omitempty"`  // pointed-to objects
   191  }
   192  
   193  // A DescribeValue is the additional result of a 'describe' query
   194  // if the selection indicates a value or expression.
   195  type DescribeValue struct {
   196  	Type     string       `json:"type"`               // type of the expression
   197  	Value    string       `json:"value,omitempty"`    // value of the expression, if constant
   198  	ObjPos   string       `json:"objpos,omitempty"`   // location of the definition, if an Ident
   199  	TypesPos []Definition `json:"typespos,omitempty"` // location of the named types, that type consist of
   200  }
   201  
   202  type DescribeMethod struct {
   203  	Name string `json:"name"` // method name, as defined by types.Selection.String()
   204  	Pos  string `json:"pos"`  // location of the method's definition
   205  }
   206  
   207  // A DescribeType is the additional result of a 'describe' query
   208  // if the selection indicates a type.
   209  type DescribeType struct {
   210  	Type    string           `json:"type"`              // the string form of the type
   211  	NamePos string           `json:"namepos,omitempty"` // location of definition of type, if named
   212  	NameDef string           `json:"namedef,omitempty"` // underlying definition of type, if named
   213  	Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type
   214  }
   215  
   216  type DescribeMember struct {
   217  	Name    string           `json:"name"`              // name of member
   218  	Type    string           `json:"type,omitempty"`    // type of member (underlying, if 'type')
   219  	Value   string           `json:"value,omitempty"`   // value of member (if 'const')
   220  	Pos     string           `json:"pos"`               // location of definition of member
   221  	Kind    string           `json:"kind"`              // one of {var,const,func,type}
   222  	Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type)
   223  }
   224  
   225  // A DescribePackage is the additional result of a 'describe' if
   226  // the selection indicates a package.
   227  type DescribePackage struct {
   228  	Path    string            `json:"path"`              // import path of the package
   229  	Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package
   230  }
   231  
   232  // A Describe is the result of a 'describe' query.
   233  // It may contain an element describing the selected semantic entity
   234  // in detail.
   235  type Describe struct {
   236  	Desc   string `json:"desc"`             // description of the selected syntax node
   237  	Pos    string `json:"pos"`              // location of the selected syntax node
   238  	Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "".
   239  
   240  	// At most one of the following fields is populated:
   241  	// the one specified by 'detail'.
   242  	Package *DescribePackage `json:"package,omitempty"`
   243  	Type    *DescribeType    `json:"type,omitempty"`
   244  	Value   *DescribeValue   `json:"value,omitempty"`
   245  }
   246  
   247  // A WhichErrs is the result of a 'whicherrs' query.
   248  // It contains the position of the queried error and the possible globals,
   249  // constants, and types it may point to.
   250  type WhichErrs struct {
   251  	ErrPos    string          `json:"errpos,omitempty"`    // location of queried error
   252  	Globals   []string        `json:"globals,omitempty"`   // locations of globals
   253  	Constants []string        `json:"constants,omitempty"` // locations of constants
   254  	Types     []WhichErrsType `json:"types,omitempty"`     // Types
   255  }
   256  
   257  type WhichErrsType struct {
   258  	Type     string `json:"type,omitempty"`
   259  	Position string `json:"position,omitempty"`
   260  }