about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2017-03-31 04:06:28 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2017-06-26 02:06:32 +0000
commit20a90485c040df87a667e9b6ee38e4d8a7d7fc5d (patch)
tree84627e1078881a7dfd93db7c857542366043cf26 /src
parent7d493bdd2a9f86ed51bc80a5c91cbb502aa3b3c4 (diff)
downloadrust-20a90485c040df87a667e9b6ee38e4d8a7d7fc5d.tar.gz
rust-20a90485c040df87a667e9b6ee38e4d8a7d7fc5d.zip
Add exmaple/test for `quote!` hygiene.
Diffstat (limited to 'src')
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example.rs19
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs36
-rw-r--r--src/test/run-pass-fulldeps/proc-macro/hygiene_example.rs27
3 files changed, 82 insertions, 0 deletions
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example.rs
new file mode 100644
index 00000000000..8ffa7abe6f7
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example.rs
@@ -0,0 +1,19 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(proc_macro)]
+
+extern crate hygiene_example_codegen;
+
+pub use hygiene_example_codegen::hello;
+
+pub fn print(string: &str) {
+    println!("{}", string);
+}
diff --git a/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs b/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs
new file mode 100644
index 00000000000..055e4e2fad7
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/auxiliary/hygiene_example_codegen.rs
@@ -0,0 +1,36 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// no-prefer-dynamic
+
+#![feature(proc_macro)]
+#![crate_type = "proc-macro"]
+
+extern crate proc_macro as proc_macro_renamed; // This does not break `quote!`
+
+use proc_macro_renamed::{TokenStream, quote};
+
+#[proc_macro]
+pub fn hello(input: TokenStream) -> TokenStream {
+    quote!(hello_helper!($input))
+    //^ `hello_helper!` always resolves to the following proc macro,
+    //| no matter where `hello!` is used.
+}
+
+#[proc_macro]
+pub fn hello_helper(input: TokenStream) -> TokenStream {
+    quote! {
+        extern crate hygiene_example; // This is never a conflict error
+        let string = format!("hello {}", $input);
+        //^ `format!` always resolves to the prelude macro,
+        //| even if a different `format!` is in scope where `hello!` is used.
+        hygiene_example::print(&string)
+    }
+}
diff --git a/src/test/run-pass-fulldeps/proc-macro/hygiene_example.rs b/src/test/run-pass-fulldeps/proc-macro/hygiene_example.rs
new file mode 100644
index 00000000000..51198db5aa7
--- /dev/null
+++ b/src/test/run-pass-fulldeps/proc-macro/hygiene_example.rs
@@ -0,0 +1,27 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:hygiene_example_codegen.rs
+// aux-build:hygiene_example.rs
+
+#![feature(proc_macro)]
+
+extern crate hygiene_example;
+use hygiene_example::hello;
+
+fn main() {
+    mod hygiene_example {} // no conflict with `extern crate hygiene_example;` from the proc macro
+    macro_rules! format { () => {} } // does not interfere with `format!` from the proc macro
+    macro_rules! hello_helper { () => {} } // similarly does not intefere with the proc macro
+
+    let string = "world"; // no conflict with `string` from the proc macro
+    hello!(string);
+    hello!(string);
+}