diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-03-04 14:23:21 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2018-03-04 14:27:08 +0100 |
commit | 4c6c9977c8ce93a5753d28278a3eb7571aaddef7 (patch) | |
tree | eccadd9a851e424a4ed6308d66e8eb4f5e6322ff | |
parent | 27641c23c6ad6f0c9e51494a2afdf5245c7090d9 (diff) |
ir: Allow renaming variants using the replaces="" annotation or a custom callback.
-rw-r--r-- | src/callbacks.rs | 15 | ||||
-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 |
4 files changed, 81 insertions, 15 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/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; |