From 5e20a29b4fdc8a2d442d1093681b396dcb4b816b Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Tue, 7 Jan 2020 11:18:04 +0000 Subject: Add structopt dependency in version 0.3.7 This patch series replaces argparse with structopt in the argument handling code. As a first step, we need structopt as a dependency. Import subrepo structopt/:structopt at efbdda4753592e27bc430fb01f7b9650b2f3174d Import subrepo bitflags/:bitflags at 30668016aca6bd3b02c766e8347e0b4080d4c296 Import subrepo clap/:clap at 784524f7eb193e35f81082cc69454c8c21b948f7 Import subrepo heck/:heck at 093d56fbf001e1506e56dbfa38631d99b1066df1 Import subrepo proc-macro-error/:proc-macro-error at 6c4cfe79a622c5de8ae68557993542be46eacae2 Import subrepo proc-macro2/:proc-macro2 at d5d48eddca4566e5438e8a2cbed4a74e049544de Import subrepo quote/:quote at 727436c6c137b20f0f34dde5d8fda2679b9747ad Import subrepo rustversion/:rustversion at 0c5663313516263059ce9059ef81fc7a1cf655ca Import subrepo syn-mid/:syn-mid at 5d3d85414a9e6674e1857ec22a87b96e04a6851a Import subrepo syn/:syn at e87c27e87f6f4ef8919d0372bdb056d53ef0d8f3 Import subrepo textwrap/:textwrap at abcd618beae3f74841032aa5b53c1086b0a57ca2 Import subrepo unicode-segmentation/:unicode-segmentation at 637c9874c4fe0c205ff27787faf150a40295c6c3 Import subrepo unicode-width/:unicode-width at 3033826f8bf05e82724140a981d5941e48fce393 Import subrepo unicode-xid/:unicode-xid at 4baae9fffb156ba229665b972a9cd5991787ceb7 --- proc-macro-error/test-crate/Cargo.toml | 20 ++++ proc-macro-error/test-crate/src/lib.rs | 123 +++++++++++++++++++++ proc-macro-error/test-crate/tests/macro-errors.rs | 6 + proc-macro-error/test-crate/tests/ok.rs | 9 ++ proc-macro-error/test-crate/tests/ui/abort.rs | 6 + proc-macro-error/test-crate/tests/ui/abort.stderr | 8 ++ proc-macro-error/test-crate/tests/ui/call_site.rs | 6 + .../test-crate/tests/ui/call_site.stderr | 8 ++ .../test-crate/tests/ui/direct_abort.rs | 6 + .../test-crate/tests/ui/direct_abort.stderr | 5 + proc-macro-error/test-crate/tests/ui/dummy.rs | 16 +++ proc-macro-error/test-crate/tests/ui/dummy.stderr | 5 + .../test-crate/tests/ui/multi-error.rs | 6 + .../test-crate/tests/ui/multi-error.stderr | 32 ++++++ .../test-crate/tests/ui/not_proc_macro.rs | 4 + .../test-crate/tests/ui/not_proc_macro.stderr | 8 ++ .../test-crate/tests/ui/option_expect.rs | 6 + .../test-crate/tests/ui/option_expect.stderr | 5 + .../test-crate/tests/ui/result_expect.rs | 6 + .../test-crate/tests/ui/result_expect.stderr | 5 + .../test-crate/tests/ui/result_unwrap.rs | 6 + .../test-crate/tests/ui/result_unwrap.stderr | 5 + .../test-crate/tests/ui/unknown_setting.rs | 4 + .../test-crate/tests/ui/unknown_setting.stderr | 5 + .../test-crate/tests/ui/unrelated_panic.rs | 6 + .../test-crate/tests/ui/unrelated_panic.stderr | 7 ++ 26 files changed, 323 insertions(+) create mode 100644 proc-macro-error/test-crate/Cargo.toml create mode 100644 proc-macro-error/test-crate/src/lib.rs create mode 100644 proc-macro-error/test-crate/tests/macro-errors.rs create mode 100644 proc-macro-error/test-crate/tests/ok.rs create mode 100644 proc-macro-error/test-crate/tests/ui/abort.rs create mode 100644 proc-macro-error/test-crate/tests/ui/abort.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/call_site.rs create mode 100644 proc-macro-error/test-crate/tests/ui/call_site.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/direct_abort.rs create mode 100644 proc-macro-error/test-crate/tests/ui/direct_abort.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/dummy.rs create mode 100644 proc-macro-error/test-crate/tests/ui/dummy.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/multi-error.rs create mode 100644 proc-macro-error/test-crate/tests/ui/multi-error.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/not_proc_macro.rs create mode 100644 proc-macro-error/test-crate/tests/ui/not_proc_macro.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/option_expect.rs create mode 100644 proc-macro-error/test-crate/tests/ui/option_expect.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/result_expect.rs create mode 100644 proc-macro-error/test-crate/tests/ui/result_expect.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/result_unwrap.rs create mode 100644 proc-macro-error/test-crate/tests/ui/result_unwrap.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/unknown_setting.rs create mode 100644 proc-macro-error/test-crate/tests/ui/unknown_setting.stderr create mode 100644 proc-macro-error/test-crate/tests/ui/unrelated_panic.rs create mode 100644 proc-macro-error/test-crate/tests/ui/unrelated_panic.stderr (limited to 'proc-macro-error/test-crate') diff --git a/proc-macro-error/test-crate/Cargo.toml b/proc-macro-error/test-crate/Cargo.toml new file mode 100644 index 0000000..96dadc3 --- /dev/null +++ b/proc-macro-error/test-crate/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "test-crate" +version = "0.0.0" +authors = ["CreepySkeleton "] +edition = "2018" +publish = false + +[lib] +proc-macro = true + +[dependencies] +proc-macro-error = { path = "../proc-macro-error"} +quote = "1" +proc-macro2 = "1" +syn = {version = "1", default-features = false } + +[dev-dependencies] +trybuild = "1.0" +rustversion = "1.0" +toml = "=0.5.2" # DO NOT BUMP diff --git a/proc-macro-error/test-crate/src/lib.rs b/proc-macro-error/test-crate/src/lib.rs new file mode 100644 index 0000000..2ea9175 --- /dev/null +++ b/proc-macro-error/test-crate/src/lib.rs @@ -0,0 +1,123 @@ +#[macro_use] +extern crate proc_macro_error; +#[macro_use] +extern crate syn; +extern crate proc_macro; + +use proc_macro2::Span; +use proc_macro_error::{set_dummy, Level, OptionExt, ResultExt}; +use syn::{ + parse::{Parse, ParseStream}, + punctuated::Punctuated, + spanned::Spanned, + Ident, +}; + +struct IdentOrUnderscore { + span: Span, + part: String, +} + +impl IdentOrUnderscore { + fn new(span: Span, part: String) -> Self { + IdentOrUnderscore { span, part } + } +} + +impl Parse for IdentOrUnderscore { + fn parse(input: ParseStream) -> syn::Result { + let la = input.lookahead1(); + + if la.peek(Ident) { + let t = input.parse::().unwrap(); + Ok(IdentOrUnderscore::new(t.span(), t.to_string())) + } else if la.peek(Token![_]) { + let t = input.parse::().unwrap(); + Ok(IdentOrUnderscore::new(t.span(), "_".to_string())) + } else { + Err(la.error()) + } + } +} + +struct Args(Vec); + +impl Parse for Args { + fn parse(input: ParseStream) -> syn::Result { + let args = Punctuated::<_, Token![,]>::parse_terminated(input)?; + Ok(Args(args.into_iter().collect())) + } +} + +#[proc_macro] +#[proc_macro_error] +pub fn make_fn(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let mut name = String::new(); + let input = parse_macro_input!(input as Args); + + for arg in input.0 { + match &*arg.part { + "abort" => abort!( + arg.span, + "abort! 3{} args {}", "+", "test"; + hint = "help {} test", "message" + ), + + "abort_call_site" => abort_call_site!( + "abort_call_site! 2{} args {}", "+", "test"; + help = "help {} test", "message" + ), + + "direct_abort" => { + diagnostic!(arg.span, Level::Error, "direct MacroError::abort() test").abort() + } + + "result_expect" => { + let e = syn::Error::new(arg.span, "error"); + Err(e).expect_or_abort("Result::expect_or_abort() test") + } + + "result_unwrap" => { + let e = syn::Error::new(arg.span, "Result::unwrap_or_abort() test"); + Err(e).unwrap_or_abort() + } + + "option_expect" => None.expect_or_abort("Option::expect_or_abort() test"), + + "need_default" => { + set_dummy(quote! { + impl Default for NeedDefault { + fn default() -> Self { + NeedDefault::A + } + } + }); + + abort!(arg.span, "set_dummy test") + } + + part if part.starts_with("multi") => { + let no_help: Option = Option::None; + let help = Some("Option help test"); + emit_error!( + arg.span, + "multiple error part: {}", part; + note = "help {} test", "message"; + hint =? help; + wow = "I see what you did here..."; + help =? no_help + ) + } + + _ => name.push_str(&arg.part), + } + } + + // test that unrelated panics are not affected + if name.is_empty() { + panic!("unrelated panic test") + } + + let name = Ident::new(&name, Span::call_site()); + quote!( fn #name() {} ).into() +} diff --git a/proc-macro-error/test-crate/tests/macro-errors.rs b/proc-macro-error/test-crate/tests/macro-errors.rs new file mode 100644 index 0000000..8c672eb --- /dev/null +++ b/proc-macro-error/test-crate/tests/macro-errors.rs @@ -0,0 +1,6 @@ +#[rustversion::attr(any(not(stable), before(1.39)), ignore)] +#[test] +fn ui() { + let t = trybuild::TestCases::new(); + t.compile_fail("tests/ui/*.rs"); +} diff --git a/proc-macro-error/test-crate/tests/ok.rs b/proc-macro-error/test-crate/tests/ok.rs new file mode 100644 index 0000000..9b6a3d1 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ok.rs @@ -0,0 +1,9 @@ +extern crate test_crate; + +use test_crate::make_fn; + +make_fn!(it, _, works); + +fn main() { + it_works(); +} diff --git a/proc-macro-error/test-crate/tests/ui/abort.rs b/proc-macro-error/test-crate/tests/ui/abort.rs new file mode 100644 index 0000000..717d772 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/abort.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(abort); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/abort.stderr b/proc-macro-error/test-crate/tests/ui/abort.stderr new file mode 100644 index 0000000..7c4e6a0 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/abort.stderr @@ -0,0 +1,8 @@ +error: abort! 3+ args test + + = help: help message test + + --> $DIR/abort.rs:4:10 + | +4 | make_fn!(abort); + | ^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/call_site.rs b/proc-macro-error/test-crate/tests/ui/call_site.rs new file mode 100644 index 0000000..7184cc4 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/call_site.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(abort_call_site); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/call_site.stderr b/proc-macro-error/test-crate/tests/ui/call_site.stderr new file mode 100644 index 0000000..d630a3a --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/call_site.stderr @@ -0,0 +1,8 @@ +error: abort_call_site! 2+ args test + + = help: help message test + + --> $DIR/call_site.rs:4:1 + | +4 | make_fn!(abort_call_site); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation diff --git a/proc-macro-error/test-crate/tests/ui/direct_abort.rs b/proc-macro-error/test-crate/tests/ui/direct_abort.rs new file mode 100644 index 0000000..b5a4c97 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/direct_abort.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(direct_abort); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/direct_abort.stderr b/proc-macro-error/test-crate/tests/ui/direct_abort.stderr new file mode 100644 index 0000000..7cfbae8 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/direct_abort.stderr @@ -0,0 +1,5 @@ +error: direct MacroError::abort() test + --> $DIR/direct_abort.rs:4:10 + | +4 | make_fn!(direct_abort); + | ^^^^^^^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/dummy.rs b/proc-macro-error/test-crate/tests/ui/dummy.rs new file mode 100644 index 0000000..7514fe0 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/dummy.rs @@ -0,0 +1,16 @@ +extern crate test_crate; +use test_crate::make_fn; + +enum NeedDefault { + A, + B +} + +make_fn!(need_default); + +fn main() { + let _ = NeedDefault::default(); +} + + + diff --git a/proc-macro-error/test-crate/tests/ui/dummy.stderr b/proc-macro-error/test-crate/tests/ui/dummy.stderr new file mode 100644 index 0000000..fd531be --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/dummy.stderr @@ -0,0 +1,5 @@ +error: set_dummy test + --> $DIR/dummy.rs:9:10 + | +9 | make_fn!(need_default); + | ^^^^^^^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/multi-error.rs b/proc-macro-error/test-crate/tests/ui/multi-error.rs new file mode 100644 index 0000000..07fbb03 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/multi-error.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(multi1, multi2, _, multi3); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/multi-error.stderr b/proc-macro-error/test-crate/tests/ui/multi-error.stderr new file mode 100644 index 0000000..25174d5 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/multi-error.stderr @@ -0,0 +1,32 @@ +error: multiple error part: multi1 + + = note: help message test + = help: Option help test + = note: I see what you did here... + + --> $DIR/multi-error.rs:4:10 + | +4 | make_fn!(multi1, multi2, _, multi3); + | ^^^^^^ + +error: multiple error part: multi2 + + = note: help message test + = help: Option help test + = note: I see what you did here... + + --> $DIR/multi-error.rs:4:18 + | +4 | make_fn!(multi1, multi2, _, multi3); + | ^^^^^^ + +error: multiple error part: multi3 + + = note: help message test + = help: Option help test + = note: I see what you did here... + + --> $DIR/multi-error.rs:4:29 + | +4 | make_fn!(multi1, multi2, _, multi3); + | ^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/not_proc_macro.rs b/proc-macro-error/test-crate/tests/ui/not_proc_macro.rs new file mode 100644 index 0000000..e241c5c --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/not_proc_macro.rs @@ -0,0 +1,4 @@ +use proc_macro_error::proc_macro_error; + +#[proc_macro_error] +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/not_proc_macro.stderr b/proc-macro-error/test-crate/tests/ui/not_proc_macro.stderr new file mode 100644 index 0000000..52d6a09 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/not_proc_macro.stderr @@ -0,0 +1,8 @@ +error: #[proc_macro_error] attribute can be used only with a proc-macro + + hint: if you are really sure that #[proc_macro_error] should be applied to this exact function use #[proc_macro_error(allow_not_macro)] + + --> $DIR/not_proc_macro.rs:3:1 + | +3 | #[proc_macro_error] + | ^^^^^^^^^^^^^^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/option_expect.rs b/proc-macro-error/test-crate/tests/ui/option_expect.rs new file mode 100644 index 0000000..20288ca --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/option_expect.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(option_expect); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/option_expect.stderr b/proc-macro-error/test-crate/tests/ui/option_expect.stderr new file mode 100644 index 0000000..dd9ecd8 --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/option_expect.stderr @@ -0,0 +1,5 @@ +error: Option::expect_or_abort() test + --> $DIR/option_expect.rs:4:1 + | +4 | make_fn!(option_expect); + | ^^^^^^^^^^^^^^^^^^^^^^^^ in this macro invocation diff --git a/proc-macro-error/test-crate/tests/ui/result_expect.rs b/proc-macro-error/test-crate/tests/ui/result_expect.rs new file mode 100644 index 0000000..a42740b --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/result_expect.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(result_expect); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/result_expect.stderr b/proc-macro-error/test-crate/tests/ui/result_expect.stderr new file mode 100644 index 0000000..c2dd81c --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/result_expect.stderr @@ -0,0 +1,5 @@ +error: Result::expect_or_abort() test: error + --> $DIR/result_expect.rs:4:10 + | +4 | make_fn!(result_expect); + | ^^^^^^^^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/result_unwrap.rs b/proc-macro-error/test-crate/tests/ui/result_unwrap.rs new file mode 100644 index 0000000..9b7fb1c --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/result_unwrap.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(result_unwrap); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/result_unwrap.stderr b/proc-macro-error/test-crate/tests/ui/result_unwrap.stderr new file mode 100644 index 0000000..2e614bd --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/result_unwrap.stderr @@ -0,0 +1,5 @@ +error: Result::unwrap_or_abort() test + --> $DIR/result_unwrap.rs:4:10 + | +4 | make_fn!(result_unwrap); + | ^^^^^^^^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/unknown_setting.rs b/proc-macro-error/test-crate/tests/ui/unknown_setting.rs new file mode 100644 index 0000000..d8e58ea --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/unknown_setting.rs @@ -0,0 +1,4 @@ +use proc_macro_error::proc_macro_error; + +#[proc_macro_error(allow_not_macro, assert_unwind_safe, trololo)] +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/unknown_setting.stderr b/proc-macro-error/test-crate/tests/ui/unknown_setting.stderr new file mode 100644 index 0000000..a55de0b --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/unknown_setting.stderr @@ -0,0 +1,5 @@ +error: unknown setting `trololo`, expected one of `assert_unwind_safe`, `allow_not_macro`, `proc_macro_hack` + --> $DIR/unknown_setting.rs:3:57 + | +3 | #[proc_macro_error(allow_not_macro, assert_unwind_safe, trololo)] + | ^^^^^^^ diff --git a/proc-macro-error/test-crate/tests/ui/unrelated_panic.rs b/proc-macro-error/test-crate/tests/ui/unrelated_panic.rs new file mode 100644 index 0000000..4863e5b --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/unrelated_panic.rs @@ -0,0 +1,6 @@ +extern crate test_crate; +use test_crate::make_fn; + +make_fn!(); + +fn main() {} diff --git a/proc-macro-error/test-crate/tests/ui/unrelated_panic.stderr b/proc-macro-error/test-crate/tests/ui/unrelated_panic.stderr new file mode 100644 index 0000000..b852cfd --- /dev/null +++ b/proc-macro-error/test-crate/tests/ui/unrelated_panic.stderr @@ -0,0 +1,7 @@ +error: proc macro panicked + --> $DIR/unrelated_panic.rs:4:1 + | +4 | make_fn!(); + | ^^^^^^^^^^^ + | + = help: message: unrelated panic test -- cgit v1.2.3