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.rs | 38 |
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(()) } |