Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r--crates/hir/src/semantics.rs91
1 files changed, 47 insertions, 44 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs
index 29f98972dc..4089e52f51 100644
--- a/crates/hir/src/semantics.rs
+++ b/crates/hir/src/semantics.rs
@@ -770,59 +770,62 @@ impl<'db> SemanticsImpl<'db> {
let file_id = self.find_file(&parent).file_id.file_id()?;
// iterate related crates and find all include! invocations that include_file_id matches
- for (invoc, _) in self
+ for iter in self
.db
.relevant_crates(file_id.file_id())
.iter()
- .flat_map(|krate| self.db.include_macro_invoc(*krate))
- .filter(|&(_, include_file_id)| include_file_id == file_id)
+ .map(|krate| self.db.include_macro_invoc(*krate))
{
- let macro_file = invoc.as_macro_file();
- let expansion_info = {
- self.with_ctx(|ctx| {
- ctx.cache
- .expansion_info_cache
- .entry(macro_file)
- .or_insert_with(|| {
- let exp_info = macro_file.expansion_info(self.db.upcast());
+ for (invoc, _) in
+ iter.iter().filter(|&&(_, include_file_id)| include_file_id == file_id)
+ {
+ let macro_file = invoc.as_macro_file();
+ let expansion_info = {
+ self.with_ctx(|ctx| {
+ ctx.cache
+ .expansion_info_cache
+ .entry(macro_file)
+ .or_insert_with(|| {
+ let exp_info = macro_file.expansion_info(self.db.upcast());
- let InMacroFile { file_id, value } = exp_info.expanded();
- if let InFile { file_id, value: Some(value) } = exp_info.arg() {
- self.cache(value.ancestors().last().unwrap(), file_id);
- }
- self.cache(value, file_id.into());
+ let InMacroFile { file_id, value } = exp_info.expanded();
+ if let InFile { file_id, value: Some(value) } = exp_info.arg() {
+ self.cache(value.ancestors().last().unwrap(), file_id);
+ }
+ self.cache(value, file_id.into());
- exp_info
- })
- .clone()
- })
- };
+ exp_info
+ })
+ .clone()
+ })
+ };
- // FIXME: uncached parse
- // Create the source analyzer for the macro call scope
- let Some(sa) = expansion_info
- .arg()
- .value
- .and_then(|it| self.analyze_no_infer(&it.ancestors().last().unwrap()))
- else {
- continue;
- };
+ // FIXME: uncached parse
+ // Create the source analyzer for the macro call scope
+ let Some(sa) = expansion_info
+ .arg()
+ .value
+ .and_then(|it| self.analyze_no_infer(&it.ancestors().last().unwrap()))
+ else {
+ continue;
+ };
- // get mapped token in the include! macro file
- let span = span::Span {
- range: token.text_range(),
- anchor: span::SpanAnchor { file_id, ast_id: ROOT_ERASED_FILE_AST_ID },
- ctx: SyntaxContextId::ROOT,
- };
- let Some(InMacroFile { file_id, value: mut mapped_tokens }) =
- expansion_info.map_range_down_exact(span)
- else {
- continue;
- };
+ // get mapped token in the include! macro file
+ let span = span::Span {
+ range: token.text_range(),
+ anchor: span::SpanAnchor { file_id, ast_id: ROOT_ERASED_FILE_AST_ID },
+ ctx: SyntaxContextId::ROOT,
+ };
+ let Some(InMacroFile { file_id, value: mut mapped_tokens }) =
+ expansion_info.map_range_down_exact(span)
+ else {
+ continue;
+ };
- // if we find one, then return
- if let Some(t) = mapped_tokens.next() {
- return Some((sa, file_id.into(), t, span));
+ // if we find one, then return
+ if let Some(t) = mapped_tokens.next() {
+ return Some((sa, file_id.into(), t, span));
+ }
}
}