summaryrefslogtreecommitdiffstats
path: root/tests/ui/proc-macro/auxiliary/parent-source-spans.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/proc-macro/auxiliary/parent-source-spans.rs')
-rw-r--r--tests/ui/proc-macro/auxiliary/parent-source-spans.rs43
1 files changed, 43 insertions, 0 deletions
diff --git a/tests/ui/proc-macro/auxiliary/parent-source-spans.rs b/tests/ui/proc-macro/auxiliary/parent-source-spans.rs
new file mode 100644
index 000000000..594f10883
--- /dev/null
+++ b/tests/ui/proc-macro/auxiliary/parent-source-spans.rs
@@ -0,0 +1,43 @@
+// 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 parent_source_spans(input: TokenStream) -> TokenStream {
+ let mut tokens = input.into_iter();
+ let (sp1, str1) = lit_span(tokens.next().expect("first string"));
+ let _ = tokens.next();
+ let (sp2, str2) = lit_span(tokens.next().expect("second string"));
+
+ sp1.error(format!("first final: {}", str1)).emit();
+ sp2.error(format!("second final: {}", str2)).emit();
+
+ if let (Some(p1), Some(p2)) = (sp1.parent(), sp2.parent()) {
+ p1.error(format!("first parent: {}", str1)).emit();
+ p2.error(format!("second parent: {}", str2)).emit();
+
+ if let (Some(gp1), Some(gp2)) = (p1.parent(), p2.parent()) {
+ gp1.error(format!("first grandparent: {}", str1)).emit();
+ gp2.error(format!("second grandparent: {}", str2)).emit();
+ }
+ }
+
+ sp1.source().error(format!("first source: {}", str1)).emit();
+ sp2.source().error(format!("second source: {}", str2)).emit();
+
+ "ok".parse().unwrap()
+}