rust/tests/ui/proc-macro/auxiliary/assert-span-pos.rs

37 lines
1.0 KiB
Rust

//@ force-host
//@ no-prefer-dynamic
#![feature(proc_macro_diagnostic, proc_macro_span)]
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::{TokenStream, TokenTree, Span};
fn lit_span(tt: TokenTree) -> (Span, String) {
match tt {
TokenTree::Literal(..) |
TokenTree::Group(..) => (tt.span(), tt.to_string().trim().into()),
_ => panic!("expected a literal in token tree, got: {:?}", tt)
}
}
#[proc_macro]
pub fn assert_span_pos(input: TokenStream) -> TokenStream {
let mut tokens = input.into_iter();
let (sp1, str1) = lit_span(tokens.next().expect("first argument"));
let _ = tokens.next();
let (_sp2, str2) = lit_span(tokens.next().expect("second argument"));
let line: usize = str1.parse().unwrap();
let col: usize = str2.parse().unwrap();
if (line, col) != (sp1.line(), sp1.column()) {
let msg = format!("line/column mismatch: ({}, {}) != ({}, {})", line, col,
sp1.line(), sp1.column());
sp1.error(msg).emit();
}
"".parse().unwrap()
}