Repository: rust-analyzer/rust-analyzer
Pull request #550 (2019-01-15 15:14:03)

remove Cancelable from source binders


Patch:
diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs
index 91b2355947..5db53a34fc 100644
--- a/crates/ra_hir/src/code_model_api.rs
+++ b/crates/ra_hir/src/code_model_api.rs
@@ -109,7 +109,7 @@ impl Module {
     }
 
     /// Finds a child module with the specified name.
-    pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
+    pub fn child(&self, db: &impl HirDatabase, name: &Name) -> Option<Module> {
         self.child_impl(db, name)
     }
 
diff --git a/crates/ra_hir/src/code_model_impl/module.rs b/crates/ra_hir/src/code_model_impl/module.rs
index 2ec3ab4696..67808d2827 100644
--- a/crates/ra_hir/src/code_model_impl/module.rs
+++ b/crates/ra_hir/src/code_model_impl/module.rs
@@ -18,7 +18,7 @@ impl Module {
         db: &impl HirDatabase,
         source_root_id: SourceRootId,
         module_id: ModuleId,
-    ) -> Cancelable<Self> {
+    ) -> Self {
         let module_tree = db.module_tree(source_root_id);
         let def_loc = DefLoc {
             kind: DefKind::Module,
@@ -27,8 +27,7 @@ impl Module {
             source_item_id: module_id.source(&module_tree),
         };
         let def_id = def_loc.id(db);
-        let module = Module::new(def_id);
-        Ok(module)
+        Module::new(def_id)
     }
 
     pub(crate) fn name_impl(&self, db: &impl HirDatabase) -> Cancelable<Option<Name>> {
@@ -84,15 +83,15 @@ impl Module {
         let loc = self.def_id.loc(db);
         let module_tree = db.module_tree(loc.source_root_id);
         let module_id = loc.module_id.crate_root(&module_tree);
-        Module::from_module_id(db, loc.source_root_id, module_id)
+        Ok(Module::from_module_id(db, loc.source_root_id, module_id))
     }
 
     /// Finds a child module with the specified name.
-    pub fn child_impl(&self, db: &impl HirDatabase, name: &Name) -> Cancelable<Option<Module>> {
+    pub fn child_impl(&self, db: &impl HirDatabase, name: &Name) -> Option<Module> {
         let loc = self.def_id.loc(db);
         let module_tree = db.module_tree(loc.source_root_id);
-        let child_id = ctry!(loc.module_id.child(&module_tree, name));
-        Module::from_module_id(db, loc.source_root_id, child_id).map(Some)
+        let child_id = loc.module_id.child(&module_tree, name)?;
+        Some(Module::from_module_id(db, loc.source_root_id, child_id))
     }
 
     /// Iterates over all child modules.
@@ -106,7 +105,7 @@ impl Module {
             .module_id
             .children(&module_tree)
             .map(|(_, module_id)| Module::from_module_id(db, loc.source_root_id, module_id))
-            .collect::<Cancelable<Vec<_>>>()?;
+            .collect::<Vec<_>>();
         Ok(children.into_iter())
     }
 
@@ -114,7 +113,11 @@ impl Module {
         let loc = self.def_id.loc(db);
         let module_tree = db.module_tree(loc.source_root_id);
         let parent_id = ctry!(loc.module_id.parent(&module_tree));
-        Module::from_module_id(db, loc.source_root_id, parent_id).map(Some)
+        Ok(Some(Module::from_module_id(
+            db,
+            loc.source_root_id,
+            parent_id,
+        )))
     }
 
     /// Returns a `ModuleScope`: a set of items, visible in this module.
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index 68c3eb4e4d..3b2498d5a5 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -82,7 +82,7 @@ pub trait HirDatabase: SyntaxDatabase
         use fn crate::module_tree::Submodule::submodules_query;
     }
 
-    fn input_module_items(source_root_id: SourceRootId, module_id: ModuleId) -> Cancelable<Arc<InputModuleItems>> {
+    fn input_module_items(source_root_id: SourceRootId, module_id: ModuleId) -> Arc<InputModuleItems> {
         type InputModuleItemsQuery;
         use fn query_definitions::input_module_items;
     }
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs
index 316896dce2..d7cc9b4ca3 100644
--- a/crates/ra_hir/src/ids.rs
+++ b/crates/ra_hir/src/ids.rs
@@ -163,7 +163,7 @@ impl DefId {
         let loc = self.loc(db);
         let res = match loc.kind {
             DefKind::Module => {
-                let module = Module::from_module_id(db, loc.source_root_id, loc.module_id)?;
+                let module = Module::from_module_id(db, loc.source_root_id, loc.module_id);
                 Def::Module(module)
             }
             DefKind::Function => {
@@ -208,7 +208,11 @@ impl DefId {
     /// For a module, returns that module; for any other def, returns the containing module.
     pub fn module(self, db: &impl HirDatabase) -> Cancelable<Module> {
         let loc = self.loc(db);
-        Module::from_module_id(db, loc.source_root_id, loc.module_id)
+        Ok(Module::from_module_id(
+            db,
+            loc.source_root_id,
+            loc.module_id,
+        ))
     }
 
     /// Returns the containing crate.
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs
index d0b0863081..c9a9fb99ff 100644
--- a/crates/ra_hir/src/impl_block.rs
+++ b/crates/ra_hir/src/impl_block.rs
@@ -196,7 +196,7 @@ pub(crate) fn impls_in_module(
     module_id: ModuleId,
 ) -> Cancelable<Arc<ModuleImplBlocks>> {
     let mut result = ModuleImplBlocks::new();
-    let module = Module::from_module_id(db, source_root_id, module_id)?;
+    let module = Module::from_module_id(db, source_root_id, module_id);
     result.collect(db, module)?;
     Ok(Arc::new(result))
 }
diff --git a/crates/ra_hir/src/query_definitions.rs b/crates/ra_hir/src/query_definitions.rs
index d84efbf957..7ff942f6a6 100644
--- a/crates/ra_hir/src/query_definitions.rs
+++ b/crates/ra_hir/src/query_definitions.rs
@@ -47,7 +47,7 @@ pub(super) fn input_module_items(
     db: &impl HirDatabase,
     source_root_id: SourceRootId,
     module_id: ModuleId,
-) -> Cancelable<Arc<InputModuleItems>> {
+) -> Arc<InputModuleItems> {
     let module_tree = db.module_tree(source_root_id);
     let source = module_id.source(&module_tree);
     let file_id = source.file_id;
@@ -90,7 +90,7 @@ pub(super) fn input_module_items(
             }
         }
     };
-    Ok(Arc::new(res))
+    Arc::new(res)
 }
 
 pub(super) fn item_map(
@@ -101,11 +101,8 @@ pub(super) fn item_map(
     let module_tree = db.module_tree(source_root);
     let input = module_tree
         .modules()
-        .map(|id| {
-            let items = db.input_module_items(source_root, id)?;
-            Ok((id, items))
-        })
-        .collect::<Cancelable<FxHashMap<_, _>>>()?;
+        .map(|id| (id, db.input_module_items(source_root, id)))
+        .collect::<FxHashMap<_, _>>();
 
     let resolver = Resolver::new(db, &input, source_root, module_tree);
     let res = resolver.resolve()?;
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index 70dd850d7c..7ab8eeae20 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -5,7 +5,7 @@
 ///
 /// So, this modules should not be used during hir construction, it exists
 /// purely for "IDE needs".
-use ra_db::{FileId, FilePosition, Cancelable};
+use ra_db::{FileId, FilePosition};
 use ra_syntax::{
     SmolStr, TextRange, SyntaxNode,
     ast::{self, AstNode, NameOwner},
@@ -18,7 +18,7 @@ use crate::{
 };
 
 /// Locates the module by `FileId`. Picks topmost module in the file.
-pub fn module_from_file_id(db: &impl HirDatabase, file_id: FileId) -> Cancelable<Option<Module>> {
+pub fn module_from_file_id(db: &impl HirDatabase, file_id: FileId) -> Option<Module> {
     let module_source = SourceItemId {
         file_id: file_id.into(),
         item_id: None,
@@ -31,25 +31,22 @@ pub fn module_from_declaration(
     db: &impl HirDatabase,
     file_id: FileId,
     decl: &ast::Module,
-) -> Cancelable<Option<Module>> {
-    let parent_module = module_from_file_id(db, file_id)?;
+) -> Option<Module> {
+    let parent_module = module_from_file_id(db, file_id);
     let child_name = decl.name();
     match (parent_module, child_name) {
         (Some(parent_module), Some(child_name)) => {
-            if let Some(child) = parent_module.child(db, &child_name.as_name())? {
-                return Ok(Some(child));
+            if let Some(child) = parent_module.child(db, &child_name.as_name()) {
+                return Some(child);
             }
         }
         _ => (),
     }
-    Ok(None)
+    None
 }
 
 /// Locates the module by position in the source code.
-pub fn module_from_position(
-    db: &impl HirDatabase,
-    position: FilePosition,
-) -> Cancelable<Option<Module>> {
+pub fn module_from_position(db: &impl HirDatabase, position: FilePosition) -> Option<Module> {
     let file = db.source_file(position.file_id);
     match find_node_at_offset::<ast::Module>(file.syntax(), position.offset) {
         Some(m) if !m.has_semi() => module_from_inline(db, position.file_id.into(), m),
@@ -61,7 +58,7 @@ fn module_from_inline(
     db: &impl HirDatabase,
     file_id: FileId,
     module: &ast::Module,
-) -> Cancelable<Option<Module>> {
+) -> Option<Module> {
     assert!(!module.has_semi());
     let file_id = file_id.into();
     let file_items = db.file_items(file_id);
@@ -78,7 +75,7 @@ pub fn module_from_child_node(
     db: &impl HirDatabase,
     file_id: FileId,
     child: &SyntaxNode,
-) -> Cancelable<Option<Module>> {
+) -> Option<Module> {
     if let Some(m) = child
         .ancestors()
         .filter_map(ast::Module::cast)
@@ -90,22 +87,16 @@ pub fn module_from_child_node(
     }
 }
 
-fn module_from_source(db: &impl HirDatabase, source: SourceItemId) -> Cancelable<Option<Module>> {
+fn module_from_source(db: &impl HirDatabase, source: SourceItemId) -> Option<Module> {
     let source_root_id = db.file_source_root(source.file_id.as_original_file());
     let module_tree = db.module_tree(source_root_id);
-    let module_id = ctry!(module_tree.find_module_by_source(source));
-    Ok(Some(Module::from_module_id(db, source_root_id, module_id)?))
+    let module_id = module_tree.find_module_by_source(source)?;
+    Some(Module::from_module_id(db, source_root_id, module_id))
 }
 
-pub fn function_from_position(
-    db: &impl HirDatabase,
-    position: FilePosition,
-) -> Cancelable<Option<Function>> {
+pub fn function_from_position(db: &impl HirDatabase, position: FilePosition) -> Option<Function> {
     let file = db.source_file(position.file_id);
-    let fn_def = ctry!(find_node_at_offset::<ast::FnDef>(
-        file.syntax(),
-        position.offset
-    ));
+    let fn_def = find_node_at_offset::<ast::FnDef>(file.syntax(), position.offset)?;
     function_from_source(db, position.file_id, fn_def)
 }
 
@@ -113,10 +104,10 @@ pub fn function_from_source(
     db: &impl HirDatabase,
     file_id: FileId,
     fn_def: &ast::FnDef,
-) -> Cancelable<Option<Function>> {
-    let module = ctry!(module_from_child_node(db, file_id, fn_def.syntax())?);
+) -> Option<Function> {
+    let module = module_from_child_node(db, file_id, fn_def.syntax())?;
     let res = function_from_module(db, &module, fn_def);
-    Ok(Some(res))
+    Some(res)
 }
 
 pub fn function_from_module(
@@ -145,21 +136,18 @@ pub fn function_from_child_node(
     db: &impl HirDatabase,
     file_id: FileId,
     node: &SyntaxNode,
-) -> Cancelable<Option<Function>> {
-    let fn_def = ctry!(node.ancestors().find_map(ast::FnDef::cast));
+) -> Option<Function> {
+    let fn_def = node.ancestors().find_map(ast::FnDef::cast)?;
     function_from_source(db, file_id, fn_def)
 }
 
-pub fn macro_symbols(
-    db: &impl HirDatabase,
-    file_id: FileId,
-) -> Cancelable<Vec<(SmolStr, TextRange)>> {
-    let module = match module_from_file_id(db, file_id)? {
+pub fn macro_symbols(db: &impl HirDatabase, file_id: FileId) -> Vec<(SmolStr, TextRange)> {
+    let module = match module_from_file_id(db, file_id) {
         Some(it) => it,
-        None => return Ok(Vec::new()),
+        None => return Vec::new(),
     };
     let loc = module.def_id.loc(db);
-    let items = db.input_module_items(loc.source_root_id, loc.module_id)?;
+    let items = db.input_module_items(loc.source_root_id, loc.module_id);
     let mut res = Vec::new();
 
     for macro_call_id in items
@@ -184,5 +172,5 @@ pub fn macro_symbols(
         }
     }
 
-    Ok(res)
+    res
 }
diff --git a/crates/ra_ide_api/src/call_info.rs b/crates/ra_ide_api/src/call_info.rs
index 27b760780c..efa320d83d 100644
--- a/crates/ra_ide_api/src/call_info.rs
+++ b/crates/ra_ide_api/src/call_info.rs
@@ -20,7 +20,7 @@ pub(crate) fn call_info(db: &RootDatabase, position: FilePosition) -> Cancelable
     let name_ref = ctry!(calling_node.name_ref());
 
     // Resolve the function's NameRef (NOTE: this isn't entirely accurate).
-    let file_symbols = db.index_resolve(name_ref)?;
+    let file_symbols = db.index_resolve(name_ref);
     let symbol = ctry!(file_symbols.into_iter().find(|it| it.ptr.kind() == FN_DEF));
     let fn_file = db.source_file(symbol.file_id);
     let fn_def = symbol.ptr.resolve(&fn_file);
diff --git a/crates/ra_ide_api/src/completion/completion_context.rs b/crates/ra_ide_api/src/completion/completion_context.rs
index 113f6c070b..f5b5ed6896 100644
--- a/crates/ra_ide_api/src/completion/completion_context.rs
+++ b/crates/ra_ide_api/src/completion/completion_context.rs
@@ -42,7 +42,7 @@ impl<'a> CompletionContext<'a> {
         original_file: &'a SourceFile,
         position: FilePosition,
     ) -> Cancelable<Option<CompletionContext<'a>>> {
-        let module = source_binder::module_from_position(db, position)?;
+        let module = source_binder::module_from_position(db, position);
         let leaf =
             ctry!(find_leaf_at_offset(original_file.syntax(), position.offset).left_biased());
         let mut ctx = CompletionContext {
diff --git a/crates/ra_ide_api/src/goto_definition.rs b/crates/ra_ide_api/src/goto_definition.rs
index 332a2fb8d3..591f36ccec 100644
--- a/crates/ra_ide_api/src/goto_definition.rs
+++ b/crates/ra_ide_api/src/goto_definition.rs
@@ -48,7 +48,7 @@ pub(crate) fn reference_definition(
 ) -> Cancelable<ReferenceResult> {
     use self::ReferenceResult::*;
     if let Some(function) =
-        hir::source_binder::function_from_child_node(db, file_id, name_ref.syntax())?
+        hir::source_binder::function_from_child_node(db, file_id, name_ref.syntax())
     {
         let scope = function.scopes(db)?;
         // First try to resolve the symbol locally
@@ -77,8 +77,7 @@ pub(crate) fn reference_definition(
         }
     }
     // Then try module name resolution
-    if let Some(module) =
-        hir::source_binder::module_from_child_node(db, file_id, name_ref.syntax())?
+    if let Some(module) = hir::source_binder::module_from_child_node(db, file_id, name_ref.syntax())
     {
         if let Some(path) = name_ref
             .syntax()
@@ -96,7 +95,7 @@ pub(crate) fn reference_definition(
     }
     // If that fails try the index based approach.
     let navs = db
-        .index_resolve(name_ref)?
+        .index_resolve(name_ref)
         .into_iter()
         .map(NavigationTarget::from_symbol)
         .collect();
@@ -111,7 +110,7 @@ fn name_definition(
     if let Some(module) = name.syntax().parent().and_then(ast::Module::cast) {
         if module.has_semi() {
             if let Some(child_module) =
-                hir::source_binder::module_from_declaration(db, file_id, module)?
+                hir::source_binder::module_from_declaration(db, file_id, module)
             {
                 let nav = NavigationTarget::from_module(db, child_module)?;
                 return Ok(Some(vec![nav]));
diff --git a/crates/ra_ide_api/src/hover.rs b/crates/ra_ide_api/src/hover.rs
index 107b238338..26f3ced700 100644
--- a/crates/ra_ide_api/src/hover.rs
+++ b/crates/ra_ide_api/src/hover.rs
@@ -72,7 +72,7 @@ pub(crate) fn type_of(db: &RootDatabase, frange: FileRange) -> Cancelable<Option
         db,
         frange.file_id,
         parent_fn
-    )?);
+    ));
     let infer = function.infer(db)?;
     let syntax_mapping = function.body_syntax_mapping(db)?;
     if let Some(expr) = ast::Expr::cast(node).and_then(|e| syntax_mapping.node_expr(e)) {
diff --git a/crates/ra_ide_api/src/imp.rs b/crates/ra_ide_api/src/imp.rs
index ba4aa0fd57..76cb312ddd 100644
--- a/crates/ra_ide_api/src/imp.rs
+++ b/crates/ra_ide_api/src/imp.rs
@@ -100,7 +100,7 @@ impl db::RootDatabase {
 impl db::RootDatabase {
     /// Returns `Vec` for the same reason as `parent_module`
     pub(crate) fn crate_for(&self, file_id: FileId) -> Cancelable<Vec<CrateId>> {
-        let module = match source_binder::module_from_file_id(self, file_id)? {
+        let module = match source_binder::module_from_file_id(self, file_id) {
             Some(it) => it,
             None => return Ok(Vec::new()),
         };
@@ -147,7 +147,7 @@ impl db::RootDatabase {
                     db,
                     position.file_id,
                     binding.syntax(),
-                )?);
+                ));
                 return Ok(Some((binding, descr)));
             };
             let name_ref = ctry!(find_node_at_offset::<ast::NameRef>(syntax, position.offset));
@@ -155,7 +155,7 @@ impl db::RootDatabase {
                 db,
                 position.file_id,
                 name_ref.syntax(),
-            )?);
+            ));
             let scope = descr.scopes(db)?;
             let resolved = ctry!(scope.resolve_local_name(name_ref));
             let resolved = resolved.ptr().resolve(source_file);
@@ -179,7 +179,7 @@ impl db::RootDatabase {
                 fix: d.fix.map(|fix| SourceChange::from_local_edit(file_id, fix)),
             })
             .collect::<Vec<_>>();
-        if let Some(m) = source_binder::module_from_file_id(self, file_id)? {
+        if let Some(m) = source_binder::module_from_file_id(self, file_id) {
             for (name_node, problem) in m.problems(self)? {
                 let source_root = self.file_source_root(file_id);
                 let diag = match problem {
@@ -258,7 +258,7 @@ impl db::RootDatabase {
             .collect::<Vec<_>>();
         Ok(res)
     }
-    pub(crate) fn index_resolve(&self, name_ref: &ast::NameRef) -> Cancelable<Vec<FileSymbol>> {
+    pub(crate) fn index_resolve(&self, name_ref: &ast::NameRef) -> Vec<FileSymbol> {
         let name = name_ref.text();
         let mut query = Query::new(name.to_string());
         query.exact();
diff --git a/crates/ra_ide_api/src/lib.rs b/crates/ra_ide_api/src/lib.rs
index abb50ff954..e0b8410d1f 100644
--- a/crates/ra_ide_api/src/lib.rs
+++ b/crates/ra_ide_api/src/lib.rs
@@ -381,12 +381,11 @@ impl Analysis {
     /// Fuzzy searches for a symbol.
     pub fn symbol_search(&self, query: Query) -> Cancelable<Vec<NavigationTarget>> {
         self.with_db(|db| {
-            let res = symbol_index::world_symbols(db, query)?
+            symbol_index::world_symbols(db, query)
                 .into_iter()
                 .map(NavigationTarget::from_symbol)
-                .collect::<Vec<_>>();
-            Ok(res)
-        })?
+                .collect::<Vec<_>>()
+        })
     }
 
     pub fn goto_definition(
diff --git a/crates/ra_ide_api/src/parent_module.rs b/crates/ra_ide_api/src/parent_module.rs
index 675042a6c0..4513047395 100644
--- a/crates/ra_ide_api/src/parent_module.rs
+++ b/crates/ra_ide_api/src/parent_module.rs
@@ -8,7 +8,7 @@ pub(crate) fn parent_module(
     db: &RootDatabase,
     position: FilePosition,
 ) -> Cancelable<Vec<NavigationTarget>> {
-    let module = match hir::source_binder::module_from_position(db, position)? {
+    let module = match hir::source_binder::module_from_position(db, position) {
         None => return Ok(Vec::new()),
         Some(it) => it,
     };
diff --git a/crates/ra_ide_api/src/runnables.rs b/crates/ra_ide_api/src/runnables.rs
index f1de28094f..9fa0f79a60 100644
--- a/crates/ra_ide_api/src/runnables.rs
+++ b/crates/ra_ide_api/src/runnables.rs
@@ -75,8 +75,7 @@ fn runnable_mod(db: &RootDatabase, file_id: FileId, module: &ast::Module) -> Opt
         return None;
     }
     let range = module.syntax().range();
-    let module =
-        hir::source_binder::module_from_child_node(db, file_id, module.syntax()).ok()??;
+    let module = hir::source_binder::module_from_child_node(db, file_id, module.syntax())?;
 
     // FIXME: thread cancellation instead of `.ok`ing
     let path = module
diff --git a/crates/ra_ide_api/src/symbol_index.rs b/crates/ra_ide_api/src/symbol_index.rs
index b7a3a35503..74165d68fb 100644
--- a/crates/ra_ide_api/src/symbol_index.rs
+++ b/crates/ra_ide_api/src/symbol_index.rs
@@ -37,13 +37,13 @@ use salsa::ParallelDatabase;
 use rayon::prelude::*;
 
 use crate::{
-    Cancelable, FileId, Query,
+    FileId, Query,
     db::RootDatabase,
 };
 
 salsa::query_group! {
     pub(crate) trait SymbolsDatabase: hir::db::HirDatabase {
-        fn file_symbols(file_id: FileId) -> Cancelable<Arc<SymbolIndex>> {
+        fn file_symbols(file_id: FileId) -> Arc<SymbolIndex> {
             type FileSymbolsQuery;
         }
         fn library_symbols(id: SourceRootId) -> Arc<SymbolIndex> {
@@ -53,7 +53,7 @@ salsa::query_group! {
     }
 }
 
-fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Cancelable<Arc<SymbolIndex>> {
+fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Arc<SymbolIndex> {
     db.check_canceled();
     let source_file = db.source_file(file_id);
     let mut symbols = source_file
@@ -63,16 +63,16 @@ fn file_symbols(db: &impl SymbolsDatabase, file_id: FileId) -> Cancelable<Arc<Sy
         .map(move |(name, ptr)| FileSymbol { name, ptr, file_id })
         .collect::<Vec<_>>();
 
-    for (name, text_range) in hir::source_binder::macro_symbols(db, file_id)? {
+    for (name, text_range) in hir::source_binder::macro_symbols(db, file_id) {
         let node = find_covering_node(source_file.syntax(), text_range);
         let ptr = LocalSyntaxPtr::new(node);
         symbols.push(FileSymbol { file_id, name, ptr })
     }
 
-    Ok(Arc::new(SymbolIndex::new(symbols)))
+    Arc::new(SymbolIndex::new(symbols))
 }
 
-pub(crate) fn world_symbols(db: &RootDatabase, query: Query) -> Cancelable<Vec<FileSymbol>> {
+pub(crate) fn world_symbols(db: &RootDatabase, query: Query) -> Vec<FileSymbol> {
     /// Need to wrap Snapshot to provide `Clone` impl for `map_with`
     struct Snap(salsa::Snapshot<RootDatabase>);
     impl Clone for Snap {
@@ -98,10 +98,9 @@ pub(crate) fn world_symbols(db: &RootDatabase, query: Query) -> Cancelable<Vec<F
         files
             .par_iter()
             .map_with(snap, |db, &file_id| db.0.file_symbols(file_id))
-            .filter_map(|it| it.ok())
             .collect()
     };
-    Ok(query.search(&buf))
+    query.search(&buf)
 }
 
 #[derive(Default, Debug)]


Test patch:
diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs
index 647fd92aad..ea8ab4c832 100644
--- a/crates/ra_hir/src/nameres/tests.rs
+++ b/crates/ra_hir/src/nameres/tests.rs
@@ -15,9 +15,7 @@ use crate::{
 fn item_map(fixture: &str) -> (Arc<ItemMap>, ModuleId) {
     let (db, pos) = MockDatabase::with_position(fixture);
     let source_root = db.file_source_root(pos.file_id);
-    let module = crate::source_binder::module_from_position(&db, pos)
-        .unwrap()
-        .unwrap();
+    let module = crate::source_binder::module_from_position(&db, pos).unwrap();
     let module_id = module.def_id.loc(&db).module_id;
     (db.item_map(source_root).unwrap(), module_id)
 }
@@ -242,9 +240,7 @@ fn item_map_across_crates() {
     db.set_crate_graph(crate_graph);
 
     let source_root = db.file_source_root(main_id);
-    let module = crate::source_binder::module_from_file_id(&db, main_id)
-        .unwrap()
-        .unwrap();
+    let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
     let module_id = module.def_id.loc(&db).module_id;
     let item_map = db.item_map(source_root).unwrap();
 
@@ -296,9 +292,7 @@ fn import_across_source_roots() {
 
     db.set_crate_graph(crate_graph);
 
-    let module = crate::source_binder::module_from_file_id(&db, main_id)
-        .unwrap()
-        .unwrap();
+    let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
     let module_id = module.def_id.loc(&db).module_id;
     let item_map = db.item_map(source_root).unwrap();
 
@@ -341,9 +335,7 @@ fn reexport_across_crates() {
     db.set_crate_graph(crate_graph);
 
     let source_root = db.file_source_root(main_id);
-    let module = crate::source_binder::module_from_file_id(&db, main_id)
-        .unwrap()
-        .unwrap();
+    let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
     let module_id = module.def_id.loc(&db).module_id;
     let item_map = db.item_map(source_root).unwrap();
 
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs
index 8aacb1a7fd..b81d91e80e 100644
--- a/crates/ra_hir/src/ty/tests.rs
+++ b/crates/ra_hir/src/ty/tests.rs
@@ -320,9 +320,7 @@ fn infer(content: &str) -> String {
         .descendants()
         .filter_map(ast::FnDef::cast)
     {
-        let func = source_binder::function_from_source(&db, file_id, fn_def)
-            .unwrap()
-            .unwrap();
+        let func = source_binder::function_from_source(&db, file_id, fn_def).unwrap();
         let inference_result = func.infer(&db).unwrap();
         let body_syntax_mapping = func.body_syntax_mapping(&db).unwrap();
         let mut types = Vec::new();
@@ -404,9 +402,7 @@ fn typing_whitespace_inside_a_function_should_not_invalidate_types() {
         }
     ",
     );
-    let func = source_binder::function_from_position(&db, pos)
-        .unwrap()
-        .unwrap();
+    let func = source_binder::function_from_position(&db, pos).unwrap();
     {
         let events = db.log_executed(|| {
             func.infer(&db).unwrap();