Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

taiki-e
Copy link
Owner

@taiki-e taiki-e commented Sep 10, 2019

This adds a feature to convert annotated imports to a projected type's imports.

For now, this works as an import for both projected type and projection trait. Now, this works as an import for projected type.

Examples

use pin_project::pin_project;

#[pin_project]
struct Foo<A> {
    #[pin]
    field: A,
}

mod bar {
    use pin_project::project;
    use super::Foo;
    use std::pin::Pin;

    #[project]
    use super::Foo;

    #[project]
    fn baz<A>(foo: Pin<&mut Foo<A>>) {
        #[project]
        let Foo { field } = foo.project();
        let _: Pin<&mut A> = field;
    }
}

@taiki-e
Copy link
Owner Author

taiki-e commented Sep 10, 2019

I feel that if importing both the projected-type and the original type, it will not look very good.

#[project]
use super::Foo;
use super::Foo;

@taiki-e taiki-e force-pushed the project-use branch 2 times, most recently from 441545a to b0b5b05 Compare September 10, 2019 20:57
@taiki-e

This comment has been minimized.

Err(error!(glob, "#[project] attribute may not be used on glob imports"));
}
UseTree::Rename(rename) => {
// TODO: Consider allowing the projected type to be renamed by `#[project] use Foo as Bar`.
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cc #43

@taiki-e taiki-e force-pushed the project-use branch 2 times, most recently from 93acf2a to 2241bd9 Compare September 19, 2019 05:36
@taiki-e
Copy link
Owner Author

taiki-e commented Sep 19, 2019

bors r+

@bors
Copy link
Contributor

bors bot commented Sep 19, 2019

Merge conflict

@taiki-e
Copy link
Owner Author

taiki-e commented Sep 19, 2019

bors retry

bors bot added a commit that referenced this pull request Sep 19, 2019
85: Add use statements support to #[project] attribute r=taiki-e a=taiki-e

This adds a feature to convert annotated imports to a projected type's imports.

~~For now, this works as an import for both projected type and projection trait.~~ Now, this works as an import for projected type.

### Examples

```rust
use pin_project::pin_project;

#[pin_project]
struct Foo<A> {
    #[pin]
    field: A,
}

mod bar {
    use pin_project::project;
    use super::Foo;
    use std::pin::Pin;

    #[project]
    use super::Foo;

    #[project]
    fn baz<A>(foo: Pin<&mut Foo<A>>) {
        #[project]
        let Foo { field } = foo.project();
        let _: Pin<&mut A> = field;
    }
}
```

Co-authored-by: Taiki Endo <[email protected]>
@bors
Copy link
Contributor

bors bot commented Sep 19, 2019

Build succeeded

  • taiki-e.pin-project

@bors bors bot merged commit b036c2f into master Sep 19, 2019
@taiki-e taiki-e deleted the project-use branch September 19, 2019 06:07
This was referenced Sep 20, 2019
bors bot added a commit that referenced this pull request Sep 22, 2019
101: Release 0.4.0-beta.1 r=taiki-e a=taiki-e

Changes:

* [Changed the argument type of project method back to `self: Pin<&mut Self>`.][90]

* [Removed "project_attr" feature and always enable `#[project]` attribute.][94]

* [Removed "renamed" feature.][100]

* [`#[project]` attribute can now be used for `use` statements.][85]

* [Added `project_ref` method and `#[project_ref]` attribute.][93]

* [`#[pin_project]` attribute now determines the visibility of the projection type/method is based on the original type.][96]

cc #21

[85]: #85
[90]: #90
[93]: #93
[94]: #94
[96]: #96
[100]: #100

Co-authored-by: Taiki Endo <[email protected]>
@taiki-e taiki-e added the A-project-attribute Area: #[project], #[project_ref], and #[project_replace] (note: this was removed in v1.0) label Sep 24, 2019
@taiki-e taiki-e mentioned this pull request Sep 25, 2019
bors bot added a commit that referenced this pull request Sep 25, 2019
109: Release 0.4.0 r=taiki-e a=taiki-e

cc #21

### Changes since the latest 0.3 release:

* **Pin projection has become a safe operation.** In the absence of other unsafe code that you write, it is impossible to cause undefined behavior. (#18)

* `#[unsafe_project]` attribute has been replaced with `#[pin_project]` attribute. (#18, #33)

* The `Unpin` argument has been removed - an `Unpin` impl is now generated by default. (#18)

* Drop impls must be specified with `#[pinned_drop]` instead of via a normal `Drop` impl. (#18, #33, #86)

* `Unpin` impls must be specified with an impl of `UnsafeUnpin`, instead of implementing the normal `Unpin` trait. (#18)

* `#[pin_project]` attribute now determines the visibility of the projection type/method is based on the original type. (#96)

* `#[pin_project]` can now be used for public type with private field types. (#53)

* `#[pin_project]` can now interoperate with `#[cfg()]`. (#77)

* Added `project_ref` method to `#[pin_project]` types. (#93)

* Added `#[project_ref]` attribute. (#93)

* Removed "project_attr" feature and always enable `#[project]` attribute. (#94)

* `#[project]` attribute can now be used for `impl` blocks. (#46)

* `#[project]` attribute can now be used for `use` statements. (#85)

* `#[project]` attribute now supports `match` expressions at the position of the initializer expression of `let` expressions. (#51)

### Changes since the 0.4.0-beta.1 release:

* Fixed an issue that caused an error when using `#[pin_project(UnsafeUnpin)]` and not providing a manual `UnsafeUnpin` implementation on a type with no generics or lifetime. (#107)


Co-authored-by: Taiki Endo <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-project-attribute Area: #[project], #[project_ref], and #[project_replace] (note: this was removed in v1.0)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant