]> git.proxmox.com Git - rustc.git/blob - compiler/rustc_builtin_macros/src/type_ascribe.rs
New upstream version 1.75.0+dfsg1
[rustc.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 }