Skip to content

Commit

Permalink
Merge pull request #87 from dtolnay/integer128
Browse files Browse the repository at this point in the history
Support i128 and u128 to tokens
  • Loading branch information
dtolnay authored Nov 8, 2018
2 parents c731dbb + fe7e65e commit 9250a2c
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 1 deletion.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ readme = "README.md"
include = ["Cargo.toml", "src/**/*.rs", "tests/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"]

[dependencies]
proc-macro2 = { version = "0.4.13", default-features = false }
proc-macro2 = { version = "0.4.21", default-features = false }

[features]
default = ["proc-macro"]
Expand Down
48 changes: 48 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
use std::env;
use std::process::Command;
use std::str::{self, FromStr};

// The rustc-cfg strings below are *not* public API. Please let us know by
// opening a GitHub issue if your build environment requires some way to enable
// these cfgs other than by executing our build script.
fn main() {
let minor = match rustc_minor_version() {
Some(minor) => minor,
None => return,
};

// 128-bit integers stabilized in Rust 1.26:
// https://blog.rust-lang.org/2018/05/10/Rust-1.26.html
if minor >= 26 {
println!("cargo:rustc-cfg=integer128");
}
}

fn rustc_minor_version() -> Option<u32> {
let rustc = match env::var_os("RUSTC") {
Some(rustc) => rustc,
None => return None,
};

let output = match Command::new(rustc).arg("--version").output() {
Ok(output) => output,
Err(_) => return None,
};

let version = match str::from_utf8(&output.stdout) {
Ok(version) => version,
Err(_) => return None,
};

let mut pieces = version.split('.');
if pieces.next() != Some("rustc 1") {
return None;
}

let next = match pieces.next() {
Some(next) => next,
None => return None,
};

u32::from_str(next).ok()
}
6 changes: 6 additions & 0 deletions src/to_tokens.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,12 @@ primitive! {
f64 => f64_suffixed
}

#[cfg(integer128)]
primitive! {
i128 => i128_suffixed
u128 => u128_suffixed
}

impl ToTokens for char {
fn to_tokens(&self, tokens: &mut TokenStream) {
tokens.append(Literal::character(*self));
Expand Down
11 changes: 11 additions & 0 deletions tests/conditional/integer128.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#[test]
fn test_integer128() {
let ii128 = -1i128;
let uu128 = 1u128;

let tokens = quote! {
#ii128 #uu128
};
let expected = "-1i128 1u128";
assert_eq!(expected, tokens.to_string());
}
5 changes: 5 additions & 0 deletions tests/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ extern crate quote;
use proc_macro2::{Ident, Span, TokenStream};
use quote::TokenStreamExt;

mod conditional {
#[cfg(integer128)]
mod integer128;
}

struct X;

impl quote::ToTokens for X {
Expand Down

0 comments on commit 9250a2c

Please sign in to comment.