Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace unsafe_project with safe pin_projectable attribute #18

Merged
merged 14 commits into from
Aug 5, 2019
Merged
38 changes: 5 additions & 33 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,34 +1,6 @@
[package]
name = "pin-project"
# NB: When modifying, also modify html_root_url in lib.rs
version = "0.3.4"
authors = ["Taiki Endo <[email protected]>"]
edition = "2018"
license = "Apache-2.0/MIT"
description = "An attribute that creates a projection struct covering all the fields."
repository = "https://github.com/taiki-e/pin-project"
documentation = "https://docs.rs/pin-project/"
readme = "README.md"
keywords = ["pin", "macros", "attribute"]
categories = ["rust-patterns"]
exclude = ["/.travis.yml", "/bors.toml"]
[workspace]

[badges]
travis-ci = { repository = "taiki-e/pin-project" }

[lib]
proc-macro = true

[features]
# Default features.
default = ["project_attr"]
# Enable to use `project` attribute.
project_attr = ["syn/visit-mut"]

[dependencies]
proc-macro2 = "0.4.13"
quote = "0.6.8"
syn = { version = "0.15.29", features = ["full"] }

[dev-dependencies]
compiletest = { version = "0.3.21", package = "compiletest_rs", features = ["stable", "tmp"] }
members = [
"pin-project",
"pin-project-internal",
]
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ The current version of pin-project requires Rust 1.33 or later.

## Examples

[`unsafe_project`] attribute creates a projection struct covering all the fields.
[`pin_projectable`] attribute creates a projection struct covering all the fields.

```rust
use pin_project::unsafe_project;
use pin_project::pin_projectable;
use std::pin::Pin;

#[unsafe_project(Unpin)] // `(Unpin)` is optional (create the appropriate conditional Unpin implementation)
#[pin_projectable]
struct Foo<T, U> {
#[pin]
future: T,
Expand All @@ -50,7 +50,7 @@ impl<T, U> Foo<T, U> {

[Code like this will be generated](doc/struct-example-1.md)

[`unsafe_project`]: https://docs.rs/pin-project/0.3/pin_project/attr.unsafe_project.html
[`pin_projectable`]: https://docs.rs/pin-project/0.3/pin_project/attr.pin_projectable.html

## License

Expand Down
36 changes: 36 additions & 0 deletions pin-project-internal/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
[package]
name = "pin-project-internal"
# NB: When modifying, also modify html_root_url in lib.rs
version = "0.3.4"
authors = ["Taiki Endo <[email protected]>"]
edition = "2018"
license = "Apache-2.0/MIT"
description = "An interal crate to support pin_project - do not use directly"
repository = "https://github.com/taiki-e/pin-project"
documentation = "https://docs.rs/pin-project/"
readme = "README.md"
keywords = ["pin", "macros", "attribute"]
categories = ["rust-patterns"]
exclude = ["/.travis.yml", "/bors.toml"]

[lib]
proc-macro = true

[features]
# Default features.
default = ["project_attr"]
# Enable to use `project` attribute.
project_attr = ["syn/visit-mut"]
# Enable to allow using the crate with a renamed 'pin-project' dependency
renamed = ["proc-macro-crate", "serde", "lazy_static"]


[dependencies]
proc-macro2 = "0.4.13"
quote = "0.6.8"
syn = { version = "0.15.29", features = ["full", "extra-traits"] }
proc-macro-crate = { version = "0.1.4", optional = true }
# Required until a new toml-rs release is made with https://github.com/alexcrichton/toml-rs/pull/311,
# and proc-macro-crate updates to that new version of toml-rs.
serde = { version = "1.0.97", optional = true }
lazy_static = { version = "1.3.0", optional = true }
File renamed without changes.
File renamed without changes.
50 changes: 50 additions & 0 deletions pin-project-internal/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#![recursion_limit = "256"]
#![doc(html_root_url = "https://docs.rs/pin-project/0.3.3")]
#![doc(test(attr(deny(warnings), allow(dead_code, unused_assignments, unused_variables))))]
#![warn(unsafe_code)]
#![warn(rust_2018_idioms, unreachable_pub)]
#![warn(single_use_lifetimes)]
#![warn(clippy::all, clippy::pedantic)]
#![warn(clippy::nursery)]

extern crate proc_macro;

#[macro_use]
mod utils;

mod pin_projectable;
#[cfg(feature = "project_attr")]
mod project;

use proc_macro::TokenStream;

#[cfg(feature = "project_attr")]
#[proc_macro_attribute]
pub fn project(args: TokenStream, input: TokenStream) -> TokenStream {
assert!(args.is_empty());
TokenStream::from(project::attribute(input.into()))
}

/// This is a doc comment from the defining crate!
#[proc_macro]
pub fn pin_project(input: TokenStream) -> TokenStream {
TokenStream::from(
pin_projectable::pin_project(input.into()).unwrap_or_else(|e| e.to_compile_error()),
)
}

#[proc_macro_attribute]
pub fn pin_projectable(args: TokenStream, input: TokenStream) -> TokenStream {
TokenStream::from(
pin_projectable::attribute(args.into(), input.into())
.unwrap_or_else(|e| e.to_compile_error()),
)
}

#[cfg(feature = "renamed")]
lazy_static::lazy_static! {
pub(crate) static ref PIN_PROJECT_CRATE: String = {
proc_macro_crate::crate_name("pin-project")
.expect("pin-project-internal was used without pin-project!")
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@ use crate::utils::{proj_ident, VecExt};

use super::*;

pub(super) fn parse(args: TokenStream, mut item: ItemEnum) -> Result<TokenStream> {
pub(super) fn parse(
args: TokenStream,
mut item: ItemEnum,
pinned_drop: Option<ItemFn>,
) -> Result<TokenStream> {
let impl_drop = ImplDrop::new(item.generics.clone(), pinned_drop)?;
let mut impl_unpin = ImplUnpin::new(args, &item.generics)?;

if item.variants.is_empty() {
Expand All @@ -31,6 +36,7 @@ pub(super) fn parse(args: TokenStream, mut item: ItemEnum) -> Result<TokenStream
enum #proj_ident #proj_generics #where_clause #proj_item_body
};

proj_items.extend(impl_drop.build(ident));
proj_items.extend(impl_unpin.build(ident));
proj_items.extend(quote! {
impl #impl_generics #ident #ty_generics #where_clause {
Expand Down
Loading