syntax/
hacks.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//! 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()
}