internal: Implement module_path macro

This commit is contained in:
Lukas Wirth 2024-08-21 12:22:15 +02:00
parent 9b7b93e031
commit d44a3ab30c
20 changed files with 279 additions and 71 deletions

View file

@ -364,7 +364,6 @@ impl<'db> SemanticsImpl<'db> {
_,
BuiltinFnLikeExpander::Column
| BuiltinFnLikeExpander::File
| BuiltinFnLikeExpander::ModulePath
| BuiltinFnLikeExpander::Asm
| BuiltinFnLikeExpander::LlvmAsm
| BuiltinFnLikeExpander::GlobalAsm
@ -482,10 +481,26 @@ impl<'db> SemanticsImpl<'db> {
let SourceAnalyzer { file_id, resolver, .. } =
self.analyze_no_infer(actual_macro_call.syntax())?;
let macro_call = InFile::new(file_id, actual_macro_call);
let krate = resolver.krate();
let macro_call_id = macro_call.as_call_id(self.db.upcast(), krate, |path| {
resolver.resolve_path_as_macro_def(self.db.upcast(), path, Some(MacroSubNs::Bang))
})?;
let macro_call_id = macro_call
.as_call_id(
self.db.upcast(),
resolver.module(),
|path| {
resolver.resolve_path_as_macro_def(
self.db.upcast(),
path,
Some(MacroSubNs::Bang),
)
},
|module| {
resolver
.module()
.def_map(self.db.upcast())
.path_for_module(self.db.upcast(), module)
},
)
.ok()?
.value?;
hir_expand::db::expand_speculative(
self.db.upcast(),
macro_call_id,

View file

@ -839,12 +839,25 @@ impl SourceAnalyzer {
db: &dyn HirDatabase,
macro_call: InFile<&ast::MacroCall>,
) -> Option<MacroFileId> {
let krate = self.resolver.krate();
// FIXME: This causes us to parse, generally this is the wrong approach for resolving a
// macro call to a macro call id!
let macro_call_id = macro_call.as_call_id(db.upcast(), krate, |path| {
self.resolver.resolve_path_as_macro_def(db.upcast(), path, Some(MacroSubNs::Bang))
})?;
let macro_call_id = macro_call
.as_call_id(
db.upcast(),
self.resolver.module(),
|path| {
self.resolver.resolve_path_as_macro_def(
db.upcast(),
path,
Some(MacroSubNs::Bang),
)
},
|module| {
self.resolver.module().def_map(db.upcast()).path_for_module(db.upcast(), module)
},
)
.ok()?
.value?;
// why the 64?
Some(macro_call_id.as_macro_file()).filter(|it| it.expansion_level(db.upcast()) < 64)
}