+
+ fn get_bin_hex_repr(cx: &LateContext, lit: &ast::Lit) -> Option<String> {
+ if let Some(src) = cx.sess().codemap().span_to_snippet(lit.span).ok() {
+ if let Some(firstch) = src.chars().next() {
+ if let Some(0) = char::to_digit(firstch, 10) {
+ if let Some(base) = src.chars().nth(1) {
+ if base == 'x' || base == 'b' {
+ return Some(src);
+ }
+ }
+ }
+ }
+ }
+
+ None
+ }
+
+ fn get_fitting_type<'a>(
+ t: &ty::TypeVariants,
+ val: u128,
+ negative: bool,
+ ) -> Option<ty::TypeVariants<'a>> {
+ use syntax::ast::IntTy::*;
+ use syntax::ast::UintTy::*;
+ macro_rules! find_fit {
+ ($ty:expr, $val:expr, $negative:expr,
+ $($type:ident => [$($utypes:expr),*] => [$($itypes:expr),*]),+) => {
+ {
+ let _neg = if negative { 1 } else { 0 };
+ match $ty {
+ $($type => {
+ $(if !negative && val <= uint_ty_range($utypes).1 {
+ return Some(ty::TyUint($utypes))
+ })*
+ $(if val <= int_ty_range($itypes).1 as u128 + _neg {
+ return Some(ty::TyInt($itypes))
+ })*
+ None
+ },)*
+ _ => None
+ }
+ }
+ }
+ }
+ if let &ty::TyInt(i) = t {
+ return find_fit!(i, val, negative,
+ I8 => [U8] => [I16, I32, I64, I128],
+ I16 => [U16] => [I32, I64, I128],
+ I32 => [U32] => [I64, I128],
+ I64 => [U64] => [I128],
+ I128 => [U128] => []);
+ }
+ if let &ty::TyUint(u) = t {
+ return find_fit!(u, val, negative,
+ U8 => [U8, U16, U32, U64, U128] => [],
+ U16 => [U16, U32, U64, U128] => [],
+ U32 => [U32, U64, U128] => [],
+ U64 => [U64, U128] => [],
+ U128 => [U128] => []);
+ }
+
+ None
+ }