]>
git.proxmox.com Git - cargo.git/blob - tests/testsuite/proc_macro.rs
1 //! Tests for proc-macros.
3 use cargo_test_support
::is_nightly
;
4 use cargo_test_support
::project
;
7 fn probe_cfg_before_crate_type_discovery() {
17 [target.'cfg(not(stage300))'.dependencies.noop]
51 extern crate proc_macro;
52 use proc_macro::TokenStream;
54 #[proc_macro_derive(Noop)]
55 pub fn noop(_input: TokenStream) -> TokenStream {
62 p
.cargo("build").run();
110 extern crate proc_macro;
111 use proc_macro::TokenStream;
113 #[proc_macro_derive(Noop)]
114 pub fn noop(_input: TokenStream) -> TokenStream {
121 p
.cargo("build").run();
122 p
.cargo("build").run();
126 fn impl_and_derive() {
136 [dependencies.transmogrify]
137 path = "../transmogrify"
144 extern crate transmogrify;
146 trait ImplByTransmogrify {
147 fn impl_by_transmogrify(&self) -> bool;
150 #[derive(Transmogrify, Debug)]
151 struct X { success: bool }
155 assert!(x.impl_by_transmogrify());
161 let _transmogrify
= project()
167 name = "transmogrify"
178 extern crate proc_macro;
179 use proc_macro::TokenStream;
181 #[proc_macro_derive(Transmogrify)]
183 pub fn transmogrify(input: TokenStream) -> TokenStream {
191 impl ImplByTransmogrify
for X
{
192 fn impl_by_transmogrify(&self) -> bool
{
202 p
.cargo("build").run();
203 p
.cargo("run").with_stdout("X { success: true }").run();
207 fn plugin_and_proc_macro() {
209 // plugins are unstable
230 #![feature(plugin_registrar, rustc_private)]
231 #![feature(proc_macro, proc_macro_lib)]
233 extern crate rustc_driver;
234 use rustc_driver::plugin::Registry;
236 extern crate proc_macro;
237 use proc_macro::TokenStream;
240 pub fn plugin_registrar(reg: &mut Registry) {}
242 #[proc_macro_derive(Questionable)]
243 pub fn questionable(input: TokenStream) -> TokenStream {
250 let msg
= " `lib.plugin` and `lib.proc-macro` cannot both be `true`";
253 .with_stderr_contains(msg
)
258 fn proc_macro_doctest() {
274 #![crate_type = "proc-macro"]
276 extern crate proc_macro;
278 use proc_macro::TokenStream;
283 #[proc_macro_derive(Bar)]
284 pub fn derive(_input: TokenStream) -> TokenStream {
297 .with_stdout_contains("test a ... ok")
298 .with_stdout_contains_n("test [..] ... ok", 2)
303 fn proc_macro_crate_type() {
304 // Verify that `crate-type = ["proc-macro"]` is the same as `proc-macro = true`
305 // and that everything, including rustdoc, works correctly.
322 //! assert_eq!(THING, 123);
333 assert_eq!(THING, 123);
345 crate-type = ["proc-macro"]
351 extern crate proc_macro;
352 use proc_macro::TokenStream;
354 #[proc_macro_derive(MkItem)]
355 pub fn mk_item(_input: TokenStream) -> TokenStream {
356 "pub const THING: i32 = 123;".parse().unwrap()
363 .with_stdout_contains("test tests::it_works ... ok")
364 .with_stdout_contains_n("test [..] ... ok", 2)
369 fn proc_macro_crate_type_warning() {
378 crate-type = ["proc-macro"]
381 .file("src/lib.rs", "")
385 .with_stderr_contains(
386 "[WARNING] library `foo` should only specify `proc-macro = true` instead of setting `crate-type`")
391 fn proc_macro_crate_type_warning_plugin() {
400 crate-type = ["proc-macro"]
404 .file("src/lib.rs", "")
408 .with_stderr_contains(
409 "[WARNING] proc-macro library `foo` should not specify `plugin = true`")
410 .with_stderr_contains(
411 "[WARNING] library `foo` should only specify `proc-macro = true` instead of setting `crate-type`")
416 fn proc_macro_crate_type_multiple() {
425 crate-type = ["proc-macro", "rlib"]
428 .file("src/lib.rs", "")
434 [ERROR] failed to parse manifest at `[..]/foo/Cargo.toml`
437 cannot mix `proc-macro` crate type with others
445 fn proc_macro_extern_prelude() {
446 // Check that proc_macro is in the extern prelude.
462 use proc_macro::TokenStream;
464 pub fn foo(input: TokenStream) -> TokenStream {
470 p
.cargo("test").run();
471 p
.cargo("doc").run();
475 fn proc_macro_built_once() {
493 the-macro = { path = '../the-macro' }
496 .file("a/build.rs", "fn main() {}")
497 .file("a/src/main.rs", "fn main() {}")
506 the-macro = { path = '../the-macro', features = ['a'] }
509 .file("b/src/main.rs", "fn main() {}")
511 "the-macro/Cargo.toml",
524 .file("the-macro/src/lib.rs", "")
526 p
.cargo("build --verbose")
527 .with_stderr_unordered(
529 [COMPILING] the-macro [..]
530 [RUNNING] `rustc --crate-name the_macro [..]`
532 [RUNNING] `rustc --crate-name b [..]`
534 [RUNNING] `rustc --crate-name build_script_build [..]`
535 [RUNNING] `[..]build[..]script[..]build[..]`
536 [RUNNING] `rustc --crate-name a [..]`