diff --git a/src/ir/item.rs b/src/ir/item.rs index a07ee1f36f..c6d80a0833 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -331,6 +331,12 @@ impl Item { self.kind().expect_type() } + /// Get a reference to this item's underlying `Type`, or `None` if this is + /// some other kind of item. + pub fn as_type(&self) -> Option<&Type> { + self.kind().as_type() + } + /// Get a reference to this item's underlying `Function`. Panic if this is /// some other kind of item. pub fn expect_function(&self) -> &Function { @@ -531,6 +537,11 @@ impl Item { ctx.opaque_by_name(&self.real_canonical_name(ctx, false, true)) } + /// Is this a reference to another type? + pub fn is_type_ref(&self) -> bool { + self.as_type().map_or(false, |ty| ty.is_type_ref()) + } + /// Get the canonical name without taking into account the replaces /// annotation. /// diff --git a/src/ir/ty.rs b/src/ir/ty.rs index be74926816..2c1e5f8efa 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -136,6 +136,15 @@ impl Type { self.is_const } + /// Is this a reference to another type? + pub fn is_type_ref(&self) -> bool { + match self.kind { + TypeKind::ResolvedTypeRef(_) | + TypeKind::UnresolvedTypeRef(_, _, _) => true, + _ => false, + } + } + /// What is the layout of this type? pub fn layout(&self, ctx: &BindgenContext) -> Option { use std::mem;