Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/syntax/src/parsing.rs')
-rw-r--r--crates/syntax/src/parsing.rs38
1 files changed, 12 insertions, 26 deletions
diff --git a/crates/syntax/src/parsing.rs b/crates/syntax/src/parsing.rs
index cba1ddde85..20c7101a03 100644
--- a/crates/syntax/src/parsing.rs
+++ b/crates/syntax/src/parsing.rs
@@ -4,24 +4,18 @@
mod text_tree_sink;
mod reparsing;
-use parser::SyntaxKind;
-use text_tree_sink::TextTreeSink;
-
-use crate::{syntax_node::GreenNode, AstNode, SyntaxError, SyntaxNode};
+use crate::{
+ parsing::text_tree_sink::build_tree, syntax_node::GreenNode, AstNode, SyntaxError, SyntaxNode,
+};
pub(crate) use crate::parsing::reparsing::incremental_reparse;
pub(crate) fn parse_text(text: &str) -> (GreenNode, Vec<SyntaxError>) {
let lexed = parser::LexedStr::new(text);
- let parser_tokens = lexed.to_tokens();
-
- let mut tree_sink = TextTreeSink::new(lexed);
-
- parser::parse_source_file(&parser_tokens, &mut tree_sink);
-
- let (tree, parser_errors) = tree_sink.finish();
-
- (tree, parser_errors)
+ let parser_input = lexed.to_input();
+ let parser_output = parser::parse_source_file(&parser_input);
+ let (node, errors, _eof) = build_tree(lexed, parser_output, false);
+ (node, errors)
}
/// Returns `text` parsed as a `T` provided there are no parse errors.
@@ -33,21 +27,13 @@ pub(crate) fn parse_text_as<T: AstNode>(
if lexed.errors().next().is_some() {
return Err(());
}
- let parser_tokens = lexed.to_tokens();
-
- let mut tree_sink = TextTreeSink::new(lexed);
-
- // TextTreeSink assumes that there's at least some root node to which it can attach errors and
- // tokens. We arbitrarily give it a SourceFile.
- use parser::TreeSink;
- tree_sink.start_node(SyntaxKind::SOURCE_FILE);
- parser::parse(&parser_tokens, &mut tree_sink, entry_point);
- tree_sink.finish_node();
+ let parser_input = lexed.to_input();
+ let parser_output = parser::parse(&parser_input, entry_point);
+ let (node, errors, eof) = build_tree(lexed, parser_output, true);
- let (tree, parser_errors, eof) = tree_sink.finish_eof();
- if !parser_errors.is_empty() || !eof {
+ if !errors.is_empty() || !eof {
return Err(());
}
- SyntaxNode::new_root(tree).first_child().and_then(T::cast).ok_or(())
+ SyntaxNode::new_root(node).first_child().and_then(T::cast).ok_or(())
}