wagon_parser/parser/
assignment.rs

1use std::{fmt::Display, write};
2
3use crate::{firstpass::{GetReqAttributes, ReqAttributes, RewriteToSynth}, WrapSpannable};
4
5use super::{Parse, LexerBridge, ParseResult, Tokens, WagParseError, Ident, SpannableNode, Spannable, ResultNext};
6use wagon_lexer::math::Math;
7
8use super::expression::Expression;
9
10use wagon_macros::new_unspanned;
11
12#[derive(PartialEq, Debug, Eq, Hash, Clone)]
13#[new_unspanned]
14/// Assigns the result of an expression to an attribute.
15///
16/// # Grammar
17/// <code>[Assignment] -> "{" ([Ident] "=" [Expression] ";")* "}";</code>
18pub struct Assignment {
19	/// The left-hand side.
20	pub ident: SpannableNode<Ident>,
21	/// The right-hand side.
22	pub expr: SpannableNode<Expression>
23}
24
25impl RewriteToSynth for Assignment {
26	fn rewrite_to_synth(&mut self) -> ReqAttributes {
27		let span = self.ident.span();
28		self.ident = self.ident.to_inner().to_synth().into_spanned(span);
29		let mut req = self.expr.rewrite_to_synth();
30		req.insert(self.ident.clone());
31		req
32	}
33}
34
35impl GetReqAttributes for Assignment {
36	fn get_req_attributes(&self) -> ReqAttributes {
37		let mut req = self.expr.get_req_attributes();
38		req.insert(self.ident.clone());
39		req
40	}
41}
42
43impl Parse for Assignment {
44	fn parse(lexer: &mut LexerBridge) -> ParseResult<Self> {
45		let ident = SpannableNode::parse(lexer)?;
46		let next = lexer.next_result()?;
47		if next == Tokens::MathToken(Math::Assigns) {
48			Ok(Self {ident, expr: SpannableNode::parse(lexer)?})
49		} else {
50			Err(WagParseError::Unexpected { span: lexer.span(), offender: next, expected: vec![Tokens::MathToken(Math::Assigns).to_string()] })
51		}
52	}
53}
54
55impl Display for Assignment {
56    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
57        write!(f, "{} = {}", self.ident, self.expr)
58    }
59}