Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/expr_store/expander.rs')
-rw-r--r--crates/hir-def/src/expr_store/expander.rs49
1 files changed, 33 insertions, 16 deletions
diff --git a/crates/hir-def/src/expr_store/expander.rs b/crates/hir-def/src/expr_store/expander.rs
index 7eec913dd6..3823fb5a1e 100644
--- a/crates/hir-def/src/expr_store/expander.rs
+++ b/crates/hir-def/src/expr_store/expander.rs
@@ -3,21 +3,24 @@
use std::mem;
use base_db::Crate;
+use cfg::CfgOptions;
use drop_bomb::DropBomb;
+use hir_expand::AstId;
use hir_expand::{
ExpandError, ExpandErrorKind, ExpandResult, HirFileId, InFile, Lookup, MacroCallId,
- attrs::RawAttrs, eager::EagerCallBackFn, mod_path::ModPath, span_map::SpanMap,
+ eager::EagerCallBackFn, mod_path::ModPath, span_map::SpanMap,
};
use span::{AstIdMap, Edition, SyntaxContext};
use syntax::ast::HasAttrs;
-use syntax::{Parse, ast};
+use syntax::{AstNode, Parse, ast};
use triomphe::Arc;
use tt::TextRange;
use crate::attr::Attrs;
use crate::expr_store::HygieneId;
+use crate::macro_call_as_call_id;
use crate::nameres::DefMap;
-use crate::{AsMacroCall, MacroId, UnresolvedMacro, db::DefDatabase};
+use crate::{MacroId, UnresolvedMacro, db::DefDatabase};
#[derive(Debug)]
pub(super) struct Expander {
@@ -64,22 +67,13 @@ impl Expander {
}
}
- pub(super) fn attrs(
- &self,
- db: &dyn DefDatabase,
- krate: Crate,
- has_attrs: &dyn HasAttrs,
- ) -> Attrs {
- Attrs::filter(db, krate, RawAttrs::new(db, has_attrs, self.span_map.as_ref()))
- }
-
pub(super) fn is_cfg_enabled(
&self,
db: &dyn DefDatabase,
- krate: Crate,
has_attrs: &dyn HasAttrs,
- ) -> bool {
- self.attrs(db, krate, has_attrs).is_cfg_enabled(krate.cfg_options(db))
+ cfg_options: &CfgOptions,
+ ) -> Result<(), cfg::CfgExpr> {
+ Attrs::is_cfg_enabled_for(db, has_attrs, self.span_map.as_ref(), cfg_options)
}
pub(super) fn call_syntax_ctx(&self) -> SyntaxContext {
@@ -100,8 +94,31 @@ impl Expander {
let result = self.within_limit(db, |this| {
let macro_call = this.in_file(&macro_call);
- match macro_call.as_call_id_with_errors(
+
+ let expands_to = hir_expand::ExpandTo::from_call_site(macro_call.value);
+ let ast_id = AstId::new(macro_call.file_id, this.ast_id_map().ast_id(macro_call.value));
+ let path = macro_call.value.path().and_then(|path| {
+ let range = path.syntax().text_range();
+ let mod_path = ModPath::from_src(db, path, &mut |range| {
+ this.span_map.span_for_range(range).ctx
+ })?;
+ let call_site = this.span_map.span_for_range(range);
+ Some((call_site, mod_path))
+ });
+
+ let Some((call_site, path)) = path else {
+ return ExpandResult::only_err(ExpandError::other(
+ this.span_map.span_for_range(macro_call.value.syntax().text_range()),
+ "malformed macro invocation",
+ ));
+ };
+
+ match macro_call_as_call_id(
db,
+ ast_id,
+ &path,
+ call_site.ctx,
+ expands_to,
krate,
|path| resolver(path).map(|it| db.macro_def(it)),
eager_callback,