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