y_lang/ast/
compiler_directive.rs

1use super::{Expression, Position, Rule, Statement};
2use pest::iterators::Pair;
3
4#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
5pub struct CompilerDirective<T> {
6    pub directive: Expression<()>,
7    pub statement: Option<Box<Statement<T>>>,
8    pub position: Position,
9}
10
11impl CompilerDirective<()> {
12    pub fn from_pair(pair: Pair<Rule>, file: &str) -> CompilerDirective<()> {
13        assert_eq!(pair.as_rule(), Rule::compiler_directive);
14
15        let (line, col) = pair.line_col();
16
17        let mut inner = pair.into_inner();
18        let directive = inner.next().unwrap();
19        let directive = Expression::from_pair(directive, file);
20
21        let statement = inner.next().unwrap();
22        let statement = Statement::from_pair(statement, file);
23
24        CompilerDirective {
25            directive,
26            statement: Some(Box::new(statement)),
27            position: (file.to_owned(), line, col),
28        }
29    }
30}
31
32impl<T> CompilerDirective<T>
33where
34    T: Clone + Default,
35{
36    pub fn info(&self) -> T {
37        match &self.statement {
38            Some(statement) => statement.info(),
39            _ => T::default(),
40        }
41    }
42}