Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 <te316e89@gmail.com>"]
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(Unpin)] // `(Unpin)` is optional (create the appropriate conditional Unpin implementation)
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
34 changes: 34 additions & 0 deletions pin-project-internal/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
[package]
name = "pin-project-internal"
# NB: When modifying, also modify html_root_url in lib.rs
version = "0.3.4"
authors = ["Taiki Endo <te316e89@gmail.com>"]
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"]


[dependencies]
proc-macro2 = "0.4.13"
quote = "0.6.8"
syn = { version = "0.15.29", features = ["full", "extra-traits"] }
proc-macro-crate = "0.1.4"
# Required until https://github.com/alexcrichton/toml-rs/pull/311 is merged,
# and proc-macro-crate updates to a new version of toml-rs
serde = "1.0.97"
lazy_static = "1.3.0"
File renamed without changes.
File renamed without changes.
51 changes: 51 additions & 0 deletions pin-project-internal/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#![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 lazy_static::lazy_static;
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()),
)
}

lazy_static! {
pub(crate) static ref PIN_PROJECT_CRATE: String = {
let crate_name = proc_macro_crate::crate_name("pin-project")
.expect("pin-project-internal was used without pin-project!");
crate_name
};
}
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