Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/has_source.rs')
| -rw-r--r-- | crates/hir/src/has_source.rs | 88 |
1 files changed, 40 insertions, 48 deletions
diff --git a/crates/hir/src/has_source.rs b/crates/hir/src/has_source.rs index 372c725293..fe7429c867 100644 --- a/crates/hir/src/has_source.rs +++ b/crates/hir/src/has_source.rs @@ -2,20 +2,20 @@ use either::Either; use hir_def::{ + CallableDefId, Lookup, MacroId, VariantId, nameres::{ModuleOrigin, ModuleSource}, src::{HasChildSource, HasSource as _}, - CallableDefId, Lookup, MacroId, VariantId, }; -use hir_expand::{HirFileId, InFile}; +use hir_expand::{EditionedFileId, HirFileId, InFile}; use hir_ty::db::InternedClosure; -use span::EditionedFileId; use syntax::ast; use tt::TextRange; use crate::{ - db::HirDatabase, Adt, Callee, Const, Enum, ExternCrateDecl, Field, FieldSource, Function, Impl, + Adt, Callee, Const, Enum, ExternCrateDecl, Field, FieldSource, Function, Impl, InlineAsmOperand, Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static, Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant, VariantDef, + db::HirDatabase, }; pub trait HasSource { @@ -35,23 +35,23 @@ pub trait HasSource { impl Module { /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. pub fn definition_source(self, db: &dyn HirDatabase) -> InFile<ModuleSource> { - let def_map = self.id.def_map(db.upcast()); - def_map[self.id.local_id].definition_source(db.upcast()) + let def_map = self.id.def_map(db); + def_map[self.id.local_id].definition_source(db) } /// Returns a node which defines this module. That is, a file or a `mod foo {}` with items. pub fn definition_source_range(self, db: &dyn HirDatabase) -> InFile<TextRange> { - let def_map = self.id.def_map(db.upcast()); - def_map[self.id.local_id].definition_source_range(db.upcast()) + let def_map = self.id.def_map(db); + def_map[self.id.local_id].definition_source_range(db) } pub fn definition_source_file_id(self, db: &dyn HirDatabase) -> HirFileId { - let def_map = self.id.def_map(db.upcast()); + let def_map = self.id.def_map(db); def_map[self.id.local_id].definition_source_file_id() } pub fn is_mod_rs(self, db: &dyn HirDatabase) -> bool { - let def_map = self.id.def_map(db.upcast()); + let def_map = self.id.def_map(db); match def_map[self.id.local_id].origin { ModuleOrigin::File { is_mod_rs, .. } => is_mod_rs, _ => false, @@ -59,7 +59,7 @@ impl Module { } pub fn as_source_file_id(self, db: &dyn HirDatabase) -> Option<EditionedFileId> { - let def_map = self.id.def_map(db.upcast()); + let def_map = self.id.def_map(db); match def_map[self.id.local_id].origin { ModuleOrigin::File { definition, .. } | ModuleOrigin::CrateRoot { definition, .. } => { Some(definition) @@ -69,22 +69,22 @@ impl Module { } pub fn is_inline(self, db: &dyn HirDatabase) -> bool { - let def_map = self.id.def_map(db.upcast()); + let def_map = self.id.def_map(db); def_map[self.id.local_id].origin.is_inline() } /// Returns a node which declares this module, either a `mod foo;` or a `mod foo {}`. /// `None` for the crate root. pub fn declaration_source(self, db: &dyn HirDatabase) -> Option<InFile<ast::Module>> { - let def_map = self.id.def_map(db.upcast()); - def_map[self.id.local_id].declaration_source(db.upcast()) + let def_map = self.id.def_map(db); + def_map[self.id.local_id].declaration_source(db) } /// Returns a text range which declares this module, either a `mod foo;` or a `mod foo {}`. /// `None` for the crate root. pub fn declaration_source_range(self, db: &dyn HirDatabase) -> Option<InFile<TextRange>> { - let def_map = self.id.def_map(db.upcast()); - def_map[self.id.local_id].declaration_source_range(db.upcast()) + let def_map = self.id.def_map(db); + def_map[self.id.local_id].declaration_source_range(db) } } @@ -92,7 +92,7 @@ impl HasSource for Field { type Ast = FieldSource; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { let var = VariantId::from(self.parent); - let src = var.child_source(db.upcast()); + let src = var.child_source(db); let field_source = src.map(|it| match it[self.id].clone() { Either::Left(it) => FieldSource::Pos(it), Either::Right(it) => FieldSource::Named(it), @@ -123,96 +123,88 @@ impl HasSource for VariantDef { impl HasSource for Struct { type Ast = ast::Struct; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Union { type Ast = ast::Union; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Enum { type Ast = ast::Enum; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Variant { type Ast = ast::Variant; fn source(self, db: &dyn HirDatabase) -> Option<InFile<ast::Variant>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Function { type Ast = ast::Fn; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Const { type Ast = ast::Const; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Static { type Ast = ast::Static; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Trait { type Ast = ast::Trait; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for TraitAlias { type Ast = ast::TraitAlias; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for TypeAlias { type Ast = ast::TypeAlias; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for Macro { type Ast = Either<ast::Macro, ast::Fn>; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { match self.id { - MacroId::Macro2Id(it) => Some( - it.lookup(db.upcast()) - .source(db.upcast()) - .map(ast::Macro::MacroDef) - .map(Either::Left), - ), - MacroId::MacroRulesId(it) => Some( - it.lookup(db.upcast()) - .source(db.upcast()) - .map(ast::Macro::MacroRules) - .map(Either::Left), - ), - MacroId::ProcMacroId(it) => { - Some(it.lookup(db.upcast()).source(db.upcast()).map(Either::Right)) + MacroId::Macro2Id(it) => { + Some(it.lookup(db).source(db).map(ast::Macro::MacroDef).map(Either::Left)) + } + MacroId::MacroRulesId(it) => { + Some(it.lookup(db).source(db).map(ast::Macro::MacroRules).map(Either::Left)) } + MacroId::ProcMacroId(it) => Some(it.lookup(db).source(db).map(Either::Right)), } } } impl HasSource for Impl { type Ast = ast::Impl; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for TypeOrConstParam { type Ast = Either<ast::TypeOrConstParam, ast::TraitOrAlias>; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - let child_source = self.id.parent.child_source(db.upcast()); + let child_source = self.id.parent.child_source(db); child_source.map(|it| it.get(self.id.local_id).cloned()).transpose() } } @@ -220,7 +212,7 @@ impl HasSource for TypeOrConstParam { impl HasSource for LifetimeParam { type Ast = ast::LifetimeParam; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - let child_source = self.id.parent.child_source(db.upcast()); + let child_source = self.id.parent.child_source(db); child_source.map(|it| it.get(self.id.local_id).cloned()).transpose() } } @@ -290,7 +282,7 @@ impl HasSource for Label { fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { let (_body, source_map) = db.body_with_source_map(self.parent); let src = source_map.label_syntax(self.label_id); - let root = src.file_syntax(db.upcast()); + let root = src.file_syntax(db); Some(src.map(|ast| ast.to_node(&root))) } } @@ -299,16 +291,16 @@ impl HasSource for ExternCrateDecl { type Ast = ast::ExternCrate; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - Some(self.id.lookup(db.upcast()).source(db.upcast())) + Some(self.id.lookup(db).source(db)) } } impl HasSource for InlineAsmOperand { type Ast = ast::AsmOperandNamed; fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> { - let (_body, source_map) = db.body_with_source_map(self.owner); + let source_map = db.body_with_source_map(self.owner).1; if let Ok(src) = source_map.expr_syntax(self.expr) { - let root = src.file_syntax(db.upcast()); + let root = src.file_syntax(db); return src .map(|ast| match ast.to_node(&root) { Either::Left(ast::Expr::AsmExpr(asm)) => asm |