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.rs88
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