summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-11-07 16:56:24 -0600
committerGitHub <noreply@github.com>2016-11-07 16:56:24 -0600
commit86c3bba4ca9293034d9b705ac87c28d5335aef0a (patch)
treea67ef8f1a195ee27893d05fe2e3f3f157a046496
parent3c4a8403bdaa8e18facbe13995e4fa84dddce997 (diff)
parentbfc02909c399f646987f025abf8bce770cf3d581 (diff)
Auto merge of #172 - malisas:malisa-semantic-parent-call, r=fitzgen,emilio
Make clang::Cursor::fallible_semantic_parent make ffi call This PR fixes #120 . `clang::Cursor::semantic_parent` now just calls `clang::Cursor::fallible_semantic_parent`, and the ffi call has been moved into `fallible_semantic_parent`. This change broke a number of tests which call `is_toplevel()` (which itself calls `semantic_parent()`): > panicked at called Option::unwrap() on a None value So I re-wrote `is_toplevel()` to call `fallible_semantic_parent()`, which returns an `Option<Cursor>` type instead.
-rwxr-xr-xsrc/clang.rs25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/clang.rs b/src/clang.rs
index a11e2924..c6af517c 100755
--- a/src/clang.rs
+++ b/src/clang.rs
@@ -101,7 +101,9 @@ impl Cursor {
/// See documentation for `lexical_parent` for details on semantic vs
/// lexical parents.
pub fn fallible_semantic_parent(&self) -> Option<Cursor> {
- let sp = self.semantic_parent();
+ let sp = unsafe {
+ Cursor { x: clang_getCursorSemanticParent(self.x) }
+ };
if sp == *self || !sp.is_valid() {
return None;
}
@@ -113,11 +115,7 @@ impl Cursor {
/// See documentation for `lexical_parent` for details on semantic vs
/// lexical parents.
pub fn semantic_parent(&self) -> Cursor {
- unsafe {
- Cursor {
- x: clang_getCursorSemanticParent(self.x),
- }
- }
+ self.fallible_semantic_parent().unwrap()
}
/// Return the number of template arguments used by this cursor's referent,
@@ -157,17 +155,18 @@ impl Cursor {
/// Is the referent a top level construct?
pub fn is_toplevel(&self) -> bool {
- let mut semantic_parent = self.semantic_parent();
+ let mut semantic_parent = self.fallible_semantic_parent();
- while semantic_parent.kind() == CXCursor_Namespace ||
- semantic_parent.kind() == CXCursor_NamespaceAlias ||
- semantic_parent.kind() == CXCursor_NamespaceRef {
- semantic_parent = semantic_parent.semantic_parent();
+ while semantic_parent.is_some() &&
+ (semantic_parent.unwrap().kind() == CXCursor_Namespace ||
+ semantic_parent.unwrap().kind() == CXCursor_NamespaceAlias ||
+ semantic_parent.unwrap().kind() == CXCursor_NamespaceRef) {
+ semantic_parent = semantic_parent.unwrap().fallible_semantic_parent();
}
let tu = self.translation_unit();
- // Yes, the second can happen with, e.g., macro definitions.
- semantic_parent == tu || semantic_parent == tu.semantic_parent()
+ // Yes, this can happen with, e.g., macro definitions.
+ semantic_parent == tu.fallible_semantic_parent()
}
/// Get the kind of referent this cursor is pointing to.