diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-07-30 19:23:36 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-30 19:23:36 +1000 |
commit | cb8bfea157fb6e493ac508af73c9f153726cd9f7 (patch) | |
tree | 0fec2798d5bccceb8495d72b36064d054a79afcb /src/codegen/mod.rs | |
parent | 29dad405165756be9ce8da659a76c4cfa331a01e (diff) | |
parent | 4b5f86fb4c3a7ef1adb9cd9befb527dd18051066 (diff) |
Merge pull request #1355 from Lytigas/associated-duplicate-enum. r=emilio
Use associated constants for rust enums when available
Diffstat (limited to 'src/codegen/mod.rs')
-rw-r--r-- | src/codegen/mod.rs | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 2a0891d9..6e80447f 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2645,15 +2645,31 @@ impl CodeGenerator for Enum { }; let existing_variant_name = entry.get(); - add_constant( - ctx, - enum_ty, - &ident, - &*mangled_name, - existing_variant_name, - enum_rust_ty.clone(), - result, - ); + // Use associated constants for named enums + if enum_ty.name().is_some() && + ctx.options().rust_features().associated_const { + let enum_rust_ty_ = enum_rust_ty.clone(); + let enum_canonical_name = &ident; + let variant_name = &*mangled_name; + let constant_name: String = variant_name.into(); + let constant_name = ctx.rust_ident(constant_name); + result.push(quote! { + impl #enum_rust_ty_ { + pub const #constant_name : #enum_rust_ty_ = + #enum_canonical_name :: #existing_variant_name ; + } + }); + } else { + add_constant( + ctx, + enum_ty, + &ident, + &*mangled_name, + existing_variant_name, + enum_rust_ty.clone(), + result, + ); + } } else { builder = builder.with_variant( ctx, |