conjure_cp_essence_parser/diagnostics/
source_map.rs1use crate::diagnostics::diagnostics_api::{Position, SymbolKind};
6use rangemap::RangeMap;
7pub type SpanId = u32;
8
9#[derive(Debug)]
10pub struct HoverInfo {
11 pub description: String, pub kind: Option<SymbolKind>, pub ty: Option<String>, pub decl_span: Option<SpanId>, }
16#[derive(Debug)]
19pub struct SourceSpan {
20 pub start_byte: usize, pub end_byte: usize,
22 pub start_point: Position,
23 pub end_point: Position,
24 pub hover_info: Option<HoverInfo>,
25}
26
27#[derive(Debug, Default)]
29pub struct SourceMap {
30 pub spans: Vec<SourceSpan>,
31 pub by_byte: RangeMap<usize, SpanId>,
32}
33
34pub fn alloc_span(
37 range: tree_sitter::Range,
38 source_map: &mut SourceMap,
39 hover_info: Option<HoverInfo>,
40) -> SpanId {
41 let span_id = source_map.spans.len() as SpanId;
42 source_map.spans.push(SourceSpan {
43 start_byte: range.start_byte,
44 end_byte: range.end_byte,
45 start_point: Position {
46 line: range.start_point.row as u32,
47 character: range.start_point.column as u32,
48 },
49 end_point: Position {
50 line: range.end_point.row as u32,
51 character: range.end_point.column as u32,
52 },
53 hover_info,
54 });
55 source_map
57 .by_byte
58 .insert(range.start_byte..range.end_byte, span_id);
59 span_id
60}
61
62impl SourceMap {
63 pub fn span_id_at_byte(&self, byte: usize) -> Option<SpanId> {
65 self.by_byte.get(&byte).copied()
66 }
67}
68
69pub fn span_with_hover(
72 node: &tree_sitter::Node,
73 _source: &str,
74 map: &mut SourceMap,
75 info: HoverInfo,
76) -> SpanId {
77 alloc_span(node.range(), map, Some(info))
78}