summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-03-05 12:19:25 -0500
committerGitHub <noreply@github.com>2018-03-05 12:19:25 -0500
commitf36f4e3e38d5a4f9c712a5bbde68403ce716dab6 (patch)
tree656a73545312d459bc01ce76433ac0720a0592bb
parentf9fe3d157192ab0738e08f1da69c4be30ed289d4 (diff)
parent4c6c9977c8ce93a5753d28278a3eb7571aaddef7 (diff)
Auto merge of #1268 - emilio:enum-replace, r=fitzgen
ir: Allow replacing enums and enum variants. Fixes #1267.
-rw-r--r--src/callbacks.rs15
-rw-r--r--src/codegen/mod.rs6
-rw-r--r--src/ir/context.rs3
-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
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;