syn_solidity/expr/
unary.rs

1use crate::{kw, utils::ParseNested, Expr, Spanned};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5    parse::{Parse, ParseStream},
6    Result,
7};
8
9/// A unary operation: `!x`, `-x`.
10#[derive(Clone, Debug)]
11pub struct ExprUnary {
12    pub op: UnOp,
13    pub expr: Box<Expr>,
14}
15
16impl Parse for ExprUnary {
17    fn parse(input: ParseStream<'_>) -> Result<Self> {
18        Ok(Self { op: input.parse()?, expr: input.parse()? })
19    }
20}
21
22impl Spanned for ExprUnary {
23    fn span(&self) -> Span {
24        let span = self.op.span();
25        span.join(self.expr.span()).unwrap_or(span)
26    }
27
28    fn set_span(&mut self, span: Span) {
29        self.op.set_span(span);
30        self.expr.set_span(span);
31    }
32}
33
34/// A unary `delete` expression: `delete vector`.
35#[derive(Clone)]
36pub struct ExprDelete {
37    pub delete_token: kw::delete,
38    pub expr: Box<Expr>,
39}
40
41impl fmt::Debug for ExprDelete {
42    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43        f.debug_struct("ExprDelete").field("expr", &self.expr).finish()
44    }
45}
46
47impl Parse for ExprDelete {
48    fn parse(input: ParseStream<'_>) -> Result<Self> {
49        Ok(Self { delete_token: input.parse()?, expr: input.parse()? })
50    }
51}
52
53impl Spanned for ExprDelete {
54    fn span(&self) -> Span {
55        let span = self.delete_token.span;
56        span.join(self.expr.span()).unwrap_or(span)
57    }
58
59    fn set_span(&mut self, span: Span) {
60        self.delete_token.span = span;
61        self.expr.set_span(span);
62    }
63}
64
65/// A postfix unary expression: `foo++`.
66#[derive(Clone, Debug)]
67pub struct ExprPostfix {
68    pub expr: Box<Expr>,
69    pub op: PostUnOp,
70}
71
72impl ParseNested for ExprPostfix {
73    fn parse_nested(expr: Box<Expr>, input: ParseStream<'_>) -> Result<Self> {
74        Ok(Self { expr, op: input.parse()? })
75    }
76}
77
78derive_parse!(ExprPostfix);
79
80impl Spanned for ExprPostfix {
81    fn span(&self) -> Span {
82        let span = self.op.span();
83        span.join(self.expr.span()).unwrap_or(span)
84    }
85
86    fn set_span(&mut self, span: Span) {
87        self.op.set_span(span);
88        self.expr.set_span(span);
89    }
90}
91
92op_enum! {
93    /// Unary operators.
94    pub enum UnOp {
95        Increment(++) peek2,
96        Decrement(--) peek2,
97        Not(!),
98        BitNot(~),
99        Neg(-),
100    }
101}
102
103op_enum! {
104    /// Postfix unary operators.
105    pub enum PostUnOp {
106        Increment(++) peek2,
107        Decrement(--) peek2,
108    }
109}