cannam@147
|
1 # Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
cannam@147
|
2 # Licensed under the MIT License:
|
cannam@147
|
3 #
|
cannam@147
|
4 # Permission is hereby granted, free of charge, to any person obtaining a copy
|
cannam@147
|
5 # of this software and associated documentation files (the "Software"), to deal
|
cannam@147
|
6 # in the Software without restriction, including without limitation the rights
|
cannam@147
|
7 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
cannam@147
|
8 # copies of the Software, and to permit persons to whom the Software is
|
cannam@147
|
9 # furnished to do so, subject to the following conditions:
|
cannam@147
|
10 #
|
cannam@147
|
11 # The above copyright notice and this permission notice shall be included in
|
cannam@147
|
12 # all copies or substantial portions of the Software.
|
cannam@147
|
13 #
|
cannam@147
|
14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
cannam@147
|
15 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
cannam@147
|
16 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
cannam@147
|
17 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
cannam@147
|
18 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
cannam@147
|
19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
cannam@147
|
20 # THE SOFTWARE.
|
cannam@147
|
21
|
cannam@147
|
22 using Cxx = import "/capnp/c++.capnp";
|
cannam@147
|
23
|
cannam@147
|
24 @0xa93fc509624c72d9;
|
cannam@147
|
25 $Cxx.namespace("capnp::schema");
|
cannam@147
|
26
|
cannam@147
|
27 using Id = UInt64;
|
cannam@147
|
28 # The globally-unique ID of a file, type, or annotation.
|
cannam@147
|
29
|
cannam@147
|
30 struct Node {
|
cannam@147
|
31 id @0 :Id;
|
cannam@147
|
32
|
cannam@147
|
33 displayName @1 :Text;
|
cannam@147
|
34 # Name to present to humans to identify this Node. You should not attempt to parse this. Its
|
cannam@147
|
35 # format could change. It is not guaranteed to be unique.
|
cannam@147
|
36 #
|
cannam@147
|
37 # (On Zooko's triangle, this is the node's nickname.)
|
cannam@147
|
38
|
cannam@147
|
39 displayNamePrefixLength @2 :UInt32;
|
cannam@147
|
40 # If you want a shorter version of `displayName` (just naming this node, without its surrounding
|
cannam@147
|
41 # scope), chop off this many characters from the beginning of `displayName`.
|
cannam@147
|
42
|
cannam@147
|
43 scopeId @3 :Id;
|
cannam@147
|
44 # ID of the lexical parent node. Typically, the scope node will have a NestedNode pointing back
|
cannam@147
|
45 # at this node, but robust code should avoid relying on this (and, in fact, group nodes are not
|
cannam@147
|
46 # listed in the outer struct's nestedNodes, since they are listed in the fields). `scopeId` is
|
cannam@147
|
47 # zero if the node has no parent, which is normally only the case with files, but should be
|
cannam@147
|
48 # allowed for any kind of node (in order to make runtime type generation easier).
|
cannam@147
|
49
|
cannam@147
|
50 parameters @32 :List(Parameter);
|
cannam@147
|
51 # If this node is parameterized (generic), the list of parameters. Empty for non-generic types.
|
cannam@147
|
52
|
cannam@147
|
53 isGeneric @33 :Bool;
|
cannam@147
|
54 # True if this node is generic, meaning that it or one of its parent scopes has a non-empty
|
cannam@147
|
55 # `parameters`.
|
cannam@147
|
56
|
cannam@147
|
57 struct Parameter {
|
cannam@147
|
58 # Information about one of the node's parameters.
|
cannam@147
|
59
|
cannam@147
|
60 name @0 :Text;
|
cannam@147
|
61 }
|
cannam@147
|
62
|
cannam@147
|
63 nestedNodes @4 :List(NestedNode);
|
cannam@147
|
64 # List of nodes nested within this node, along with the names under which they were declared.
|
cannam@147
|
65
|
cannam@147
|
66 struct NestedNode {
|
cannam@147
|
67 name @0 :Text;
|
cannam@147
|
68 # Unqualified symbol name. Unlike Node.displayName, this *can* be used programmatically.
|
cannam@147
|
69 #
|
cannam@147
|
70 # (On Zooko's triangle, this is the node's petname according to its parent scope.)
|
cannam@147
|
71
|
cannam@147
|
72 id @1 :Id;
|
cannam@147
|
73 # ID of the nested node. Typically, the target node's scopeId points back to this node, but
|
cannam@147
|
74 # robust code should avoid relying on this.
|
cannam@147
|
75 }
|
cannam@147
|
76
|
cannam@147
|
77 annotations @5 :List(Annotation);
|
cannam@147
|
78 # Annotations applied to this node.
|
cannam@147
|
79
|
cannam@147
|
80 union {
|
cannam@147
|
81 # Info specific to each kind of node.
|
cannam@147
|
82
|
cannam@147
|
83 file @6 :Void;
|
cannam@147
|
84
|
cannam@147
|
85 struct :group {
|
cannam@147
|
86 dataWordCount @7 :UInt16;
|
cannam@147
|
87 # Size of the data section, in words.
|
cannam@147
|
88
|
cannam@147
|
89 pointerCount @8 :UInt16;
|
cannam@147
|
90 # Size of the pointer section, in pointers (which are one word each).
|
cannam@147
|
91
|
cannam@147
|
92 preferredListEncoding @9 :ElementSize;
|
cannam@147
|
93 # The preferred element size to use when encoding a list of this struct. If this is anything
|
cannam@147
|
94 # other than `inlineComposite` then the struct is one word or less in size and is a candidate
|
cannam@147
|
95 # for list packing optimization.
|
cannam@147
|
96
|
cannam@147
|
97 isGroup @10 :Bool;
|
cannam@147
|
98 # If true, then this "struct" node is actually not an independent node, but merely represents
|
cannam@147
|
99 # some named union or group within a particular parent struct. This node's scopeId refers
|
cannam@147
|
100 # to the parent struct, which may itself be a union/group in yet another struct.
|
cannam@147
|
101 #
|
cannam@147
|
102 # All group nodes share the same dataWordCount and pointerCount as the top-level
|
cannam@147
|
103 # struct, and their fields live in the same ordinal and offset spaces as all other fields in
|
cannam@147
|
104 # the struct.
|
cannam@147
|
105 #
|
cannam@147
|
106 # Note that a named union is considered a special kind of group -- in fact, a named union
|
cannam@147
|
107 # is exactly equivalent to a group that contains nothing but an unnamed union.
|
cannam@147
|
108
|
cannam@147
|
109 discriminantCount @11 :UInt16;
|
cannam@147
|
110 # Number of fields in this struct which are members of an anonymous union, and thus may
|
cannam@147
|
111 # overlap. If this is non-zero, then a 16-bit discriminant is present indicating which
|
cannam@147
|
112 # of the overlapping fields is active. This can never be 1 -- if it is non-zero, it must be
|
cannam@147
|
113 # two or more.
|
cannam@147
|
114 #
|
cannam@147
|
115 # Note that the fields of an unnamed union are considered fields of the scope containing the
|
cannam@147
|
116 # union -- an unnamed union is not its own group. So, a top-level struct may contain a
|
cannam@147
|
117 # non-zero discriminant count. Named unions, on the other hand, are equivalent to groups
|
cannam@147
|
118 # containing unnamed unions. So, a named union has its own independent schema node, with
|
cannam@147
|
119 # `isGroup` = true.
|
cannam@147
|
120
|
cannam@147
|
121 discriminantOffset @12 :UInt32;
|
cannam@147
|
122 # If `discriminantCount` is non-zero, this is the offset of the union discriminant, in
|
cannam@147
|
123 # multiples of 16 bits.
|
cannam@147
|
124
|
cannam@147
|
125 fields @13 :List(Field);
|
cannam@147
|
126 # Fields defined within this scope (either the struct's top-level fields, or the fields of
|
cannam@147
|
127 # a particular group; see `isGroup`).
|
cannam@147
|
128 #
|
cannam@147
|
129 # The fields are sorted by ordinal number, but note that because groups share the same
|
cannam@147
|
130 # ordinal space, the field's index in this list is not necessarily exactly its ordinal.
|
cannam@147
|
131 # On the other hand, the field's position in this list does remain the same even as the
|
cannam@147
|
132 # protocol evolves, since it is not possible to insert or remove an earlier ordinal.
|
cannam@147
|
133 # Therefore, for most use cases, if you want to identify a field by number, it may make the
|
cannam@147
|
134 # most sense to use the field's index in this list rather than its ordinal.
|
cannam@147
|
135 }
|
cannam@147
|
136
|
cannam@147
|
137 enum :group {
|
cannam@147
|
138 enumerants@14 :List(Enumerant);
|
cannam@147
|
139 # Enumerants ordered by numeric value (ordinal).
|
cannam@147
|
140 }
|
cannam@147
|
141
|
cannam@147
|
142 interface :group {
|
cannam@147
|
143 methods @15 :List(Method);
|
cannam@147
|
144 # Methods ordered by ordinal.
|
cannam@147
|
145
|
cannam@147
|
146 superclasses @31 :List(Superclass);
|
cannam@147
|
147 # Superclasses of this interface.
|
cannam@147
|
148 }
|
cannam@147
|
149
|
cannam@147
|
150 const :group {
|
cannam@147
|
151 type @16 :Type;
|
cannam@147
|
152 value @17 :Value;
|
cannam@147
|
153 }
|
cannam@147
|
154
|
cannam@147
|
155 annotation :group {
|
cannam@147
|
156 type @18 :Type;
|
cannam@147
|
157
|
cannam@147
|
158 targetsFile @19 :Bool;
|
cannam@147
|
159 targetsConst @20 :Bool;
|
cannam@147
|
160 targetsEnum @21 :Bool;
|
cannam@147
|
161 targetsEnumerant @22 :Bool;
|
cannam@147
|
162 targetsStruct @23 :Bool;
|
cannam@147
|
163 targetsField @24 :Bool;
|
cannam@147
|
164 targetsUnion @25 :Bool;
|
cannam@147
|
165 targetsGroup @26 :Bool;
|
cannam@147
|
166 targetsInterface @27 :Bool;
|
cannam@147
|
167 targetsMethod @28 :Bool;
|
cannam@147
|
168 targetsParam @29 :Bool;
|
cannam@147
|
169 targetsAnnotation @30 :Bool;
|
cannam@147
|
170 }
|
cannam@147
|
171 }
|
cannam@147
|
172 }
|
cannam@147
|
173
|
cannam@147
|
174 struct Field {
|
cannam@147
|
175 # Schema for a field of a struct.
|
cannam@147
|
176
|
cannam@147
|
177 name @0 :Text;
|
cannam@147
|
178
|
cannam@147
|
179 codeOrder @1 :UInt16;
|
cannam@147
|
180 # Indicates where this member appeared in the code, relative to other members.
|
cannam@147
|
181 # Code ordering may have semantic relevance -- programmers tend to place related fields
|
cannam@147
|
182 # together. So, using code ordering makes sense in human-readable formats where ordering is
|
cannam@147
|
183 # otherwise irrelevant, like JSON. The values of codeOrder are tightly-packed, so the maximum
|
cannam@147
|
184 # value is count(members) - 1. Fields that are members of a union are only ordered relative to
|
cannam@147
|
185 # the other members of that union, so the maximum value there is count(union.members).
|
cannam@147
|
186
|
cannam@147
|
187 annotations @2 :List(Annotation);
|
cannam@147
|
188
|
cannam@147
|
189 const noDiscriminant :UInt16 = 0xffff;
|
cannam@147
|
190
|
cannam@147
|
191 discriminantValue @3 :UInt16 = Field.noDiscriminant;
|
cannam@147
|
192 # If the field is in a union, this is the value which the union's discriminant should take when
|
cannam@147
|
193 # the field is active. If the field is not in a union, this is 0xffff.
|
cannam@147
|
194
|
cannam@147
|
195 union {
|
cannam@147
|
196 slot :group {
|
cannam@147
|
197 # A regular, non-group, non-fixed-list field.
|
cannam@147
|
198
|
cannam@147
|
199 offset @4 :UInt32;
|
cannam@147
|
200 # Offset, in units of the field's size, from the beginning of the section in which the field
|
cannam@147
|
201 # resides. E.g. for a UInt32 field, multiply this by 4 to get the byte offset from the
|
cannam@147
|
202 # beginning of the data section.
|
cannam@147
|
203
|
cannam@147
|
204 type @5 :Type;
|
cannam@147
|
205 defaultValue @6 :Value;
|
cannam@147
|
206
|
cannam@147
|
207 hadExplicitDefault @10 :Bool;
|
cannam@147
|
208 # Whether the default value was specified explicitly. Non-explicit default values are always
|
cannam@147
|
209 # zero or empty values. Usually, whether the default value was explicit shouldn't matter.
|
cannam@147
|
210 # The main use case for this flag is for structs representing method parameters:
|
cannam@147
|
211 # explicitly-defaulted parameters may be allowed to be omitted when calling the method.
|
cannam@147
|
212 }
|
cannam@147
|
213
|
cannam@147
|
214 group :group {
|
cannam@147
|
215 # A group.
|
cannam@147
|
216
|
cannam@147
|
217 typeId @7 :Id;
|
cannam@147
|
218 # The ID of the group's node.
|
cannam@147
|
219 }
|
cannam@147
|
220 }
|
cannam@147
|
221
|
cannam@147
|
222 ordinal :union {
|
cannam@147
|
223 implicit @8 :Void;
|
cannam@147
|
224 explicit @9 :UInt16;
|
cannam@147
|
225 # The original ordinal number given to the field. You probably should NOT use this; if you need
|
cannam@147
|
226 # a numeric identifier for a field, use its position within the field array for its scope.
|
cannam@147
|
227 # The ordinal is given here mainly just so that the original schema text can be reproduced given
|
cannam@147
|
228 # the compiled version -- i.e. so that `capnp compile -ocapnp` can do its job.
|
cannam@147
|
229 }
|
cannam@147
|
230 }
|
cannam@147
|
231
|
cannam@147
|
232 struct Enumerant {
|
cannam@147
|
233 # Schema for member of an enum.
|
cannam@147
|
234
|
cannam@147
|
235 name @0 :Text;
|
cannam@147
|
236
|
cannam@147
|
237 codeOrder @1 :UInt16;
|
cannam@147
|
238 # Specifies order in which the enumerants were declared in the code.
|
cannam@147
|
239 # Like Struct.Field.codeOrder.
|
cannam@147
|
240
|
cannam@147
|
241 annotations @2 :List(Annotation);
|
cannam@147
|
242 }
|
cannam@147
|
243
|
cannam@147
|
244 struct Superclass {
|
cannam@147
|
245 id @0 :Id;
|
cannam@147
|
246 brand @1 :Brand;
|
cannam@147
|
247 }
|
cannam@147
|
248
|
cannam@147
|
249 struct Method {
|
cannam@147
|
250 # Schema for method of an interface.
|
cannam@147
|
251
|
cannam@147
|
252 name @0 :Text;
|
cannam@147
|
253
|
cannam@147
|
254 codeOrder @1 :UInt16;
|
cannam@147
|
255 # Specifies order in which the methods were declared in the code.
|
cannam@147
|
256 # Like Struct.Field.codeOrder.
|
cannam@147
|
257
|
cannam@147
|
258 implicitParameters @7 :List(Node.Parameter);
|
cannam@147
|
259 # The parameters listed in [] (typically, type / generic parameters), whose bindings are intended
|
cannam@147
|
260 # to be inferred rather than specified explicitly, although not all languages support this.
|
cannam@147
|
261
|
cannam@147
|
262 paramStructType @2 :Id;
|
cannam@147
|
263 # ID of the parameter struct type. If a named parameter list was specified in the method
|
cannam@147
|
264 # declaration (rather than a single struct parameter type) then a corresponding struct type is
|
cannam@147
|
265 # auto-generated. Such an auto-generated type will not be listed in the interface's
|
cannam@147
|
266 # `nestedNodes` and its `scopeId` will be zero -- it is completely detached from the namespace.
|
cannam@147
|
267 # (Awkwardly, it does of course inherit generic parameters from the method's scope, which makes
|
cannam@147
|
268 # this a situation where you can't just climb the scope chain to find where a particular
|
cannam@147
|
269 # generic parameter was introduced. Making the `scopeId` zero was a mistake.)
|
cannam@147
|
270
|
cannam@147
|
271 paramBrand @5 :Brand;
|
cannam@147
|
272 # Brand of param struct type.
|
cannam@147
|
273
|
cannam@147
|
274 resultStructType @3 :Id;
|
cannam@147
|
275 # ID of the return struct type; similar to `paramStructType`.
|
cannam@147
|
276
|
cannam@147
|
277 resultBrand @6 :Brand;
|
cannam@147
|
278 # Brand of result struct type.
|
cannam@147
|
279
|
cannam@147
|
280 annotations @4 :List(Annotation);
|
cannam@147
|
281 }
|
cannam@147
|
282
|
cannam@147
|
283 struct Type {
|
cannam@147
|
284 # Represents a type expression.
|
cannam@147
|
285
|
cannam@147
|
286 union {
|
cannam@147
|
287 # The ordinals intentionally match those of Value.
|
cannam@147
|
288
|
cannam@147
|
289 void @0 :Void;
|
cannam@147
|
290 bool @1 :Void;
|
cannam@147
|
291 int8 @2 :Void;
|
cannam@147
|
292 int16 @3 :Void;
|
cannam@147
|
293 int32 @4 :Void;
|
cannam@147
|
294 int64 @5 :Void;
|
cannam@147
|
295 uint8 @6 :Void;
|
cannam@147
|
296 uint16 @7 :Void;
|
cannam@147
|
297 uint32 @8 :Void;
|
cannam@147
|
298 uint64 @9 :Void;
|
cannam@147
|
299 float32 @10 :Void;
|
cannam@147
|
300 float64 @11 :Void;
|
cannam@147
|
301 text @12 :Void;
|
cannam@147
|
302 data @13 :Void;
|
cannam@147
|
303
|
cannam@147
|
304 list :group {
|
cannam@147
|
305 elementType @14 :Type;
|
cannam@147
|
306 }
|
cannam@147
|
307
|
cannam@147
|
308 enum :group {
|
cannam@147
|
309 typeId @15 :Id;
|
cannam@147
|
310 brand @21 :Brand;
|
cannam@147
|
311 }
|
cannam@147
|
312 struct :group {
|
cannam@147
|
313 typeId @16 :Id;
|
cannam@147
|
314 brand @22 :Brand;
|
cannam@147
|
315 }
|
cannam@147
|
316 interface :group {
|
cannam@147
|
317 typeId @17 :Id;
|
cannam@147
|
318 brand @23 :Brand;
|
cannam@147
|
319 }
|
cannam@147
|
320
|
cannam@147
|
321 anyPointer :union {
|
cannam@147
|
322 unconstrained :union {
|
cannam@147
|
323 # A regular AnyPointer.
|
cannam@147
|
324 #
|
cannam@147
|
325 # The name "unconstrained" means as opposed to constraining it to match a type parameter.
|
cannam@147
|
326 # In retrospect this name is probably a poor choice given that it may still be constrained
|
cannam@147
|
327 # to be a struct, list, or capability.
|
cannam@147
|
328
|
cannam@147
|
329 anyKind @18 :Void; # truly AnyPointer
|
cannam@147
|
330 struct @25 :Void; # AnyStruct
|
cannam@147
|
331 list @26 :Void; # AnyList
|
cannam@147
|
332 capability @27 :Void; # Capability
|
cannam@147
|
333 }
|
cannam@147
|
334
|
cannam@147
|
335 parameter :group {
|
cannam@147
|
336 # This is actually a reference to a type parameter defined within this scope.
|
cannam@147
|
337
|
cannam@147
|
338 scopeId @19 :Id;
|
cannam@147
|
339 # ID of the generic type whose parameter we're referencing. This should be a parent of the
|
cannam@147
|
340 # current scope.
|
cannam@147
|
341
|
cannam@147
|
342 parameterIndex @20 :UInt16;
|
cannam@147
|
343 # Index of the parameter within the generic type's parameter list.
|
cannam@147
|
344 }
|
cannam@147
|
345
|
cannam@147
|
346 implicitMethodParameter :group {
|
cannam@147
|
347 # This is actually a reference to an implicit (generic) parameter of a method. The only
|
cannam@147
|
348 # legal context for this type to appear is inside Method.paramBrand or Method.resultBrand.
|
cannam@147
|
349
|
cannam@147
|
350 parameterIndex @24 :UInt16;
|
cannam@147
|
351 }
|
cannam@147
|
352 }
|
cannam@147
|
353 }
|
cannam@147
|
354 }
|
cannam@147
|
355
|
cannam@147
|
356 struct Brand {
|
cannam@147
|
357 # Specifies bindings for parameters of generics. Since these bindings turn a generic into a
|
cannam@147
|
358 # non-generic, we call it the "brand".
|
cannam@147
|
359
|
cannam@147
|
360 scopes @0 :List(Scope);
|
cannam@147
|
361 # For each of the target type and each of its parent scopes, a parameterization may be included
|
cannam@147
|
362 # in this list. If no parameterization is included for a particular relevant scope, then either
|
cannam@147
|
363 # that scope has no parameters or all parameters should be considered to be `AnyPointer`.
|
cannam@147
|
364
|
cannam@147
|
365 struct Scope {
|
cannam@147
|
366 scopeId @0 :Id;
|
cannam@147
|
367 # ID of the scope to which these params apply.
|
cannam@147
|
368
|
cannam@147
|
369 union {
|
cannam@147
|
370 bind @1 :List(Binding);
|
cannam@147
|
371 # List of parameter bindings.
|
cannam@147
|
372
|
cannam@147
|
373 inherit @2 :Void;
|
cannam@147
|
374 # The place where this Brand appears is actually within this scope or a sub-scope,
|
cannam@147
|
375 # and the bindings for this scope should be inherited from the reference point.
|
cannam@147
|
376 }
|
cannam@147
|
377 }
|
cannam@147
|
378
|
cannam@147
|
379 struct Binding {
|
cannam@147
|
380 union {
|
cannam@147
|
381 unbound @0 :Void;
|
cannam@147
|
382 type @1 :Type;
|
cannam@147
|
383
|
cannam@147
|
384 # TODO(someday): Allow non-type parameters? Unsure if useful.
|
cannam@147
|
385 }
|
cannam@147
|
386 }
|
cannam@147
|
387 }
|
cannam@147
|
388
|
cannam@147
|
389 struct Value {
|
cannam@147
|
390 # Represents a value, e.g. a field default value, constant value, or annotation value.
|
cannam@147
|
391
|
cannam@147
|
392 union {
|
cannam@147
|
393 # The ordinals intentionally match those of Type.
|
cannam@147
|
394
|
cannam@147
|
395 void @0 :Void;
|
cannam@147
|
396 bool @1 :Bool;
|
cannam@147
|
397 int8 @2 :Int8;
|
cannam@147
|
398 int16 @3 :Int16;
|
cannam@147
|
399 int32 @4 :Int32;
|
cannam@147
|
400 int64 @5 :Int64;
|
cannam@147
|
401 uint8 @6 :UInt8;
|
cannam@147
|
402 uint16 @7 :UInt16;
|
cannam@147
|
403 uint32 @8 :UInt32;
|
cannam@147
|
404 uint64 @9 :UInt64;
|
cannam@147
|
405 float32 @10 :Float32;
|
cannam@147
|
406 float64 @11 :Float64;
|
cannam@147
|
407 text @12 :Text;
|
cannam@147
|
408 data @13 :Data;
|
cannam@147
|
409
|
cannam@147
|
410 list @14 :AnyPointer;
|
cannam@147
|
411
|
cannam@147
|
412 enum @15 :UInt16;
|
cannam@147
|
413 struct @16 :AnyPointer;
|
cannam@147
|
414
|
cannam@147
|
415 interface @17 :Void;
|
cannam@147
|
416 # The only interface value that can be represented statically is "null", whose methods always
|
cannam@147
|
417 # throw exceptions.
|
cannam@147
|
418
|
cannam@147
|
419 anyPointer @18 :AnyPointer;
|
cannam@147
|
420 }
|
cannam@147
|
421 }
|
cannam@147
|
422
|
cannam@147
|
423 struct Annotation {
|
cannam@147
|
424 # Describes an annotation applied to a declaration. Note AnnotationNode describes the
|
cannam@147
|
425 # annotation's declaration, while this describes a use of the annotation.
|
cannam@147
|
426
|
cannam@147
|
427 id @0 :Id;
|
cannam@147
|
428 # ID of the annotation node.
|
cannam@147
|
429
|
cannam@147
|
430 brand @2 :Brand;
|
cannam@147
|
431 # Brand of the annotation.
|
cannam@147
|
432 #
|
cannam@147
|
433 # Note that the annotation itself is not allowed to be parameterized, but its scope might be.
|
cannam@147
|
434
|
cannam@147
|
435 value @1 :Value;
|
cannam@147
|
436 }
|
cannam@147
|
437
|
cannam@147
|
438 enum ElementSize {
|
cannam@147
|
439 # Possible element sizes for encoded lists. These correspond exactly to the possible values of
|
cannam@147
|
440 # the 3-bit element size component of a list pointer.
|
cannam@147
|
441
|
cannam@147
|
442 empty @0; # aka "void", but that's a keyword.
|
cannam@147
|
443 bit @1;
|
cannam@147
|
444 byte @2;
|
cannam@147
|
445 twoBytes @3;
|
cannam@147
|
446 fourBytes @4;
|
cannam@147
|
447 eightBytes @5;
|
cannam@147
|
448 pointer @6;
|
cannam@147
|
449 inlineComposite @7;
|
cannam@147
|
450 }
|
cannam@147
|
451
|
cannam@147
|
452 struct CapnpVersion {
|
cannam@147
|
453 major @0 :UInt16;
|
cannam@147
|
454 minor @1 :UInt8;
|
cannam@147
|
455 micro @2 :UInt8;
|
cannam@147
|
456 }
|
cannam@147
|
457
|
cannam@147
|
458 struct CodeGeneratorRequest {
|
cannam@147
|
459 capnpVersion @2 :CapnpVersion;
|
cannam@147
|
460 # Version of the `capnp` executable. Generally, code generators should ignore this, but the code
|
cannam@147
|
461 # generators that ship with `capnp` itself will print a warning if this mismatches since that
|
cannam@147
|
462 # probably indicates something is misconfigured.
|
cannam@147
|
463 #
|
cannam@147
|
464 # The first version of 'capnp' to set this was 0.6.0. So, if it's missing, the compiler version
|
cannam@147
|
465 # is older than that.
|
cannam@147
|
466
|
cannam@147
|
467 nodes @0 :List(Node);
|
cannam@147
|
468 # All nodes parsed by the compiler, including for the files on the command line and their
|
cannam@147
|
469 # imports.
|
cannam@147
|
470
|
cannam@147
|
471 requestedFiles @1 :List(RequestedFile);
|
cannam@147
|
472 # Files which were listed on the command line.
|
cannam@147
|
473
|
cannam@147
|
474 struct RequestedFile {
|
cannam@147
|
475 id @0 :Id;
|
cannam@147
|
476 # ID of the file.
|
cannam@147
|
477
|
cannam@147
|
478 filename @1 :Text;
|
cannam@147
|
479 # Name of the file as it appeared on the command-line (minus the src-prefix). You may use
|
cannam@147
|
480 # this to decide where to write the output.
|
cannam@147
|
481
|
cannam@147
|
482 imports @2 :List(Import);
|
cannam@147
|
483 # List of all imported paths seen in this file.
|
cannam@147
|
484
|
cannam@147
|
485 struct Import {
|
cannam@147
|
486 id @0 :Id;
|
cannam@147
|
487 # ID of the imported file.
|
cannam@147
|
488
|
cannam@147
|
489 name @1 :Text;
|
cannam@147
|
490 # Name which *this* file used to refer to the foreign file. This may be a relative name.
|
cannam@147
|
491 # This information is provided because it might be useful for code generation, e.g. to
|
cannam@147
|
492 # generate #include directives in C++. We don't put this in Node.file because this
|
cannam@147
|
493 # information is only meaningful at compile time anyway.
|
cannam@147
|
494 #
|
cannam@147
|
495 # (On Zooko's triangle, this is the import's petname according to the importing file.)
|
cannam@147
|
496 }
|
cannam@147
|
497 }
|
cannam@147
|
498 }
|