summaryrefslogtreecommitdiffstats
path: root/third_party/rust/proc-macro-hack/src/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/proc-macro-hack/src/error.rs')
-rw-r--r--third_party/rust/proc-macro-hack/src/error.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/third_party/rust/proc-macro-hack/src/error.rs b/third_party/rust/proc-macro-hack/src/error.rs
new file mode 100644
index 0000000000..7334a53d9a
--- /dev/null
+++ b/third_party/rust/proc-macro-hack/src/error.rs
@@ -0,0 +1,39 @@
+use proc_macro::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree};
+use std::iter::FromIterator;
+
+pub struct Error {
+ span: Span,
+ msg: String,
+}
+
+impl Error {
+ pub fn new(span: Span, msg: impl Into<String>) -> Self {
+ Error {
+ span,
+ msg: msg.into(),
+ }
+ }
+}
+
+pub fn compile_error(err: Error) -> TokenStream {
+ // compile_error!($msg)
+ TokenStream::from_iter(vec![
+ TokenTree::Ident(Ident::new("compile_error", err.span)),
+ TokenTree::Punct({
+ let mut punct = Punct::new('!', Spacing::Alone);
+ punct.set_span(err.span);
+ punct
+ }),
+ TokenTree::Group({
+ let mut group = Group::new(Delimiter::Brace, {
+ TokenStream::from_iter(vec![TokenTree::Literal({
+ let mut string = Literal::string(&err.msg);
+ string.set_span(err.span);
+ string
+ })])
+ });
+ group.set_span(err.span);
+ group
+ }),
+ ])
+}