swamp_script_source_map_lookup/
lib.rs

1/*
2 * Copyright (c) Peter Bjorklund. All rights reserved. https://github.com/swamp/script
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_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}