wagon_parser/parser/
assignment.rs1use 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]
14pub struct Assignment {
19 pub ident: SpannableNode<Ident>,
21 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}