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 Other(String),
46 AttributeDef(Node<AttributeDef>),
47 AttributeUsage(Node<AttributeUsage>),
48 RequirementUsage(Node<RequirementUsage>),
49 ItemUsage(Node<ItemUsage>),
50 Ref(Node<RefDecl>),
51 PortUsage(Node<PortUsage>),
52 PartUsage(Box<Node<PartUsage>>),
53 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
54 InterfaceDef(Node<InterfaceDef>),
55 InterfaceUsage(Node<InterfaceUsage>),
56 Connect(Node<Connect>),
57 Connection(Node<ConnectionUsageMember>),
59 Perform(Node<Perform>),
60 Allocate(Node<Allocate>),
61 OpaqueMember(Node<OpaqueMemberDecl>),
62 ExhibitState(Node<ExhibitState>),
64 CalcUsage(Node<CalcUsage>),
66 EnumerationUsage(Node<EnumerationUsage>),
68}
69
70#[derive(Debug, Clone, PartialEq, Eq)]
72pub struct OpaqueMemberDecl {
73 pub keyword: String,
74 pub name: String,
75 pub text: String,
76 pub body: AttributeBody,
77}
78
79#[derive(Debug, Clone, PartialEq, Eq)]
81pub struct ConnectionUsageMember {
82 pub name: Option<String>,
83 pub type_name: Option<String>,
84 pub body: ConnectionDefBody,
85 pub subsets: Option<String>,
86 pub redefines: Option<String>,
87}
88
89#[derive(Debug, Clone, PartialEq, Eq)]
91pub struct ExhibitState {
92 pub name: String,
93 pub type_name: Option<String>,
94 pub redefines: Option<String>,
95 pub body: StateDefBody,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq)]
100pub struct AttributeDef {
101 pub name: String,
102 pub typing: Option<String>,
104 pub value: Option<Node<Expression>>,
106 pub body: AttributeBody,
107 pub name_span: Option<Span>,
109 pub typing_span: Option<Span>,
111}
112
113#[derive(Debug, Clone, PartialEq, Eq)]
115pub enum AttributeBody {
116 Semicolon,
117 Brace {
118 elements: Vec<Node<AttributeBodyElement>>,
119 },
120}
121
122#[derive(Debug, Clone, PartialEq, Eq)]
123pub enum AttributeBodyElement {
124 Error(Node<ParseErrorNode>),
125 Doc(Node<DocComment>),
126 AttributeDef(Node<AttributeDef>),
127 AttributeUsage(Node<AttributeUsage>),
128 Other(String),
129}
130
131#[derive(Debug, Clone, PartialEq, Eq)]
133pub struct ItemDef {
134 pub identification: Identification,
135 pub specializes: Option<String>,
136 pub specializes_span: Option<Span>,
137 pub body: AttributeBody,
138}
139
140#[derive(Debug, Clone, PartialEq, Eq)]
142pub struct IndividualDef {
143 pub identification: Identification,
144 pub specializes: Option<String>,
145 pub specializes_span: Option<Span>,
146 pub body: AttributeBody,
147}
148
149#[derive(Debug, Clone, PartialEq, Eq)]
151pub struct PartUsage {
152 pub is_individual: bool,
153 pub name: String,
154 pub type_name: String,
156 pub multiplicity: Option<String>,
158 pub ordered: bool,
159 pub subsets: Option<(String, Option<Node<Expression>>)>,
161 pub redefines: Option<String>,
163 pub value: Option<Node<Expression>>,
165 pub body: PartUsageBody,
166 pub name_span: Option<Span>,
168 pub type_ref_span: Option<Span>,
170}
171
172#[derive(Debug, Clone, PartialEq, Eq)]
174pub enum PartUsageBody {
175 Semicolon,
176 Brace {
177 elements: Vec<Node<PartUsageBodyElement>>,
178 },
179}
180
181#[derive(Debug, Clone, PartialEq, Eq)]
183pub struct MetadataAnnotation {
184 pub name: String,
185 pub type_name: Option<String>,
186 pub body: ConnectBody,
187}
188
189#[derive(Debug, Clone, PartialEq, Eq)]
191pub struct Annotation {
192 pub sigil: String,
193 pub head: String,
194 pub type_name: Option<String>,
195 pub body: ConnectBody,
196}
197
198#[derive(Debug, Clone, PartialEq, Eq)]
200pub enum PartUsageBodyElement {
201 Error(Node<ParseErrorNode>),
202 Doc(Node<DocComment>),
203 Annotation(Node<Annotation>),
204 AttributeUsage(Node<AttributeUsage>),
205 EnumerationUsage(Node<EnumerationUsage>),
206 PartUsage(Box<Node<PartUsage>>),
207 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
208 PortUsage(Node<PortUsage>),
209 Bind(Node<Bind>),
210 Ref(Node<RefDecl>),
212 InterfaceUsage(Node<InterfaceUsage>),
213 Connect(Node<Connect>),
214 Perform(Node<Perform>),
215 Allocate(Node<Allocate>),
216 Satisfy(Node<Satisfy>),
217 StateUsage(Node<StateUsage>),
218 MetadataAnnotation(Node<MetadataAnnotation>),
219}
220
221#[derive(Debug, Clone, PartialEq, Eq)]
223pub struct Perform {
224 pub action_name: String,
226 pub type_name: Option<String>,
228 pub body: PerformBody,
229}
230
231#[derive(Debug, Clone, PartialEq, Eq)]
233pub enum PerformBody {
234 Semicolon,
235 Brace {
236 elements: Vec<Node<PerformBodyElement>>,
237 },
238}
239
240#[derive(Debug, Clone, PartialEq, Eq)]
242pub enum PerformBodyElement {
243 Doc(Node<DocComment>),
244 InOut(Node<PerformInOutBinding>),
245}
246
247#[derive(Debug, Clone, PartialEq, Eq)]
249pub struct PerformInOutBinding {
250 pub direction: InOut,
251 pub name: String,
252 pub value: Node<Expression>,
253}
254
255#[derive(Debug, Clone, PartialEq, Eq)]
257pub struct AttributeUsage {
258 pub name: String,
259 pub typing: Option<String>,
261 pub subsets: Option<String>,
263 pub redefines: Option<String>,
265 pub references: Option<String>,
267 pub crosses: Option<String>,
269 pub value: Option<Node<Expression>>,
271 pub body: AttributeBody,
272 pub name_span: Option<Span>,
274 pub typing_span: Option<Span>,
276 pub redefines_span: Option<Span>,
278}
279
280#[derive(Debug, Clone, PartialEq, Eq)]
286pub struct PortDef {
287 pub identification: Identification,
288 pub specializes: Option<String>,
290 pub specializes_span: Option<Span>,
291 pub body: PortDefBody,
292}
293
294#[derive(Debug, Clone, PartialEq, Eq)]
296pub enum PortDefBody {
297 Semicolon,
298 Brace {
299 elements: Vec<Node<PortDefBodyElement>>,
300 },
301}
302
303#[derive(Debug, Clone, PartialEq, Eq)]
305pub enum PortDefBodyElement {
306 InOutDecl(Node<InOutDecl>),
307 Doc(Node<DocComment>),
308 Error(Node<ParseErrorNode>),
309 AttributeDef(Node<AttributeDef>),
310 AttributeUsage(Node<AttributeUsage>),
311 PortUsage(Node<PortUsage>),
312}
313
314#[derive(Debug, Clone, PartialEq, Eq)]
316pub struct PortUsage {
317 pub name: String,
318 pub type_name: Option<String>,
319 pub multiplicity: Option<String>,
320 pub subsets: Option<(String, Option<Node<Expression>>)>,
322 pub redefines: Option<String>,
323 pub references: Option<String>,
325 pub crosses: Option<String>,
327 pub body: PortBody,
328 pub name_span: Option<Span>,
330 pub type_ref_span: Option<Span>,
332}
333
334#[derive(Debug, Clone, PartialEq, Eq)]
336pub enum PortBody {
337 Semicolon,
338 Brace {
339 elements: Vec<Node<PortBodyElement>>,
340 },
341}
342
343#[derive(Debug, Clone, PartialEq, Eq)]
345#[allow(clippy::large_enum_variant)]
346pub enum PortBodyElement {
347 Error(Node<ParseErrorNode>),
348 InOutDecl(Node<InOutDecl>),
349 PortUsage(Node<PortUsage>),
350 Other(String),
351}
352
353#[derive(Debug, Clone, PartialEq, Eq)]
355pub struct ConnectStmt {
356 pub from: Node<Expression>,
357 pub to: Node<Expression>,
358 pub body: ConnectBody,
359}
360
361#[derive(Debug, Clone, PartialEq, Eq)]
367pub struct InterfaceDef {
368 pub identification: Identification,
369 pub specializes: Option<String>,
370 pub specializes_span: Option<Span>,
371 pub body: InterfaceDefBody,
372}
373
374#[derive(Debug, Clone, PartialEq, Eq)]
376pub enum InterfaceDefBody {
377 Semicolon,
378 Brace {
379 elements: Vec<Node<InterfaceDefBodyElement>>,
380 },
381}
382
383#[derive(Debug, Clone, PartialEq, Eq)]
385pub enum InterfaceDefBodyElement {
386 Doc(Node<DocComment>),
387 EndDecl(Node<EndDecl>),
388 RefDecl(Node<RefDecl>),
389 ConnectStmt(Node<ConnectStmt>),
390}
391
392#[derive(Debug, Clone, PartialEq, Eq)]
394pub struct EndDecl {
395 pub name: String,
396 pub type_name: String,
397 pub uses_derived_syntax: bool,
398 pub name_span: Option<Span>,
400 pub type_ref_span: Option<Span>,
402}
403
404#[derive(Debug, Clone, PartialEq, Eq)]
406pub struct RefDecl {
407 pub name: String,
408 pub type_name: String,
409 pub value: Option<Node<Expression>>,
411 pub body: RefBody,
412 pub name_span: Option<Span>,
414 pub type_ref_span: Option<Span>,
416}
417
418#[derive(Debug, Clone, PartialEq, Eq)]
420pub enum RefBody {
421 Semicolon,
422 Brace,
423}
424
425#[derive(Debug, Clone, PartialEq, Eq)]
431pub struct ConnectionDef {
432 pub annotation: Option<String>,
433 pub identification: Identification,
434 pub specializes: Option<String>,
435 pub specializes_span: Option<Span>,
436 pub body: ConnectionDefBody,
437}
438
439#[derive(Debug, Clone, PartialEq, Eq)]
441pub enum ConnectionDefBody {
442 Semicolon,
443 Brace {
444 elements: Vec<Node<ConnectionDefBodyElement>>,
445 },
446}
447
448#[derive(Debug, Clone, PartialEq, Eq)]
449pub enum ConnectionDefBodyElement {
450 EndDecl(Node<EndDecl>),
451 RefDecl(Node<RefDecl>),
452 ConnectStmt(Node<ConnectStmt>),
453}
454
455#[derive(Debug, Clone, PartialEq, Eq)]
461pub struct MetadataDef {
462 pub is_abstract: bool,
463 pub identification: Identification,
464 pub specializes: Option<String>,
465 pub specializes_span: Option<Span>,
466 pub body: DefinitionBody,
467}
468
469#[derive(Debug, Clone, PartialEq, Eq)]
475pub struct EnumDef {
476 pub identification: Identification,
477 pub specializes: Option<String>,
478 pub specializes_span: Option<Span>,
479 pub body: EnumerationBody,
480}
481
482#[derive(Debug, Clone, PartialEq, Eq)]
483pub enum EnumerationBody {
484 Semicolon,
485 Brace { values: Vec<String> },
486}
487
488#[derive(Debug, Clone, PartialEq, Eq)]
494pub struct OccurrenceDef {
495 pub is_abstract: bool,
496 pub identification: Identification,
497 pub specializes: Option<String>,
498 pub specializes_span: Option<Span>,
499 pub body: DefinitionBody,
500}
501
502#[derive(Debug, Clone, PartialEq, Eq)]
504pub struct OccurrenceUsage {
505 pub is_individual: bool,
506 pub is_then: bool,
507 pub portion_kind: Option<String>,
508 pub name: String,
509 pub type_name: Option<String>,
510 pub subsets: Option<String>,
511 pub redefines: Option<String>,
512 pub references: Option<String>,
513 pub crosses: Option<String>,
514 pub body: OccurrenceUsageBody,
515}
516
517#[derive(Debug, Clone, PartialEq, Eq)]
518pub enum OccurrenceUsageBody {
519 Semicolon,
520 Brace {
521 elements: Vec<Node<OccurrenceBodyElement>>,
522 },
523}
524
525#[derive(Debug, Clone, PartialEq, Eq)]
527pub struct AssertConstraintMember {
528 pub body: ConstraintDefBody,
529}
530
531#[derive(Debug, Clone, PartialEq, Eq)]
532#[allow(clippy::large_enum_variant)]
533pub enum OccurrenceBodyElement {
534 Error(Node<ParseErrorNode>),
535 Doc(Node<DocComment>),
536 Annotation(Node<Annotation>),
537 AssertConstraint(Node<AssertConstraintMember>),
538 Other(String),
539 AttributeUsage(Node<AttributeUsage>),
540 PartUsage(Box<Node<PartUsage>>),
541 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
542}
543
544#[derive(Debug, Clone, PartialEq, Eq)]
550pub enum DefinitionBody {
551 Semicolon,
552 Brace {
553 elements: Vec<Node<DefinitionBodyElement>>,
554 },
555}
556
557#[derive(Debug, Clone, PartialEq, Eq)]
558#[allow(clippy::large_enum_variant)]
559pub enum DefinitionBodyElement {
560 Error(Node<ParseErrorNode>),
561 Doc(Node<DocComment>),
562 OccurrenceMember(Node<OccurrenceBodyElement>),
563 Other(String),
564}
565#[derive(Debug, Clone, PartialEq, Eq)]
571pub struct Bind {
572 pub left: Node<Expression>,
573 pub right: Node<Expression>,
574 pub body: Option<ConnectBody>,
576}
577
578#[derive(Debug, Clone, PartialEq, Eq)]
580pub enum InterfaceUsage {
581 TypedConnect {
583 interface_type: Option<String>,
584 from: Node<Expression>,
585 to: Node<Expression>,
586 body: ConnectBody,
587 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
588 },
589 Connection {
591 from: Node<Expression>,
592 to: Node<Expression>,
593 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
594 },
595}
596
597#[derive(Debug, Clone, PartialEq, Eq)]
599pub enum InterfaceUsageBodyElement {
600 RefRedef {
602 name: String,
603 value: Node<Expression>,
604 body: RefBody,
605 },
606}
607
608#[derive(Debug, Clone, PartialEq, Eq)]
610pub struct Connect {
611 pub from: Node<Expression>,
612 pub to: Node<Expression>,
613 pub body: ConnectBody,
614}
615
616#[derive(Debug, Clone, PartialEq, Eq)]
622pub struct AliasDef {
623 pub identification: Identification,
624 pub target: String,
625 pub body: AliasBody,
626}
627
628#[derive(Debug, Clone, PartialEq, Eq)]
630pub enum AliasBody {
631 Semicolon,
632 Brace,
633}