bytebraise_syntax/syntax/ast/
tokens.rs

1use crate::syntax::ast::{AstToken, SyntaxKind, SyntaxToken};
2
3use std::fmt::Debug;
4
5use crate::ast_token;
6
7ast_token!(Identifier, Identifier);
8ast_token!(Task, Task);
9ast_token!(Python, Python);
10ast_token!(Fakeroot, Fakeroot);
11ast_token!(DoubleQuotedValue, DoubleQuotedValue);
12ast_token!(SingleQuotedValue, SingleQuotedValue);
13ast_token!(Export, Export);
14ast_token!(UnquotedValue, UnquotedValue);
15ast_token!(DirectiveArgument, DirectiveArgument);
16
17ast_token!(Equals, Equals);
18ast_token!(EqualsPlus, EqualsPlus);
19ast_token!(EqualsDot, EqualsDot);
20ast_token!(DotEquals, DotEquals);
21ast_token!(PlusEquals, PlusEquals);
22ast_token!(DefaultEquals, DefaultEquals);
23ast_token!(WeakEquals, WeakEquals);
24ast_token!(ColonEquals, ColonEquals);
25
26ast_token!(PythonDefKeyword, PythonDefKeyword);
27ast_token!(PythonDefFunctionName, PythonDefFunctionName);
28ast_token!(PythonDefFunctionArgs, PythonDefFunctionArgs);
29ast_token!(Colon, Colon);
30ast_token!(PythonDefFunctionBody, PythonDefFunctionBody);
31
32ast_token!(Varflag, Varflag);
33impl Varflag {
34    pub fn value(&self) -> &str {
35        // Slice off the square brackets
36        let len = self.text().len();
37        &self.text()[1..len - 1]
38    }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, Hash)]
42pub enum AssignmentOperator {
43    Equals(Equals),
44    EqualsPlus(EqualsPlus),
45    EqualsDot(EqualsDot),
46    DotEquals(DotEquals),
47    PlusEquals(PlusEquals),
48    DefaultEquals(DefaultEquals),
49    WeakEquals(WeakEquals),
50    ColonEquals(ColonEquals),
51}
52
53impl AstToken for AssignmentOperator {
54    fn can_cast(token: SyntaxKind) -> bool
55    where
56        Self: Sized,
57    {
58        token.is_assignment_operator()
59    }
60
61    fn cast(syntax: SyntaxToken) -> Option<Self>
62    where
63        Self: Sized,
64    {
65        let ret = match syntax.kind() {
66            SyntaxKind::ColonEquals => AssignmentOperator::ColonEquals(ColonEquals { syntax }),
67            SyntaxKind::DefaultEquals => {
68                AssignmentOperator::DefaultEquals(DefaultEquals { syntax })
69            }
70            SyntaxKind::DotEquals => AssignmentOperator::DotEquals(DotEquals { syntax }),
71            SyntaxKind::Equals => AssignmentOperator::Equals(Equals { syntax }),
72            SyntaxKind::EqualsDot => AssignmentOperator::EqualsDot(EqualsDot { syntax }),
73            SyntaxKind::EqualsPlus => AssignmentOperator::EqualsPlus(EqualsPlus { syntax }),
74            SyntaxKind::PlusEquals => AssignmentOperator::PlusEquals(PlusEquals { syntax }),
75            SyntaxKind::WeakEquals => AssignmentOperator::WeakEquals(WeakEquals { syntax }),
76            _ => return None,
77        };
78
79        Some(ret)
80    }
81
82    fn syntax(&self) -> &SyntaxToken {
83        match self {
84            AssignmentOperator::Equals(it) => &it.syntax,
85            AssignmentOperator::EqualsPlus(it) => &it.syntax,
86            AssignmentOperator::EqualsDot(it) => &it.syntax,
87            AssignmentOperator::DotEquals(it) => &it.syntax,
88            AssignmentOperator::PlusEquals(it) => &it.syntax,
89            AssignmentOperator::DefaultEquals(it) => &it.syntax,
90            AssignmentOperator::WeakEquals(it) => &it.syntax,
91            AssignmentOperator::ColonEquals(it) => &it.syntax,
92        }
93    }
94}