Unnamed repository; edit this file 'description' to name the repository.
Add `ast::Expr::parse`
DropDemBits 2024-06-02
parent c4573b2 · commit e989f22
-rw-r--r--crates/syntax/src/lib.rs23
-rw-r--r--crates/syntax/src/parsing.rs9
2 files changed, 32 insertions, 0 deletions
diff --git a/crates/syntax/src/lib.rs b/crates/syntax/src/lib.rs
index b8a8103cc6..58f59c384b 100644
--- a/crates/syntax/src/lib.rs
+++ b/crates/syntax/src/lib.rs
@@ -175,6 +175,29 @@ impl Parse<SourceFile> {
}
}
+impl ast::Expr {
+ /// Parses an `ast::Expr` from `text`.
+ ///
+ /// Note that if the parsed root node is not a valid expression, [`Parse::tree`] will panic.
+ /// For example:
+ /// ```rust,should_panic
+ /// # use syntax::{ast, Edition};
+ /// ast::Expr::parse("let fail = true;", Edition::CURRENT).tree();
+ /// ```
+ pub fn parse(text: &str, edition: Edition) -> Parse<ast::Expr> {
+ let _p = tracing::span!(tracing::Level::INFO, "Expr::parse").entered();
+ let (green, errors) = parsing::parse_text_at(text, parser::TopEntryPoint::Expr, edition);
+ let root = SyntaxNode::new_root(green.clone());
+
+ assert!(
+ ast::Expr::can_cast(root.kind()) || root.kind() == SyntaxKind::ERROR,
+ "{:?} isn't an expression",
+ root.kind()
+ );
+ Parse::new(green, errors)
+ }
+}
+
/// `SourceFile` represents a parse tree for a single Rust file.
pub use crate::ast::SourceFile;
diff --git a/crates/syntax/src/parsing.rs b/crates/syntax/src/parsing.rs
index 420f4938e5..165109029f 100644
--- a/crates/syntax/src/parsing.rs
+++ b/crates/syntax/src/parsing.rs
@@ -18,6 +18,15 @@ pub(crate) fn parse_text(text: &str, edition: parser::Edition) -> (GreenNode, Ve
(node, errors)
}
+pub(crate) fn parse_text_at(text: &str, entry: parser::TopEntryPoint, edition: parser::Edition) -> (GreenNode, Vec<SyntaxError>) {
+ let _p = tracing::span!(tracing::Level::INFO, "parse_text_at").entered();
+ let lexed = parser::LexedStr::new(text);
+ let parser_input = lexed.to_input();
+ let parser_output = entry.parse(&parser_input, edition);
+ let (node, errors, _eof) = build_tree(lexed, parser_output);
+ (node, errors)
+}
+
pub(crate) fn build_tree(
lexed: parser::LexedStr<'_>,
parser_output: parser::Output,