Skip to main content

scarf_syntax/declarations/
function_declarations.rs

1// =======================================================================
2// function_declarations.rs
3// =======================================================================
4// CST Nodes from 1800-2023 A.2.6
5use crate::*;
6
7#[derive(Clone, Debug, PartialEq)]
8pub enum FunctionDataTypeOrImplicit<'a> {
9    DataType(Box<DataTypeOrVoid<'a>>),
10    Implicit(Box<ImplicitDataType<'a>>),
11}
12
13#[derive(Clone, Debug, PartialEq)]
14pub struct FunctionDeclaration<'a>(
15    pub Metadata<'a>, // function
16    pub Option<DynamicOverrideSpecifiers<'a>>,
17    pub Option<Lifetime<'a>>,
18    pub FunctionBodyDeclaration<'a>,
19);
20
21#[derive(Clone, Debug, PartialEq)]
22pub enum FunctionBodyDeclaration<'a> {
23    Tf(
24        Box<(
25            FunctionDataTypeOrImplicit<'a>,
26            Option<InterfaceIdentifierOrClassScope<'a>>,
27            FunctionIdentifier<'a>,
28            Metadata<'a>, // ;
29            Vec<TfItemDeclaration<'a>>,
30            Vec<FunctionStatementOrNull<'a>>,
31            Metadata<'a>, // endfunction
32            Option<(
33                Metadata<'a>, // :
34                FunctionIdentifier<'a>,
35            )>,
36        )>,
37    ),
38    Block(
39        Box<(
40            FunctionDataTypeOrImplicit<'a>,
41            Option<InterfaceIdentifierOrClassScope<'a>>,
42            FunctionIdentifier<'a>,
43            Metadata<'a>, // (
44            Option<TfPortList<'a>>,
45            Metadata<'a>, // )
46            Metadata<'a>, // ;
47            Vec<BlockItemDeclaration<'a>>,
48            Vec<FunctionStatementOrNull<'a>>,
49            Metadata<'a>, // endfunction
50            Option<(
51                Metadata<'a>, // :
52                FunctionIdentifier<'a>,
53            )>,
54        )>,
55    ),
56}
57
58#[derive(Clone, Debug, PartialEq)]
59pub struct FunctionPrototype<'a>(
60    pub Metadata<'a>, // function
61    pub Option<DynamicOverrideSpecifiers<'a>>,
62    pub DataTypeOrVoid<'a>,
63    pub FunctionIdentifier<'a>,
64    pub  Option<(
65        Metadata<'a>, // (
66        Option<TfPortList<'a>>,
67        Metadata<'a>, // )
68    )>,
69);
70
71#[derive(Clone, Debug, PartialEq)]
72pub enum DpiImportExport<'a> {
73    FunctionImport(
74        Box<(
75            Metadata<'a>, // import
76            DpiSpecString<'a>,
77            Option<DpiFunctionImportProperty<'a>>,
78            Option<(
79                CIdentifier<'a>,
80                Metadata<'a>, // =
81            )>,
82            DpiFunctionProto<'a>,
83            Metadata<'a>, // ;
84        )>,
85    ),
86    TaskImport(
87        Box<(
88            Metadata<'a>, // import
89            DpiSpecString<'a>,
90            Option<DpiTaskImportProperty<'a>>,
91            Option<(
92                CIdentifier<'a>,
93                Metadata<'a>, // =
94            )>,
95            DpiTaskProto<'a>,
96            Metadata<'a>, // ;
97        )>,
98    ),
99    FunctionExport(
100        Box<(
101            Metadata<'a>, // export
102            DpiSpecString<'a>,
103            Option<(
104                CIdentifier<'a>,
105                Metadata<'a>, // =
106            )>,
107            Metadata<'a>, // function
108            FunctionIdentifier<'a>,
109            Metadata<'a>, // ;
110        )>,
111    ),
112    TaskExport(
113        Box<(
114            Metadata<'a>, // export
115            DpiSpecString<'a>,
116            Option<(
117                CIdentifier<'a>,
118                Metadata<'a>, // =
119            )>,
120            Metadata<'a>, // task
121            TaskIdentifier<'a>,
122            Metadata<'a>, // ;
123        )>,
124    ),
125}
126
127#[derive(Clone, Debug, PartialEq)]
128pub enum DpiSpecString<'a> {
129    DpiC(Metadata<'a>),
130    Dpi(Metadata<'a>),
131}
132
133#[derive(Clone, Debug, PartialEq)]
134pub enum DpiFunctionImportProperty<'a> {
135    Context(Metadata<'a>),
136    Pure(Metadata<'a>),
137}
138
139#[derive(Clone, Debug, PartialEq)]
140pub struct DpiTaskImportProperty<'a>(
141    pub Metadata<'a>, // context
142);
143
144#[derive(Clone, Debug, PartialEq)]
145pub struct DpiFunctionProto<'a>(pub FunctionPrototype<'a>);
146
147#[derive(Clone, Debug, PartialEq)]
148pub struct DpiTaskProto<'a>(pub TaskPrototype<'a>);