}
/// 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)
}
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,
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>> {
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.
.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())
}
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.
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;
}
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 => {
/// 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.
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))
}
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)
}
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();
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();
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();
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;
}
}
};
- Ok(Arc::new(res))
+ Arc::new(res)
}
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()?;
///
/// 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},
};
/// 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,
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),
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);
db: &impl HirDatabase,
file_id: FileId,
child: &SyntaxNode,
-) -> Cancelable<Option<Module>> {
+) -> Option<Module> {
if let Some(m) = child
.ancestors()
.filter_map(ast::Module::cast)
}
}
-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)
}
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(
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
}
}
- Ok(res)
+ res
}
.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();
}
",
);
- 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();
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 {
) -> 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
}
}
// 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()
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]));
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)) {
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()),
};
db,
position.file_id,
binding.syntax(),
- )?);
+ ));
return Ok(Some((binding, descr)));
};
let name_ref = ctry!(find_node_at_offset::<ast::NameRef>(syntax, position.offset));
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);
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 {
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,
};
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
.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 })