summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml2
-rw-r--r--Cargo.toml.orig2
-rw-r--r--METADATA8
-rw-r--r--TEST_MAPPING7
-rw-r--r--src/lib.rs11
-rw-r--r--src/pin_project/args.rs13
-rw-r--r--src/pin_project/attribute.rs4
-rw-r--r--src/pin_project/derive.rs38
-rw-r--r--src/pinned_drop.rs10
-rw-r--r--src/utils.rs6
10 files changed, 53 insertions, 48 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 234def0..57fba47 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,7 +13,7 @@
[package]
edition = "2018"
name = "pin-project-internal"
-version = "1.0.1"
+version = "1.0.2"
authors = ["Taiki Endo <te316e89@gmail.com>"]
description = "Implementation detail of the `pin-project` crate.\n"
homepage = "https://github.com/taiki-e/pin-project"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 4a4d1d2..0f018e8 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
[package]
name = "pin-project-internal"
-version = "1.0.1"
+version = "1.0.2"
authors = ["Taiki Endo <te316e89@gmail.com>"]
edition = "2018"
license = "Apache-2.0 OR MIT"
diff --git a/METADATA b/METADATA
index 69b7fd9..dd0e798 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@ third_party {
}
url {
type: ARCHIVE
- value: "https://static.crates.io/crates/pin-project-internal/pin-project-internal-1.0.1.crate"
+ value: "https://static.crates.io/crates/pin-project-internal/pin-project-internal-1.0.2.crate"
}
- version: "1.0.1"
+ version: "1.0.2"
license_type: NOTICE
last_upgrade_date {
year: 2020
- month: 10
- day: 26
+ month: 11
+ day: 18
}
}
diff --git a/TEST_MAPPING b/TEST_MAPPING
index 89ed5be..195e52f 100644
--- a/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -4,13 +4,6 @@
{
"host": true,
"name": "pin-project-internal_host_test_src_lib"
- },
- {
- "host": true,
- "name": "futures-util_host_test_src_lib"
- },
- {
- "name": "futures-util_device_test_src_lib"
}
]
}
diff --git a/src/lib.rs b/src/lib.rs
index 0fdb9c4..05c2b49 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,6 +1,6 @@
//! Implementation detail of the `pin-project` crate. - **do not use directly**
-#![doc(html_root_url = "https://docs.rs/pin-project-internal/1.0.1")]
+#![doc(html_root_url = "https://docs.rs/pin-project-internal/1.0.2")]
#![doc(test(
no_crate_inject,
attr(deny(warnings, rust_2018_idioms, single_use_lifetimes), allow(dead_code))
@@ -8,11 +8,14 @@
#![warn(unsafe_code)]
#![warn(future_incompatible, rust_2018_idioms, single_use_lifetimes, unreachable_pub)]
#![warn(clippy::all, clippy::default_trait_access)]
-// mem::take and #[non_exhaustive] requires Rust 1.40, matches! requires Rust 1.42
+// mem::take, #[non_exhaustive], and Option::{as_deref, as_deref_mut} require Rust 1.40,
+// matches! requires Rust 1.42, str::{strip_prefix, strip_suffix} requires Rust 1.45
#![allow(
clippy::mem_replace_with_default,
clippy::manual_non_exhaustive,
- clippy::match_like_matches_macro
+ clippy::option_as_ref_deref,
+ clippy::match_like_matches_macro,
+ clippy::manual_strip
)]
#![allow(clippy::needless_doctest_main)]
@@ -302,7 +305,7 @@ use proc_macro::TokenStream;
/// #[pin_project]
/// struct Struct<T> {
/// field: T,
-/// #[pin]
+/// #[pin] // <------ This `#[pin]` is required to make `Struct` to `!Unpin`.
/// _pin: PhantomPinned,
/// }
/// ```
diff --git a/src/pin_project/args.rs b/src/pin_project/args.rs
index 38e43d4..c321260 100644
--- a/src/pin_project/args.rs
+++ b/src/pin_project/args.rs
@@ -3,7 +3,7 @@ use quote::quote;
use syn::{
parse::{Parse, ParseStream},
spanned::Spanned,
- *,
+ Attribute, Error, Ident, Result, Token,
};
use super::PIN;
@@ -45,11 +45,11 @@ pub(super) fn parse_args(attrs: &[Attribute]) -> Result<Args> {
// As the `#[pin]` attribute generated by `#[pin_project]`
// has the same span as `#[pin_project]`, it is possible
// that a useless error message will be generated.
+ // So, use the span of `prev_attr` if it is not a valid attribute.
let res = syn::parse2::<Input>(attr.tokens.clone()).unwrap().0;
let span = match (prev_res, res) {
(Some(_), _) => attr,
- (_, Some(_)) => prev_attr,
- (None, None) => prev_attr,
+ (None, _) => prev_attr,
};
Err(error!(span, "duplicate #[pin] attribute"))
} else {
@@ -236,6 +236,7 @@ pub(super) enum ProjReplace {
span: Span,
},
/// `project_replace = <ident>`.
+ #[allow(dead_code)] // false positive that fixed in Rust 1.38
Named {
span: Span,
ident: Ident,
@@ -246,12 +247,12 @@ impl ProjReplace {
/// Return the span of this argument.
pub(super) fn span(&self) -> Option<Span> {
match self {
- ProjReplace::None => None,
- ProjReplace::Named { span, .. } | ProjReplace::Unnamed { span, .. } => Some(*span),
+ Self::None => None,
+ Self::Named { span, .. } | Self::Unnamed { span, .. } => Some(*span),
}
}
pub(super) fn ident(&self) -> Option<&Ident> {
- if let ProjReplace::Named { ident, .. } = self { Some(ident) } else { None }
+ if let Self::Named { ident, .. } = self { Some(ident) } else { None }
}
}
diff --git a/src/pin_project/attribute.rs b/src/pin_project/attribute.rs
index 7945aba..92ed547 100644
--- a/src/pin_project/attribute.rs
+++ b/src/pin_project/attribute.rs
@@ -2,7 +2,7 @@ use proc_macro2::TokenStream;
use quote::quote;
use syn::{
parse::{Parse, ParseStream},
- *,
+ Attribute, Result, Token, Visibility,
};
use super::PIN;
@@ -36,7 +36,7 @@ pub(super) fn parse_attribute(args: &TokenStream, input: TokenStream) -> Result<
})
}
-#[allow(dead_code)] // https://github.com/rust-lang/rust/issues/56750
+#[allow(dead_code)] // false positive that fixed in Rust 1.39
struct Input {
attrs: Vec<Attribute>,
body: TokenStream,
diff --git a/src/pin_project/derive.rs b/src/pin_project/derive.rs
index 1a598b7..63cd142 100644
--- a/src/pin_project/derive.rs
+++ b/src/pin_project/derive.rs
@@ -1,6 +1,10 @@
use proc_macro2::{Delimiter, Group, Span, TokenStream};
use quote::{format_ident, quote, quote_spanned, ToTokens};
-use syn::{visit_mut::VisitMut, *};
+use syn::{
+ parse_quote, token, visit_mut::VisitMut, Attribute, Data, DataEnum, DeriveInput, Error, Field,
+ Fields, FieldsNamed, FieldsUnnamed, Generics, Ident, Index, Lifetime, LifetimeDef, Meta,
+ MetaList, NestedMeta, Result, Token, Type, Variant, Visibility, WhereClause,
+};
use super::{
args::{parse_args, Args, ProjReplace, UnpinImpl},
@@ -101,6 +105,9 @@ fn global_allowed_lints() -> TokenStream {
#[allow(explicit_outlives_requirements)] // https://github.com/rust-lang/rust/issues/60993
#[allow(single_use_lifetimes)] // https://github.com/rust-lang/rust/issues/55058
#[allow(unreachable_pub)] // This lint warns `pub` field in private struct.
+ // This lint warns of `clippy::*` generated by external macros.
+ // We allow this lint for compatibility with older compilers.
+ #[allow(clippy::unknown_clippy_lints)]
#[allow(clippy::pattern_type_mismatch)]
#[allow(clippy::redundant_pub_crate)] // This lint warns `pub(crate)` field in private struct.
}
@@ -118,20 +125,20 @@ fn proj_allowed_lints(kind: TypeKind) -> (TokenStream, TokenStream, TokenStream)
};
let global_allowed_lints = global_allowed_lints();
let proj_mut = quote! {
+ #global_allowed_lints
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(clippy::mut_mut)] // This lint warns `&mut &mut <ty>`.
#[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326}
- #global_allowed_lints
};
let proj_ref = quote! {
+ #global_allowed_lints
#[allow(dead_code)] // This lint warns unused fields/variants.
#[allow(clippy::type_repetition_in_bounds)] // https://github.com/rust-lang/rust-clippy/issues/4326
- #global_allowed_lints
};
let proj_own = quote! {
+ #global_allowed_lints
#[allow(dead_code)] // This lint warns unused fields/variants.
#large_enum_variant
- #global_allowed_lints
};
(proj_mut, proj_ref, proj_own)
}
@@ -500,7 +507,6 @@ fn visit_variants(cx: &mut Context<'_>, variants: &Variants) -> Result<Projected
},
};
- let orig_ident = cx.orig.ident;
let proj_ident = &cx.proj.mut_ident;
let proj_ref_ident = &cx.proj.ref_ident;
proj_variants.extend(quote! {
@@ -513,19 +519,13 @@ fn visit_variants(cx: &mut Context<'_>, variants: &Variants) -> Result<Projected
#ident #proj_own_fields,
});
proj_arms.extend(quote! {
- #orig_ident::#ident #proj_pat => {
- #proj_ident::#ident #proj_body
- }
+ Self::#ident #proj_pat => #proj_ident::#ident #proj_body,
});
proj_ref_arms.extend(quote! {
- #orig_ident::#ident #proj_pat => {
- #proj_ref_ident::#ident #proj_body
- }
+ Self::#ident #proj_pat => #proj_ref_ident::#ident #proj_body,
});
proj_own_arms.extend(quote! {
- #orig_ident::#ident #proj_pat => {
- #proj_own_body
- }
+ Self::#ident #proj_pat => { #proj_own_body }
});
}
@@ -545,6 +545,10 @@ fn visit_fields(
fields: &Fields,
delim: Delimiter,
) -> Result<ProjectedFields> {
+ fn surround(delim: Delimiter, tokens: TokenStream) -> TokenStream {
+ Group::new(delim, tokens).into_token_stream()
+ }
+
let mut proj_pat = TokenStream::new();
let mut proj_body = TokenStream::new();
let mut proj_fields = TokenStream::new();
@@ -553,7 +557,7 @@ fn visit_fields(
let mut proj_move = TokenStream::new();
let mut pinned_bindings = Vec::with_capacity(fields.len());
- for (i, Field { attrs, vis, ident, colon_token, ty, .. }) in fields.iter().enumerate() {
+ for (i, Field { attrs, vis, ident, colon_token, ty }) in fields.iter().enumerate() {
let binding = ident.clone().unwrap_or_else(|| format_ident!("_{}", i));
proj_pat.extend(quote!(#binding,));
if attrs.position_exact(PIN)?.is_some() {
@@ -596,10 +600,6 @@ fn visit_fields(
}
}
- fn surround(delim: Delimiter, tokens: TokenStream) -> TokenStream {
- Group::new(delim, tokens).into_token_stream()
- }
-
let proj_pat = surround(delim, proj_pat);
let proj_body = surround(delim, proj_body);
let proj_fields = surround(delim, proj_fields);
diff --git a/src/pinned_drop.rs b/src/pinned_drop.rs
index 86b0f47..ecf52dd 100644
--- a/src/pinned_drop.rs
+++ b/src/pinned_drop.rs
@@ -1,6 +1,10 @@
use proc_macro2::TokenStream;
-use quote::{quote, ToTokens};
-use syn::{spanned::Spanned, visit_mut::VisitMut, *};
+use quote::{format_ident, quote, ToTokens};
+use syn::{
+ parse_quote, spanned::Spanned, visit_mut::VisitMut, Error, FnArg, GenericArgument, ImplItem,
+ ItemImpl, Pat, PatIdent, Path, PathArguments, Result, ReturnType, Signature, Token, Type,
+ TypePath, TypeReference,
+};
use crate::utils::{parse_as_empty, prepend_underscore_to_self, ReplaceReceiver, SliceExt};
@@ -196,7 +200,7 @@ fn expand_impl(item: &mut ItemImpl) {
// `fn drop(mut self: Pin<&mut Self>)` -> `fn __drop_inner<T>(mut __self: Pin<&mut Receiver>)`
let drop_inner = {
let mut drop_inner = method.clone();
- let ident = Ident::new("__drop_inner", drop_inner.sig.ident.span());
+ let ident = format_ident!("__drop_inner");
// Add a dummy `__drop_inner` function to prevent users call outer `__drop_inner`.
drop_inner.block.stmts.insert(0, parse_quote!(fn #ident() {}));
drop_inner.sig.ident = ident;
diff --git a/src/utils.rs b/src/utils.rs
index 2fd8a61..fe1bf35 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -3,9 +3,13 @@ use quote::{quote, quote_spanned, ToTokens};
use std::{iter::FromIterator, mem};
use syn::{
parse::{Parse, ParseBuffer, ParseStream},
+ parse_quote,
punctuated::Punctuated,
+ token,
visit_mut::{self, VisitMut},
- *,
+ Attribute, ExprPath, ExprStruct, Generics, Ident, Item, Lifetime, LifetimeDef, Macro, PatPath,
+ PatStruct, PatTupleStruct, Path, PathArguments, PredicateType, QSelf, Result, Token, Type,
+ TypeParamBound, TypePath, Variant, Visibility, WherePredicate,
};
pub(crate) type Variants = Punctuated<Variant, Token![,]>;