syntax/hacks.rs
//! Things which exist to solve practical issues, but which shouldn't exist.
//!
//! Please avoid adding new usages of the functions in this module
use parser::Edition;
use crate::{ast, AstNode};
pub fn parse_expr_from_str(s: &str, edition: Edition) -> Option<ast::Expr> {
let s = s.trim();
let file = ast::SourceFile::parse(
// Need a newline because the text may contain line comments.
&format!("const _: () = ({s}\n);"),
edition,
);
let expr = file.syntax_node().descendants().find_map(ast::ParenExpr::cast)?;
// Can't check the text because the original text may contain whitespace and comments.
// Wrap in parentheses to better allow for verification. Of course, the real fix is
// to get rid of this hack.
expr.expr()
}