Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/attrs/docs.rs')
| -rw-r--r-- | crates/hir-def/src/attrs/docs.rs | 68 |
1 files changed, 31 insertions, 37 deletions
diff --git a/crates/hir-def/src/attrs/docs.rs b/crates/hir-def/src/attrs/docs.rs index 16e813bc5f..a0665dfecd 100644 --- a/crates/hir-def/src/attrs/docs.rs +++ b/crates/hir-def/src/attrs/docs.rs @@ -418,10 +418,10 @@ fn extend_with_attrs<'a, 'db>( indent: &mut usize, get_cfg_options: &dyn Fn() -> &'a CfgOptions, cfg_options: &mut Option<&'a CfgOptions>, - make_resolver: &dyn Fn() -> Option<Resolver<'db>>, + make_resolver: &dyn Fn() -> Resolver<'db>, ) { // Lazily initialised when we first encounter a `#[doc = macro!()]`. - let mut expander: Option<Option<(DocMacroExpander<'db>, DocExprSourceCtx<'db>)>> = None; + let mut expander: Option<(DocMacroExpander<'db>, DocExprSourceCtx<'db>)> = None; // FIXME: `#[cfg_attr(..., doc = macro!())]` skips macro expansion because // `top_attr` points to the `cfg_attr` node, not the inner `doc = macro!()`. @@ -457,32 +457,31 @@ fn extend_with_attrs<'a, 'db>( top_attr.as_simple_call().is_some_and(|(name, _)| name == "cfg_attr"); if !is_from_cfg_attr && let Some(expr) = top_attr.expr() - && let Some((exp, ctx)) = expander - .get_or_insert_with(|| { - make_resolver().map(|resolver| { - let def_map = resolver.top_level_def_map(); - let recursion_limit = def_map.recursion_limit() as usize; - ( - DocMacroExpander { - db, - krate, - recursion_depth: 0, - recursion_limit, - }, - DocExprSourceCtx { - resolver, - file_id, - ast_id_map: db.ast_id_map(file_id), - span_map: db.span_map(file_id), - }, - ) - }) - }) - .as_mut() - && let Some(expanded) = - expand_doc_expr_via_macro_pipeline(exp, ctx, expr) { - result.extend_with_unmapped_doc_str(&expanded, indent); + let (exp, ctx) = expander.get_or_insert_with(|| { + let resolver = make_resolver(); + let def_map = resolver.top_level_def_map(); + let recursion_limit = def_map.recursion_limit() as usize; + ( + DocMacroExpander { + db, + krate, + recursion_depth: 0, + recursion_limit, + }, + DocExprSourceCtx { + resolver, + file_id, + ast_id_map: db.ast_id_map(file_id), + span_map: db.span_map(file_id), + }, + ) + }); + if let Some(expanded) = + expand_doc_expr_via_macro_pipeline(exp, ctx, expr) + { + result.extend_with_unmapped_doc_str(&expanded, indent); + } } } _ => {} @@ -496,10 +495,7 @@ fn extend_with_attrs<'a, 'db>( pub(crate) fn extract_docs<'a, 'db>( db: &'db dyn DefDatabase, krate: Crate, - // Returns (outer_resolver, inline_resolver). - // `outer_resolver` is `Some` only for outlined modules (`mod foo;`) where outer docs - // should be resolved in the parent module's scope. - resolvers: &dyn Fn() -> (Option<Resolver<'db>>, Resolver<'db>), + resolver: &dyn Fn() -> Resolver<'db>, get_cfg_options: &dyn Fn() -> &'a CfgOptions, source: InFile<ast::AnyHasAttrs>, outer_mod_decl: Option<InFile<ast::Module>>, @@ -519,8 +515,7 @@ pub(crate) fn extract_docs<'a, 'db>( if let Some(outer_mod_decl) = outer_mod_decl { let mut indent = usize::MAX; - // For outer docs (the `mod foo;` declaration), use the parent module's resolver - // so that macros are resolved in the parent's scope. + // For outer docs (the `mod foo;` declaration), use the module's own resolver. extend_with_attrs( &mut result, db, @@ -531,7 +526,7 @@ pub(crate) fn extract_docs<'a, 'db>( &mut indent, get_cfg_options, &mut cfg_options, - &|| resolvers().0, + resolver, ); result.remove_indent(indent, 0); result.outline_mod = Some((outer_mod_decl.file_id, result.docs_source_map.len())); @@ -539,7 +534,6 @@ pub(crate) fn extract_docs<'a, 'db>( let inline_source_map_start = result.docs_source_map.len(); let mut indent = usize::MAX; - let inline_resolver = &|| Some(resolvers().1); // For inline docs, use the item's own resolver. extend_with_attrs( &mut result, @@ -551,7 +545,7 @@ pub(crate) fn extract_docs<'a, 'db>( &mut indent, get_cfg_options, &mut cfg_options, - inline_resolver, + resolver, ); if let Some(inner_attrs_node) = &inner_attrs_node { result.inline_inner_docs_start = Some(TextSize::of(&result.docs)); @@ -565,7 +559,7 @@ pub(crate) fn extract_docs<'a, 'db>( &mut indent, get_cfg_options, &mut cfg_options, - inline_resolver, + resolver, ); } result.remove_indent(indent, inline_source_map_start); |