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: AttributeBody,
467}
468
469#[derive(Debug, Clone, PartialEq, Eq)]
471pub struct MetadataUsage {
472 pub name: String,
473 pub type_name: Option<String>,
474 pub body: AttributeBody,
475}
476
477#[derive(Debug, Clone, PartialEq, Eq)]
483pub struct EnumDef {
484 pub identification: Identification,
485 pub specializes: Option<String>,
486 pub specializes_span: Option<Span>,
487 pub body: EnumerationBody,
488}
489
490#[derive(Debug, Clone, PartialEq, Eq)]
491pub enum EnumerationBody {
492 Semicolon,
493 Brace { values: Vec<String> },
494}
495
496#[derive(Debug, Clone, PartialEq, Eq)]
502pub struct OccurrenceDef {
503 pub is_abstract: bool,
504 pub identification: Identification,
505 pub specializes: Option<String>,
506 pub specializes_span: Option<Span>,
507 pub body: DefinitionBody,
508}
509
510#[derive(Debug, Clone, PartialEq, Eq)]
512pub struct OccurrenceUsage {
513 pub is_individual: bool,
514 pub is_then: bool,
515 pub portion_kind: Option<String>,
516 pub name: String,
517 pub type_name: Option<String>,
518 pub subsets: Option<String>,
519 pub redefines: Option<String>,
520 pub references: Option<String>,
521 pub crosses: Option<String>,
522 pub body: OccurrenceUsageBody,
523}
524
525#[derive(Debug, Clone, PartialEq, Eq)]
526pub enum OccurrenceUsageBody {
527 Semicolon,
528 Brace {
529 elements: Vec<Node<OccurrenceBodyElement>>,
530 },
531}
532
533#[derive(Debug, Clone, PartialEq, Eq)]
535pub struct AssertConstraintMember {
536 pub body: ConstraintDefBody,
537}
538
539#[derive(Debug, Clone, PartialEq, Eq)]
540#[allow(clippy::large_enum_variant)]
541pub enum OccurrenceBodyElement {
542 Error(Node<ParseErrorNode>),
543 Doc(Node<DocComment>),
544 Annotation(Node<Annotation>),
545 AssertConstraint(Node<AssertConstraintMember>),
546 Other(String),
547 AttributeUsage(Node<AttributeUsage>),
548 PartUsage(Box<Node<PartUsage>>),
549 OccurrenceUsage(Box<Node<OccurrenceUsage>>),
550}
551
552#[derive(Debug, Clone, PartialEq, Eq)]
558pub enum DefinitionBody {
559 Semicolon,
560 Brace {
561 elements: Vec<Node<DefinitionBodyElement>>,
562 },
563}
564
565#[derive(Debug, Clone, PartialEq, Eq)]
566#[allow(clippy::large_enum_variant)]
567pub enum DefinitionBodyElement {
568 Error(Node<ParseErrorNode>),
569 Doc(Node<DocComment>),
570 OccurrenceMember(Node<OccurrenceBodyElement>),
571 Other(String),
572}
573#[derive(Debug, Clone, PartialEq, Eq)]
579pub struct Bind {
580 pub left: Node<Expression>,
581 pub right: Node<Expression>,
582 pub body: Option<ConnectBody>,
584}
585
586#[derive(Debug, Clone, PartialEq, Eq)]
588pub enum InterfaceUsage {
589 TypedConnect {
591 interface_type: Option<String>,
592 from: Node<Expression>,
593 to: Node<Expression>,
594 body: ConnectBody,
595 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
596 },
597 Connection {
599 from: Node<Expression>,
600 to: Node<Expression>,
601 body_elements: Vec<Node<InterfaceUsageBodyElement>>,
602 },
603}
604
605#[derive(Debug, Clone, PartialEq, Eq)]
607pub enum InterfaceUsageBodyElement {
608 RefRedef {
610 name: String,
611 value: Node<Expression>,
612 body: RefBody,
613 },
614}
615
616#[derive(Debug, Clone, PartialEq, Eq)]
618pub struct Connect {
619 pub from: Node<Expression>,
620 pub to: Node<Expression>,
621 pub body: ConnectBody,
622}
623
624#[derive(Debug, Clone, PartialEq, Eq)]
630pub struct AliasDef {
631 pub identification: Identification,
632 pub target: String,
633 pub body: AliasBody,
634}
635
636#[derive(Debug, Clone, PartialEq, Eq)]
638pub enum AliasBody {
639 Semicolon,
640 Brace,
641}