diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2018-03-05 12:19:25 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-05 12:19:25 -0500 |
commit | f36f4e3e38d5a4f9c712a5bbde68403ce716dab6 (patch) | |
tree | 656a73545312d459bc01ce76433ac0720a0592bb | |
parent | f9fe3d157192ab0738e08f1da69c4be30ed289d4 (diff) | |
parent | 4c6c9977c8ce93a5753d28278a3eb7571aaddef7 (diff) |
Auto merge of #1268 - emilio:enum-replace, r=fitzgen
ir: Allow replacing enums and enum variants.
Fixes #1267.
-rw-r--r-- | src/callbacks.rs | 15 | ||||
-rw-r--r-- | src/codegen/mod.rs | 6 | ||||
-rw-r--r-- | src/ir/context.rs | 3 | ||||
-rw-r--r-- | src/ir/enum_ty.rs | 33 | ||||
-rw-r--r-- | tests/expectations/tests/enum-variant-replaces.rs | 14 | ||||
-rw-r--r-- | tests/headers/enum-variant-replaces.h | 34 |
6 files changed, 86 insertions, 19 deletions
diff --git a/src/callbacks.rs b/src/callbacks.rs index 469314c4..f6935a55 100644 --- a/src/callbacks.rs +++ b/src/callbacks.rs @@ -36,14 +36,23 @@ pub trait ParseCallbacks: fmt::Debug + UnwindSafe { } /// This function should return whether, given the a given enum variant - /// name, and value, returns whether this enum variant will forcibly be a - /// constant. + /// name, and value, this enum variant will forcibly be a constant. fn enum_variant_behavior( &self, _enum_name: Option<&str>, - _variant_name: &str, + _original_variant_name: &str, _variant_value: EnumVariantValue, ) -> Option<EnumVariantCustomBehavior> { None } + + /// Allows to rename an enum variant, replacing `_original_variant_name`. + fn enum_variant_name( + &self, + _enum_name: Option<&str>, + _original_variant_name: &str, + _variant_value: EnumVariantValue, + ) -> Option<String> { + None + } } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index b21c0dc4..1801520a 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -2228,7 +2228,7 @@ impl<'a> EnumBuilder<'a> { self, ctx: &BindgenContext, variant: &EnumVariant, - mangling_prefix: Option<&String>, + mangling_prefix: Option<&str>, rust_ty: quote::Tokens, result: &mut CodegenResult<'b>, ) -> Self { @@ -2548,9 +2548,9 @@ impl CodeGenerator for Enum { let constant_mangling_prefix = if ctx.options().prepend_enum_name { if enum_ty.name().is_none() { - parent_canonical_name.as_ref().map(|n| &*n) + parent_canonical_name.as_ref().map(|n| &**n) } else { - Some(&name) + Some(&*name) } } else { None diff --git a/src/ir/context.rs b/src/ir/context.rs index df8a84ef..b453378d 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -1060,6 +1060,7 @@ impl BindgenContext { match *ty.kind() { TypeKind::Comp(..) | TypeKind::TemplateAlias(..) | + TypeKind::Enum(..) | TypeKind::Alias(..) => {} _ => continue, } @@ -2060,7 +2061,7 @@ impl BindgenContext { /// Has the item with the given `name` and `id` been replaced by another /// type? - pub fn is_replaced_type<Id: Into<ItemId>>(&self, path: &[String], id: Id) -> bool { + fn is_replaced_type<Id: Into<ItemId>>(&self, path: &[String], id: Id) -> bool { let id = id.into(); match self.replacements.get(path) { Some(replaced_by) if *replaced_by != id => true, diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index bc8e37eb..4ae311e2 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -98,22 +98,31 @@ impl Enum { }; if let Some(val) = value { let name = cursor.spelling(); + let annotations = Annotations::new(&cursor); let custom_behavior = ctx.parse_callbacks() - .and_then( - |t| t.enum_variant_behavior(type_name, &name, val), - ) + .and_then(|callbacks| { + callbacks.enum_variant_behavior(type_name, &name, val) + }) .or_else(|| { - Annotations::new(&cursor).and_then( - |anno| if anno.hide() { - Some(EnumVariantCustomBehavior::Hide) - } else if anno.constify_enum_variant() { - Some(EnumVariantCustomBehavior::Constify) - } else { - None - }, - ) + let annotations = annotations.as_ref()?; + if annotations.hide() { + Some(EnumVariantCustomBehavior::Hide) + } else if annotations.constify_enum_variant() { + Some(EnumVariantCustomBehavior::Constify) + } else { + None + } }); + let name = ctx.parse_callbacks() + .and_then(|callbacks| { + callbacks.enum_variant_name(type_name, &name, val) + }) + .or_else(|| { + annotations.as_ref()?.use_instead_of()?.last().cloned() + }) + .unwrap_or(name); + let comment = cursor.raw_comment(); variants.push(EnumVariant::new( name, diff --git a/tests/expectations/tests/enum-variant-replaces.rs b/tests/expectations/tests/enum-variant-replaces.rs new file mode 100644 index 00000000..aabcad75 --- /dev/null +++ b/tests/expectations/tests/enum-variant-replaces.rs @@ -0,0 +1,14 @@ +/* automatically generated by rust-bindgen */ + +#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] + +/// <div rustbindgen replaces="PASS"></div> +/// +/// Should see PASS below. +pub const OGRErr_PASS: OGRErr = 0; +/// <div rustbindgen replaces="OGRERR_NONE"></div> +/// +/// Should see OGRERR_NONE instead of CUSTOM_OGRERR_NONE below. +pub const OGRErr_OGRERR_NONE: OGRErr = 1; +/// <div rustbindgen replaces="OGRErr"></div> +pub type OGRErr = u32; diff --git a/tests/headers/enum-variant-replaces.h b/tests/headers/enum-variant-replaces.h new file mode 100644 index 00000000..45eb4d7a --- /dev/null +++ b/tests/headers/enum-variant-replaces.h @@ -0,0 +1,34 @@ + +/** Type for a OGR error */ +typedef enum +{ + OGRERR_NONE, /**< Success */ + OGRERR_NOT_ENOUGH_DATA, /**< Not enough data to deserialize */ + OGRERR_NOT_ENOUGH_MEMORY, /**< Not enough memory */ + OGRERR_UNSUPPORTED_GEOMETRY_TYPE, /**< Unsupported geometry type */ + OGRERR_UNSUPPORTED_OPERATION, /**< Unsupported operation */ + OGRERR_CORRUPT_DATA, /**< Corrupt data */ + OGRERR_FAILURE, /**< Failure */ + OGRERR_UNSUPPORTED_SRS, /**< Unsupported SRS */ + OGRERR_INVALID_HANDLE, /**< Invalid handle */ + OGRERR_NON_EXISTING_FEATURE /**< Non existing feature. Added in GDAL 2.0 */ +} OGRErr; + +/** + * <div rustbindgen replaces="OGRErr"></div> + */ +typedef enum +{ + /** + * <div rustbindgen replaces="PASS"></div> + * + * Should see PASS below. + */ + FAIL, + /** + * <div rustbindgen replaces="OGRERR_NONE"></div> + * + * Should see OGRERR_NONE instead of CUSTOM_OGRERR_NONE below. + */ + CUSTOM_OGRERR_NONE +} StrictOGRErr; |