use pasta_dsl::parser::Span;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PastaPos {
pub file: String,
pub line: u32,
}
pub trait SourceMapSink {
fn record_line(&mut self, lua_line: u32, pasta_line: u32);
fn record(&mut self, lua_line: u32, span: Span) {
self.record_line(lua_line, span.start_line as u32);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Default)]
struct CapturingSink {
records: Vec<(u32, u32)>,
}
impl SourceMapSink for CapturingSink {
fn record_line(&mut self, lua_line: u32, pasta_line: u32) {
self.records.push((lua_line, pasta_line));
}
}
#[test]
fn record_is_sugar_for_record_line() {
const LUA_LINE: u32 = 11;
const PASTA_LINE: u32 = 2;
let mut direct = CapturingSink::default();
direct.record_line(LUA_LINE, PASTA_LINE);
let mut via_span = CapturingSink::default();
let span = Span::new(PASTA_LINE as usize, 3, PASTA_LINE as usize, 20, 42, 60);
via_span.record(LUA_LINE, span);
assert_eq!(
direct.records,
vec![(LUA_LINE, PASTA_LINE)],
"record_line maps the output .lua line directly to the .pasta line"
);
assert_eq!(
via_span.records, direct.records,
"record(lua_line, span) must be sugar for record_line(lua_line, span.start_line)"
);
}
#[test]
fn multiple_lua_lines_map_to_same_pasta_line() {
const PASTA_LINE: u32 = 5;
let mut sink = CapturingSink::default();
sink.record_line(10, PASTA_LINE);
sink.record_line(11, PASTA_LINE);
sink.record_line(12, PASTA_LINE);
assert_eq!(
sink.records,
vec![(10, PASTA_LINE), (11, PASTA_LINE), (12, PASTA_LINE)],
"1.3: every .lua line produced by one .pasta element maps to that .pasta line"
);
}
}