move Attribute::with_desugared_doc to librustdoc
This commit is contained in:
parent
10a52c25ca
commit
0a5b38f9c3
@ -26,9 +26,10 @@ use rustc::ty::{self, DefIdTree, TyCtxt, Region, RegionVid, Ty, AdtKind};
|
|||||||
use rustc::ty::fold::TypeFolder;
|
use rustc::ty::fold::TypeFolder;
|
||||||
use rustc::ty::layout::VariantIdx;
|
use rustc::ty::layout::VariantIdx;
|
||||||
use rustc::util::nodemap::{FxHashMap, FxHashSet};
|
use rustc::util::nodemap::{FxHashMap, FxHashSet};
|
||||||
use syntax::ast::{self, AttrStyle, Ident};
|
use syntax::ast::{self, Attribute, AttrStyle, AttrItem, Ident};
|
||||||
use syntax::attr;
|
use syntax::attr;
|
||||||
use syntax_expand::base::MacroKind;
|
use syntax_expand::base::MacroKind;
|
||||||
|
use syntax::parse::lexer::comments;
|
||||||
use syntax::source_map::DUMMY_SP;
|
use syntax::source_map::DUMMY_SP;
|
||||||
use syntax::symbol::{Symbol, kw, sym};
|
use syntax::symbol::{Symbol, kw, sym};
|
||||||
use syntax_pos::{self, Pos, FileName};
|
use syntax_pos::{self, Pos, FileName};
|
||||||
@ -858,8 +859,31 @@ impl Attributes {
|
|||||||
let mut cfg = Cfg::True;
|
let mut cfg = Cfg::True;
|
||||||
let mut doc_line = 0;
|
let mut doc_line = 0;
|
||||||
|
|
||||||
|
/// Converts `self` to a normal `#[doc="foo"]` comment, if it is a
|
||||||
|
/// comment like `///` or `/** */`. (Returns `self` unchanged for
|
||||||
|
/// non-sugared doc attributes.)
|
||||||
|
pub fn with_desugared_doc<T>(attr: &Attribute, f: impl FnOnce(&Attribute) -> T) -> T {
|
||||||
|
if attr.is_sugared_doc {
|
||||||
|
let comment = attr.value_str().unwrap();
|
||||||
|
let meta = attr::mk_name_value_item_str(
|
||||||
|
Ident::with_dummy_span(sym::doc),
|
||||||
|
Symbol::intern(&comments::strip_doc_comment_decoration(&comment.as_str())),
|
||||||
|
DUMMY_SP,
|
||||||
|
);
|
||||||
|
f(&Attribute {
|
||||||
|
item: AttrItem { path: meta.path, tokens: meta.kind.tokens(meta.span) },
|
||||||
|
id: attr.id,
|
||||||
|
style: attr.style,
|
||||||
|
is_sugared_doc: true,
|
||||||
|
span: attr.span,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
f(attr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let other_attrs = attrs.iter().filter_map(|attr| {
|
let other_attrs = attrs.iter().filter_map(|attr| {
|
||||||
attr.with_desugared_doc(|attr| {
|
with_desugared_doc(attr, |attr| {
|
||||||
if attr.check_name(sym::doc) {
|
if attr.check_name(sym::doc) {
|
||||||
if let Some(mi) = attr.meta() {
|
if let Some(mi) = attr.meta() {
|
||||||
if let Some(value) = mi.value_str() {
|
if let Some(value) = mi.value_str() {
|
||||||
|
@ -13,8 +13,8 @@ use crate::ast::{AttrItem, AttrId, AttrStyle, Name, Ident, Path, PathSegment};
|
|||||||
use crate::ast::{MetaItem, MetaItemKind, NestedMetaItem};
|
use crate::ast::{MetaItem, MetaItemKind, NestedMetaItem};
|
||||||
use crate::ast::{Lit, LitKind, Expr, Item, Local, Stmt, StmtKind, GenericParam};
|
use crate::ast::{Lit, LitKind, Expr, Item, Local, Stmt, StmtKind, GenericParam};
|
||||||
use crate::mut_visit::visit_clobber;
|
use crate::mut_visit::visit_clobber;
|
||||||
use crate::source_map::{BytePos, Spanned, DUMMY_SP};
|
use crate::source_map::{BytePos, Spanned};
|
||||||
use crate::parse::lexer::comments::{doc_comment_style, strip_doc_comment_decoration};
|
use crate::parse::lexer::comments::doc_comment_style;
|
||||||
use crate::parse::parser::Parser;
|
use crate::parse::parser::Parser;
|
||||||
use crate::parse::PResult;
|
use crate::parse::PResult;
|
||||||
use crate::parse::token::{self, Token};
|
use crate::parse::token::{self, Token};
|
||||||
@ -312,31 +312,6 @@ impl Attribute {
|
|||||||
span: self.span,
|
span: self.span,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Converts `self` to a normal `#[doc="foo"]` comment, if it is a
|
|
||||||
/// comment like `///` or `/** */`. (Returns `self` unchanged for
|
|
||||||
/// non-sugared doc attributes.)
|
|
||||||
pub fn with_desugared_doc<T, F>(&self, f: F) -> T where
|
|
||||||
F: FnOnce(&Attribute) -> T,
|
|
||||||
{
|
|
||||||
if self.is_sugared_doc {
|
|
||||||
let comment = self.value_str().unwrap();
|
|
||||||
let meta = mk_name_value_item_str(
|
|
||||||
Ident::with_dummy_span(sym::doc),
|
|
||||||
Symbol::intern(&strip_doc_comment_decoration(&comment.as_str())),
|
|
||||||
DUMMY_SP,
|
|
||||||
);
|
|
||||||
f(&Attribute {
|
|
||||||
item: AttrItem { path: meta.path, tokens: meta.kind.tokens(meta.span) },
|
|
||||||
id: self.id,
|
|
||||||
style: self.style,
|
|
||||||
is_sugared_doc: true,
|
|
||||||
span: self.span,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
f(self)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Constructors */
|
/* Constructors */
|
||||||
|
@ -176,7 +176,7 @@ fn split_block_comment_into_lines(
|
|||||||
|
|
||||||
// it appears this function is called only from pprust... that's
|
// it appears this function is called only from pprust... that's
|
||||||
// probably not a good thing.
|
// probably not a good thing.
|
||||||
pub fn gather_comments(sess: &ParseSess, path: FileName, src: String) -> Vec<Comment> {
|
crate fn gather_comments(sess: &ParseSess, path: FileName, src: String) -> Vec<Comment> {
|
||||||
let cm = SourceMap::new(sess.source_map().path_mapping().clone());
|
let cm = SourceMap::new(sess.source_map().path_mapping().clone());
|
||||||
let source_file = cm.new_source_file(path, src);
|
let source_file = cm.new_source_file(path, src);
|
||||||
let text = (*source_file.src.as_ref().unwrap()).clone();
|
let text = (*source_file.src.as_ref().unwrap()).clone();
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
use syntax_pos::Span;
|
use syntax_pos::Span;
|
||||||
|
|
||||||
|
use super::{StringReader, UnmatchedBrace};
|
||||||
|
|
||||||
use crate::print::pprust::token_to_string;
|
use crate::print::pprust::token_to_string;
|
||||||
use crate::parse::lexer::{StringReader, UnmatchedBrace};
|
|
||||||
use crate::parse::token::{self, Token};
|
use crate::parse::token::{self, Token};
|
||||||
use crate::parse::PResult;
|
use crate::parse::PResult;
|
||||||
use crate::tokenstream::{DelimSpan, IsJoint::{self, *}, TokenStream, TokenTree, TreeAndJoint};
|
use crate::tokenstream::{DelimSpan, IsJoint::{self, *}, TokenStream, TokenTree, TreeAndJoint};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user