y_lang/ast/
compiler_directive.rs1use 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}