1
Fork 0

Fix clippy

This commit is contained in:
Vadim Petrochenkov 2020-07-22 17:59:17 +03:00
parent 52a9c157d0
commit d642c3b6f8
3 changed files with 39 additions and 49 deletions

View file

@ -2,6 +2,7 @@ use crate::utils::{implements_trait, is_entrypoint_fn, is_type_diagnostic_item,
use if_chain::if_chain; use if_chain::if_chain;
use itertools::Itertools; use itertools::Itertools;
use rustc_ast::ast::{AttrKind, Attribute}; use rustc_ast::ast::{AttrKind, Attribute};
use rustc_ast::token::CommentKind;
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
@ -249,7 +250,7 @@ fn lint_for_missing_headers<'tcx>(
} }
} }
/// Cleanup documentation decoration (`///` and such). /// Cleanup documentation decoration.
/// ///
/// We can't use `rustc_ast::attr::AttributeMethods::with_desugared_doc` or /// We can't use `rustc_ast::attr::AttributeMethods::with_desugared_doc` or
/// `rustc_ast::parse::lexer::comments::strip_doc_comment_decoration` because we /// `rustc_ast::parse::lexer::comments::strip_doc_comment_decoration` because we
@ -257,54 +258,44 @@ fn lint_for_missing_headers<'tcx>(
/// the spans but this function is inspired from the later. /// the spans but this function is inspired from the later.
#[allow(clippy::cast_possible_truncation)] #[allow(clippy::cast_possible_truncation)]
#[must_use] #[must_use]
pub fn strip_doc_comment_decoration(comment: &str, span: Span) -> (String, Vec<(usize, Span)>) { pub fn strip_doc_comment_decoration(doc: &str, comment_kind: CommentKind, span: Span) -> (String, Vec<(usize, Span)>) {
// one-line comments lose their prefix // one-line comments lose their prefix
const ONELINERS: &[&str] = &["///!", "///", "//!", "//"]; if comment_kind == CommentKind::Line {
for prefix in ONELINERS { let mut doc = doc.to_owned();
if comment.starts_with(*prefix) { doc.push('\n');
let doc = &comment[prefix.len()..]; let len = doc.len();
let mut doc = doc.to_owned(); return (doc, vec![(len, span.with_lo(span.lo() + BytePos(3)))]);
doc.push('\n');
return (
doc.to_owned(),
vec![(doc.len(), span.with_lo(span.lo() + BytePos(prefix.len() as u32)))],
);
}
} }
if comment.starts_with("/*") { let mut sizes = vec![];
let doc = &comment[3..comment.len() - 2]; let mut contains_initial_stars = false;
let mut sizes = vec![]; for line in doc.lines() {
let mut contains_initial_stars = false; let offset = line.as_ptr() as usize - doc.as_ptr() as usize;
for line in doc.lines() { debug_assert_eq!(offset as u32 as usize, offset);
let offset = line.as_ptr() as usize - comment.as_ptr() as usize; contains_initial_stars |= line.trim_start().starts_with('*');
debug_assert_eq!(offset as u32 as usize, offset); // +1 for the newline
contains_initial_stars |= line.trim_start().starts_with('*'); sizes.push((line.len() + 1, span.with_lo(span.lo() + BytePos(3 + offset as u32))));
// +1 for the newline }
sizes.push((line.len() + 1, span.with_lo(span.lo() + BytePos(offset as u32)))); if !contains_initial_stars {
} return (doc.to_string(), sizes);
if !contains_initial_stars { }
return (doc.to_string(), sizes); // remove the initial '*'s if any
} let mut no_stars = String::with_capacity(doc.len());
// remove the initial '*'s if any for line in doc.lines() {
let mut no_stars = String::with_capacity(doc.len()); let mut chars = line.chars();
for line in doc.lines() { while let Some(c) = chars.next() {
let mut chars = line.chars(); if c.is_whitespace() {
while let Some(c) = chars.next() { no_stars.push(c);
if c.is_whitespace() { } else {
no_stars.push(c); no_stars.push(if c == '*' { ' ' } else { c });
} else { break;
no_stars.push(if c == '*' { ' ' } else { c });
break;
}
} }
no_stars.push_str(chars.as_str());
no_stars.push('\n');
} }
return (no_stars, sizes); no_stars.push_str(chars.as_str());
no_stars.push('\n');
} }
panic!("not a doc-comment: {}", comment); (no_stars, sizes)
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -318,9 +309,8 @@ fn check_attrs<'a>(cx: &LateContext<'_>, valid_idents: &FxHashSet<String>, attrs
let mut spans = vec![]; let mut spans = vec![];
for attr in attrs { for attr in attrs {
if let AttrKind::DocComment(ref comment) = attr.kind { if let AttrKind::DocComment(comment_kind, comment) = attr.kind {
let comment = comment.to_string(); let (comment, current_spans) = strip_doc_comment_decoration(&comment.as_str(), comment_kind, attr.span);
let (comment, current_spans) = strip_doc_comment_decoration(&comment, attr.span);
spans.extend_from_slice(&current_spans); spans.extend_from_slice(&current_spans);
doc.push_str(&comment); doc.push_str(&comment);
} else if attr.has_name(sym!(doc)) { } else if attr.has_name(sym!(doc)) {

View file

@ -60,13 +60,13 @@ declare_lint_pass!(TabsInDocComments => [TABS_IN_DOC_COMMENTS]);
impl TabsInDocComments { impl TabsInDocComments {
fn warn_if_tabs_in_doc(cx: &EarlyContext<'_>, attr: &ast::Attribute) { fn warn_if_tabs_in_doc(cx: &EarlyContext<'_>, attr: &ast::Attribute) {
if let ast::AttrKind::DocComment(comment) = attr.kind { if let ast::AttrKind::DocComment(_, comment) = attr.kind {
let comment = comment.as_str(); let comment = comment.as_str();
for (lo, hi) in get_chunks_of_tabs(&comment) { for (lo, hi) in get_chunks_of_tabs(&comment) {
let new_span = Span::new( let new_span = Span::new(
attr.span.lo() + BytePos(lo), attr.span.lo() + BytePos(3 + lo),
attr.span.lo() + BytePos(hi), attr.span.lo() + BytePos(3 + hi),
attr.span.ctxt(), attr.span.ctxt(),
); );
span_lint_and_sugg( span_lint_and_sugg(

View file

@ -506,7 +506,7 @@ pub fn eq_attr(l: &Attribute, r: &Attribute) -> bool {
use AttrKind::*; use AttrKind::*;
l.style == r.style l.style == r.style
&& match (&l.kind, &r.kind) { && match (&l.kind, &r.kind) {
(DocComment(l), DocComment(r)) => l == r, (DocComment(l1, l2), DocComment(r1, r2)) => l1 == r1 && l2 == r2,
(Normal(l), Normal(r)) => eq_path(&l.path, &r.path) && eq_mac_args(&l.args, &r.args), (Normal(l), Normal(r)) => eq_path(&l.path, &r.path) && eq_mac_args(&l.args, &r.args),
_ => false, _ => false,
} }