Compute enum discriminant during parsing

This allows us to reuse the computation in multiple places later.
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 3c059a7..4e98674 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -367,12 +367,7 @@
     }
     writeln!(out, "enum class {} : uint32_t {{", enm.ident);
     for variant in &enm.variants {
-        write!(out, "  ");
-        write!(out, "{}", variant.ident);
-        if let Some(discriminant) = &variant.discriminant {
-            write!(out, " = {}", discriminant);
-        }
-        writeln!(out, ",");
+        writeln!(out, "  {} = {},", variant.ident, variant.discriminant);
     }
     writeln!(out, "}};");
 }
@@ -383,18 +378,13 @@
         "static_assert(sizeof({}) == sizeof(uint32_t), \"incorrect size\");",
         enm.ident
     );
-    let mut prev_discriminant = None;
     for variant in &enm.variants {
-        let discriminant = variant
-            .discriminant
-            .unwrap_or_else(|| prev_discriminant.map_or(0, |n| n + 1));
         writeln!(
             out,
             "static_assert(static_cast<uint32_t>({}::{}) == {},
               \"disagrees with the value in #[cxx::bridge]\");",
-            enm.ident, variant.ident, discriminant,
+            enm.ident, variant.ident, variant.discriminant,
         );
-        prev_discriminant = Some(discriminant);
     }
 }