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 PortUsage(Node<PortUsage>),
334}
335
336#[derive(Debug, Clone, PartialEq, Eq)]
338pub struct PortUsage {
339 pub name: String,
340 pub type_name: Option<String>,
341 pub multiplicity: Option<String>,
342 pub subsets: Option<(String, Option<Node<Expression>>)>,
344 pub redefines: Option<String>,
345 pub references: Option<String>,
347 pub crosses: Option<String>,
349 pub body: PortBody,
350 pub name_span: Option<Span>,
352 pub type_ref_span: Option<Span>,
354}
355
356#[derive(Debug, Clone, PartialEq, Eq)]
358pub enum PortBody {
359 Semicolon,
360 Brace {
361 elements: Vec<Node<PortBodyElement>>,
362 },
363}
364
365#[derive(Debug, Clone, PartialEq, Eq)]
367#[allow(clippy::large_enum_variant)]
368pub enum PortBodyElement {
369 Error(Node<ParseErrorNode>),
370 InOutDecl(Node<InOutDecl>),
371 PortUsage(Node<PortUsage>),
372 Other(String),
373}
374
375#[derive(Debug, Clone, PartialEq, Eq)]
377pub struct ConnectStmt {
378 pub from: Node<Expression>,
379 pub to: Node<Expression>,
380 pub body: ConnectBody,
381}
382
383#[derive(Debug, Clone, PartialEq, Eq)]
389pub struct InterfaceDef {
390 pub identification: Identification,
391 pub specializes: Option<String>,
392 pub specializes_span: Option<Span>,
393 pub body: InterfaceDefBody,
394}
395
396#[derive(Debug, Clone, PartialEq, Eq)]
398pub enum InterfaceDefBody {
399 Semicolon,
400 Brace {
401 elements: Vec<Node<InterfaceDefBodyElement>>,
402 },
403}
404
405#[derive(Debug, Clone, PartialEq, Eq)]
407pub enum InterfaceDefBodyElement {
408 Doc(Node<DocComment>),
409 EndDecl(Node<EndDecl>),
410 RefDecl(Node<RefDecl>),
411 ConnectStmt(Node<ConnectStmt>),
412}
413
414#[derive(Debug, Clone, PartialEq, Eq)]
416pub struct EndDecl {
417 pub name: String,
418 pub type_name: String,
419 pub uses_derived_syntax: bool,
420 pub name_span: Option<Span>,
422 pub type_ref_span: Option<Span>,
424}
425
426#[derive(Debug, Clone, PartialEq, Eq)]
428pub struct RefDecl {
429 pub name: String,
430 pub type_name: String,
431 pub value: Option<Node<Expression>>,
433 pub body: RefBody,
434 pub name_span: Option<Span>,
436 pub type_ref_span: Option<Span>,
438}
439
440#[derive(Debug, Clone, PartialEq, Eq)]
442pub enum RefBody {
443 Semicolon,
444 Brace,
445}
446
447#[derive(Debug, Clone, PartialEq, Eq)]
453pub struct ConnectionDef {
454 pub annotation: Option<String>,
455 pub identification: Identification,
456 pub specializes: Option<String>,
457 pub specializes_span: Option<Span>,
458 pub body: ConnectionDefBody,
459}
460
461#[derive(Debug, Clone, PartialEq, Eq)]
463pub enum ConnectionDefBody {
464 Semicolon,
465 Brace {
466 elements: Vec<Node<ConnectionDefBodyElement>>,
467 },
468}
469
470#[derive(Debug, Clone, PartialEq, Eq)]
471pub enum ConnectionDefBodyElement {
472 EndDecl(Node<EndDecl>),
473 RefDecl(Node<RefDecl>),
474 ConnectStmt(Node<ConnectStmt>),
475}
476
477#[derive(Debug, Clone, PartialEq, Eq)]
483pub struct MetadataDef {
484 pub is_abstract: bool,
485 pub identification: Identification,
486 pub specializes: Option<String>,
487 pub specializes_span: Option<Span>,
488 pub body: AttributeBody,
489}
490
491#[derive(Debug, Clone, PartialEq, Eq)]
493pub struct MetadataUsage {
494 pub name: String,
495 pub type_name: Option<String>,
496 pub body: AttributeBody,
497}
498
499#[derive(Debug, Clone, PartialEq, Eq)]
505pub struct EnumDef {
506 pub identification: Identification,
507 pub specializes: Option<String>,
508 pub specializes_span: Option<Span>,
509 pub body: EnumerationBody,
510}
511
512#[derive(Debug, Clone, PartialEq, Eq)]
513pub enum EnumerationBody {
514 Semicolon,
515 Brace { values: Vec<String> },
516}
517
518#[derive(Debug, Clone, PartialEq, Eq)]
524pub struct OccurrenceDef {
525 pub is_abstract: bool,
526 pub identification: Identification,
527 pub specializes: Option<String>,
528 pub specializes_span: Option<Span>,
529 pub body: DefinitionBody,
530}
531
532#[derive(Debug, Clone, PartialEq, Eq)]
534pub struct OccurrenceUsage {
535 pub is_individual: bool,
536 pub is_then: bool,
537 pub portion_kind: Option<String>,
538 pub name: String,
539 pub type_name: Option<String>,
540 pub subsets: Option<String>,
541 pub redefines: Option<String>,
542 pub references: Option<String>,
543 pub crosses: Option<String>,
544 pub body: OccurrenceUsageBody,
545}
546
547#[derive(Debug, Clone, PartialEq, Eq)]
548pub enum OccurrenceUsageBody {
549 Semicolon,
550 Brace {
551 elements: Vec<Node<OccurrenceBodyElement>>,
552 },
553}
554
555#[derive(Debug, Clone, PartialEq, Eq)]
557pub struct AssertConstraintMember {
558 pub body: ConstraintDefBody,
559}
560
561#[derive(Debug, Clone, PartialEq, Eq)]
562#[allow(clippy::large_enum_variant)]
563pub enum OccurrenceBodyElement {
564 Error(Node<ParseErrorNode>),
565 Doc(Node<DocComment>),
566 Annotation(Node<Annotation>),
567 AssertConstraint(Node<AssertConstraintMember>),
568 Other(String),
569 AttributeUsage(Node<AttributeUsage>),
570 PartUsage(Box<Node<PartUsage>>),
571 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
572}
573
574#[derive(Debug, Clone, PartialEq, Eq)]
580pub enum DefinitionBody {
581 Semicolon,
582 Brace {
583 elements: Vec<Node<DefinitionBodyElement>>,
584 },
585}
586
587#[derive(Debug, Clone, PartialEq, Eq)]
588#[allow(clippy::large_enum_variant)]
589pub enum DefinitionBodyElement {
590 Error(Node<ParseErrorNode>),
591 Doc(Node<DocComment>),
592 OccurrenceMember(Node<OccurrenceBodyElement>),
593 Other(String),
594}
595#[derive(Debug, Clone, PartialEq, Eq)]
601pub struct Bind {
602 pub left: Node<Expression>,
603 pub right: Node<Expression>,
604 pub body: Option<ConnectBody>,
606}
607
608#[derive(Debug, Clone, PartialEq, Eq)]
610pub enum InterfaceUsage {
611 TypedConnect {
613 interface_type: Option<String>,
614 from: Node<Expression>,
615 to: Node<Expression>,
616 body: ConnectBody,
617 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
618 },
619 Connection {
621 from: Node<Expression>,
622 to: Node<Expression>,
623 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
624 },
625}
626
627#[derive(Debug, Clone, PartialEq, Eq)]
629pub enum InterfaceUsageBodyElement {
630 RefRedef {
632 name: String,
633 value: Node<Expression>,
634 body: RefBody,
635 },
636}
637
638#[derive(Debug, Clone, PartialEq, Eq)]
640pub struct Connect {
641 pub from: Node<Expression>,
642 pub to: Node<Expression>,
643 pub body: ConnectBody,
644}
645
646#[derive(Debug, Clone, PartialEq, Eq)]
652pub struct AliasDef {
653 pub identification: Identification,
654 pub target: String,
655 pub body: AliasBody,
656}
657
658#[derive(Debug, Clone, PartialEq, Eq)]
660pub enum AliasBody {
661 Semicolon,
662 Brace,
663}