diff options
| author | Michael Goulet <michael@errs.io> | 2022-02-13 20:39:36 -0800 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-02-27 21:03:56 -0800 |
| commit | 8a0c2c4e83c216811d96a4a5af9987431b75bd6f (patch) | |
| tree | 7c468660475d53e1882696a7125911f11a9604d1 | |
| parent | b07d59f794d8fffb628f82c9c8156f5457de5e49 (diff) | |
| download | rust-8a0c2c4e83c216811d96a4a5af9987431b75bd6f.tar.gz rust-8a0c2c4e83c216811d96a4a5af9987431b75bd6f.zip | |
move method out of nesting
| -rw-r--r-- | src/librustdoc/html/render/mod.rs | 179 |
1 files changed, 90 insertions, 89 deletions
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 3c1737c5e3f..1d111077606 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -794,6 +794,94 @@ fn assoc_type( } } +fn assoc_method( + w: &mut Buffer, + meth: &clean::Item, + header: hir::FnHeader, + g: &clean::Generics, + d: &clean::FnDecl, + link: AssocItemLink<'_>, + parent: ItemType, + cx: &Context<'_>, + render_mode: RenderMode, +) { + let name = meth.name.as_ref().unwrap(); + let href = match link { + AssocItemLink::Anchor(Some(ref id)) => Some(format!("#{}", id)), + AssocItemLink::Anchor(None) => Some(format!("#{}.{}", meth.type_(), name)), + AssocItemLink::GotoSource(did, provided_methods) => { + // We're creating a link from an impl-item to the corresponding + // trait-item and need to map the anchored type accordingly. + let ty = if provided_methods.contains(name) { + ItemType::Method + } else { + ItemType::TyMethod + }; + + match (href(did.expect_def_id(), cx), ty) { + (Ok(p), ty) => Some(format!("{}#{}.{}", p.0, ty, name)), + (Err(HrefError::DocumentationNotBuilt), ItemType::TyMethod) => None, + (Err(_), ty) => Some(format!("#{}.{}", ty, name)), + } + } + }; + let vis = meth.visibility.print_with_space(meth.def_id, cx).to_string(); + // FIXME: Once https://github.com/rust-lang/rust/issues/67792 is implemented, we can remove + // this condition. + let constness = match render_mode { + RenderMode::Normal => { + print_constness_with_space(&header.constness, meth.const_stability(cx.tcx())) + } + RenderMode::ForDeref { .. } => "", + }; + let asyncness = header.asyncness.print_with_space(); + let unsafety = header.unsafety.print_with_space(); + let defaultness = print_default_space(meth.is_default()); + let abi = print_abi_with_space(header.abi).to_string(); + + // NOTE: `{:#}` does not print HTML formatting, `{}` does. So `g.print` can't be reused between the length calculation and `write!`. + let generics_len = format!("{:#}", g.print(cx)).len(); + let mut header_len = "fn ".len() + + vis.len() + + constness.len() + + asyncness.len() + + unsafety.len() + + defaultness.len() + + abi.len() + + name.as_str().len() + + generics_len; + + let (indent, indent_str, end_newline) = if parent == ItemType::Trait { + header_len += 4; + let indent_str = " "; + render_attributes_in_pre(w, meth, indent_str); + (4, indent_str, false) + } else { + render_attributes_in_code(w, meth); + (0, "", true) + }; + w.reserve(header_len + "<a href=\"\" class=\"fnname\">{".len() + "</a>".len()); + write!( + w, + "{indent}{vis}{constness}{asyncness}{unsafety}{defaultness}{abi}fn <a {href} class=\"fnname\">{name}</a>\ + {generics}{decl}{notable_traits}{where_clause}", + indent = indent_str, + vis = vis, + constness = constness, + asyncness = asyncness, + unsafety = unsafety, + defaultness = defaultness, + abi = abi, + // links without a href are valid - https://www.w3schools.com/tags/att_a_href.asp + href = href.map(|href| format!("href=\"{}\"", href)).unwrap_or_else(|| "".to_string()), + name = name, + generics = g.print(cx), + decl = d.full_print(header_len, indent, header.asyncness, cx), + notable_traits = notable_traits_decl(d, cx), + where_clause = print_where_clause(g, cx, indent, end_newline), + ) +} + /// Writes a span containing the versions at which an item became stable and/or const-stable. For /// example, if the item became stable at 1.0.0, and const-stable at 1.45.0, this function would /// write a span containing "1.0.0 (const: 1.45.0)". @@ -875,100 +963,13 @@ fn render_assoc_item( cx: &Context<'_>, render_mode: RenderMode, ) { - fn method( - w: &mut Buffer, - meth: &clean::Item, - header: hir::FnHeader, - g: &clean::Generics, - d: &clean::FnDecl, - link: AssocItemLink<'_>, - parent: ItemType, - cx: &Context<'_>, - render_mode: RenderMode, - ) { - let name = meth.name.as_ref().unwrap(); - let href = match link { - AssocItemLink::Anchor(Some(ref id)) => Some(format!("#{}", id)), - AssocItemLink::Anchor(None) => Some(format!("#{}.{}", meth.type_(), name)), - AssocItemLink::GotoSource(did, provided_methods) => { - // We're creating a link from an impl-item to the corresponding - // trait-item and need to map the anchored type accordingly. - let ty = if provided_methods.contains(name) { - ItemType::Method - } else { - ItemType::TyMethod - }; - - match (href(did.expect_def_id(), cx), ty) { - (Ok(p), ty) => Some(format!("{}#{}.{}", p.0, ty, name)), - (Err(HrefError::DocumentationNotBuilt), ItemType::TyMethod) => None, - (Err(_), ty) => Some(format!("#{}.{}", ty, name)), - } - } - }; - let vis = meth.visibility.print_with_space(meth.def_id, cx).to_string(); - // FIXME: Once https://github.com/rust-lang/rust/issues/67792 is implemented, we can remove - // this condition. - let constness = match render_mode { - RenderMode::Normal => { - print_constness_with_space(&header.constness, meth.const_stability(cx.tcx())) - } - RenderMode::ForDeref { .. } => "", - }; - let asyncness = header.asyncness.print_with_space(); - let unsafety = header.unsafety.print_with_space(); - let defaultness = print_default_space(meth.is_default()); - let abi = print_abi_with_space(header.abi).to_string(); - - // NOTE: `{:#}` does not print HTML formatting, `{}` does. So `g.print` can't be reused between the length calculation and `write!`. - let generics_len = format!("{:#}", g.print(cx)).len(); - let mut header_len = "fn ".len() - + vis.len() - + constness.len() - + asyncness.len() - + unsafety.len() - + defaultness.len() - + abi.len() - + name.as_str().len() - + generics_len; - - let (indent, indent_str, end_newline) = if parent == ItemType::Trait { - header_len += 4; - let indent_str = " "; - render_attributes_in_pre(w, meth, indent_str); - (4, indent_str, false) - } else { - render_attributes_in_code(w, meth); - (0, "", true) - }; - w.reserve(header_len + "<a href=\"\" class=\"fnname\">{".len() + "</a>".len()); - write!( - w, - "{indent}{vis}{constness}{asyncness}{unsafety}{defaultness}{abi}fn <a {href} class=\"fnname\">{name}</a>\ - {generics}{decl}{notable_traits}{where_clause}", - indent = indent_str, - vis = vis, - constness = constness, - asyncness = asyncness, - unsafety = unsafety, - defaultness = defaultness, - abi = abi, - // links without a href are valid - https://www.w3schools.com/tags/att_a_href.asp - href = href.map(|href| format!("href=\"{}\"", href)).unwrap_or_else(|| "".to_string()), - name = name, - generics = g.print(cx), - decl = d.full_print(header_len, indent, header.asyncness, cx), - notable_traits = notable_traits_decl(d, cx), - where_clause = print_where_clause(g, cx, indent, end_newline), - ) - } match *item.kind { clean::StrippedItem(..) => {} clean::TyMethodItem(ref m) => { - method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) + assoc_method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) } clean::MethodItem(ref m, _) => { - method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) + assoc_method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) } clean::AssocConstItem(ref ty, _) => { assoc_const(w, item, ty, link, if parent == ItemType::Trait { " " } else { "" }, cx) |
