From 8a24504bc2f4fd6838389b2422973270fb957cd4 Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Fri, 4 Sep 2020 00:49:10 +0900 Subject: [PATCH] Remove Replace argument --- .../src/pin_project/derive.rs | 30 ++-- tests/ui/pin_project/invalid.rs | 18 +- tests/ui/pin_project/invalid.stderr | 170 ++++++++---------- 3 files changed, 93 insertions(+), 125 deletions(-) diff --git a/pin-project-internal/src/pin_project/derive.rs b/pin-project-internal/src/pin_project/derive.rs index 56a3d474..2ae947fb 100644 --- a/pin-project-internal/src/pin_project/derive.rs +++ b/pin-project-internal/src/pin_project/derive.rs @@ -125,13 +125,13 @@ struct Args { project: Option, /// `project_ref = ` argument. project_ref: Option, - /// `project_replace [= ]` or `Replace` argument. + /// `project_replace [= ]` argument. project_replace: ProjReplace, } enum ProjReplace { None, - /// `project_replace` or `Replace`. + /// `project_replace`. Unnamed { span: Span, }, @@ -242,8 +242,6 @@ impl Parse for Args { let mut not_unpin = None; let mut project = None; let mut project_ref = None; - - let mut replace = None; let mut project_replace_value = None; let mut project_replace_span = None; @@ -290,9 +288,10 @@ impl Parse for Args { } } "Replace" => { - if replace.replace(token.span()).is_some() { - return Err(error!(token, "duplicate `Replace` argument")); - } + return Err(error!( + token, + "`Replace` argument was removed, use `project_replace` argument instead" + )); } _ => return Err(error!(token, "unexpected argument: {}", token)), } @@ -333,19 +332,12 @@ impl Parse for Args { span, "arguments `PinnedDrop` and `project_replace` are mutually exclusive", )); - } else if replace.is_some() { - return Err(Error::new( - span, - "arguments `PinnedDrop` and `Replace` are mutually exclusive", - )); } } - let project_replace = match (project_replace_span, project_replace_value, replace) { - (None, _, None) => ProjReplace::None, - // If both `project_replace` and `Replace` are specified, - // We always prefer `project_replace`'s span, - (Some(span), Some(ident), _) => ProjReplace::Named { ident, span }, - (Some(span), ..) | (None, _, Some(span)) => ProjReplace::Unnamed { span }, + let project_replace = match (project_replace_span, project_replace_value) { + (None, _) => ProjReplace::None, + (Some(span), Some(ident)) => ProjReplace::Named { ident, span }, + (Some(span), None) => ProjReplace::Unnamed { span }, }; let unpin_impl = match (unsafe_unpin, not_unpin) { (None, None) => UnpinImpl::Default, @@ -427,7 +419,7 @@ struct Context<'a> { project: bool, /// `project_ref` argument. project_ref: bool, - /// `project_replace [= ]` or `Replace` argument. + /// `project_replace [= ]` argument. project_replace: ProjReplace, } diff --git a/tests/ui/pin_project/invalid.rs b/tests/ui/pin_project/invalid.rs index 9c51bec8..985fe9a3 100644 --- a/tests/ui/pin_project/invalid.rs +++ b/tests/ui/pin_project/invalid.rs @@ -88,6 +88,9 @@ mod pin_item { mod pin_project_argument { use pin_project::pin_project; + #[pin_project(Replace)] //~ ERROR `Replace` argument was removed, use `project_replace` argument instead + struct RemovedReplace(#[pin] ()); + #[pin_project(UnsafeUnpin,,)] //~ ERROR expected identifier struct Unexpected1(#[pin] ()); @@ -106,9 +109,6 @@ mod pin_project_argument { #[pin_project(PinnedDrop, PinnedDrop)] //~ ERROR duplicate `PinnedDrop` argument struct DuplicatePinnedDrop(#[pin] ()); - #[pin_project(Replace, Replace)] //~ ERROR duplicate `Replace` argument - struct DuplicateReplace(#[pin] ()); - #[pin_project(UnsafeUnpin, UnsafeUnpin)] //~ ERROR duplicate `UnsafeUnpin` argument struct DuplicateUnsafeUnpin(#[pin] ()); @@ -142,24 +142,12 @@ mod pin_project_argument { #[pin_project(project_replace = A)] // Ok struct ProjectReplaceWithoutReplace(#[pin] ()); - #[pin_project(PinnedDrop, Replace)] //~ ERROR arguments `PinnedDrop` and `Replace` are mutually exclusive - struct PinnedDropWithReplace1(#[pin] ()); - - #[pin_project(Replace, UnsafeUnpin, PinnedDrop)] //~ ERROR arguments `PinnedDrop` and `Replace` are mutually exclusive - struct PinnedDropWithReplace2(#[pin] ()); - #[pin_project(PinnedDrop, project_replace)] //~ ERROR arguments `PinnedDrop` and `project_replace` are mutually exclusive struct PinnedDropWithProjectReplace1(#[pin] ()); #[pin_project(project_replace, UnsafeUnpin, PinnedDrop)] //~ ERROR arguments `PinnedDrop` and `project_replace` are mutually exclusive struct PinnedDropWithProjectReplace2(#[pin] ()); - #[pin_project(project_replace, Replace)] // Ok - struct ProjectReplaceWithReplace1(#[pin] ()); - - #[pin_project(project_replace = B, Replace)] // Ok - struct ProjectReplaceWithReplace2(#[pin] ()); - #[pin_project(UnsafeUnpin, !Unpin)] //~ ERROR arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive struct UnsafeUnpinWithNotUnpin1(#[pin] ()); diff --git a/tests/ui/pin_project/invalid.stderr b/tests/ui/pin_project/invalid.stderr index 3c6af57c..9d8044cd 100644 --- a/tests/ui/pin_project/invalid.stderr +++ b/tests/ui/pin_project/invalid.stderr @@ -64,42 +64,42 @@ error: #[pin] attribute may only be used on fields of structs or variants 82 | #[pin] //~ ERROR may only be used on fields of structs or variants | ^^^^^^ +error: `Replace` argument was removed, use `project_replace` argument instead + --> $DIR/invalid.rs:91:19 + | +91 | #[pin_project(Replace)] //~ ERROR `Replace` argument was removed, use `project_replace` argument instead + | ^^^^^^^ + error: expected identifier - --> $DIR/invalid.rs:91:31 + --> $DIR/invalid.rs:94:31 | -91 | #[pin_project(UnsafeUnpin,,)] //~ ERROR expected identifier +94 | #[pin_project(UnsafeUnpin,,)] //~ ERROR expected identifier | ^ error: unexpected argument: Foo - --> $DIR/invalid.rs:94:19 + --> $DIR/invalid.rs:97:19 | -94 | #[pin_project(Foo)] //~ ERROR unexpected argument +97 | #[pin_project(Foo)] //~ ERROR unexpected argument | ^^^ error: expected identifier - --> $DIR/invalid.rs:97:19 - | -97 | #[pin_project(,UnsafeUnpin)] //~ ERROR expected identifier - | ^ + --> $DIR/invalid.rs:100:19 + | +100 | #[pin_project(,UnsafeUnpin)] //~ ERROR expected identifier + | ^ error: expected `,` - --> $DIR/invalid.rs:103:30 + --> $DIR/invalid.rs:106:30 | -103 | #[pin_project(PinnedDrop PinnedDrop)] //~ ERROR expected `,` +106 | #[pin_project(PinnedDrop PinnedDrop)] //~ ERROR expected `,` | ^^^^^^^^^^ error: duplicate `PinnedDrop` argument - --> $DIR/invalid.rs:106:31 + --> $DIR/invalid.rs:109:31 | -106 | #[pin_project(PinnedDrop, PinnedDrop)] //~ ERROR duplicate `PinnedDrop` argument +109 | #[pin_project(PinnedDrop, PinnedDrop)] //~ ERROR duplicate `PinnedDrop` argument | ^^^^^^^^^^ -error: duplicate `Replace` argument - --> $DIR/invalid.rs:109:28 - | -109 | #[pin_project(Replace, Replace)] //~ ERROR duplicate `Replace` argument - | ^^^^^^^ - error: duplicate `UnsafeUnpin` argument --> $DIR/invalid.rs:112:32 | @@ -160,187 +160,175 @@ error: duplicate `project_replace` argument 139 | #[pin_project(project_replace = A, project_replace)] //~ ERROR duplicate `project_replace` argument | ^^^^^^^^^^^^^^^ -error: arguments `PinnedDrop` and `Replace` are mutually exclusive - --> $DIR/invalid.rs:145:19 - | -145 | #[pin_project(PinnedDrop, Replace)] //~ ERROR arguments `PinnedDrop` and `Replace` are mutually exclusive - | ^^^^^^^^^^ - -error: arguments `PinnedDrop` and `Replace` are mutually exclusive - --> $DIR/invalid.rs:148:41 - | -148 | #[pin_project(Replace, UnsafeUnpin, PinnedDrop)] //~ ERROR arguments `PinnedDrop` and `Replace` are mutually exclusive - | ^^^^^^^^^^ - error: arguments `PinnedDrop` and `project_replace` are mutually exclusive - --> $DIR/invalid.rs:151:19 + --> $DIR/invalid.rs:145:19 | -151 | #[pin_project(PinnedDrop, project_replace)] //~ ERROR arguments `PinnedDrop` and `project_replace` are mutually exclusive +145 | #[pin_project(PinnedDrop, project_replace)] //~ ERROR arguments `PinnedDrop` and `project_replace` are mutually exclusive | ^^^^^^^^^^ error: arguments `PinnedDrop` and `project_replace` are mutually exclusive - --> $DIR/invalid.rs:154:49 + --> $DIR/invalid.rs:148:49 | -154 | #[pin_project(project_replace, UnsafeUnpin, PinnedDrop)] //~ ERROR arguments `PinnedDrop` and `project_replace` are mutually exclusive +148 | #[pin_project(project_replace, UnsafeUnpin, PinnedDrop)] //~ ERROR arguments `PinnedDrop` and `project_replace` are mutually exclusive | ^^^^^^^^^^ error: arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive - --> $DIR/invalid.rs:163:19 + --> $DIR/invalid.rs:151:19 | -163 | #[pin_project(UnsafeUnpin, !Unpin)] //~ ERROR arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive +151 | #[pin_project(UnsafeUnpin, !Unpin)] //~ ERROR arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive | ^^^^^^^^^^^ error: arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive - --> $DIR/invalid.rs:166:39 + --> $DIR/invalid.rs:154:39 | -166 | #[pin_project(!Unpin, PinnedDrop, UnsafeUnpin)] //~ ERROR arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive +154 | #[pin_project(!Unpin, PinnedDrop, UnsafeUnpin)] //~ ERROR arguments `UnsafeUnpin` and `!Unpin` are mutually exclusive | ^^^^^^^^^^^ error: expected `!Unpin`, found `!` - --> $DIR/invalid.rs:169:19 + --> $DIR/invalid.rs:157:19 | -169 | #[pin_project(!)] //~ ERROR expected `!Unpin`, found `!` +157 | #[pin_project(!)] //~ ERROR expected `!Unpin`, found `!` | ^ error: unexpected argument: Unpin - --> $DIR/invalid.rs:172:19 + --> $DIR/invalid.rs:160:19 | -172 | #[pin_project(Unpin)] //~ ERROR unexpected argument +160 | #[pin_project(Unpin)] //~ ERROR unexpected argument | ^^^^^ error: expected `project = `, found `project` - --> $DIR/invalid.rs:175:19 + --> $DIR/invalid.rs:163:19 | -175 | #[pin_project(project)] //~ ERROR expected `project = `, found `project` +163 | #[pin_project(project)] //~ ERROR expected `project = `, found `project` | ^^^^^^^ error: expected `project = `, found `project =` - --> $DIR/invalid.rs:178:19 + --> $DIR/invalid.rs:166:19 | -178 | #[pin_project(project = )] //~ ERROR expected `project = `, found `project =` +166 | #[pin_project(project = )] //~ ERROR expected `project = `, found `project =` | ^^^^^^^^^ error: expected identifier - --> $DIR/invalid.rs:181:29 + --> $DIR/invalid.rs:169:29 | -181 | #[pin_project(project = !)] //~ ERROR expected identifier +169 | #[pin_project(project = !)] //~ ERROR expected identifier | ^ error: expected `project_ref = `, found `project_ref` - --> $DIR/invalid.rs:184:19 + --> $DIR/invalid.rs:172:19 | -184 | #[pin_project(project_ref)] //~ ERROR expected `project_ref = `, found `project_ref` +172 | #[pin_project(project_ref)] //~ ERROR expected `project_ref = `, found `project_ref` | ^^^^^^^^^^^ error: expected `project_ref = `, found `project_ref =` - --> $DIR/invalid.rs:187:19 + --> $DIR/invalid.rs:175:19 | -187 | #[pin_project(project_ref = )] //~ ERROR expected `project_ref = `, found `project_ref =` +175 | #[pin_project(project_ref = )] //~ ERROR expected `project_ref = `, found `project_ref =` | ^^^^^^^^^^^^^ error: expected identifier - --> $DIR/invalid.rs:190:33 + --> $DIR/invalid.rs:178:33 | -190 | #[pin_project(project_ref = !)] //~ ERROR expected identifier +178 | #[pin_project(project_ref = !)] //~ ERROR expected identifier | ^ error: expected `project_replace = `, found `project_replace =` - --> $DIR/invalid.rs:196:19 + --> $DIR/invalid.rs:184:19 | -196 | #[pin_project(project_replace = )] //~ ERROR expected `project_replace = `, found `project_replace =` +184 | #[pin_project(project_replace = )] //~ ERROR expected `project_replace = `, found `project_replace =` | ^^^^^^^^^^^^^^^^^ error: expected identifier - --> $DIR/invalid.rs:199:37 + --> $DIR/invalid.rs:187:37 | -199 | #[pin_project(project_replace = !)] //~ ERROR expected identifier +187 | #[pin_project(project_replace = !)] //~ ERROR expected identifier | ^ error: name `A` is already specified by `project` argument - --> $DIR/invalid.rs:206:46 + --> $DIR/invalid.rs:194:46 | -206 | #[pin_project(project = A, project_ref = A)] //~ ERROR name `A` is already specified by `project` argument +194 | #[pin_project(project = A, project_ref = A)] //~ ERROR name `A` is already specified by `project` argument | ^ error: name `A` is already specified by `project` argument - --> $DIR/invalid.rs:209:50 + --> $DIR/invalid.rs:197:50 | -209 | #[pin_project(project = A, project_replace = A)] //~ ERROR name `A` is already specified by `project` argument +197 | #[pin_project(project = A, project_replace = A)] //~ ERROR name `A` is already specified by `project` argument | ^ error: name `A` is already specified by `project_ref` argument - --> $DIR/invalid.rs:212:54 + --> $DIR/invalid.rs:200:54 | -212 | #[pin_project(project_ref = A, project_replace = A)] //~ ERROR name `A` is already specified by `project_ref` argument +200 | #[pin_project(project_ref = A, project_replace = A)] //~ ERROR name `A` is already specified by `project_ref` argument | ^ error: duplicate #[pin_project] attribute - --> $DIR/invalid.rs:220:5 + --> $DIR/invalid.rs:208:5 | -220 | #[pin_project] //~ ERROR duplicate #[pin_project] attribute +208 | #[pin_project] //~ ERROR duplicate #[pin_project] attribute | ^^^^^^^^^^^^^^ error: #[pin_project] attribute may not be used on structs with zero fields - --> $DIR/invalid.rs:228:19 + --> $DIR/invalid.rs:216:19 | -228 | struct Struct {} //~ ERROR may not be used on structs with zero fields +216 | struct Struct {} //~ ERROR may not be used on structs with zero fields | ^^ error: #[pin_project] attribute may not be used on structs with zero fields - --> $DIR/invalid.rs:231:23 + --> $DIR/invalid.rs:219:23 | -231 | struct TupleStruct(); //~ ERROR may not be used on structs with zero fields +219 | struct TupleStruct(); //~ ERROR may not be used on structs with zero fields | ^^ error: #[pin_project] attribute may not be used on structs with zero fields - --> $DIR/invalid.rs:234:12 + --> $DIR/invalid.rs:222:12 | -234 | struct UnitStruct; //~ ERROR may not be used on structs with zero fields +222 | struct UnitStruct; //~ ERROR may not be used on structs with zero fields | ^^^^^^^^^^ error: #[pin_project] attribute may not be used on enums without variants - --> $DIR/invalid.rs:237:20 + --> $DIR/invalid.rs:225:20 | -237 | enum EnumEmpty {} //~ ERROR may not be used on enums without variants +225 | enum EnumEmpty {} //~ ERROR may not be used on enums without variants | ^^ error: #[pin_project] attribute may not be used on enums with discriminants - --> $DIR/invalid.rs:241:13 + --> $DIR/invalid.rs:229:13 | -241 | V = 2, //~ ERROR may not be used on enums with discriminants +229 | V = 2, //~ ERROR may not be used on enums with discriminants | ^ error: #[pin_project] attribute may not be used on enums with zero fields - --> $DIR/invalid.rs:246:9 + --> $DIR/invalid.rs:234:9 | -246 | / Unit, //~ ERROR may not be used on enums with zero fields -247 | | Tuple(), -248 | | Struct {}, +234 | / Unit, //~ ERROR may not be used on enums with zero fields +235 | | Tuple(), +236 | | Struct {}, | |__________________^ error: #[pin_project] attribute may only be used on structs or enums - --> $DIR/invalid.rs:252:5 + --> $DIR/invalid.rs:240:5 | -252 | / union Union { -253 | | //~^ ERROR may only be used on structs or enums -254 | | f: (), -255 | | } +240 | / union Union { +241 | | //~^ ERROR may only be used on structs or enums +242 | | f: (), +243 | | } | |_____^ error: #[pin_project] attribute may not be used on #[repr(packed)] types - --> $DIR/invalid.rs:263:12 + --> $DIR/invalid.rs:251:12 | -263 | #[repr(packed)] +251 | #[repr(packed)] | ^^^^^^ error: #[pin_project] attribute may not be used on #[repr(packed)] types - --> $DIR/invalid.rs:267:12 + --> $DIR/invalid.rs:255:12 | -267 | #[repr(packed)] +255 | #[repr(packed)] | ^^^^^^ error: #[pin_project] attribute may not be used on #[repr(packed)] types - --> $DIR/invalid.rs:271:12 + --> $DIR/invalid.rs:259:12 | -271 | #[repr(packed)] +259 | #[repr(packed)] | ^^^^^^