blob: 4434f2d9447fa6e077498ffca322760cc11e13b3 [file] [log] [blame]
# 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.
stream @4 :Void;
# The keyword "stream".
}
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;
}