]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_builtin_macros/src/type_ascribe.rs
Rollup merge of #105359 - flba-eb:thread_local_key_sentinel_value, r=m-ou-se
[rust.git] / compiler / rustc_builtin_macros / src / type_ascribe.rs
1 use rustc_ast::ptr::P;
2 use rustc_ast::tokenstream::TokenStream;
3 use rustc_ast::{token, Expr, ExprKind, Ty};
4 use rustc_errors::PResult;
5 use rustc_expand::base::{self, DummyResult, ExtCtxt, MacEager};
6 use rustc_span::Span;
7
8 pub fn expand_type_ascribe(
9     cx: &mut ExtCtxt<'_>,
10     span: Span,
11     tts: TokenStream,
12 ) -> Box<dyn base::MacResult + 'static> {
13     let (expr, ty) = match parse_ascribe(cx, tts) {
14         Ok(parsed) => parsed,
15         Err(mut err) => {
16             err.emit();
17             return DummyResult::any(span);
18         }
19     };
20
21     let asc_expr = cx.expr(span, ExprKind::Type(expr, ty));
22
23     return MacEager::expr(asc_expr);
24 }
25
26 fn parse_ascribe<'a>(cx: &mut ExtCtxt<'a>, stream: TokenStream) -> PResult<'a, (P<Expr>, P<Ty>)> {
27     let mut parser = cx.new_parser_from_tts(stream);
28
29     let expr = parser.parse_expr()?;
30     parser.expect(&token::Comma)?;
31
32     let ty = parser.parse_ty()?;
33
34     Ok((expr, ty))
35 }