Skip to content

Commit daabd07

Browse files
committed
Use iterators for comment attributes fix #166
1 parent 5157b05 commit daabd07

File tree

2 files changed

+43
-30
lines changed

2 files changed

+43
-30
lines changed

src/clang.rs

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -808,27 +808,12 @@ impl Comment {
808808
}
809809
}
810810

811-
/// Given that this comment is an HTML start tag, get the number of HTML
812-
/// attributes it has.
813-
pub fn get_num_tag_attrs(&self) -> c_uint {
814-
unsafe {
815-
clang_HTMLStartTag_getNumAttrs(self.x)
816-
}
817-
}
818-
819-
/// Given that this comment is an HTML start tag, get the `idx`th
820-
/// attribute's name.
821-
pub fn get_tag_attr_name(&self, idx: c_uint) -> String {
822-
unsafe {
823-
String_ { x: clang_HTMLStartTag_getAttrName(self.x, idx) }.to_string()
824-
}
825-
}
826-
827-
/// Given that this comment is an HTML start tag, get the `idx`th
828-
/// attribute's value.
829-
pub fn get_tag_attr_value(&self, idx: c_uint) -> String {
830-
unsafe {
831-
String_ { x: clang_HTMLStartTag_getAttrValue(self.x, idx) }.to_string()
811+
/// Given that this comment is an HTML start tag, get its attributes.
812+
pub fn get_tag_attrs(&self) -> CommentAttributesIterator {
813+
CommentAttributesIterator {
814+
x: self.x,
815+
length: unsafe { clang_HTMLStartTag_getNumAttrs(self.x) },
816+
index: 0
832817
}
833818
}
834819
}
@@ -853,6 +838,37 @@ impl Iterator for CommentChildrenIterator {
853838
}
854839
}
855840

841+
/// An HTML start tag comment attribute
842+
pub struct CommentAttribute {
843+
/// HTML start tag attribute name
844+
pub name: String,
845+
/// HTML start tag attribute value
846+
pub value: String
847+
}
848+
849+
/// An iterator for a comment's attributes
850+
pub struct CommentAttributesIterator {
851+
x: CXComment,
852+
length: c_uint,
853+
index: c_uint
854+
}
855+
856+
impl Iterator for CommentAttributesIterator {
857+
type Item = CommentAttribute;
858+
fn next(&mut self) -> Option<CommentAttribute> {
859+
if self.index < self.length {
860+
let idx = self.index;
861+
self.index += 1;
862+
Some( CommentAttribute {
863+
name: String_ { x: unsafe { clang_HTMLStartTag_getAttrName(self.x, idx) } }.to_string(),
864+
value: String_ { x: unsafe { clang_HTMLStartTag_getAttrValue(self.x, idx) } }.to_string()
865+
})
866+
} else {
867+
None
868+
}
869+
}
870+
}
871+
856872
/// A source file.
857873
pub struct File {
858874
x: CXFile

src/ir/annotations.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,20 +133,17 @@ impl Annotations {
133133
use clangll::CXComment_HTMLStartTag;
134134
if comment.kind() == CXComment_HTMLStartTag &&
135135
comment.get_tag_name() == "div" &&
136-
comment.get_num_tag_attrs() > 1 &&
137-
comment.get_tag_attr_name(0) == "rustbindgen" {
136+
comment.get_tag_attrs().next().map_or(false, |attr| attr.name == "rustbindgen") {
138137
*matched = true;
139-
for i in 0..comment.get_num_tag_attrs() {
140-
let value = comment.get_tag_attr_value(i);
141-
let name = comment.get_tag_attr_name(i);
142-
match name.as_str() {
138+
for attr in comment.get_tag_attrs() {
139+
match attr.name.as_str() {
143140
"opaque" => self.opaque = true,
144141
"hide" => self.hide = true,
145142
"nocopy" => self.disallow_copy = true,
146-
"replaces" => self.use_instead_of = Some(value),
147-
"private" => self.private_fields = Some(value != "false"),
143+
"replaces" => self.use_instead_of = Some(attr.value),
144+
"private" => self.private_fields = Some(attr.value != "false"),
148145
"accessor"
149-
=> self.accessor_kind = Some(parse_accessor(&value)),
146+
=> self.accessor_kind = Some(parse_accessor(&attr.value)),
150147
_ => {},
151148
}
152149
}

0 commit comments

Comments
 (0)