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 pub direction: Option<InOut>,
300}
301
302#[derive(Debug, Clone, PartialEq, Eq)]
308pub struct PortDef {
309 pub identification: Identification,
310 pub specializes: Option<String>,
312 pub specializes_span: Option<Span>,
313 pub body: PortDefBody,
314}
315
316#[derive(Debug, Clone, PartialEq, Eq)]
318pub enum PortDefBody {
319 Semicolon,
320 Brace {
321 elements: Vec<Node<PortDefBodyElement>>,
322 },
323}
324
325#[derive(Debug, Clone, PartialEq, Eq)]
327pub enum PortDefBodyElement {
328 InOutDecl(Node<InOutDecl>),
329 Doc(Node<DocComment>),
330 Error(Node<ParseErrorNode>),
331 AttributeDef(Node<AttributeDef>),
332 AttributeUsage(Node<AttributeUsage>),
333 ItemUsage(Node<ItemUsage>),
334 PortUsage(Node<PortUsage>),
335}
336
337#[derive(Debug, Clone, PartialEq, Eq)]
339pub struct PortUsage {
340 pub name: String,
341 pub type_name: Option<String>,
342 pub multiplicity: Option<String>,
343 pub subsets: Option<(String, Option<Node<Expression>>)>,
345 pub redefines: Option<String>,
346 pub references: Option<String>,
348 pub crosses: Option<String>,
350 pub body: PortBody,
351 pub name_span: Option<Span>,
353 pub type_ref_span: Option<Span>,
355}
356
357#[derive(Debug, Clone, PartialEq, Eq)]
359pub enum PortBody {
360 Semicolon,
361 Brace {
362 elements: Vec<Node<PortBodyElement>>,
363 },
364}
365
366#[derive(Debug, Clone, PartialEq, Eq)]
368#[allow(clippy::large_enum_variant)]
369pub enum PortBodyElement {
370 Error(Node<ParseErrorNode>),
371 InOutDecl(Node<InOutDecl>),
372 PortUsage(Node<PortUsage>),
373 Other(String),
374}
375
376#[derive(Debug, Clone, PartialEq, Eq)]
378pub struct ConnectStmt {
379 pub from: Node<Expression>,
380 pub to: Node<Expression>,
381 pub body: ConnectBody,
382}
383
384#[derive(Debug, Clone, PartialEq, Eq)]
390pub struct InterfaceDef {
391 pub identification: Identification,
392 pub specializes: Option<String>,
393 pub specializes_span: Option<Span>,
394 pub body: InterfaceDefBody,
395}
396
397#[derive(Debug, Clone, PartialEq, Eq)]
399pub enum InterfaceDefBody {
400 Semicolon,
401 Brace {
402 elements: Vec<Node<InterfaceDefBodyElement>>,
403 },
404}
405
406#[derive(Debug, Clone, PartialEq, Eq)]
408pub enum InterfaceDefBodyElement {
409 Doc(Node<DocComment>),
410 EndDecl(Node<EndDecl>),
411 RefDecl(Node<RefDecl>),
412 ConnectStmt(Node<ConnectStmt>),
413}
414
415#[derive(Debug, Clone, PartialEq, Eq)]
417pub struct EndDecl {
418 pub name: String,
419 pub type_name: String,
420 pub uses_derived_syntax: bool,
421 pub name_span: Option<Span>,
423 pub type_ref_span: Option<Span>,
425}
426
427#[derive(Debug, Clone, PartialEq, Eq)]
429pub struct RefDecl {
430 pub name: String,
431 pub type_name: String,
432 pub value: Option<Node<Expression>>,
434 pub body: RefBody,
435 pub name_span: Option<Span>,
437 pub type_ref_span: Option<Span>,
439}
440
441#[derive(Debug, Clone, PartialEq, Eq)]
443pub enum RefBody {
444 Semicolon,
445 Brace,
446}
447
448#[derive(Debug, Clone, PartialEq, Eq)]
454pub struct ConnectionDef {
455 pub annotation: Option<String>,
456 pub identification: Identification,
457 pub specializes: Option<String>,
458 pub specializes_span: Option<Span>,
459 pub body: ConnectionDefBody,
460}
461
462#[derive(Debug, Clone, PartialEq, Eq)]
464pub enum ConnectionDefBody {
465 Semicolon,
466 Brace {
467 elements: Vec<Node<ConnectionDefBodyElement>>,
468 },
469}
470
471#[derive(Debug, Clone, PartialEq, Eq)]
472pub enum ConnectionDefBodyElement {
473 EndDecl(Node<EndDecl>),
474 RefDecl(Node<RefDecl>),
475 ConnectStmt(Node<ConnectStmt>),
476}
477
478#[derive(Debug, Clone, PartialEq, Eq)]
484pub struct MetadataDef {
485 pub is_abstract: bool,
486 pub identification: Identification,
487 pub specializes: Option<String>,
488 pub specializes_span: Option<Span>,
489 pub body: AttributeBody,
490}
491
492#[derive(Debug, Clone, PartialEq, Eq)]
494pub struct MetadataUsage {
495 pub name: String,
496 pub type_name: Option<String>,
497 pub body: AttributeBody,
498}
499
500#[derive(Debug, Clone, PartialEq, Eq)]
506pub struct EnumDef {
507 pub identification: Identification,
508 pub specializes: Option<String>,
509 pub specializes_span: Option<Span>,
510 pub body: EnumerationBody,
511}
512
513#[derive(Debug, Clone, PartialEq, Eq)]
514pub enum EnumerationBody {
515 Semicolon,
516 Brace { values: Vec<String> },
517}
518
519#[derive(Debug, Clone, PartialEq, Eq)]
525pub struct OccurrenceDef {
526 pub is_abstract: bool,
527 pub identification: Identification,
528 pub specializes: Option<String>,
529 pub specializes_span: Option<Span>,
530 pub body: DefinitionBody,
531}
532
533#[derive(Debug, Clone, PartialEq, Eq)]
535pub struct OccurrenceUsage {
536 pub is_individual: bool,
537 pub is_then: bool,
538 pub portion_kind: Option<String>,
539 pub name: String,
540 pub type_name: Option<String>,
541 pub subsets: Option<String>,
542 pub redefines: Option<String>,
543 pub references: Option<String>,
544 pub crosses: Option<String>,
545 pub body: OccurrenceUsageBody,
546}
547
548#[derive(Debug, Clone, PartialEq, Eq)]
549pub enum OccurrenceUsageBody {
550 Semicolon,
551 Brace {
552 elements: Vec<Node<OccurrenceBodyElement>>,
553 },
554}
555
556#[derive(Debug, Clone, PartialEq, Eq)]
558pub struct AssertConstraintMember {
559 pub body: ConstraintDefBody,
560}
561
562#[derive(Debug, Clone, PartialEq, Eq)]
563#[allow(clippy::large_enum_variant)]
564pub enum OccurrenceBodyElement {
565 Error(Node<ParseErrorNode>),
566 Doc(Node<DocComment>),
567 Annotation(Node<Annotation>),
568 AssertConstraint(Node<AssertConstraintMember>),
569 Other(String),
570 AttributeUsage(Node<AttributeUsage>),
571 PartUsage(Box<Node<PartUsage>>),
572 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
573}
574
575#[derive(Debug, Clone, PartialEq, Eq)]
581pub enum DefinitionBody {
582 Semicolon,
583 Brace {
584 elements: Vec<Node<DefinitionBodyElement>>,
585 },
586}
587
588#[derive(Debug, Clone, PartialEq, Eq)]
589#[allow(clippy::large_enum_variant)]
590pub enum DefinitionBodyElement {
591 Error(Node<ParseErrorNode>),
592 Doc(Node<DocComment>),
593 OccurrenceMember(Node<OccurrenceBodyElement>),
594 Other(String),
595}
596#[derive(Debug, Clone, PartialEq, Eq)]
602pub struct Bind {
603 pub left: Node<Expression>,
604 pub right: Node<Expression>,
605 pub body: Option<ConnectBody>,
607}
608
609#[derive(Debug, Clone, PartialEq, Eq)]
611pub enum InterfaceUsage {
612 TypedConnect {
614 interface_type: Option<String>,
615 from: Node<Expression>,
616 to: Node<Expression>,
617 body: ConnectBody,
618 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
619 },
620 Connection {
622 from: Node<Expression>,
623 to: Node<Expression>,
624 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
625 },
626}
627
628#[derive(Debug, Clone, PartialEq, Eq)]
630pub enum InterfaceUsageBodyElement {
631 RefRedef {
633 name: String,
634 value: Node<Expression>,
635 body: RefBody,
636 },
637}
638
639#[derive(Debug, Clone, PartialEq, Eq)]
641pub struct Connect {
642 pub from: Node<Expression>,
643 pub to: Node<Expression>,
644 pub body: ConnectBody,
645}
646
647#[derive(Debug, Clone, PartialEq, Eq)]
653pub struct AliasDef {
654 pub identification: Identification,
655 pub target: String,
656 pub body: AliasBody,
657}
658
659#[derive(Debug, Clone, PartialEq, Eq)]
661pub enum AliasBody {
662 Semicolon,
663 Brace,
664}