summaryrefslogtreecommitdiff
path: root/src/codegen/mod.rs
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2018-07-30 19:23:36 +1000
committerGitHub <noreply@github.com>2018-07-30 19:23:36 +1000
commitcb8bfea157fb6e493ac508af73c9f153726cd9f7 (patch)
tree0fec2798d5bccceb8495d72b36064d054a79afcb /src/codegen/mod.rs
parent29dad405165756be9ce8da659a76c4cfa331a01e (diff)
parent4b5f86fb4c3a7ef1adb9cd9befb527dd18051066 (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.rs34
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,