Unlike expr macros, macros in type position in a derive input are rare
enough that it's not worth supporting for an issue that has such an easy
workaround (just replace `Self` in the macro input with your type name).
I think there is no ambiguity in from_str as a method name so "choose a
less ambiguous method name" is unnecessary, and it can't be a FromStr
impl in this case because FromStr's error type cannot borrow from the
input string slice.
warning: method `from_str` can be confused for the standard trait method `std::str::FromStr::from_str`
--> serde_derive_internals/src/case.rs:50:5
|
50 | / pub fn from_str(rename_all_str: &str) -> Result<Self, ParseError> {
51 | | for (name, rule) in RENAME_RULES {
52 | | if rename_all_str == *name {
53 | | return Ok(*rule);
... |
58 | | })
59 | | }
| |_____^
|
= note: `#[warn(clippy::should_implement_trait)]` on by default
= help: consider implementing the trait `std::str::FromStr` or choosing a less ambiguous method name
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#should_implement_trait
This usage is fine. It's mirroring trait signatures in syn::visit::Visit.
error: unused `self` argument
--> serde_derive/src/bound.rs:241:24
|
241 | fn visit_macro(&mut self, _mac: &'ast syn::Macro) {}
| ^^^^^^^^^
|
note: the lint level is defined here
--> serde_derive/src/lib.rs:18:22
|
18 | #![deny(clippy::all, clippy::pedantic)]
| ^^^^^^^^^^^^^^^^
= note: `#[deny(clippy::unused_self)]` implied by `#[deny(clippy::pedantic)]`
= help: consider refactoring to a associated function
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#unused_self
The builtin visitor is fairly expensive to compile (3700 lines of code),
particularly if something else in the dependency graph also enables
syn/full. For the usage in serde_derive, it turns out to be easy to
replace.
The implied lifetime bound on T only works on 1.31+. Older versions fail
with:
error[E0309]: the parameter type `T` may not live long enough
--> serde/src/private/de.rs:2548:37
|
2548 | pub struct Borrowed<'de, T: ?Sized>(pub &'de T);
| -- ^^^^^^^^^^
| |
| help: consider adding an explicit lifetime bound `T: 'de`...
|
note: ...so that the reference type `&'de T` does not outlive the data it points at
--> serde/src/private/de.rs:2548:37
|
2548 | pub struct Borrowed<'de, T: ?Sized>(pub &'de T);
| ^^^^^^^^^^
The BorrowedDeserializer was added in #1917, but only makes sense for
&str and &[u8], not for u64 which also needs to be have an
IdentifierDeserializer impl.
We shouldn't try to use the same macro for public and private types. The
API for a private type can usually be pared much further down to save
compile time, such as Debug and Copy and Clone impls.
All of these macros are only used internally within the serde crate.
There is no need for them to have #[macro_export] and need to be hidden
from docs.
Both of these modules are doc(hidden) and commented "Not public API",
but incorrect downstream code sometimes still references them. Naming
the module __private will make it more likely to be noticed in code
review.
Fixes a rustdoc warning:
warning: unneeded long form for URL
--> serde/src/lib.rs:12:27
|
12 | //! See the Serde website [https://serde.rs/] for additional documentation and
| ^^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `<https://serde.rs/>`
|
= note: `#[warn(non_autolinks)]` on by default
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:1876:9
|
1876 | / impl<'de> Deserialize<'de> for Field {
1877 | | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1878 | | where
1879 | | D: Deserializer<'de>,
... |
1917 | | }
1918 | | }
| |_________^
|
note: the lint level is defined here
--> serde/src/lib.rs:95:52
|
95 | #![cfg_attr(feature = "cargo-clippy", deny(clippy, clippy_pedantic))]
| ^^^^^^^^^^^^^^^
= note: `#[deny(clippy::items_after_statements)]` implied by `#[deny(clippy::pedantic)]`
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:1920:9
|
1920 | struct DurationVisitor;
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:1922:9
|
1922 | / impl<'de> Visitor<'de> for DurationVisitor {
1923 | | type Value = Duration;
1924 | |
1925 | | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
... |
1979 | | }
1980 | | }
| |_________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:1982:9
|
1982 | const FIELDS: &'static [&'static str] = &["secs", "nanos"];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:2001:9
|
2001 | / impl<'de> Deserialize<'de> for Field {
2002 | | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2003 | | where
2004 | | D: Deserializer<'de>,
... |
2042 | | }
2043 | | }
| |_________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:2045:9
|
2045 | struct DurationVisitor;
| ^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:2047:9
|
2047 | / impl<'de> Visitor<'de> for DurationVisitor {
2048 | | type Value = Duration;
2049 | |
2050 | | fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
... |
2108 | | }
2109 | | }
| |_________^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: adding items after statements is confusing, since items exist from the start of the scope
--> serde/src/de/impls.rs:2111:9
|
2111 | const FIELDS: &'static [&'static str] = &["secs_since_epoch", "nanos_since_epoch"];
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#items_after_statements
error: use `std::ptr::eq` when comparing raw pointers
--> serde_derive/src/de.rs:362:12
|
362 | if field as *const Field == transparent_field as *const Field {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `std::ptr::eq(field, transparent_field)`
|
note: the lint level is defined here
--> serde_derive/src/lib.rs:18:9
|
18 | #![deny(clippy::all, clippy::pedantic)]
| ^^^^^^^^^^^
= note: `#[deny(clippy::ptr_eq)]` implied by `#[deny(clippy::all)]`
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#ptr_eq