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 | type Implements struct { |
117 | T ImplementsType `json:"type,omitempty"` // the queried type |
118 | AssignableTo []ImplementsType `json:"to,omitempty"` // types assignable to T |
119 | AssignableFrom []ImplementsType `json:"from,omitempty"` // interface types assignable from T |
120 | AssignableFromPtr []ImplementsType `json:"fromptr,omitempty"` // interface types assignable only from *T |
121 | |
122 | // The following fields are set only if the query was a method. |
123 | // Assignable{To,From,FromPtr}Method[i] is the corresponding |
124 | // method of type Assignable{To,From,FromPtr}[i], or blank |
125 | // {"",""} if that type lacks the method. |
126 | Method *DescribeMethod `json:"method,omitempty"` // the queried method |
127 | AssignableToMethod []DescribeMethod `json:"to_method,omitempty"` |
128 | AssignableFromMethod []DescribeMethod `json:"from_method,omitempty"` |
129 | AssignableFromPtrMethod []DescribeMethod `json:"fromptr_method,omitempty"` |
130 | } |
131 | |
132 | // An ImplementsType describes a single type as part of an 'implements' query. |
133 | type ImplementsType struct { |
134 | Name string `json:"name"` // full name of the type |
135 | Pos string `json:"pos"` // location of its definition |
136 | Kind string `json:"kind"` // "basic", "array", etc |
137 | } |
138 | |
139 | // A SyntaxNode is one element of a stack of enclosing syntax nodes in |
140 | // a "what" query. |
141 | type SyntaxNode struct { |
142 | Description string `json:"desc"` // description of syntax tree |
143 | Start int `json:"start"` // start byte offset, 0-based |
144 | End int `json:"end"` // end byte offset |
145 | } |
146 | |
147 | // A What is the result of the "what" query, which quickly identifies |
148 | // the selection, parsing only a single file. It is intended for use |
149 | // in low-latency GUIs. |
150 | type What struct { |
151 | Enclosing []SyntaxNode `json:"enclosing"` // enclosing nodes of syntax tree |
152 | Modes []string `json:"modes"` // query modes enabled for this selection. |
153 | SrcDir string `json:"srcdir,omitempty"` // $GOROOT src directory containing queried package |
154 | ImportPath string `json:"importpath,omitempty"` // import path of queried package |
155 | Object string `json:"object,omitempty"` // name of identified object, if any |
156 | SameIDs []string `json:"sameids,omitempty"` // locations of references to same object |
157 | } |
158 | |
159 | // A PointsToLabel describes a pointer analysis label. |
160 | // |
161 | // A "label" is an object that may be pointed to by a pointer, map, |
162 | // channel, 'func', slice or interface. Labels include: |
163 | // - functions |
164 | // - globals |
165 | // - arrays created by literals (e.g. []byte("foo")) and conversions ([]byte(s)) |
166 | // - stack- and heap-allocated variables (including composite literals) |
167 | // - arrays allocated by append() |
168 | // - channels, maps and arrays created by make() |
169 | // - and their subelements, e.g. "alloc.y[*].z" |
170 | type PointsToLabel struct { |
171 | Pos string `json:"pos"` // location of syntax that allocated the object |
172 | Desc string `json:"desc"` // description of the label |
173 | } |
174 | |
175 | // A PointsTo is one element of the result of a 'pointsto' query on an |
176 | // expression. It describes a single pointer: its type and the set of |
177 | // "labels" it points to. |
178 | // |
179 | // If the pointer is of interface type, it will have one PTS entry |
180 | // describing each concrete type that it may contain. For each |
181 | // concrete type that is a pointer, the PTS entry describes the labels |
182 | // it may point to. The same is true for reflect.Values, except the |
183 | // dynamic types needn't be concrete. |
184 | type PointsTo struct { |
185 | Type string `json:"type"` // (concrete) type of the pointer |
186 | NamePos string `json:"namepos,omitempty"` // location of type defn, if Named |
187 | Labels []PointsToLabel `json:"labels,omitempty"` // pointed-to objects |
188 | } |
189 | |
190 | // A DescribeValue is the additional result of a 'describe' query |
191 | // if the selection indicates a value or expression. |
192 | type DescribeValue struct { |
193 | Type string `json:"type"` // type of the expression |
194 | Value string `json:"value,omitempty"` // value of the expression, if constant |
195 | ObjPos string `json:"objpos,omitempty"` // location of the definition, if an Ident |
196 | TypesPos []Definition `json:"typespos,omitempty"` // location of the named types, that type consist of |
197 | } |
198 | |
199 | type DescribeMethod struct { |
200 | Name string `json:"name"` // method name, as defined by types.Selection.String() |
201 | Pos string `json:"pos"` // location of the method's definition |
202 | } |
203 | |
204 | // A DescribeType is the additional result of a 'describe' query |
205 | // if the selection indicates a type. |
206 | type DescribeType struct { |
207 | Type string `json:"type"` // the string form of the type |
208 | NamePos string `json:"namepos,omitempty"` // location of definition of type, if named |
209 | NameDef string `json:"namedef,omitempty"` // underlying definition of type, if named |
210 | Methods []DescribeMethod `json:"methods,omitempty"` // methods of the type |
211 | } |
212 | |
213 | type DescribeMember struct { |
214 | Name string `json:"name"` // name of member |
215 | Type string `json:"type,omitempty"` // type of member (underlying, if 'type') |
216 | Value string `json:"value,omitempty"` // value of member (if 'const') |
217 | Pos string `json:"pos"` // location of definition of member |
218 | Kind string `json:"kind"` // one of {var,const,func,type} |
219 | Methods []DescribeMethod `json:"methods,omitempty"` // methods (if member is a type) |
220 | } |
221 | |
222 | // A DescribePackage is the additional result of a 'describe' if |
223 | // the selection indicates a package. |
224 | type DescribePackage struct { |
225 | Path string `json:"path"` // import path of the package |
226 | Members []*DescribeMember `json:"members,omitempty"` // accessible members of the package |
227 | } |
228 | |
229 | // A Describe is the result of a 'describe' query. |
230 | // It may contain an element describing the selected semantic entity |
231 | // in detail. |
232 | type Describe struct { |
233 | Desc string `json:"desc"` // description of the selected syntax node |
234 | Pos string `json:"pos"` // location of the selected syntax node |
235 | Detail string `json:"detail,omitempty"` // one of {package, type, value}, or "". |
236 | |
237 | // At most one of the following fields is populated: |
238 | // the one specified by 'detail'. |
239 | Package *DescribePackage `json:"package,omitempty"` |
240 | Type *DescribeType `json:"type,omitempty"` |
241 | Value *DescribeValue `json:"value,omitempty"` |
242 | } |
243 | |
244 | // A WhichErrs is the result of a 'whicherrs' query. |
245 | // It contains the position of the queried error and the possible globals, |
246 | // constants, and types it may point to. |
247 | type WhichErrs struct { |
248 | ErrPos string `json:"errpos,omitempty"` // location of queried error |
249 | Globals []string `json:"globals,omitempty"` // locations of globals |
250 | Constants []string `json:"constants,omitempty"` // locations of constants |
251 | Types []WhichErrsType `json:"types,omitempty"` // Types |
252 | } |
253 | |
254 | type WhichErrsType struct { |
255 | Type string `json:"type,omitempty"` |
256 | Position string `json:"position,omitempty"` |
257 | } |
258 |
Members