mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 21:05:02 +00:00
Add data queries for macros
This commit is contained in:
parent
55ec93a337
commit
c37fe779c6
8 changed files with 102 additions and 19 deletions
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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 _: () = ();`
|
||||||
|
|
|
@ -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>);
|
||||||
|
|
||||||
|
|
|
@ -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()),
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue