swamp_script_source_map_lookup/
lib.rs1use std::fmt::Debug;
6use std::path::PathBuf;
7use swamp_script_node::{Node, Span};
8use swamp_script_source_map::SourceMap;
9
10pub struct FileLineInfo {
11 pub row: usize,
12 pub col: usize,
13 pub line: String,
14 pub relative_file_name: String,
15}
16
17pub trait SourceMapLookup: Debug {
18 fn get_text(&self, resolved_node: &Node) -> &str;
19 fn get_text_span(&self, span: &Span) -> &str;
20
21 fn get_line(&self, span: &Span) -> FileLineInfo;
22}
23
24#[derive(Debug)]
25pub struct SourceMapWrapper<'a> {
26 pub source_map: &'a SourceMap,
27 pub current_dir: PathBuf,
28}
29
30impl SourceMapLookup for SourceMapWrapper<'_> {
31 fn get_text(&self, resolved_node: &Node) -> &str {
32 self.source_map.get_span_source(
33 resolved_node.span.file_id,
34 resolved_node.span.offset as usize,
35 resolved_node.span.length as usize,
36 )
37 }
38
39 fn get_text_span(&self, span: &Span) -> &str {
40 self.source_map
41 .get_span_source(span.file_id, span.offset as usize, span.length as usize)
42 }
43
44 fn get_line(&self, span: &Span) -> FileLineInfo {
45 let relative_file_name = self
46 .source_map
47 .get_relative_path_to(span.file_id, &self.current_dir)
48 .unwrap();
49 let (row, col) = self
50 .source_map
51 .get_span_location_utf8(span.file_id, span.offset as usize);
52 let line = self.source_map.get_source_line(span.file_id, row).unwrap();
53
54 FileLineInfo {
55 row,
56 col,
57 line: line.to_string(),
58 relative_file_name: relative_file_name.to_str().unwrap().to_string(),
59 }
60 }
61}