aboutsummaryrefslogtreecommitdiffstats
path: root/src/runtime.rs
diff options
context:
space:
mode:
authorDavid Tolnay <dtolnay@gmail.com>2019-02-02 15:01:09 -0800
committerDavid Tolnay <dtolnay@gmail.com>2019-02-03 22:54:27 +0100
commitfcc424258c0b5eb2da8fc92f9c6a4004c17a0440 (patch)
treef9a26b81282fb6512d80209573bc21d82ff1c737 /src/runtime.rs
parent2012cea3277ee75f1ffd7e8ae2922a3fedc6b597 (diff)
downloadplatform_external_rust_crates_quote-fcc424258c0b5eb2da8fc92f9c6a4004c17a0440.tar.gz
platform_external_rust_crates_quote-fcc424258c0b5eb2da8fc92f9c6a4004c17a0440.tar.bz2
platform_external_rust_crates_quote-fcc424258c0b5eb2da8fc92f9c6a4004c17a0440.zip
Move runtime support to its own module
Diffstat (limited to 'src/runtime.rs')
-rw-r--r--src/runtime.rs122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/runtime.rs b/src/runtime.rs
new file mode 100644
index 0000000..6ebd1f8
--- /dev/null
+++ b/src/runtime.rs
@@ -0,0 +1,122 @@
+use ext::TokenStreamExt;
+pub use proc_macro2::*;
+
+fn is_ident_start(c: u8) -> bool {
+ (b'a' <= c && c <= b'z') || (b'A' <= c && c <= b'Z') || c == b'_'
+}
+
+fn is_ident_continue(c: u8) -> bool {
+ (b'a' <= c && c <= b'z')
+ || (b'A' <= c && c <= b'Z')
+ || c == b'_'
+ || (b'0' <= c && c <= b'9')
+}
+
+fn is_ident(token: &str) -> bool {
+ if token.bytes().all(|digit| digit >= b'0' && digit <= b'9') {
+ return false;
+ }
+
+ let mut bytes = token.bytes();
+ let first = bytes.next().unwrap();
+ if !is_ident_start(first) {
+ return false;
+ }
+ for ch in bytes {
+ if !is_ident_continue(ch) {
+ return false;
+ }
+ }
+ true
+}
+
+pub fn parse(tokens: &mut TokenStream, span: Span, s: &str) {
+ if is_ident(s) {
+ // Fast path, since idents are the most common token.
+ tokens.append(Ident::new(s, span));
+ } else {
+ let s: TokenStream = s.parse().expect("invalid token stream");
+ tokens.extend(s.into_iter().map(|mut t| {
+ t.set_span(span);
+ t
+ }));
+ }
+}
+
+macro_rules! push_punct {
+ ($name:ident $char1:tt) => {
+ pub fn $name(tokens: &mut TokenStream, span: Span) {
+ let mut punct = Punct::new($char1, Spacing::Alone);
+ punct.set_span(span);
+ tokens.append(punct);
+ }
+ };
+ ($name:ident $char1:tt $char2:tt) => {
+ pub fn $name(tokens: &mut TokenStream, span: Span) {
+ let mut punct = Punct::new($char1, Spacing::Joint);
+ punct.set_span(span);
+ tokens.append(punct);
+ let mut punct = Punct::new($char2, Spacing::Alone);
+ punct.set_span(span);
+ tokens.append(punct);
+ }
+ };
+ ($name:ident $char1:tt $char2:tt $char3:tt) => {
+ pub fn $name(tokens: &mut TokenStream, span: Span) {
+ let mut punct = Punct::new($char1, Spacing::Joint);
+ punct.set_span(span);
+ tokens.append(punct);
+ let mut punct = Punct::new($char2, Spacing::Joint);
+ punct.set_span(span);
+ tokens.append(punct);
+ let mut punct = Punct::new($char3, Spacing::Alone);
+ punct.set_span(span);
+ tokens.append(punct);
+ }
+ };
+}
+
+push_punct!(push_add '+');
+push_punct!(push_add_eq '+' '=');
+push_punct!(push_and '&');
+push_punct!(push_and_and '&' '&');
+push_punct!(push_and_eq '&' '=');
+push_punct!(push_at '@');
+push_punct!(push_bang '!');
+push_punct!(push_caret '^');
+push_punct!(push_caret_eq '^' '=');
+push_punct!(push_colon ':');
+push_punct!(push_colon2 ':' ':');
+push_punct!(push_comma ',');
+push_punct!(push_div '/');
+push_punct!(push_div_eq '/' '=');
+push_punct!(push_dot '.');
+push_punct!(push_dot2 '.' '.');
+push_punct!(push_dot3 '.' '.' '.');
+push_punct!(push_dot_dot_eq '.' '.' '=');
+push_punct!(push_eq '=');
+push_punct!(push_eq_eq '=' '=');
+push_punct!(push_ge '>' '=');
+push_punct!(push_gt '>');
+push_punct!(push_le '<' '=');
+push_punct!(push_lt '<');
+push_punct!(push_mul_eq '*' '=');
+push_punct!(push_ne '!' '=');
+push_punct!(push_or '|');
+push_punct!(push_or_eq '|' '=');
+push_punct!(push_or_or '|' '|');
+push_punct!(push_pound '#');
+push_punct!(push_question '?');
+push_punct!(push_rarrow '-' '>');
+push_punct!(push_larrow '<' '-');
+push_punct!(push_rem '%');
+push_punct!(push_rem_eq '%' '=');
+push_punct!(push_fat_arrow '=' '>');
+push_punct!(push_semi ';');
+push_punct!(push_shl '<' '<');
+push_punct!(push_shl_eq '<' '<' '=');
+push_punct!(push_shr '>' '>');
+push_punct!(push_shr_eq '>' '>' '=');
+push_punct!(push_star '*');
+push_punct!(push_sub '-');
+push_punct!(push_sub_eq '-' '=');