diff options
author | Jeff Vander Stoep <jeffv@google.com> | 2019-06-21 10:23:07 -0700 |
---|---|---|
committer | Jeff Vander Stoep <jeffv@google.com> | 2019-06-21 10:23:07 -0700 |
commit | 46a888dcabc80678e25d77d9c4ef203c988fda29 (patch) | |
tree | db22dc61f6d23fa1dd34d4b4356a989ee8c51f5a /src/emit.rs | |
parent | 999390bbb063512fa25468c6ac152b8d3e315cec (diff) | |
parent | 7e714dc8dd0e17b9e6383f164d5095e60370c482 (diff) | |
download | remain-46a888dcabc80678e25d77d9c4ef203c988fda29.tar.gz |
Merge remote-tracking branch 'aosp/upstream-master' into mymergeplatform-tools-29.0.4platform-tools-29.0.3platform-tools-29.0.2
Change-Id: Ibfc3eba22e5853ff1e499cb8468f8e645986174c
Diffstat (limited to 'src/emit.rs')
-rw-r--r-- | src/emit.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/emit.rs b/src/emit.rs new file mode 100644 index 0000000..d1ddda8 --- /dev/null +++ b/src/emit.rs @@ -0,0 +1,39 @@ +use proc_macro::TokenStream; +use proc_macro2::Span; +use quote::quote; +use syn::Error; + +#[derive(Copy, Clone)] +pub enum Kind { + Enum, + Match, + Struct, + Let, +} + +pub fn emit(err: Error, kind: Kind, original: TokenStream) -> TokenStream { + let mut err = err; + if !probably_has_spans(kind) { + // Otherwise the error is printed without any line number. + err = Error::new(Span::call_site(), &err.to_string()); + } + + let err = err.to_compile_error(); + let original = proc_macro2::TokenStream::from(original); + + let expanded = match kind { + Kind::Enum | Kind::Let | Kind::Struct => quote!(#err #original), + Kind::Match => quote!({ #err #original }), + }; + + TokenStream::from(expanded) +} + +// Rustc is so bad at spans. +// https://github.com/rust-lang/rust/issues/43081 +fn probably_has_spans(kind: Kind) -> bool { + match kind { + Kind::Enum | Kind::Struct => true, + Kind::Match | Kind::Let => false, + } +} |