glsl_lang_pp/processor/event/
send.rs1use 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}