Test clippy_utils in CI

This makes sure that the tests in clippy_utils are run in CI.

When looking into this I discovered that two tests were failing and
multiple doc tests were failing. This fixes those tests and enables a
few more doc tests.
This commit is contained in:
flip1995 2021-12-20 19:56:06 +01:00
parent 790513056f
commit eb47398773
No known key found for this signature in database
GPG Key ID: 1CA0DF2AF59D68A5
4 changed files with 25 additions and 10 deletions

View File

@ -58,6 +58,10 @@ jobs:
run: cargo test --features deny-warnings,internal-lints,metadata-collector-lint run: cargo test --features deny-warnings,internal-lints,metadata-collector-lint
working-directory: clippy_lints working-directory: clippy_lints
- name: Test clippy_utils
run: cargo test --features deny-warnings,internal-lints,metadata-collector-lint
working-directory: clippy_utils
- name: Test rustc_tools_util - name: Test rustc_tools_util
run: cargo test --features deny-warnings run: cargo test --features deny-warnings
working-directory: rustc_tools_util working-directory: rustc_tools_util

View File

@ -121,6 +121,10 @@ jobs:
run: cargo test --features deny-warnings,internal-lints,metadata-collector-lint run: cargo test --features deny-warnings,internal-lints,metadata-collector-lint
working-directory: clippy_lints working-directory: clippy_lints
- name: Test clippy_utils
run: cargo test --features deny-warnings,internal-lints,metadata-collector-lint
working-directory: clippy_utils
- name: Test rustc_tools_util - name: Test rustc_tools_util
run: cargo test --features deny-warnings run: cargo test --features deny-warnings
working-directory: rustc_tools_util working-directory: rustc_tools_util

View File

@ -156,18 +156,18 @@ pub fn differing_macro_contexts(lhs: Span, rhs: Span) -> bool {
/// instead. /// instead.
/// ///
/// Examples: /// Examples:
/// ```ignore /// ```
/// let abc = 1; /// let abc = 1;
/// // ^ output /// // ^ output
/// let def = abc; /// let def = abc;
/// dbg!(def) /// dbg!(def);
/// // ^^^ input /// // ^^^ input
/// ///
/// // or... /// // or...
/// let abc = 1; /// let abc = 1;
/// let def = abc + 2; /// let def = abc + 2;
/// // ^^^^^^^ output /// // ^^^^^^^ output
/// dbg!(def) /// dbg!(def);
/// // ^^^ input /// // ^^^ input
/// ``` /// ```
pub fn expr_or_init<'a, 'b, 'tcx: 'b>(cx: &LateContext<'tcx>, mut expr: &'a Expr<'b>) -> &'a Expr<'b> { pub fn expr_or_init<'a, 'b, 'tcx: 'b>(cx: &LateContext<'tcx>, mut expr: &'a Expr<'b>) -> &'a Expr<'b> {
@ -1136,7 +1136,7 @@ pub fn find_macro_calls(names: &[&str], body: &Body<'_>) -> Vec<Span> {
/// Extends the span to the beginning of the spans line, incl. whitespaces. /// Extends the span to the beginning of the spans line, incl. whitespaces.
/// ///
/// ```rust,ignore /// ```rust
/// let x = (); /// let x = ();
/// // ^^ /// // ^^
/// // will be converted to /// // will be converted to
@ -1337,7 +1337,7 @@ pub fn is_adjusted(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
cx.typeck_results().adjustments().get(e.hir_id).is_some() cx.typeck_results().adjustments().get(e.hir_id).is_some()
} }
/// Returns the pre-expansion span if is this comes from an expansion of the /// Returns the pre-expansion span if this comes from an expansion of the
/// macro `name`. /// macro `name`.
/// See also [`is_direct_expn_of`]. /// See also [`is_direct_expn_of`].
#[must_use] #[must_use]
@ -1364,7 +1364,8 @@ pub fn is_expn_of(mut span: Span, name: &str) -> Option<Span> {
/// of the macro `name`. /// of the macro `name`.
/// The difference with [`is_expn_of`] is that in /// The difference with [`is_expn_of`] is that in
/// ```rust /// ```rust
/// # macro_rules! foo { ($e:tt) => { $e } }; macro_rules! bar { ($e:expr) => { $e } } /// # macro_rules! foo { ($name:tt!$args:tt) => { $name!$args } }
/// # macro_rules! bar { ($e:expr) => { $e } }
/// foo!(bar!(42)); /// foo!(bar!(42));
/// ``` /// ```
/// `42` is considered expanded from `foo!` and `bar!` by `is_expn_of` but only /// `42` is considered expanded from `foo!` and `bar!` by `is_expn_of` but only
@ -1905,7 +1906,9 @@ pub fn is_no_core_crate(cx: &LateContext<'_>) -> bool {
/// Check if parent of a hir node is a trait implementation block. /// Check if parent of a hir node is a trait implementation block.
/// For example, `f` in /// For example, `f` in
/// ```rust,ignore /// ```rust
/// # struct S;
/// # trait Trait { fn f(); }
/// impl Trait for S { /// impl Trait for S {
/// fn f() {} /// fn f() {}
/// } /// }

View File

@ -15,6 +15,7 @@ pub fn new(char_index: usize, byte_index: usize) -> Self {
/// Returns the index of the character after the first camel-case component of `s`. /// Returns the index of the character after the first camel-case component of `s`.
/// ///
/// ``` /// ```
/// # use clippy_utils::str_utils::{camel_case_until, StrIndex};
/// assert_eq!(camel_case_until("AbcDef"), StrIndex::new(6, 6)); /// assert_eq!(camel_case_until("AbcDef"), StrIndex::new(6, 6));
/// assert_eq!(camel_case_until("ABCD"), StrIndex::new(0, 0)); /// assert_eq!(camel_case_until("ABCD"), StrIndex::new(0, 0));
/// assert_eq!(camel_case_until("AbcDD"), StrIndex::new(3, 3)); /// assert_eq!(camel_case_until("AbcDD"), StrIndex::new(3, 3));
@ -55,9 +56,10 @@ pub fn camel_case_until(s: &str) -> StrIndex {
} }
} }
/// Returns index of the last camel-case component of `s`. /// Returns index of the first camel-case component of `s`.
/// ///
/// ``` /// ```
/// # use clippy_utils::str_utils::{camel_case_start, StrIndex};
/// assert_eq!(camel_case_start("AbcDef"), StrIndex::new(0, 0)); /// assert_eq!(camel_case_start("AbcDef"), StrIndex::new(0, 0));
/// assert_eq!(camel_case_start("abcDef"), StrIndex::new(3, 3)); /// assert_eq!(camel_case_start("abcDef"), StrIndex::new(3, 3));
/// assert_eq!(camel_case_start("ABCD"), StrIndex::new(4, 4)); /// assert_eq!(camel_case_start("ABCD"), StrIndex::new(4, 4));
@ -69,9 +71,9 @@ pub fn camel_case_start(s: &str) -> StrIndex {
let char_count = s.chars().count(); let char_count = s.chars().count();
let range = 0..char_count; let range = 0..char_count;
let mut iter = range.rev().zip(s.char_indices().rev()); let mut iter = range.rev().zip(s.char_indices().rev());
if let Some((char_index, (_, first))) = iter.next() { if let Some((_, (_, first))) = iter.next() {
if !first.is_lowercase() { if !first.is_lowercase() {
return StrIndex::new(char_index, s.len()); return StrIndex::new(char_count, s.len());
} }
} else { } else {
return StrIndex::new(char_count, s.len()); return StrIndex::new(char_count, s.len());
@ -116,6 +118,7 @@ pub fn new(char_count: usize, byte_count: usize) -> Self {
/// Returns the number of chars that match from the start /// Returns the number of chars that match from the start
/// ///
/// ``` /// ```
/// # use clippy_utils::str_utils::{count_match_start, StrCount};
/// assert_eq!(count_match_start("hello_mouse", "hello_penguin"), StrCount::new(6, 6)); /// assert_eq!(count_match_start("hello_mouse", "hello_penguin"), StrCount::new(6, 6));
/// assert_eq!(count_match_start("hello_clippy", "bye_bugs"), StrCount::new(0, 0)); /// assert_eq!(count_match_start("hello_clippy", "bye_bugs"), StrCount::new(0, 0));
/// assert_eq!(count_match_start("hello_world", "hello_world"), StrCount::new(11, 11)); /// assert_eq!(count_match_start("hello_world", "hello_world"), StrCount::new(11, 11));
@ -141,6 +144,7 @@ pub fn count_match_start(str1: &str, str2: &str) -> StrCount {
/// Returns the number of chars and bytes that match from the end /// Returns the number of chars and bytes that match from the end
/// ///
/// ``` /// ```
/// # use clippy_utils::str_utils::{count_match_end, StrCount};
/// assert_eq!(count_match_end("hello_cat", "bye_cat"), StrCount::new(4, 4)); /// assert_eq!(count_match_end("hello_cat", "bye_cat"), StrCount::new(4, 4));
/// assert_eq!(count_match_end("if_item_thing", "enum_value"), StrCount::new(0, 0)); /// assert_eq!(count_match_end("if_item_thing", "enum_value"), StrCount::new(0, 0));
/// assert_eq!(count_match_end("Clippy", "Clippy"), StrCount::new(6, 6)); /// assert_eq!(count_match_end("Clippy", "Clippy"), StrCount::new(6, 6));