swamp_source_map_lookup/
lib.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/swamp
3 * Licensed under the MIT License. See LICENSE in the project root for license information.
4 */
5use 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}