1use super::behavior::{Allocate, InOut, InOutDecl, StateDefBody, StateUsage};
2use super::common::{CommentAnnotation, ConnectBody, DocComment, Identification, ParseErrorNode};
3use super::requirement::{EnumerationUsage, ItemUsage, RequirementUsage, Satisfy};
4use super::view::{CalcUsage, ConstraintDefBody};
5use crate::ast::core::{Expression, Node, Span};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct PartDef {
10 pub definition_prefix: Option<DefinitionPrefix>,
12 pub is_individual: bool,
14 pub identification: Identification,
15 pub specializes: Option<String>,
17 pub specializes_span: Option<Span>,
19 pub body: PartDefBody,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq)]
24pub enum DefinitionPrefix {
25 Abstract,
26 Variation,
27}
28
29#[derive(Debug, Clone, PartialEq, Eq)]
31pub enum PartDefBody {
32 Semicolon,
33 Brace {
34 elements: Vec<Node<PartDefBodyElement>>,
35 },
36}
37
38#[derive(Debug, Clone, PartialEq, Eq)]
40pub enum PartDefBodyElement {
41 Error(Node<ParseErrorNode>),
42 Doc(Node<DocComment>),
43 Comment(Node<CommentAnnotation>),
44 Annotation(Node<Annotation>),
45 MetadataKeywordUsage(Node<MetadataKeywordUsage>),
46 Other(String),
47 AttributeDef(Node<AttributeDef>),
48 AttributeUsage(Node<AttributeUsage>),
49 RequirementUsage(Node<RequirementUsage>),
50 ItemDef(Node<ItemDef>),
51 ItemUsage(Node<ItemUsage>),
52 Ref(Node<RefDecl>),
53 PortUsage(Node<PortUsage>),
54 PartUsage(Box<Node<PartUsage>>),
55 PartDef(Node<PartDef>),
56 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
57 InterfaceDef(Node<InterfaceDef>),
58 InterfaceUsage(Node<InterfaceUsage>),
59 Connect(Node<Connect>),
60 Connection(Node<ConnectionUsageMember>),
62 Perform(Node<Perform>),
63 Allocate(Node<Allocate>),
64 OpaqueMember(Node<OpaqueMemberDecl>),
65 ExhibitState(Node<ExhibitState>),
67 CalcUsage(Node<CalcUsage>),
69 EnumerationUsage(Node<EnumerationUsage>),
71}
72
73#[derive(Debug, Clone, PartialEq, Eq)]
75pub struct OpaqueMemberDecl {
76 pub keyword: String,
77 pub name: String,
78 pub text: String,
79 pub body: AttributeBody,
80}
81
82#[derive(Debug, Clone, PartialEq, Eq)]
84pub struct ConnectionUsageMember {
85 pub name: Option<String>,
86 pub type_name: Option<String>,
87 pub body: ConnectionDefBody,
88 pub subsets: Option<String>,
89 pub redefines: Option<String>,
90}
91
92#[derive(Debug, Clone, PartialEq, Eq)]
94pub struct ExhibitState {
95 pub name: String,
96 pub type_name: Option<String>,
97 pub redefines: Option<String>,
98 pub body: StateDefBody,
99}
100
101#[derive(Debug, Clone, PartialEq, Eq)]
103pub struct AttributeDef {
104 pub name: String,
105 pub typing: Option<String>,
107 pub value: Option<Node<Expression>>,
109 pub body: AttributeBody,
110 pub name_span: Option<Span>,
112 pub typing_span: Option<Span>,
114 pub value_span: Option<Span>,
116}
117
118#[derive(Debug, Clone, PartialEq, Eq)]
120pub enum AttributeBody {
121 Semicolon,
122 Brace {
123 elements: Vec<Node<AttributeBodyElement>>,
124 },
125}
126
127#[derive(Debug, Clone, PartialEq, Eq)]
128pub enum AttributeBodyElement {
129 Error(Node<ParseErrorNode>),
130 Doc(Node<DocComment>),
131 AttributeDef(Node<AttributeDef>),
132 AttributeUsage(Node<AttributeUsage>),
133 Other(String),
134}
135
136#[derive(Debug, Clone, PartialEq, Eq)]
138pub struct ItemDef {
139 pub identification: Identification,
140 pub specializes: Option<String>,
141 pub specializes_span: Option<Span>,
142 pub body: AttributeBody,
143}
144
145#[derive(Debug, Clone, PartialEq, Eq)]
147pub struct IndividualDef {
148 pub identification: Identification,
149 pub specializes: Option<String>,
150 pub specializes_span: Option<Span>,
151 pub body: AttributeBody,
152}
153
154#[derive(Debug, Clone, PartialEq, Eq)]
156pub struct PartUsage {
157 pub is_individual: bool,
158 pub name: String,
159 pub type_name: String,
161 pub multiplicity: Option<String>,
163 pub ordered: bool,
164 pub subsets: Option<(String, Option<Node<Expression>>)>,
166 pub redefines: Option<String>,
168 pub value: Option<Node<Expression>>,
170 pub body: PartUsageBody,
171 pub name_span: Option<Span>,
173 pub type_ref_span: Option<Span>,
175}
176
177#[derive(Debug, Clone, PartialEq, Eq)]
179pub enum PartUsageBody {
180 Semicolon,
181 Brace {
182 elements: Vec<Node<PartUsageBodyElement>>,
183 },
184}
185
186#[derive(Debug, Clone, PartialEq, Eq)]
188pub struct MetadataAnnotation {
189 pub name: String,
190 pub type_name: Option<String>,
191 pub body: ConnectBody,
192 pub head_span: Option<Span>,
193 pub type_span: Option<Span>,
194}
195
196#[derive(Debug, Clone, PartialEq, Eq)]
198pub struct MetadataKeywordUsage {
199 pub keyword: String,
200 pub type_name: Option<String>,
201 pub body: ConnectBody,
202 pub keyword_span: Span,
203 pub type_span: Option<Span>,
204}
205
206#[derive(Debug, Clone, PartialEq, Eq)]
208pub struct Annotation {
209 pub sigil: String,
210 pub head: String,
211 pub type_name: Option<String>,
212 pub body: ConnectBody,
213 pub head_span: Option<Span>,
214 pub type_span: Option<Span>,
215}
216
217#[derive(Debug, Clone, PartialEq, Eq)]
219pub enum PartUsageBodyElement {
220 Error(Node<ParseErrorNode>),
221 Doc(Node<DocComment>),
222 Annotation(Node<Annotation>),
223 AttributeUsage(Node<AttributeUsage>),
224 EnumerationUsage(Node<EnumerationUsage>),
225 PartUsage(Box<Node<PartUsage>>),
226 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
227 PortUsage(Node<PortUsage>),
228 Bind(Node<Bind>),
229 Ref(Node<RefDecl>),
231 InterfaceUsage(Node<InterfaceUsage>),
232 Connect(Node<Connect>),
233 Perform(Node<Perform>),
234 Allocate(Node<Allocate>),
235 Satisfy(Node<Satisfy>),
236 StateUsage(Node<StateUsage>),
237 MetadataAnnotation(Node<MetadataAnnotation>),
238 MetadataKeywordUsage(Node<MetadataKeywordUsage>),
239}
240
241#[derive(Debug, Clone, PartialEq, Eq)]
243pub struct Perform {
244 pub action_name: String,
246 pub type_name: Option<String>,
248 pub body: PerformBody,
249}
250
251#[derive(Debug, Clone, PartialEq, Eq)]
253pub enum PerformBody {
254 Semicolon,
255 Brace {
256 elements: Vec<Node<PerformBodyElement>>,
257 },
258}
259
260#[derive(Debug, Clone, PartialEq, Eq)]
262pub enum PerformBodyElement {
263 Doc(Node<DocComment>),
264 InOut(Node<PerformInOutBinding>),
265}
266
267#[derive(Debug, Clone, PartialEq, Eq)]
269pub struct PerformInOutBinding {
270 pub direction: InOut,
271 pub name: String,
272 pub value: Node<Expression>,
273}
274
275#[derive(Debug, Clone, PartialEq, Eq)]
277pub struct AttributeUsage {
278 pub name: String,
279 pub typing: Option<String>,
281 pub subsets: Option<String>,
283 pub redefines: Option<String>,
285 pub references: Option<String>,
287 pub crosses: Option<String>,
289 pub value: Option<Node<Expression>>,
291 pub body: AttributeBody,
292 pub name_span: Option<Span>,
294 pub typing_span: Option<Span>,
296 pub redefines_span: Option<Span>,
298}
299
300#[derive(Debug, Clone, PartialEq, Eq)]
306pub struct PortDef {
307 pub identification: Identification,
308 pub specializes: Option<String>,
310 pub specializes_span: Option<Span>,
311 pub body: PortDefBody,
312}
313
314#[derive(Debug, Clone, PartialEq, Eq)]
316pub enum PortDefBody {
317 Semicolon,
318 Brace {
319 elements: Vec<Node<PortDefBodyElement>>,
320 },
321}
322
323#[derive(Debug, Clone, PartialEq, Eq)]
325pub enum PortDefBodyElement {
326 InOutDecl(Node<InOutDecl>),
327 Doc(Node<DocComment>),
328 Error(Node<ParseErrorNode>),
329 AttributeDef(Node<AttributeDef>),
330 AttributeUsage(Node<AttributeUsage>),
331 PortUsage(Node<PortUsage>),
332}
333
334#[derive(Debug, Clone, PartialEq, Eq)]
336pub struct PortUsage {
337 pub name: String,
338 pub type_name: Option<String>,
339 pub multiplicity: Option<String>,
340 pub subsets: Option<(String, Option<Node<Expression>>)>,
342 pub redefines: Option<String>,
343 pub references: Option<String>,
345 pub crosses: Option<String>,
347 pub body: PortBody,
348 pub name_span: Option<Span>,
350 pub type_ref_span: Option<Span>,
352}
353
354#[derive(Debug, Clone, PartialEq, Eq)]
356pub enum PortBody {
357 Semicolon,
358 Brace {
359 elements: Vec<Node<PortBodyElement>>,
360 },
361}
362
363#[derive(Debug, Clone, PartialEq, Eq)]
365#[allow(clippy::large_enum_variant)]
366pub enum PortBodyElement {
367 Error(Node<ParseErrorNode>),
368 InOutDecl(Node<InOutDecl>),
369 PortUsage(Node<PortUsage>),
370 Other(String),
371}
372
373#[derive(Debug, Clone, PartialEq, Eq)]
375pub struct ConnectStmt {
376 pub from: Node<Expression>,
377 pub to: Node<Expression>,
378 pub body: ConnectBody,
379}
380
381#[derive(Debug, Clone, PartialEq, Eq)]
387pub struct InterfaceDef {
388 pub identification: Identification,
389 pub specializes: Option<String>,
390 pub specializes_span: Option<Span>,
391 pub body: InterfaceDefBody,
392}
393
394#[derive(Debug, Clone, PartialEq, Eq)]
396pub enum InterfaceDefBody {
397 Semicolon,
398 Brace {
399 elements: Vec<Node<InterfaceDefBodyElement>>,
400 },
401}
402
403#[derive(Debug, Clone, PartialEq, Eq)]
405pub enum InterfaceDefBodyElement {
406 Doc(Node<DocComment>),
407 EndDecl(Node<EndDecl>),
408 RefDecl(Node<RefDecl>),
409 ConnectStmt(Node<ConnectStmt>),
410}
411
412#[derive(Debug, Clone, PartialEq, Eq)]
414pub struct EndDecl {
415 pub name: String,
416 pub type_name: String,
417 pub uses_derived_syntax: bool,
418 pub name_span: Option<Span>,
420 pub type_ref_span: Option<Span>,
422}
423
424#[derive(Debug, Clone, PartialEq, Eq)]
426pub struct RefDecl {
427 pub name: String,
428 pub type_name: String,
429 pub value: Option<Node<Expression>>,
431 pub body: RefBody,
432 pub name_span: Option<Span>,
434 pub type_ref_span: Option<Span>,
436}
437
438#[derive(Debug, Clone, PartialEq, Eq)]
440pub enum RefBody {
441 Semicolon,
442 Brace,
443}
444
445#[derive(Debug, Clone, PartialEq, Eq)]
451pub struct ConnectionDef {
452 pub annotation: Option<String>,
453 pub identification: Identification,
454 pub specializes: Option<String>,
455 pub specializes_span: Option<Span>,
456 pub body: ConnectionDefBody,
457}
458
459#[derive(Debug, Clone, PartialEq, Eq)]
461pub enum ConnectionDefBody {
462 Semicolon,
463 Brace {
464 elements: Vec<Node<ConnectionDefBodyElement>>,
465 },
466}
467
468#[derive(Debug, Clone, PartialEq, Eq)]
469pub enum ConnectionDefBodyElement {
470 EndDecl(Node<EndDecl>),
471 RefDecl(Node<RefDecl>),
472 ConnectStmt(Node<ConnectStmt>),
473}
474
475#[derive(Debug, Clone, PartialEq, Eq)]
481pub struct MetadataDef {
482 pub is_abstract: bool,
483 pub identification: Identification,
484 pub specializes: Option<String>,
485 pub specializes_span: Option<Span>,
486 pub body: AttributeBody,
487}
488
489#[derive(Debug, Clone, PartialEq, Eq)]
491pub struct MetadataUsage {
492 pub name: String,
493 pub type_name: Option<String>,
494 pub body: AttributeBody,
495}
496
497#[derive(Debug, Clone, PartialEq, Eq)]
503pub struct EnumDef {
504 pub identification: Identification,
505 pub specializes: Option<String>,
506 pub specializes_span: Option<Span>,
507 pub body: EnumerationBody,
508}
509
510#[derive(Debug, Clone, PartialEq, Eq)]
511pub enum EnumerationBody {
512 Semicolon,
513 Brace { values: Vec<String> },
514}
515
516#[derive(Debug, Clone, PartialEq, Eq)]
522pub struct OccurrenceDef {
523 pub is_abstract: bool,
524 pub identification: Identification,
525 pub specializes: Option<String>,
526 pub specializes_span: Option<Span>,
527 pub body: DefinitionBody,
528}
529
530#[derive(Debug, Clone, PartialEq, Eq)]
532pub struct OccurrenceUsage {
533 pub is_individual: bool,
534 pub is_then: bool,
535 pub portion_kind: Option<String>,
536 pub name: String,
537 pub type_name: Option<String>,
538 pub subsets: Option<String>,
539 pub redefines: Option<String>,
540 pub references: Option<String>,
541 pub crosses: Option<String>,
542 pub body: OccurrenceUsageBody,
543}
544
545#[derive(Debug, Clone, PartialEq, Eq)]
546pub enum OccurrenceUsageBody {
547 Semicolon,
548 Brace {
549 elements: Vec<Node<OccurrenceBodyElement>>,
550 },
551}
552
553#[derive(Debug, Clone, PartialEq, Eq)]
555pub struct AssertConstraintMember {
556 pub body: ConstraintDefBody,
557}
558
559#[derive(Debug, Clone, PartialEq, Eq)]
560#[allow(clippy::large_enum_variant)]
561pub enum OccurrenceBodyElement {
562 Error(Node<ParseErrorNode>),
563 Doc(Node<DocComment>),
564 Annotation(Node<Annotation>),
565 AssertConstraint(Node<AssertConstraintMember>),
566 Other(String),
567 AttributeUsage(Node<AttributeUsage>),
568 PartUsage(Box<Node<PartUsage>>),
569 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
570}
571
572#[derive(Debug, Clone, PartialEq, Eq)]
578pub enum DefinitionBody {
579 Semicolon,
580 Brace {
581 elements: Vec<Node<DefinitionBodyElement>>,
582 },
583}
584
585#[derive(Debug, Clone, PartialEq, Eq)]
586#[allow(clippy::large_enum_variant)]
587pub enum DefinitionBodyElement {
588 Error(Node<ParseErrorNode>),
589 Doc(Node<DocComment>),
590 OccurrenceMember(Node<OccurrenceBodyElement>),
591 Other(String),
592}
593#[derive(Debug, Clone, PartialEq, Eq)]
599pub struct Bind {
600 pub left: Node<Expression>,
601 pub right: Node<Expression>,
602 pub body: Option<ConnectBody>,
604}
605
606#[derive(Debug, Clone, PartialEq, Eq)]
608pub enum InterfaceUsage {
609 TypedConnect {
611 interface_type: Option<String>,
612 from: Node<Expression>,
613 to: Node<Expression>,
614 body: ConnectBody,
615 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
616 },
617 Connection {
619 from: Node<Expression>,
620 to: Node<Expression>,
621 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
622 },
623}
624
625#[derive(Debug, Clone, PartialEq, Eq)]
627pub enum InterfaceUsageBodyElement {
628 RefRedef {
630 name: String,
631 value: Node<Expression>,
632 body: RefBody,
633 },
634}
635
636#[derive(Debug, Clone, PartialEq, Eq)]
638pub struct Connect {
639 pub from: Node<Expression>,
640 pub to: Node<Expression>,
641 pub body: ConnectBody,
642}
643
644#[derive(Debug, Clone, PartialEq, Eq)]
650pub struct AliasDef {
651 pub identification: Identification,
652 pub target: String,
653 pub body: AliasBody,
654}
655
656#[derive(Debug, Clone, PartialEq, Eq)]
658pub enum AliasBody {
659 Semicolon,
660 Brace,
661}