| // Copyright 2013 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 serial defines the guru's schema for -json output. |
| // |
| // The output of a guru query is a stream of one or more JSON objects. |
| // This table shows the types of objects in the result stream for each |
| // query type. |
| // |
| // Query Result stream |
| // ----- ------------- |
| // callees Callees |
| // callers Caller ... |
| // callstack CallStack |
| // definition Definition |
| // describe Describe |
| // freevars FreeVar ... |
| // implements Implements |
| // peers Peers |
| // pointsto PointsTo ... |
| // referrers ReferrersInitial ReferrersPackage ... |
| // what What |
| // whicherrs WhichErrs |
| // |
| // All 'pos' strings in the output are of the form "file:line:col", |
| // where line is the 1-based line number and col is the 1-based byte index. |
| package serial |
| |
| // A Peers is the result of a 'peers' query. |
| // If Allocs is empty, the selected channel can't point to anything. |
| type Peers struct { |
| Pos string `json:"pos"` // location of the selected channel op (<-) |
| Type string `json:"type"` // type of the selected channel |
| Allocs []string `json:"allocs,omitempty"` // locations of aliased make(chan) ops |
| Sends []string `json:"sends,omitempty"` // locations of aliased ch<-x ops |
| Receives []string `json:"receives,omitempty"` // locations of aliased <-ch ops |
| Closes []string `json:"closes,omitempty"` // locations of aliased close(ch) ops |
| } |
| |
| // A "referrers" query emits a ReferrersInitial object followed by zero or |
| // more ReferrersPackage objects, one per package that contains a reference. |
| type ( |
| ReferrersInitial struct { |
| ObjPos string `json:"objpos,omitempty"` // location of the definition |
| Desc string `json:"desc"` // description of the denoted object |
| } |
| ReferrersPackage struct { |
| Package string `json:"package"` |
| Refs []Ref `json:"refs"` // non-empty list of references within this package |
| } |
| Ref struct { |
| Pos string `json:"pos"` // location of all references |
| Text string `json:"text"` // text of the referring line |
| } |
| ) |
| |
| // A Definition is the result of a 'definition' query. |
| type Definition struct { |
| ObjPos string `json:"objpos,omitempty"` // location of the definition |
| Desc string `json:"desc"` // description of the denoted object |
| } |
| |
| // A Callees is the result of a 'callees' query. |
| // |
| // Callees is nonempty unless the call was a dynamic call on a |
| // provably nil func or interface value. |
| type ( |
| Callees struct { |
| Pos string `json:"pos"` // location of selected call site |
| Desc string `json:"desc"` // description of call site |
| Callees []*Callee `json:"callees"` |
| } |
| Callee struct { |
| Name string `json:"name"` // full name of called function |
| Pos string `json:"pos"` // location of called function |
| } |
| ) |
| |
| // A Caller is one element of the slice returned by a 'callers' query. |
| // (Callstack also contains a similar slice.) |
| // |
| // The root of the callgraph has an unspecified "Caller" string. |
| type Caller struct { |
| Pos string `json:"pos,omitempty"` // location of the calling function |
| Desc string `json:"desc"` // description of call site |
| Caller string `json:"caller"` // full name of calling function |
| } |
| |
| // A CallStack is the result of a 'callstack' query. |
| // It indicates an arbitrary path from the root of the callgraph to |
| // the query function. |
| // |
| // If the Callers slice is empty, the function was unreachable in this |
| // analysis scope. |
| type CallStack struct { |
| Pos string `json:"pos"` // location of the selected function |
| Target string `json:"target"` // the selected function |
| Callers []Caller `json:"callers"` // enclosing calls, innermost first. |
| } |
| |
| // A FreeVar is one element of the slice returned by a 'freevars' |
| // query. Each one identifies an expression referencing a local |
| // identifier defined outside the selected region. |
| type FreeVar struct { |
| Pos string `json:"pos"` // location of the identifier's definition |
| Kind string `json:"kind"` // one of {var,func,type,const,label} |
| Ref string `json:"ref"` // referring expression (e.g. "x" or "x.y.z") |
| Type string `json:"type"` // type of the expression |
| } |
| |
| // An Implements contains the result of an 'implements' query. |
| // It describes the queried type, the set of named non-empty interface |
| // types to which it is assignable, and the set of named/*named types |
| // (concrete or non-empty interface) which may be assigned to it. |
| type Implements struct { |
| T ImplementsType `json:"type,omitempty"` // the queried type |
| AssignableTo []ImplementsType `json:"to,omitempty"` // types assignable to T |
| AssignableFrom []ImplementsType `json:"from,omitempty"` // interface types assignable from T |
| AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T |
| |
| // The following fields are set only if the query was a method. |
| // Assignable{To,From,FromPtr}Method[i] is the corresponding |
| // method of type Assignable{To,From,FromPtr}[i], or blank |
| // {"",""} if that type lacks the method. |
| Method *DescribeMethod `json:"method,omitempty"` // the queried method |
| AssignableToMethod []DescribeMethod `json:"to_method,omitempty"` |
| AssignableFromMethod []DescribeMethod `json:"from_method,omitempty"` |
| AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"` |
| } |
| |
| // An ImplementsType describes a single type as part of an 'implements' query. |
| type ImplementsType struct { |
| Name string `json:"name"` // full name of the type |
| Pos string `json:"pos"` // location of its definition |
| Kind string `json:"kind"` // "basic", "array", etc |
| } |
| |
| // A SyntaxNode is one element of a stack of enclosing syntax nodes in |
| // a "what" query. |
| type SyntaxNode struct { |
| Description string `json:"desc"` // description of syntax tree |
| Start int `json:"start"` // start byte offset, 0-based |
| End int `json:"end"` // end byte offset |
| } |
| |
| // A What is the result of the "what" query, which quickly identifies |
| // the selection, parsing only a single file. It is intended for use |
| // in low-latency GUIs. |
| type What struct { |
| Enclosing []SyntaxNode `json:"enclosing"` // enclosing nodes of syntax tree |
| Modes []string `json:"modes"` // query modes enabled for this selection. |
| SrcDir string `json:"srcdir,omitempty"` // $GOROOT src directory containing queried package |
| ImportPath string `json:"importpath,omitempty"` // import path of queried package |
| Object string `json:"object,omitempty"` // name of identified object, if any |
| SameIDs []string `json:"sameids,omitempty"` // locations of references to same object |
| } |
| |
| // A PointsToLabel describes a pointer analysis label. |
| // |
| // A "label" is an object that may be pointed to by a pointer, map, |
| // channel, 'func', slice or interface. Labels include: |
| // - functions |
| // - globals |
| // - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s)) |
| // - stack- and heap-allocated variables (including composite literals) |
| // - arrays allocated by append() |
| // - channels, maps and arrays created by make() |
| // - and their subelements, e.g. "alloc.y[*].z" |
| type PointsToLabel struct { |
| Pos string `json:"pos"` // location of syntax that allocated the object |
| Desc string `json:"desc"` // description of the label |
| } |
| |
| // A PointsTo is one element of the result of a 'pointsto' query on an |
| // expression. It describes a single pointer: its type and the set of |
| // "labels" it points to. |
| // |
| // If the pointer is of interface type, it will have one PTS entry |
| // describing each concrete type that it may contain. For each |
| // concrete type that is a pointer, the PTS entry describes the labels |
| // it may point to. The same is true for reflect.Values, except the |
| // dynamic types needn't be concrete. |
| type PointsTo struct { |
| Type string `json:"type"` // (concrete) type of the pointer |
| NamePos string `json:"namepos,omitempty"` // location of type defn, if Named |
| Labels []PointsToLabel `json:"labels,omitempty"` // pointed-to objects |
| } |
| |
| // A DescribeValue is the additional result of a 'describe' query |
| // if the selection indicates a value or expression. |
| type DescribeValue struct { |
| Type string `json:"type"` // type of the expression |
| Value string `json:"value,omitempty"` // value of the expression, if constant |
| ObjPos string `json:"objpos,omitempty"` // location of the definition, if an Ident |
| TypesPos []Definition `json:"typespos,omitempty"` // location of the named types, that type consist of |
| } |
| |
| type DescribeMethod struct { |
| Name string `json:"name"` // method name, as defined by types.Selection.String() |
| Pos string `json:"pos"` // location of the method's definition |
| } |
| |
| // A DescribeType is the additional result of a 'describe' query |
| // if the selection indicates a type. |
| type DescribeType struct { |
| Type string `json:"type"` // the string form of the type |
| NamePos string `json:"namepos,omitempty"` // location of definition of type, if named |
| NameDef string `json:"namedef,omitempty"` // underlying definition of type, if named |
| Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type |
| } |
| |
| type DescribeMember struct { |
| Name string `json:"name"` // name of member |
| Type string `json:"type,omitempty"` // type of member (underlying, if 'type') |
| Value string `json:"value,omitempty"` // value of member (if 'const') |
| Pos string `json:"pos"` // location of definition of member |
| Kind string `json:"kind"` // one of {var,const,func,type} |
| Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type) |
| } |
| |
| // A DescribePackage is the additional result of a 'describe' if |
| // the selection indicates a package. |
| type DescribePackage struct { |
| Path string `json:"path"` // import path of the package |
| Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package |
| } |
| |
| // A Describe is the result of a 'describe' query. |
| // It may contain an element describing the selected semantic entity |
| // in detail. |
| type Describe struct { |
| Desc string `json:"desc"` // description of the selected syntax node |
| Pos string `json:"pos"` // location of the selected syntax node |
| Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "". |
| |
| // At most one of the following fields is populated: |
| // the one specified by 'detail'. |
| Package *DescribePackage `json:"package,omitempty"` |
| Type *DescribeType `json:"type,omitempty"` |
| Value *DescribeValue `json:"value,omitempty"` |
| } |
| |
| // A WhichErrs is the result of a 'whicherrs' query. |
| // It contains the position of the queried error and the possible globals, |
| // constants, and types it may point to. |
| type WhichErrs struct { |
| ErrPos string `json:"errpos,omitempty"` // location of queried error |
| Globals []string `json:"globals,omitempty"` // locations of globals |
| Constants []string `json:"constants,omitempty"` // locations of constants |
| Types []WhichErrsType `json:"types,omitempty"` // Types |
| } |
| |
| type WhichErrsType struct { |
| Type string `json:"type,omitempty"` |
| Position string `json:"position,omitempty"` |
| } |