use super::behavior::{Allocate, InOut, InOutDecl, StateDefBody, StateUsage};
use super::common::{CommentAnnotation, ConnectBody, DocComment, Identification, ParseErrorNode};
use super::requirement::{EnumerationUsage, ItemUsage, RequirementUsage, Satisfy};
use super::view::{CalcUsage, ConstraintDefBody};
use crate::ast::core::{Expression, Node, Span};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PartDef {
pub definition_prefix: Option<DefinitionPrefix>,
pub is_individual: bool,
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: PartDefBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DefinitionPrefix {
Abstract,
Variation,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PartDefBody {
Semicolon,
Brace {
elements: Vec<Node<PartDefBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PartDefBodyElement {
Error(Node<ParseErrorNode>),
Doc(Node<DocComment>),
Comment(Node<CommentAnnotation>),
Annotation(Node<Annotation>),
MetadataKeywordUsage(Node<MetadataKeywordUsage>),
Other(String),
AttributeDef(Node<AttributeDef>),
AttributeUsage(Node<AttributeUsage>),
RequirementUsage(Node<RequirementUsage>),
ItemDef(Node<ItemDef>),
ItemUsage(Node<ItemUsage>),
Ref(Node<RefDecl>),
PortUsage(Node<PortUsage>),
PartUsage(Box<Node<PartUsage>>),
PartDef(Node<PartDef>),
OccurrenceUsage(Box<Node<OccurrenceUsage>>),
InterfaceDef(Node<InterfaceDef>),
InterfaceUsage(Node<InterfaceUsage>),
Connect(Node<Connect>),
Connection(Node<ConnectionUsageMember>),
Perform(Node<Perform>),
Allocate(Node<Allocate>),
OpaqueMember(Node<OpaqueMemberDecl>),
ExhibitState(Node<ExhibitState>),
CalcUsage(Node<CalcUsage>),
EnumerationUsage(Node<EnumerationUsage>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OpaqueMemberDecl {
pub keyword: String,
pub name: String,
pub text: String,
pub body: AttributeBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConnectionUsageMember {
pub name: Option<String>,
pub type_name: Option<String>,
pub body: ConnectionDefBody,
pub subsets: Option<String>,
pub redefines: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ExhibitState {
pub name: String,
pub type_name: Option<String>,
pub redefines: Option<String>,
pub body: StateDefBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AttributeDef {
pub name: String,
pub typing: Option<String>,
pub value: Option<Node<Expression>>,
pub body: AttributeBody,
pub name_span: Option<Span>,
pub typing_span: Option<Span>,
pub value_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AttributeBody {
Semicolon,
Brace {
elements: Vec<Node<AttributeBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AttributeBodyElement {
Error(Node<ParseErrorNode>),
Doc(Node<DocComment>),
AttributeDef(Node<AttributeDef>),
AttributeUsage(Node<AttributeUsage>),
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ItemDef {
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: AttributeBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct IndividualDef {
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: AttributeBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PartUsage {
pub is_individual: bool,
pub name: String,
pub type_name: String,
pub multiplicity: Option<String>,
pub ordered: bool,
pub subsets: Option<(String, Option<Node<Expression>>)>,
pub redefines: Option<String>,
pub value: Option<Node<Expression>>,
pub body: PartUsageBody,
pub name_span: Option<Span>,
pub type_ref_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PartUsageBody {
Semicolon,
Brace {
elements: Vec<Node<PartUsageBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MetadataAnnotation {
pub name: String,
pub type_name: Option<String>,
pub body: ConnectBody,
pub head_span: Option<Span>,
pub type_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MetadataKeywordUsage {
pub keyword: String,
pub type_name: Option<String>,
pub body: ConnectBody,
pub keyword_span: Span,
pub type_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Annotation {
pub sigil: String,
pub head: String,
pub type_name: Option<String>,
pub body: ConnectBody,
pub head_span: Option<Span>,
pub type_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PartUsageBodyElement {
Error(Node<ParseErrorNode>),
Doc(Node<DocComment>),
Annotation(Node<Annotation>),
AttributeUsage(Node<AttributeUsage>),
EnumerationUsage(Node<EnumerationUsage>),
PartUsage(Box<Node<PartUsage>>),
OccurrenceUsage(Box<Node<OccurrenceUsage>>),
PortUsage(Node<PortUsage>),
Bind(Node<Bind>),
Ref(Node<RefDecl>),
InterfaceUsage(Node<InterfaceUsage>),
Connect(Node<Connect>),
Perform(Node<Perform>),
Allocate(Node<Allocate>),
Satisfy(Node<Satisfy>),
StateUsage(Node<StateUsage>),
MetadataAnnotation(Node<MetadataAnnotation>),
MetadataKeywordUsage(Node<MetadataKeywordUsage>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Perform {
pub action_name: String,
pub type_name: Option<String>,
pub body: PerformBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PerformBody {
Semicolon,
Brace {
elements: Vec<Node<PerformBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PerformBodyElement {
Doc(Node<DocComment>),
InOut(Node<PerformInOutBinding>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PerformInOutBinding {
pub direction: InOut,
pub name: String,
pub value: Node<Expression>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AttributeUsage {
pub name: String,
pub typing: Option<String>,
pub subsets: Option<String>,
pub redefines: Option<String>,
pub references: Option<String>,
pub crosses: Option<String>,
pub value: Option<Node<Expression>>,
pub body: AttributeBody,
pub name_span: Option<Span>,
pub typing_span: Option<Span>,
pub redefines_span: Option<Span>,
pub direction: Option<InOut>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PortDef {
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: PortDefBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PortDefBody {
Semicolon,
Brace {
elements: Vec<Node<PortDefBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PortDefBodyElement {
InOutDecl(Node<InOutDecl>),
Doc(Node<DocComment>),
Error(Node<ParseErrorNode>),
AttributeDef(Node<AttributeDef>),
AttributeUsage(Node<AttributeUsage>),
ItemUsage(Node<ItemUsage>),
PortUsage(Node<PortUsage>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PortUsage {
pub name: String,
pub type_name: Option<String>,
pub multiplicity: Option<String>,
pub subsets: Option<(String, Option<Node<Expression>>)>,
pub redefines: Option<String>,
pub references: Option<String>,
pub crosses: Option<String>,
pub body: PortBody,
pub name_span: Option<Span>,
pub type_ref_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PortBody {
Semicolon,
Brace {
elements: Vec<Node<PortBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(clippy::large_enum_variant)]
pub enum PortBodyElement {
Error(Node<ParseErrorNode>),
InOutDecl(Node<InOutDecl>),
PortUsage(Node<PortUsage>),
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConnectStmt {
pub from: Node<Expression>,
pub to: Node<Expression>,
pub body: ConnectBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InterfaceDef {
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: InterfaceDefBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InterfaceDefBody {
Semicolon,
Brace {
elements: Vec<Node<InterfaceDefBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InterfaceDefBodyElement {
Doc(Node<DocComment>),
EndDecl(Node<EndDecl>),
RefDecl(Node<RefDecl>),
ConnectStmt(Node<ConnectStmt>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EndDecl {
pub name: String,
pub type_name: String,
pub uses_derived_syntax: bool,
pub name_span: Option<Span>,
pub type_ref_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RefDecl {
pub name: String,
pub type_name: String,
pub value: Option<Node<Expression>>,
pub body: RefBody,
pub name_span: Option<Span>,
pub type_ref_span: Option<Span>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RefBody {
Semicolon,
Brace,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConnectionDef {
pub annotation: Option<String>,
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: ConnectionDefBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ConnectionDefBody {
Semicolon,
Brace {
elements: Vec<Node<ConnectionDefBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ConnectionDefBodyElement {
EndDecl(Node<EndDecl>),
RefDecl(Node<RefDecl>),
ConnectStmt(Node<ConnectStmt>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MetadataDef {
pub is_abstract: bool,
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: AttributeBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MetadataUsage {
pub name: String,
pub type_name: Option<String>,
pub body: AttributeBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnumDef {
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: EnumerationBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EnumerationBody {
Semicolon,
Brace { values: Vec<String> },
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OccurrenceDef {
pub is_abstract: bool,
pub identification: Identification,
pub specializes: Option<String>,
pub specializes_span: Option<Span>,
pub body: DefinitionBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OccurrenceUsage {
pub is_individual: bool,
pub is_then: bool,
pub portion_kind: Option<String>,
pub name: String,
pub type_name: Option<String>,
pub subsets: Option<String>,
pub redefines: Option<String>,
pub references: Option<String>,
pub crosses: Option<String>,
pub body: OccurrenceUsageBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OccurrenceUsageBody {
Semicolon,
Brace {
elements: Vec<Node<OccurrenceBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AssertConstraintMember {
pub body: ConstraintDefBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(clippy::large_enum_variant)]
pub enum OccurrenceBodyElement {
Error(Node<ParseErrorNode>),
Doc(Node<DocComment>),
Annotation(Node<Annotation>),
AssertConstraint(Node<AssertConstraintMember>),
Other(String),
AttributeUsage(Node<AttributeUsage>),
PartUsage(Box<Node<PartUsage>>),
OccurrenceUsage(Box<Node<OccurrenceUsage>>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DefinitionBody {
Semicolon,
Brace {
elements: Vec<Node<DefinitionBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[allow(clippy::large_enum_variant)]
pub enum DefinitionBodyElement {
Error(Node<ParseErrorNode>),
Doc(Node<DocComment>),
OccurrenceMember(Node<OccurrenceBodyElement>),
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Bind {
pub left: Node<Expression>,
pub right: Node<Expression>,
pub body: Option<ConnectBody>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InterfaceUsage {
TypedConnect {
interface_type: Option<String>,
from: Node<Expression>,
to: Node<Expression>,
body: ConnectBody,
body_elements: Vec<Node<InterfaceUsageBodyElement>>,
},
Connection {
from: Node<Expression>,
to: Node<Expression>,
body_elements: Vec<Node<InterfaceUsageBodyElement>>,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum InterfaceUsageBodyElement {
RefRedef {
name: String,
value: Node<Expression>,
body: RefBody,
},
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Connect {
pub from: Node<Expression>,
pub to: Node<Expression>,
pub body: ConnectBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AliasDef {
pub identification: Identification,
pub target: String,
pub body: AliasBody,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum AliasBody {
Semicolon,
Brace,
}