Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); internal: add tuple struct support in `pin_data` and `pin_init!` by mqqz · Pull Request #113 · Rust-for-Linux/pin-init · GitHub
Skip to content

internal: add tuple struct support in pin_data and pin_init! - #113

Closed
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs
Closed

internal: add tuple struct support in pin_data and pin_init!#113
mqqz wants to merge 4 commits into
Rust-for-Linux:mainfrom
mqqz:add_tuple_structs

Conversation

@mqqz

@mqqzmqqz commented Feb 28, 2026

Copy link
Copy Markdown
Contributor

Extend pin_data and pin_init! to support tuple struct syntax.

pin_data (internal/src/pin_data.rs):

  • add tuple-field handling via a refactored FieldInfo struct
  • generate projections and pin-data accessors for unnamed members

pin_init! (internal/src/init.rs):

  • parse initialiser keys as syn::Member (named or tuple index)
  • extend parser to support both:
    • tuple-like syntax e.g. Foo(a, <- b, c)
    • and brace syntax e.g. Foo{0 : a, 1 <- b, 2: c} (No longer accepted).
    • Couldn't decide on appropriate syntax, I'm not sure if keeping both is a good idea

Testing:

  • tests/tuple_struct.rs
  • tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs
  • tests/ui/compile-fail/tuple_shorthand.rs
  • tests/ui/expand/pin_{data,init}
  • more that got added later

Note that currently for tuple struct internal fields identifiers like _0 (for the first index) which clippy doesn't like. I'm not sure whether it's better to change naming or add #[allow(clippy::just_underscores_and_digits)] (I don't want to go through the effort of spamming clippy and changing all expanded tests just yet). I added relevant clippy suppression so no lints come up now in user code.

Closes: #85

@mqqz
mqqz marked this pull request as draft February 28, 2026 18:14
@mqqz
mqqzforce-pushed the add_tuple_structs branch 5 times, most recently from cd3f0a3 to 78043e4CompareMarch 2, 2026 21:33
@mqqz
mqqz marked this pull request as ready for review March 2, 2026 21:55
@mqqz
mqqzforce-pushed the add_tuple_structs branch from f58c415 to 757cb2eCompareMarch 2, 2026 22:11

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hi! Thanks for the PR!

I have several suggestions and some bigger things, but overall very happy with your changes & the style of code you used.

I really like the idea of adding FieldInfo before doing the changes to support tuple structs. I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

Regarding syntax in the tuple form, I think it's fine to only support { 0 <- init } at the moment. I have thought about removing the <- syntax altogether (#66) & always expecting an initializer, but there are some drawbacks. So when one writes init!(Struct(a, b, c)), we just treat it as init!(Struct { 0: a, 1: b, 2: c }) and if they want to use an initializer, they need the braced version.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

Comment threadtests/ui/compile-fail/init/no_tuple_shorthand.rs
Comment threadtests/ui/expand/pin-init.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs Outdated
Comment threadtests/tuple_struct.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/init.rs
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 757cb2e to cc01981CompareMarch 10, 2026 04:23
@mqqz
mqqz requested a review from BennoLossinMarch 10, 2026 04:54
@mqqz
mqqzforce-pushed the add_tuple_structs branch from cc01981 to 940ccb6CompareMarch 10, 2026 05:20
@mqqz

mqqz commented Mar 10, 2026

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review! I appreciate you taking the time to look at my work. I have looked at the comments and pushed changes that should hopefully address most of them.


I think we can take it a bit further and clean up a lot of the pin_data.rs code by moving code generation & handling pinned/unpinned fields in that type instead of the generation functions. Do you mind doing that work in the first commit as well?

I heavily refactored pin_data.rs and extracted code much of the relevant code into FieldInfo methods.

You can just add #[allow(clippy::just_underscores_and_digits)] to the generated code, that lint isn't useful for our code, since it's macro-generated.

Done. I made sure the generated code doesn't raise any lint warnings.

We also should think about if the pin-projected version of a tuple struct should also be a tuple struct. That makes the code quite a lot more complex.

I am unsure of how much value that would add apart from aesthetics/ergonomics. I would not bother it just yet as the churn might not justify it unless an apparent user need surfaces later. I would focus on having a safe + sound implementation and adding separate codegen paths for named vs tuple projected types makes it harder.

Lastly, I think we should have some more tests, some things that are missing: generics and !Unpin types with #[pin].

I added a new commit that expands the testing coverage with more comprehensive and meaningful test cases (incl. (const) generics, lifetimes and !Unpin types as requested).


Also, during testing I found that

#[pin_data]structTuple<T>(T,#[pin]#[pin]i32);

compiles fine and treats it as one #[pin], (I personally think it should panic) but this isn't a pressing issue. I can address this or leave it as is, whichever option makes more sense for you.

best,
~mo

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 940ccb6 to 528ad75CompareMarch 10, 2026 06:23

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Just looked at the first commit. I like it much better like this, thanks a lot for doing this work. I have some suggestions & small adjustments, but overall this looks good. (will do the other commits separately)

Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs Outdated
Comment threadinternal/src/pin_data.rs
Comment threadCHANGELOG.md Outdated
Comment threadinternal/src/pin_data.rs Outdated

@BennoLossinBennoLossin left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Two things for the second commit, we don't need the TupleStruct(<- value, other) syntax and one other minor thing.

Comment threadinternal/src/init.rs Outdated
Comment threadinternal/src/init.rs Outdated
@BennoLossin

Copy link
Copy Markdown
Member

Greatly appreciated the updated tests!

@mqqz
mqqzforce-pushed the add_tuple_structs branch from 528ad75 to 8735d1eCompareMarch 12, 2026 07:49
@mqqz
mqqz requested a review from BennoLossinMarch 12, 2026 08:26
@mqqz
mqqzforce-pushed the add_tuple_structs branch 3 times, most recently from 737c41e to 68d6fffCompareMarch 20, 2026 15:15
mqqz added 4 commits April 24, 2026 12:58
Introduce `FieldInfo` struct to encapsulate field and other relevant
data (e.g. pinned and member name) to abstract over named/unnamed
fields and extract relevant field data code into methods.
Also, generate projections and pin-data accessors for unnamed
members.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Refactor to parse initialiser keys as `Member` (named or tuple index).
Additionally, extend init parser to support both tuple-like init
constructor e.g. `Foo(a, b, c)` and brace syntax e.g.
`Foo{0 : a, 1 <- b, 2: c}`.
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Add initial tests to validate the basic functionality of tuple struct
support. Mainly, focusing on init syntax and pin data.
Tests include:
- `tests/tuple_struct.rs`
- `tests/ui/compile-fail/tuple_{duplicate,invalid,missing}_field.rs`
- `tests/ui/compile-fail/no_tuple_shorthand.rs`
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
Increase test coverage for new tuple struct feature with more
comprehensive cases focusing on generics and !Unpin types.
Extend `tests/tuple_struct.rs` cases
- add runtime checks for generic payloads (type, lifetime, const
generics)
- cover multi-pinned tuple fields and `PinnedDrop` delegation
- verify partial-init failure cleanup/rollback semantics
Expand tuple struct UI test coverage
- `tests/ui/compile-fail/init/` (wrong generics, invalid index,
tuple arrow/syntax error cases)
- `tests/ui/compile-fail/pin_data/` (missing #[pin])
Update tuple expand expectations
- `tests/ui/expand/tuple_struct.rs`
Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
@mqqz
mqqzforce-pushed the add_tuple_structs branch from 68d6fff to 79f31bbCompareApril 24, 2026 10:11
@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

rebased and removed feature gates from tests since MSRV was bumped and I have nothing better to do atm 😀

@nbdd0121

Copy link
Copy Markdown
Member

Hi @mqqz, I have a WIP cleanup/refactoring which would simplify and remove a lot of the code that you have been refactoring here, so unfortunately I wouldn't be able to take this PR as is. If you could implement the change without significant refactoring then I would recommend that, or otherwise please wait a bit and come back once I have landed cleanups. Thanks!

@mqqz

mqqz commented Apr 24, 2026

Copy link
Copy Markdown
ContributorAuthor

No worries and no rush at all either!

I'll see if I can integrate these changes when your refactor lands. Thanks

@nbdd0121

Copy link
Copy Markdown
Member

(Also I think this doesn't work when some of the fields are #[cfg] out)

@nbdd0121

Copy link
Copy Markdown
Member

The big refactors have landed. If you could rebase and perhaps reduce the amount of code motion (i.e. only extract needed info to FieldInfo and perhaps not create methods yet) then I could take another look.

@mqqz

mqqz commented May 22, 2026

Copy link
Copy Markdown
ContributorAuthor

This PR is too fat and outdated to be reviewable. Plus, I think switching to using a projected tuple struct as well is a better approach (to address Gary's cfg concern).

Hence, I'm closing and replacing with a newer PR #155.

@mqqzmqqz closed this May 22, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

Support for initializing tuple-structs

3 participants

@mqqz@BennoLossin@nbdd0121