diff --git a/src/bindgen/rust_lib.rs b/src/bindgen/rust_lib.rs
index 02fa0e59324c64d3b00c73d710857d2c712f34a3..ebcf83c71200ca1ff1b79ecaff58fde7e1750b2c 100644
--- a/src/bindgen/rust_lib.rs
+++ b/src/bindgen/rust_lib.rs
@@ -111,15 +111,22 @@ fn parse_expand_crate<F>(crate_name: &str, context: &mut ParseLibContext<F>)
         context.cache_expanded_crate.get(&owned_crate_name).unwrap().clone()
     };
 
+    process_expanded_mod(crate_name, &mod_parsed, context);
+}
+
+fn process_expanded_mod<F>(crate_name: &str,
+                           items: &Vec<syn::Item>,
+                           context: &mut ParseLibContext<F>)
+    where F: FnMut(&str, &Vec<syn::Item>)
+{
     (context.items_callback)(crate_name,
-                             &mod_parsed);
+                             items);
 
-    for item in &mod_parsed {
+    for item in items {
         match item.node {
             syn::ItemKind::Mod(ref inline_items) => {
                 if let &Some(ref inline_items) = inline_items {
-                    (context.items_callback)(crate_name,
-                                             &inline_items);
+                    process_expanded_mod(crate_name, inline_items, context);
                     continue;
                 }
 
@@ -139,8 +146,6 @@ fn parse_mod<F>(crate_name: &str,
                 context: &mut ParseLibContext<F>)
     where F: FnMut(&str, &Vec<syn::Item>)
 {
-    let mod_dir = mod_path.parent().unwrap().to_path_buf();
-
     let mod_parsed = {
         let owned_mod_path = mod_path.to_path_buf();
 
@@ -154,17 +159,33 @@ fn parse_mod<F>(crate_name: &str,
         context.cache_src.get(&owned_mod_path).unwrap().clone()
     };
 
+    let mod_dir = mod_path.parent().unwrap();
+
+    process_mod(crate_name,
+                mod_dir,
+                &mod_parsed,
+                context);
+}
+
+fn process_mod<F>(crate_name: &str,
+                  mod_dir: &Path,
+                  items: &Vec<syn::Item>,
+                  context: &mut ParseLibContext<F>)
+    where F: FnMut(&str, &Vec<syn::Item>)
+{
     (context.items_callback)(crate_name,
-                             &mod_parsed);
+                             items);
 
-    for item in &mod_parsed {
+    for item in items {
         match item.node {
             syn::ItemKind::Mod(ref inline_items) => {
                 let next_mod_name = item.ident.to_string();
 
                 if let &Some(ref inline_items) = inline_items {
-                    (context.items_callback)(crate_name,
-                                             &inline_items);
+                    process_mod(crate_name,
+                                mod_dir,
+                                inline_items,
+                                context);
                     continue;
                 }