|  | use rustc_ast::tokenstream::{TokenStream, TokenTree}; | 
|  | use rustc_expand::base::{DummyResult, ExpandResult, ExtCtxt, MacroExpanderResult}; | 
|  | use rustc_span::{Span, kw}; | 
|  |  | 
|  | use crate::errors; | 
|  |  | 
|  | pub(crate) fn expand_trace_macros( | 
|  | cx: &mut ExtCtxt<'_>, | 
|  | sp: Span, | 
|  | tt: TokenStream, | 
|  | ) -> MacroExpanderResult<'static> { | 
|  | let mut iter = tt.iter(); | 
|  | let mut err = false; | 
|  | let value = match iter.next() { | 
|  | Some(TokenTree::Token(token, _)) if token.is_keyword(kw::True) => true, | 
|  | Some(TokenTree::Token(token, _)) if token.is_keyword(kw::False) => false, | 
|  | _ => { | 
|  | err = true; | 
|  | false | 
|  | } | 
|  | }; | 
|  | err |= iter.next().is_some(); | 
|  | if err { | 
|  | cx.dcx().emit_err(errors::TraceMacros { span: sp }); | 
|  | } else { | 
|  | cx.set_trace_macros(value); | 
|  | } | 
|  |  | 
|  | ExpandResult::Ready(DummyResult::any_valid(sp)) | 
|  | } |