Skip to content

Commit 624c32c

Browse files
author
bors-servo
authored
Auto merge of #200 - fitzgen:replace-template-alias, r=emilio
Allow aliases and template aliases to be considered for replacement Fixes #89. I'm not exactly *happy* with the way this is implemented (making `real_canonical_name` public so that we can use it in replacement lookups) but I'm not sure of a better way without refactoring most of how naming works right now. r? @emilio
2 parents 20c6f45 + 8041ebf commit 624c32c

File tree

4 files changed

+57
-15
lines changed

4 files changed

+57
-15
lines changed

src/ir/context.rs

+14-10
Original file line numberDiff line numberDiff line change
@@ -320,23 +320,27 @@ impl<'ctx> BindgenContext<'ctx> {
320320
let mut replacements = vec![];
321321

322322
for (id, item) in self.items.iter() {
323+
// Calls to `canonical_name` are expensive, so eagerly filter out
324+
// items that cannot be replaced.
323325
let ty = match item.kind().as_type() {
324326
Some(ty) => ty,
325327
None => continue,
326328
};
327329

328-
// canonical_name calls are expensive.
329-
let ci = match ty.as_comp() {
330-
Some(ci) => ci,
331-
None => continue,
332-
};
333-
334-
if ci.is_template_specialization() {
335-
continue;
330+
match *ty.kind() {
331+
TypeKind::Comp(ref ci) if !ci.is_template_specialization() => {}
332+
TypeKind::TemplateAlias(_, _) |
333+
TypeKind::Alias(_, _) => {}
334+
_ => continue,
336335
}
337336

338-
if let Some(replacement) = self.replacements
339-
.get(&item.canonical_name(self)) {
337+
let name = item.real_canonical_name(self,
338+
self.options()
339+
.enable_cxx_namespaces,
340+
true);
341+
let replacement = self.replacements.get(&name);
342+
343+
if let Some(replacement) = replacement {
340344
if replacement != id {
341345
// We set this just after parsing the annotation. It's
342346
// very unlikely, but this can happen.

src/ir/item.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -539,11 +539,11 @@ impl Item {
539539
///
540540
/// This name should be derived from the immutable state contained in the
541541
/// type and the parent chain, since it should be consistent.
542-
fn real_canonical_name(&self,
543-
ctx: &BindgenContext,
544-
count_namespaces: bool,
545-
for_name_checking: bool)
546-
-> String {
542+
pub fn real_canonical_name(&self,
543+
ctx: &BindgenContext,
544+
count_namespaces: bool,
545+
for_name_checking: bool)
546+
-> String {
547547
let base_name = match *self.kind() {
548548
ItemKind::Type(ref ty) => {
549549
match *ty.kind() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/* automatically generated by rust-bindgen */
2+
3+
4+
#![allow(non_snake_case)]
5+
6+
7+
#[repr(C)]
8+
#[derive(Debug, Copy, Clone)]
9+
pub struct Rooted<T> {
10+
pub ptr: MaybeWrapped<T>,
11+
}
12+
/// But the replacement type does use T!
13+
///
14+
/// <div rustbindgen replaces="MaybeWrapped" />
15+
pub type MaybeWrapped<T> = T;
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// bindgen-flags: -- --std=c++14
2+
3+
namespace JS {
4+
namespace detail {
5+
6+
/// Notice how this doesn't use T.
7+
template <typename T>
8+
using MaybeWrapped = int;
9+
10+
}
11+
12+
template <typename T>
13+
class Rooted {
14+
detail::MaybeWrapped<T> ptr;
15+
};
16+
17+
}
18+
19+
/// But the replacement type does use T!
20+
///
21+
/// <div rustbindgen replaces="MaybeWrapped" />
22+
template <typename T>
23+
using replaces_MaybeWrapped = T;

0 commit comments

Comments
 (0)