aboutsummaryrefslogtreecommitdiff
path: root/src/emit.rs
diff options
context:
space:
mode:
authorJeff Vander Stoep <jeffv@google.com>2019-06-21 10:23:07 -0700
committerJeff Vander Stoep <jeffv@google.com>2019-06-21 10:23:07 -0700
commit46a888dcabc80678e25d77d9c4ef203c988fda29 (patch)
treedb22dc61f6d23fa1dd34d4b4356a989ee8c51f5a /src/emit.rs
parent999390bbb063512fa25468c6ac152b8d3e315cec (diff)
parent7e714dc8dd0e17b9e6383f164d5095e60370c482 (diff)
downloadremain-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.rs39
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,
+ }
+}