summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2018-03-04 14:23:21 +0100
committerEmilio Cobos Álvarez <emilio@crisal.io>2018-03-04 14:27:08 +0100
commit4c6c9977c8ce93a5753d28278a3eb7571aaddef7 (patch)
treeeccadd9a851e424a4ed6308d66e8eb4f5e6322ff
parent27641c23c6ad6f0c9e51494a2afdf5245c7090d9 (diff)
ir: Allow renaming variants using the replaces="" annotation or a custom callback.
-rw-r--r--src/callbacks.rs15
-rw-r--r--src/ir/enum_ty.rs33
-rw-r--r--tests/expectations/tests/enum-variant-replaces.rs14
-rw-r--r--tests/headers/enum-variant-replaces.h34
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;