# Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
# Licensed under the MIT License:
|
#
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# of this software and associated documentation files (the "Software"), to deal
|
# in the Software without restriction, including without limitation the rights
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
# copies of the Software, and to permit persons to whom the Software is
|
# furnished to do so, subject to the following conditions:
|
#
|
# The above copyright notice and this permission notice shall be included in
|
# all copies or substantial portions of the Software.
|
#
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
# THE SOFTWARE.
|
|
@0xc56be168dcbbc3c6;
|
# The structures in this file correspond to the AST of the Cap'n Proto schema language.
|
#
|
# This file is intended to be used internally by capnpc. Mostly, it is useful because it is more
|
# convenient than defining data classes in C++, particularly where variant types (unions) are
|
# needed. Over time, this file may change in backwards-incompatible ways.
|
|
using Cxx = import "/capnp/c++.capnp";
|
|
$Cxx.namespace("capnp::compiler");
|
|
# TODO(someday): Here's a case where parameterized types might be nice, but note that it would
|
# need to support primitive parameters...
|
struct LocatedText {
|
value @0 :Text;
|
startByte @1 :UInt32;
|
endByte @2 :UInt32;
|
}
|
|
struct LocatedInteger {
|
value @0 :UInt64;
|
startByte @1 :UInt32;
|
endByte @2 :UInt32;
|
}
|
|
struct LocatedFloat {
|
value @0 :Float64;
|
startByte @1 :UInt32;
|
endByte @2 :UInt32;
|
}
|
|
struct Expression {
|
# An expression. May evaluate to a type, a value, or a declaration (i.e. some named thing which
|
# is neither a type nor a value, like an annotation declaration).
|
|
union {
|
unknown @0 :Void; # e.g. parse error; downstream should ignore
|
positiveInt @1 :UInt64;
|
negativeInt @2 :UInt64;
|
float @3 :Float64;
|
string @4 :Text;
|
binary @10 :Data;
|
|
relativeName @5 :LocatedText;
|
# Just an identifier.
|
|
absoluteName @15 :LocatedText;
|
# An identifier with leading '.'.
|
|
import @16 :LocatedText;
|
# An import directive.
|
|
embed @17 :LocatedText;
|
# An embed directive.
|
|
list @6 :List(Expression);
|
# Bracketed list; members are never named.
|
|
tuple @7 :List(Param);
|
# Parenthesized list, possibly with named members.
|
#
|
# Note that a parenthesized list with one unnamed member is just a parenthesized expression,
|
# not a tuple, and so will never be represented as a tuple.
|
|
application :group {
|
# Application of a function to some parameters, e.g. "foo(bar, baz)".
|
|
function @11 :Expression;
|
params @12 :List(Param);
|
}
|
|
member :group {
|
# A named member of an aggregate, e.g. "foo.bar".
|
|
parent @13 :Expression;
|
name @14 :LocatedText;
|
}
|
|
# TODO(someday): Basic arithmetic?
|
}
|
|
struct Param {
|
union {
|
unnamed @0 :Void; # Just a value.
|
named @1 :LocatedText; # "name = value"
|
}
|
value @2 :Expression;
|
}
|
|
startByte @8 :UInt32;
|
endByte @9 :UInt32;
|
}
|
|
struct Declaration {
|
# A declaration statement.
|
|
name @0 :LocatedText;
|
|
id :union {
|
unspecified @1 :Void;
|
uid @2 :LocatedInteger;
|
ordinal @3 :LocatedInteger; # limited to 16 bits
|
}
|
|
parameters @57 :List(BrandParameter);
|
# If this node is parameterized (generic), the list of parameters. Empty for non-generic types.
|
|
struct BrandParameter {
|
name @0 :Text;
|
startByte @1 :UInt32;
|
endByte @2 :UInt32;
|
}
|
|
nestedDecls @4 :List(Declaration);
|
|
annotations @5 :List(AnnotationApplication);
|
struct AnnotationApplication {
|
name @0 :Expression;
|
|
value :union {
|
none @1 :Void; # None specified; implies void value.
|
expression @2 :Expression;
|
}
|
}
|
|
startByte @6 :UInt32;
|
endByte @7 :UInt32;
|
|
docComment @8 :Text;
|
|
union {
|
file @9 :Void;
|
|
using :group {
|
target @10 :Expression;
|
}
|
|
const :group {
|
type @11 :Expression;
|
value @12 :Expression;
|
}
|
|
enum @13 :Void;
|
enumerant @14 :Void;
|
|
struct @15 :Void;
|
field :group {
|
type @16 :Expression;
|
defaultValue :union {
|
none @17 :Void;
|
value @18 :Expression;
|
}
|
}
|
union @19 :Void;
|
group @20 :Void;
|
|
interface :group {
|
superclasses @21 :List(Expression);
|
}
|
method :group {
|
params @22 :ParamList;
|
results :union {
|
none @23 :Void;
|
explicit @24 :ParamList;
|
}
|
}
|
|
annotation :group {
|
type @25 :Expression;
|
|
targetsFile @26 :Bool;
|
targetsConst @27 :Bool;
|
targetsEnum @28 :Bool;
|
targetsEnumerant @29 :Bool;
|
targetsStruct @30 :Bool;
|
targetsField @31 :Bool;
|
targetsUnion @32 :Bool;
|
targetsGroup @33 :Bool;
|
targetsInterface @34 :Bool;
|
targetsMethod @35 :Bool;
|
targetsParam @36 :Bool;
|
targetsAnnotation @37 :Bool;
|
}
|
|
nakedId @38 :LocatedInteger;
|
nakedAnnotation @39 :AnnotationApplication;
|
# A floating UID or annotation (allowed at the file top level).
|
|
# The following declaration types are not produced by the parser, but are declared here
|
# so that the compiler can handle symbol name lookups more uniformly.
|
#
|
# New union members added here will magically become visible in the global scope.
|
# E.g. "builtinFoo" becomes visible as "Foo".
|
builtinVoid @40 :Void;
|
builtinBool @41 :Void;
|
builtinInt8 @42 :Void;
|
builtinInt16 @43 :Void;
|
builtinInt32 @44 :Void;
|
builtinInt64 @45 :Void;
|
builtinUInt8 @46 :Void;
|
builtinUInt16 @47 :Void;
|
builtinUInt32 @48 :Void;
|
builtinUInt64 @49 :Void;
|
builtinFloat32 @50 :Void;
|
builtinFloat64 @51 :Void;
|
builtinText @52 :Void;
|
builtinData @53 :Void;
|
builtinList @54 :Void $builtinParams([(name = "Element")]);
|
builtinObject @55 :Void; # only for "renamed to AnyPointer" error message
|
builtinAnyPointer @56 :Void;
|
builtinAnyStruct @58 :Void;
|
builtinAnyList @59 :Void;
|
builtinCapability @60 :Void;
|
}
|
|
annotation builtinParams @0x94099c3f9eb32d6b (field) :List(BrandParameter);
|
|
struct ParamList {
|
# A list of method parameters or method returns.
|
|
union {
|
namedList @0 :List(Param);
|
|
type @1 :Expression;
|
# Specified some other struct type instead of a named list.
|
}
|
|
startByte @2 :UInt32;
|
endByte @3 :UInt32;
|
}
|
struct Param {
|
name @0 :LocatedText; # If null, param failed to parse.
|
type @1 :Expression;
|
annotations @2 :List(AnnotationApplication);
|
defaultValue :union {
|
none @3 :Void;
|
value @4 :Expression;
|
}
|
|
startByte @5 :UInt32;
|
endByte @6 :UInt32;
|
}
|
}
|
|
struct ParsedFile {
|
root @0 :Declaration;
|
}
|