use harn_lexer::Lexer;
use crate::{Parser, SNode};
pub fn parse_expression(
source: Option<&str>,
segment: &str,
line: usize,
column: usize,
) -> Option<SNode> {
Parser::new(lexer(source, segment, line, column).tokenize().ok()?)
.parse_single_expression()
.ok()
}
pub fn lexer(source: Option<&str>, segment: &str, line: usize, column: usize) -> Lexer {
let offset = source
.and_then(|source| harn_lexer::byte_offset_for_position(source, line, column))
.unwrap_or_default();
Lexer::with_position_and_offset(segment, line, column, offset)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Node;
#[test]
fn parses_a_hole_into_spans_that_address_the_containing_source() {
let source = "const label = \"é ${platform()}\"\n";
let expression = parse_expression(Some(source), "platform()", 1, 20).expect("expression");
assert!(matches!(expression.node, Node::FunctionCall { .. }));
assert_eq!(
&source[expression.span.start..expression.span.end],
"platform()"
);
}
}