mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			38 lines
		
	
	
		
			871 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			871 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // force-host
 | |
| // no-prefer-dynamic
 | |
| 
 | |
| #![crate_type = "proc-macro"]
 | |
| #![feature(proc_macro_diagnostic, proc_macro_span, proc_macro_def_site)]
 | |
| 
 | |
| extern crate proc_macro;
 | |
| 
 | |
| use proc_macro::{TokenStream, TokenTree, Span, Diagnostic};
 | |
| 
 | |
| fn parse(input: TokenStream) -> Result<(), Diagnostic> {
 | |
|     let mut hi_spans = vec![];
 | |
|     for tree in input {
 | |
|         if let TokenTree::Ident(ref ident) = tree {
 | |
|             if ident.to_string() == "hi" {
 | |
|                 hi_spans.push(ident.span());
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if !hi_spans.is_empty() {
 | |
|         return Err(Span::def_site()
 | |
|                        .error("hello to you, too!")
 | |
|                        .span_note(hi_spans, "found these 'hi's"));
 | |
|     }
 | |
| 
 | |
|     Ok(())
 | |
| }
 | |
| 
 | |
| #[proc_macro]
 | |
| pub fn hello(input: TokenStream) -> TokenStream {
 | |
|     if let Err(diag) = parse(input) {
 | |
|         diag.emit();
 | |
|     }
 | |
| 
 | |
|     TokenStream::new()
 | |
| }
 | 
