glsl_lang_pp/processor/event/
send.rs

1use std::path::PathBuf;
2
3use rowan::TextRange;
4
5use lang_util::FileId;
6
7use super::{parser::SyntaxNode, Error, Event, OutputToken};
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub struct SendNode {
11    root: rowan::GreenNode,
12    range: TextRange,
13}
14
15impl SendNode {
16    pub fn text(&self) -> String {
17        SyntaxNode::from(self.clone()).text().to_string()
18    }
19}
20
21impl From<&SyntaxNode> for SendNode {
22    fn from(node: &SyntaxNode) -> Self {
23        let range = node.text_range();
24        Self {
25            root: (*node
26                .ancestors()
27                .last()
28                .unwrap_or_else(|| node.clone())
29                .green())
30            .to_owned(),
31            range,
32        }
33    }
34}
35
36impl From<SendNode> for SyntaxNode {
37    fn from(node: SendNode) -> Self {
38        let range = node.range;
39        SyntaxNode::new_root(node.root)
40            .descendants()
41            .find(|descendant| descendant.text_range() == range)
42            .unwrap()
43    }
44}
45
46#[derive(Debug, Clone, PartialEq, Eq)]
47pub enum SendEvent {
48    Error {
49        error: Error,
50        masked: bool,
51    },
52    EnterFile {
53        file_id: FileId,
54        path: PathBuf,
55        canonical_path: PathBuf,
56    },
57    Token {
58        token: OutputToken,
59        masked: bool,
60    },
61    Directive {
62        node: SendNode,
63        masked: bool,
64        errors: Vec<Error>,
65    },
66}
67
68impl From<Event> for SendEvent {
69    fn from(value: Event) -> Self {
70        match value {
71            Event::Error { error, masked } => Self::Error { error, masked },
72            Event::EnterFile {
73                file_id,
74                path,
75                canonical_path,
76            } => Self::EnterFile {
77                file_id,
78                path,
79                canonical_path,
80            },
81            Event::Token { token, masked } => Self::Token { token, masked },
82            Event::Directive { directive, masked } => Self::Directive {
83                node: (&directive.node).into(),
84                masked,
85                errors: directive.errors,
86            },
87        }
88    }
89}