rust/crates/syntax/src/parsing.rs

47 lines
1.5 KiB
Rust
Raw Normal View History

2020-08-12 10:06:49 -05:00
//! Lexing, bridging to parser (which does the actual parsing) and
2019-02-21 06:24:42 -06:00
//! incremental reparsing.
mod reparsing;
use rowan::TextRange;
2021-12-28 09:57:13 -06:00
use crate::{syntax_node::GreenNode, SyntaxError, SyntaxTreeBuilder};
pub(crate) use crate::parsing::reparsing::incremental_reparse;
pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) {
let lexed = parser::LexedStr::new(text);
2021-12-25 12:59:02 -06:00
let parser_input = lexed.to_input();
2021-12-28 10:13:30 -06:00
let parser_output = parser::TopEntryPoint::SourceFile.parse(&parser_input);
let (node, errors, _eof) = build_tree(lexed, parser_output);
(node, errors)
}
pub(crate) fn build_tree(
lexed: parser::LexedStr<'_>,
parser_output: parser::Output,
) -> (GreenNode, Vec<SyntaxError>, bool) {
let mut builder = SyntaxTreeBuilder::default();
2021-12-28 10:13:30 -06:00
let is_eof = lexed.intersperse_trivia(&parser_output, &mut |step| match step {
parser::StrStep::Token { kind, text } => builder.token(kind, text),
parser::StrStep::Enter { kind } => builder.start_node(kind),
parser::StrStep::Exit => builder.finish_node(),
parser::StrStep::Error { msg, pos } => {
builder.error(msg.to_string(), pos.try_into().unwrap())
}
});
let (node, mut errors) = builder.finish_raw();
for (i, err) in lexed.errors() {
let text_range = lexed.text_range(i);
let text_range = TextRange::new(
text_range.start.try_into().unwrap(),
text_range.end.try_into().unwrap(),
);
errors.push(SyntaxError::new(err, text_range))
}
(node, errors, is_eof)
}