Skip to content

Commit

Permalink
Removed usage of Attributes in FnDecl and ExternalCrate. Relocate par…
Browse files Browse the repository at this point in the history
…t of the fields in Attributes, as functions in AttributesExt.

refacto use from_def_id_and_attrs_and_parts instead of an old trick

most of josha suggestions + check if def_id is not fake before using it in a query

Removed usage of Attributes in FnDecl and ExternalCrate. Relocate part of the Attributes fields as functions in AttributesExt.
  • Loading branch information
Timothée Delabrouille committed Apr 27, 2021
1 parent 5da10c0 commit b4f1dfd
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 53 deletions.
3 changes: 1 addition & 2 deletions src/librustdoc/clean/inline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,7 @@ crate fn try_inline(
let attrs = box merge_attrs(cx, Some(parent_module), target_attrs, attrs_clone);

cx.inlined.insert(did);
let what_rustc_thinks = clean::Item::from_def_id_and_parts(did, Some(name), kind, cx);
ret.push(clean::Item { attrs, ..what_rustc_thinks });
ret.push(clean::Item::from_def_id_and_attrs_and_parts(did, Some(name), kind, attrs, cx));
Some(ret)
}

Expand Down
7 changes: 2 additions & 5 deletions src/librustdoc/clean/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,8 @@ impl<T: Clean<U>, U> Clean<Option<U>> for Option<T> {
}

impl Clean<ExternalCrate> for CrateNum {
fn clean(&self, cx: &mut DocContext<'_>) -> ExternalCrate {
let root = DefId { krate: *self, index: CRATE_DEF_INDEX };
ExternalCrate { crate_num: *self, attrs: cx.tcx.get_attrs(root).clean(cx) }
fn clean(&self, _cx: &mut DocContext<'_>) -> ExternalCrate {
ExternalCrate { crate_num: *self }
}
}

Expand Down Expand Up @@ -850,7 +849,6 @@ where
inputs: (self.0.inputs, self.1).clean(cx),
output: self.0.output.clean(cx),
c_variadic: self.0.c_variadic,
attrs: Attributes::default(),
}
}
}
Expand All @@ -862,7 +860,6 @@ impl<'tcx> Clean<FnDecl> for (DefId, ty::PolyFnSig<'tcx>) {

FnDecl {
output: Return(sig.skip_binder().output().clean(cx)),
attrs: Attributes::default(),
c_variadic: sig.skip_binder().c_variadic,
inputs: Arguments {
values: sig
Expand Down
50 changes: 27 additions & 23 deletions src/librustdoc/clean/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ crate struct TraitWithExtraInfo {
#[derive(Clone, Debug)]
crate struct ExternalCrate {
crate crate_num: CrateNum,
crate attrs: Attributes,
}

impl ExternalCrate {
Expand Down Expand Up @@ -663,12 +662,35 @@ impl<'a> Iterator for ListAttributesIter<'a> {
crate trait AttributesExt {
/// Finds an attribute as List and returns the list of attributes nested inside.
fn lists(&self, name: Symbol) -> ListAttributesIter<'_>;

fn span(&self) -> Option<rustc_span::Span>;

fn inner_docs(&self) -> bool;

fn other_attrs(&self) -> Vec<ast::Attribute>;
}

impl AttributesExt for [ast::Attribute] {
fn lists(&self, name: Symbol) -> ListAttributesIter<'_> {
ListAttributesIter { attrs: self.iter(), current_list: Vec::new().into_iter(), name }
}

/// Return the span of the first doc-comment, if it exists.
fn span(&self) -> Option<rustc_span::Span> {
self.iter().find(|attr| attr.doc_str().is_some()).map(|attr| attr.span)
}

/// Returns whether the first doc-comment is an inner attribute.
///
//// If there are no doc-comments, return true.
/// FIXME(#78591): Support both inner and outer attributes on the same item.
fn inner_docs(&self) -> bool {
self.iter().find(|a| a.doc_str().is_some()).map_or(true, |a| a.style == AttrStyle::Inner)
}

fn other_attrs(&self) -> Vec<ast::Attribute> {
self.iter().filter(|attr| attr.doc_str().is_none()).cloned().collect()
}
}

crate trait NestedAttributesExt {
Expand Down Expand Up @@ -778,8 +800,6 @@ crate struct Attributes {
crate doc_strings: Vec<DocFragment>,
crate other_attrs: Vec<ast::Attribute>,
crate cfg: Option<Arc<Cfg>>,
crate span: Option<rustc_span::Span>,
crate inner_docs: bool,
}

#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
Expand Down Expand Up @@ -811,6 +831,10 @@ pub struct RenderedLink {
}

impl Attributes {
crate fn lists(&self, name: Symbol) -> ListAttributesIter<'_> {
self.other_attrs.lists(name)
}

/// Extracts the content from an attribute `#[doc(cfg(content))]`.
crate fn extract_cfg(mi: &ast::MetaItem) -> Option<&ast::MetaItem> {
use rustc_ast::NestedMetaItem::MetaItem;
Expand Down Expand Up @@ -895,7 +919,6 @@ impl Attributes {
additional_attrs: Option<(&[ast::Attribute], DefId)>,
) -> Attributes {
let mut doc_strings: Vec<DocFragment> = vec![];
let mut sp = None;
let mut cfg = Cfg::True;
let mut doc_line = 0;

Expand Down Expand Up @@ -940,9 +963,6 @@ impl Attributes {

doc_strings.push(frag);

if sp.is_none() {
sp = Some(attr.span);
}
None
} else {
if attr.has_name(sym::doc) {
Expand Down Expand Up @@ -1001,17 +1021,10 @@ impl Attributes {
}
}

let inner_docs = attrs
.iter()
.find(|a| a.doc_str().is_some())
.map_or(true, |a| a.style == AttrStyle::Inner);

Attributes {
doc_strings,
other_attrs,
cfg: if cfg == Cfg::True { None } else { Some(Arc::new(cfg)) },
span: sp,
inner_docs,
}
}

Expand Down Expand Up @@ -1079,7 +1092,6 @@ impl PartialEq for Attributes {
fn eq(&self, rhs: &Self) -> bool {
self.doc_strings == rhs.doc_strings
&& self.cfg == rhs.cfg
&& self.span == rhs.span
&& self
.other_attrs
.iter()
Expand All @@ -1094,19 +1106,12 @@ impl Hash for Attributes {
fn hash<H: Hasher>(&self, hasher: &mut H) {
self.doc_strings.hash(hasher);
self.cfg.hash(hasher);
self.span.hash(hasher);
for attr in &self.other_attrs {
attr.id.hash(hasher);
}
}
}

impl AttributesExt for Attributes {
fn lists(&self, name: Symbol) -> ListAttributesIter<'_> {
self.other_attrs.lists(name)
}
}

#[derive(Clone, PartialEq, Eq, Debug, Hash)]
crate enum GenericBound {
TraitBound(PolyTrait, hir::TraitBoundModifier),
Expand Down Expand Up @@ -1269,7 +1274,6 @@ crate struct FnDecl {
crate inputs: Arguments,
crate output: FnRetTy,
crate c_variadic: bool,
crate attrs: Attributes,
}

impl FnDecl {
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ use std::rc::Rc;

use crate::clean;
use crate::clean::inline::build_external_trait;
use crate::clean::{AttributesExt, TraitWithExtraInfo, MAX_DEF_IDX};
use crate::clean::{TraitWithExtraInfo, MAX_DEF_IDX};
use crate::config::{Options as RustdocOptions, OutputFormat, RenderOptions};
use crate::formats::cache::Cache;
use crate::passes::{self, Condition::*, ConditionalPass};
Expand Down
11 changes: 6 additions & 5 deletions src/librustdoc/doctest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use std::str;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex};

use crate::clean::Attributes;
use crate::clean::{types::AttributesExt, Attributes};
use crate::config::Options;
use crate::html::markdown::{self, ErrorCodes, Ignore, LangString};
use crate::lint::init_lints;
Expand Down Expand Up @@ -1092,8 +1092,9 @@ impl<'a, 'hir, 'tcx> HirCollector<'a, 'hir, 'tcx> {
sp: Span,
nested: F,
) {
let attrs = self.tcx.hir().attrs(hir_id);
let mut attrs = Attributes::from_ast(self.sess.diagnostic(), attrs, None);
let ast_attrs = self.tcx.hir().attrs(hir_id);

let mut attrs = Attributes::from_ast(self.sess.diagnostic(), ast_attrs, None);
if let Some(ref cfg) = attrs.cfg {
if !cfg.matches(&self.sess.parse_sess, Some(&self.sess.features_untracked())) {
return;
Expand All @@ -1110,8 +1111,8 @@ impl<'a, 'hir, 'tcx> HirCollector<'a, 'hir, 'tcx> {
// anything else, this will combine them for us.
if let Some(doc) = attrs.collapsed_doc_value() {
// Use the outermost invocation, so that doctest names come from where the docs were written.
let span = attrs
.span
let span = ast_attrs
.span()
.map(|span| span.ctxt().outer_expn().expansion_cause().unwrap_or(span))
.unwrap_or(DUMMY_SP);
self.collector.set_position(span);
Expand Down
8 changes: 5 additions & 3 deletions src/librustdoc/formats/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,12 @@ impl Cache {
};
let name = e.name(tcx);
let extern_url = extern_html_root_urls.get(&*name.as_str()).map(|u| &**u);
self.extern_locations
.insert(n, (name, src_root, extern_location(e, extern_url, &dst, tcx)));

let did = DefId { krate: n, index: CRATE_DEF_INDEX };
self.extern_locations.insert(
n,
(name, src_root, extern_location(e, extern_url, tcx.get_attrs(did), &dst, tcx)),
);

self.external_paths.insert(did, (vec![name.to_string()], ItemType::Module));
}

Expand Down
9 changes: 6 additions & 3 deletions src/librustdoc/html/render/cache.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
use std::collections::BTreeMap;
use std::path::Path;

use rustc_ast::ast;
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
use rustc_middle::ty::TyCtxt;
use rustc_span::symbol::{sym, Symbol};
use serde::ser::{Serialize, SerializeStruct, Serializer};

use crate::clean;
use crate::clean::types::{
FnDecl, FnRetTy, GenericBound, Generics, GetDefId, Type, WherePredicate,
AttributesExt, FnDecl, FnRetTy, GenericBound, Generics, GetDefId, Type, TypeKind,
WherePredicate,
};
use crate::clean::{self, AttributesExt};
use crate::formats::cache::Cache;
use crate::formats::item_type::ItemType;
use crate::html::markdown::short_markdown_summary;
Expand All @@ -30,6 +32,7 @@ crate enum ExternalLocation {
crate fn extern_location(
e: &clean::ExternalCrate,
extern_url: Option<&str>,
ast_attrs: &[ast::Attribute],
dst: &Path,
tcx: TyCtxt<'_>,
) -> ExternalLocation {
Expand All @@ -50,7 +53,7 @@ crate fn extern_location(

// Failing that, see if there's an attribute specifying where to find this
// external crate
e.attrs
ast_attrs
.lists(sym::doc)
.filter(|a| a.has_name(sym::html_root_url))
.filter_map(|a| a.value_str())
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/html/render/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use super::print_item::{full_path, item_path, print_item};
use super::write_shared::write_shared;
use super::{print_sidebar, settings, AllTypes, NameDoc, StylePath, BASIC_KEYWORDS};

use crate::clean::{self, AttributesExt};
use crate::clean;
use crate::config::RenderOptions;
use crate::docfs::{DocFS, PathError};
use crate::error::Error;
Expand Down
2 changes: 1 addition & 1 deletion src/librustdoc/json/conversions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ impl FromWithTcx<clean::BareFunctionDecl> for FunctionPointer {

impl FromWithTcx<clean::FnDecl> for FnDecl {
fn from_tcx(decl: clean::FnDecl, tcx: TyCtxt<'_>) -> Self {
let clean::FnDecl { inputs, output, c_variadic, attrs: _ } = decl;
let clean::FnDecl { inputs, output, c_variadic } = decl;
FnDecl {
inputs: inputs
.values
Expand Down
19 changes: 12 additions & 7 deletions src/librustdoc/passes/collect_intra_doc_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
//!
//! [RFC 1946]: https://github.com/rust-lang/rfcs/blob/master/text/1946-intra-rustdoc-links.md

use clean::AttributesExt;
use rustc_ast as ast;
use rustc_data_structures::{fx::FxHashMap, stable_set::FxHashSet};
use rustc_errors::{Applicability, DiagnosticBuilder};
Expand Down Expand Up @@ -853,7 +854,12 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
}
});

if item.is_mod() && item.attrs.inner_docs {
let inner_docs = match self_id {
Some(did) => self.cx.tcx.get_attrs(did).inner_docs(),
None => false,
};

if item.is_mod() && inner_docs {
self.mod_ids.push(item.def_id);
}

Expand All @@ -880,7 +886,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
}

Some(if item.is_mod() {
if !item.attrs.inner_docs {
if !inner_docs {
self.mod_ids.push(item.def_id);
}

Expand Down Expand Up @@ -1050,6 +1056,8 @@ impl LinkCollector<'_, '_> {
};
let mut path_str = &*path_str;

let inner_docs = self.cx.tcx.get_attrs(item.def_id).inner_docs();

// In order to correctly resolve intra-doc links we need to
// pick a base AST node to work from. If the documentation for
// this module came from an inner comment (//!) then we anchor
Expand All @@ -1061,11 +1069,8 @@ impl LinkCollector<'_, '_> {
// we've already pushed this node onto the resolution stack but
// for outer comments we explicitly try and resolve against the
// parent_node first.
let base_node = if item.is_mod() && item.attrs.inner_docs {
self.mod_ids.last().copied()
} else {
parent_node
};
let base_node =
if item.is_mod() && inner_docs { self.mod_ids.last().copied() } else { parent_node };

let mut module_id = if let Some(id) = base_node {
id
Expand Down
4 changes: 2 additions & 2 deletions src/librustdoc/passes/strip_hidden.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ use rustc_hir::def_id::DefIdSet;
use rustc_span::symbol::sym;
use std::mem;

use crate::clean::Item;
use crate::clean::{self, AttributesExt, NestedAttributesExt};
use crate::clean;
use crate::clean::{Item, NestedAttributesExt};
use crate::core::DocContext;
use crate::fold::{DocFolder, StripItem};
use crate::passes::{ImplStripper, Pass};
Expand Down

0 comments on commit b4f1dfd

Please sign in to comment.