Parse discriminant values from clang AST
diff --git a/syntax/discriminant.rs b/syntax/discriminant.rs
index 80f7c0b..01d0f1a 100644
--- a/syntax/discriminant.rs
+++ b/syntax/discriminant.rs
@@ -150,7 +150,7 @@
}
impl Discriminant {
- const fn zero() -> Self {
+ pub const fn zero() -> Self {
Discriminant {
sign: Sign::Positive,
magnitude: 0,
@@ -179,6 +179,28 @@
magnitude: i.wrapping_abs() as u64,
}
}
+
+ pub const fn checked_succ(self) -> Option<Self> {
+ match self.sign {
+ Sign::Negative => {
+ if self.magnitude == 1 {
+ Some(Discriminant::zero())
+ } else {
+ Some(Discriminant {
+ sign: Sign::Negative,
+ magnitude: self.magnitude - 1,
+ })
+ }
+ }
+ Sign::Positive => match self.magnitude.checked_add(1) {
+ Some(magnitude) => Some(Discriminant {
+ sign: Sign::Positive,
+ magnitude,
+ }),
+ None => None,
+ },
+ }
+ }
}
impl Display for Discriminant {
diff --git a/syntax/mod.rs b/syntax/mod.rs
index dd5de52..b22587f 100644
--- a/syntax/mod.rs
+++ b/syntax/mod.rs
@@ -30,7 +30,6 @@
mod visit;
use self::attrs::OtherAttrs;
-use self::discriminant::Discriminant;
use self::namespace::Namespace;
use self::parse::kw;
use self::symbol::Symbol;
@@ -41,6 +40,7 @@
pub use self::atom::Atom;
pub use self::derive::{Derive, Trait};
+pub use self::discriminant::Discriminant;
pub use self::doc::Doc;
pub use self::names::ForeignName;
pub use self::parse::parse_items;