aboutsummaryrefslogtreecommitdiff
path: root/proc-macro-error/test-crate/src
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2020-01-07 11:18:04 +0000
committerDaniel Mueller <deso@posteo.net>2020-01-08 09:20:25 -0800
commit5e20a29b4fdc8a2d442d1093681b396dcb4b816b (patch)
tree55ab083fa8999d2ccbb5e921c1ffe52560dca152 /proc-macro-error/test-crate/src
parent203e691f46d591a2cc8acdfd850fa9f5b0fb8a98 (diff)
downloadnitrocli-5e20a29b4fdc8a2d442d1093681b396dcb4b816b.tar.gz
nitrocli-5e20a29b4fdc8a2d442d1093681b396dcb4b816b.tar.bz2
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
Diffstat (limited to 'proc-macro-error/test-crate/src')
-rw-r--r--proc-macro-error/test-crate/src/lib.rs123
1 files changed, 123 insertions, 0 deletions
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<Self> {
+ let la = input.lookahead1();
+
+ if la.peek(Ident) {
+ let t = input.parse::<Ident>().unwrap();
+ Ok(IdentOrUnderscore::new(t.span(), t.to_string()))
+ } else if la.peek(Token![_]) {
+ let t = input.parse::<Token![_]>().unwrap();
+ Ok(IdentOrUnderscore::new(t.span(), "_".to_string()))
+ } else {
+ Err(la.error())
+ }
+ }
+}
+
+struct Args(Vec<IdentOrUnderscore>);
+
+impl Parse for Args {
+ fn parse(input: ParseStream) -> syn::Result<Self> {
+ 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<String> = 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()
+}