%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1999-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%% Purpose : Core Erlang syntax trees as records.
%% It would be nice to incorporate some generic functions as well but
%% this could make including this file difficult.
%% Note: the annotation list is *always* the first record field.
%% Thus it is possible to define the macros:
%% -define(get_ann(X), element(2, X)).
%% -define(set_ann(X, Y), setelement(2, X, Y)).
%% The record definitions appear alphabetically
-record(c_alias, {anno=[] :: list(), var :: cerl:cerl(),
pat :: cerl:cerl()}).
-record(c_apply, {anno=[] :: list(), op :: cerl:cerl(),
args :: [cerl:cerl()]}).
-record(c_binary, {anno=[] :: list(), segments :: [cerl:c_bitstr()]}).
-record(c_bitstr, {anno=[] :: list(), val :: cerl:cerl(),
size :: cerl:cerl(),
unit :: cerl:cerl(),
type :: cerl:cerl(),
flags :: cerl:cerl()}).
-record(c_call, {anno=[] :: list(), module :: cerl:cerl(),
name :: cerl:cerl(),
args :: [cerl:cerl()]}).
-record(c_case, {anno=[] :: list(), arg :: cerl:cerl(),
clauses :: [cerl:cerl()]}).
-record(c_catch, {anno=[] :: list(), body :: cerl:cerl()}).
-record(c_clause, {anno=[] :: list(), pats :: [cerl:cerl()],
guard :: cerl:cerl(),
body :: cerl:cerl() | any()}). % TODO
-record(c_cons, {anno=[] :: list(), hd :: cerl:cerl(),
tl :: cerl:cerl()}).
-record(c_fun, {anno=[] :: list(), vars :: [cerl:cerl()],
body :: cerl:cerl()}).
-record(c_let, {anno=[] :: list(), vars :: [cerl:cerl()],
arg :: cerl:cerl(),
body :: cerl:cerl()}).
-record(c_letrec, {anno=[] :: list(),
defs :: [{cerl:cerl(), cerl:cerl()}],
body :: cerl:cerl()}).
-record(c_literal, {anno=[] :: list(), val :: any()}).
-record(c_map, {anno=[] :: list(),
arg=#c_literal{val=#{}} :: cerl:c_var() | cerl:c_literal(),
es :: [cerl:c_map_pair()],
is_pat=false :: boolean()}).
-record(c_map_pair, {anno=[] :: list(),
op :: #c_literal{val::'assoc'} | #c_literal{val::'exact'},
key :: any(), % TODO
val :: any()}). % TODO
-record(c_module, {anno=[] :: list(), name :: cerl:cerl(),
exports :: [cerl:cerl()],
attrs :: [{cerl:cerl(), cerl:cerl()}],
defs :: [{cerl:cerl(), cerl:cerl()}]}).
-record(c_primop, {anno=[] :: list(), name :: cerl:cerl(),
args :: [cerl:cerl()]}).
-record(c_receive, {anno=[] :: list(), clauses :: [cerl:cerl()],
timeout :: cerl:cerl(),
action :: cerl:cerl()}).
-record(c_seq, {anno=[] :: list(), arg :: cerl:cerl() | any(), % TODO
body :: cerl:cerl()}).
-record(c_try, {anno=[] :: list(), arg :: cerl:cerl(),
vars :: [cerl:cerl()],
body :: cerl:cerl(),
evars :: [cerl:cerl()],
handler :: cerl:cerl()}).
-record(c_tuple, {anno=[] :: list(), es :: [cerl:cerl()]}).
-record(c_values, {anno=[] :: list(), es :: [cerl:cerl()]}).
-record(c_var, {anno=[] :: list(), name :: cerl:var_name()}).