Add data queries for macros

This commit is contained in:
Lukas Wirth 2022-03-09 00:41:54 +01:00
parent 55ec93a337
commit c37fe779c6
8 changed files with 102 additions and 19 deletions

View file

@ -340,7 +340,7 @@ impl ModuleDef {
ModuleDef::Variant(it) => it.name(db), ModuleDef::Variant(it) => it.name(db),
ModuleDef::TypeAlias(it) => it.name(db), ModuleDef::TypeAlias(it) => it.name(db),
ModuleDef::Static(it) => it.name(db), ModuleDef::Static(it) => it.name(db),
ModuleDef::Macro(it) => it.name(db)?, ModuleDef::Macro(it) => it.name(db),
ModuleDef::BuiltinType(it) => it.name(), ModuleDef::BuiltinType(it) => it.name(),
}; };
Some(name) Some(name)
@ -426,8 +426,7 @@ impl HasVisibility for ModuleDef {
ModuleDef::Trait(it) => it.visibility(db), ModuleDef::Trait(it) => it.visibility(db),
ModuleDef::TypeAlias(it) => it.visibility(db), ModuleDef::TypeAlias(it) => it.visibility(db),
ModuleDef::Variant(it) => it.visibility(db), ModuleDef::Variant(it) => it.visibility(db),
// FIXME ModuleDef::Macro(it) => it.visibility(db),
ModuleDef::Macro(_) => Visibility::Public,
ModuleDef::BuiltinType(_) => Visibility::Public, ModuleDef::BuiltinType(_) => Visibility::Public,
} }
} }
@ -1766,14 +1765,12 @@ impl Macro {
Module { id: self.id.module(db.upcast()) } Module { id: self.id.module(db.upcast()) }
} }
pub fn name(self, _db: &dyn HirDatabase) -> Option<Name> { pub fn name(self, db: &dyn HirDatabase) -> Name {
// match self.id { match self.id {
// MacroId::Macro2Id(id) => db.macro2_data(id).name.clone(), MacroId::Macro2Id(id) => db.macro2_data(id).name.clone(),
// MacroId::MacroRulesId(id) => db.macro_rules_data(id).name.clone(), MacroId::MacroRulesId(id) => db.macro_rules_data(id).name.clone(),
// MacroId::ProcMacroId(id) => db.proc_macro_data(id).name.clone(), MacroId::ProcMacroId(id) => db.proc_macro_data(id).name.clone(),
// } }
// FIXME
None
} }
pub fn kind(&self, db: &dyn HirDatabase) -> MacroKind { pub fn kind(&self, db: &dyn HirDatabase) -> MacroKind {
@ -1826,6 +1823,20 @@ impl Macro {
} }
} }
impl HasVisibility for Macro {
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
match self.id {
MacroId::Macro2Id(id) => {
let data = db.macro2_data(id);
let visibility = &data.visibility;
visibility.resolve(db.upcast(), &self.id.resolver(db.upcast()))
}
MacroId::MacroRulesId(_) => Visibility::Public,
MacroId::ProcMacroId(_) => Visibility::Public,
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)] #[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
pub enum ItemInNs { pub enum ItemInNs {
Types(ModuleDef), Types(ModuleDef),
@ -3374,3 +3385,9 @@ impl HasCrate for Type {
self.krate.into() self.krate.into()
} }
} }
impl HasCrate for Macro {
fn krate(&self, db: &dyn HirDatabase) -> Crate {
self.module(db).krate()
}
}

View file

@ -15,7 +15,8 @@ use crate::{
type_ref::{TraitRef, TypeBound, TypeRef}, type_ref::{TraitRef, TypeBound, TypeRef},
visibility::RawVisibility, visibility::RawVisibility,
AssocItemId, AstIdWithPath, ConstId, ConstLoc, FunctionId, FunctionLoc, HasModule, ImplId, AssocItemId, AstIdWithPath, ConstId, ConstLoc, FunctionId, FunctionLoc, HasModule, ImplId,
Intern, ItemContainerId, Lookup, ModuleId, StaticId, TraitId, TypeAliasId, TypeAliasLoc, Intern, ItemContainerId, Lookup, Macro2Id, MacroRulesId, ModuleId, ProcMacroId, StaticId,
TraitId, TypeAliasId, TypeAliasLoc,
}; };
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
@ -293,6 +294,59 @@ impl ImplData {
} }
} }
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Macro2Data {
pub name: Name,
pub visibility: RawVisibility,
}
impl Macro2Data {
pub(crate) fn macro2_data_query(db: &dyn DefDatabase, makro: Macro2Id) -> Arc<Macro2Data> {
let loc = makro.lookup(db);
let item_tree = loc.id.item_tree(db);
let makro = &item_tree[loc.id.value];
Arc::new(Macro2Data {
name: makro.name.clone(),
visibility: item_tree[makro.visibility].clone(),
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MacroRulesData {
pub name: Name,
}
impl MacroRulesData {
pub(crate) fn macro_rules_data_query(
db: &dyn DefDatabase,
makro: MacroRulesId,
) -> Arc<MacroRulesData> {
let loc = makro.lookup(db);
let item_tree = loc.id.item_tree(db);
let makro = &item_tree[loc.id.value];
Arc::new(MacroRulesData { name: makro.name.clone() })
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProcMacroData {
pub name: Name,
}
impl ProcMacroData {
pub(crate) fn proc_macro_data_query(
db: &dyn DefDatabase,
makro: ProcMacroId,
) -> Arc<ProcMacroData> {
let loc = makro.lookup(db);
let item_tree = loc.id.item_tree(db);
let makro = &item_tree[loc.id.value];
Arc::new(ProcMacroData { name: makro.name.clone() })
}
}
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConstData { pub struct ConstData {
/// `None` for `const _: () = ();` /// `None` for `const _: () = ();`

View file

@ -11,7 +11,10 @@ use crate::{
adt::{EnumData, StructData}, adt::{EnumData, StructData},
attr::{Attrs, AttrsWithOwner}, attr::{Attrs, AttrsWithOwner},
body::{scope::ExprScopes, Body, BodySourceMap}, body::{scope::ExprScopes, Body, BodySourceMap},
data::{ConstData, FunctionData, ImplData, StaticData, TraitData, TypeAliasData}, data::{
ConstData, FunctionData, ImplData, Macro2Data, MacroRulesData, ProcMacroData, StaticData,
TraitData, TypeAliasData,
},
generics::GenericParams, generics::GenericParams,
import_map::ImportMap, import_map::ImportMap,
intern::Interned, intern::Interned,
@ -118,6 +121,15 @@ pub trait DefDatabase: InternDatabase + AstDatabase + Upcast<dyn AstDatabase> {
#[salsa::invoke(StaticData::static_data_query)] #[salsa::invoke(StaticData::static_data_query)]
fn static_data(&self, konst: StaticId) -> Arc<StaticData>; fn static_data(&self, konst: StaticId) -> Arc<StaticData>;
#[salsa::invoke(Macro2Data::macro2_data_query)]
fn macro2_data(&self, makro: Macro2Id) -> Arc<Macro2Data>;
#[salsa::invoke(MacroRulesData::macro_rules_data_query)]
fn macro_rules_data(&self, makro: MacroRulesId) -> Arc<MacroRulesData>;
#[salsa::invoke(ProcMacroData::proc_macro_data_query)]
fn proc_macro_data(&self, makro: ProcMacroId) -> Arc<ProcMacroData>;
#[salsa::invoke(Body::body_with_source_map_query)] #[salsa::invoke(Body::body_with_source_map_query)]
fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc<Body>, Arc<BodySourceMap>); fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc<Body>, Arc<BodySourceMap>);

View file

@ -472,7 +472,7 @@ fn filename_and_frag_for_def(
} }
Definition::Const(c) => format!("const.{}.html", c.name(db)?), Definition::Const(c) => format!("const.{}.html", c.name(db)?),
Definition::Static(s) => format!("static.{}.html", s.name(db)), Definition::Static(s) => format!("static.{}.html", s.name(db)),
Definition::Macro(mac) => format!("macro.{}.html", mac.name(db)?), Definition::Macro(mac) => format!("macro.{}.html", mac.name(db)),
Definition::Field(field) => { Definition::Field(field) => {
let def = match field.parent_def(db) { let def = match field.parent_def(db) {
hir::VariantDef::Struct(it) => Definition::Adt(it.into()), hir::VariantDef::Struct(it) => Definition::Adt(it.into()),

View file

@ -75,7 +75,7 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option<
for node in tok.ancestors() { for node in tok.ancestors() {
if let Some(item) = ast::Item::cast(node.clone()) { if let Some(item) = ast::Item::cast(node.clone()) {
if let Some(def) = sema.resolve_attr_macro_call(&item) { if let Some(def) = sema.resolve_attr_macro_call(&item) {
name = def.name(db).map(|name| name.to_string()); name = Some(def.name(db).to_string());
expanded = expand_attr_macro_recur(&sema, &item); expanded = expand_attr_macro_recur(&sema, &item);
break; break;
} }

View file

@ -36,7 +36,7 @@ pub(super) fn complete_derive(acc: &mut Completions, ctx: &CompletionContext, at
|&&dependency| { |&&dependency| {
!existing_derives !existing_derives
.iter() .iter()
.filter_map(|it| it.name(ctx.db)) .map(|it| it.name(ctx.db))
.any(|it| it.to_smol_str() == dependency) .any(|it| it.to_smol_str() == dependency)
}, },
)); ));
@ -108,7 +108,7 @@ fn flyimport_derive(acc: &mut Completions, ctx: &CompletionContext) -> Option<()
let mut item = CompletionItem::new( let mut item = CompletionItem::new(
SymbolKind::Derive, SymbolKind::Derive,
ctx.source_range(), ctx.source_range(),
mac.name(ctx.db)?.to_smol_str(), mac.name(ctx.db).to_smol_str(),
); );
item.add_import(ImportEdit { import, scope: import_scope.clone() }); item.add_import(ImportEdit { import, scope: import_scope.clone() });
if let Some(docs) = mac.docs(ctx.db) { if let Some(docs) = mac.docs(ctx.db) {

View file

@ -94,7 +94,7 @@ impl Definition {
pub fn name(&self, db: &RootDatabase) -> Option<Name> { pub fn name(&self, db: &RootDatabase) -> Option<Name> {
let name = match self { let name = match self {
Definition::Macro(it) => it.name(db)?, Definition::Macro(it) => it.name(db),
Definition::Field(it) => it.name(db), Definition::Field(it) => it.name(db),
Definition::Module(it) => it.name(db)?, Definition::Module(it) => it.name(db)?,
Definition::Function(it) => it.name(db), Definition::Function(it) => it.name(db),

View file

@ -15,7 +15,7 @@ pub fn item_name(db: &RootDatabase, item: ItemInNs) -> Option<Name> {
match item { match item {
ItemInNs::Types(module_def_id) => ModuleDef::from(module_def_id).name(db), ItemInNs::Types(module_def_id) => ModuleDef::from(module_def_id).name(db),
ItemInNs::Values(module_def_id) => ModuleDef::from(module_def_id).name(db), ItemInNs::Values(module_def_id) => ModuleDef::from(module_def_id).name(db),
ItemInNs::Macros(macro_def_id) => Macro::from(macro_def_id).name(db), ItemInNs::Macros(macro_def_id) => Some(Macro::from(macro_def_id).name(db)),
} }
} }