Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

prost-build: CodeGenerator::boxed method #1019

Merged
merged 4 commits into from May 5, 2024

Conversation

mzabaluev
Copy link
Contributor

A helper method to capture the logic of deciding whether a field needs to be boxed. This follows the pattern with other methods like optional, and will allow reusing the logic in the upcoming builder codegen in #901.

Copy link
Collaborator

@caspermeijn caspermeijn left a comment

Choose a reason for hiding this comment

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

At line 626, there is another instance of a boxed variable. Can that be replaced by the same function?

prost-build/src/code_generator.rs Outdated Show resolved Hide resolved
Comment on lines 1030 to 1032
if field.label == Some(Label::Repeated as i32) {
return false;
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Note that this changes the logic from the original: now any boxed match from the config will be ignored if the field is repeated, while previously it gave true. But I think that was wrong, because it never makes sense to box a Vec.

Copy link
Contributor Author

@mzabaluev mzabaluev Mar 29, 2024

Choose a reason for hiding this comment

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

To think of it, this should be reverted if we want this to be merged for 0.12.x releases.

Copy link
Collaborator

Choose a reason for hiding this comment

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

The quick fix is to split this function into a boxed_field and boxed_oneof variants. Make sure to document why two variants are needed.

Maybe you could add a deprecation warning like this:

println!("cargo:warning=Field X is repeated and manually marked as boxed. This is deprecated and support will be removed in a later release");

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The quick fix is to split this function into a boxed_field and boxed_oneof variants. Make sure to document why two variants are needed.

I don't like this idea. The logic would need to be replicated, even though it's mostly the same for regular fields and oneof members. More so with the deprecation warning, which I have now added as per your suggestion.

@mzabaluev
Copy link
Contributor Author

At line 626, there is another instance of a boxed variable. Can that be replaced by the same function?

Done, with some complication and a questionable behavioral change that I have commented on above.

Copy link
Collaborator

@caspermeijn caspermeijn left a comment

Choose a reason for hiding this comment

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

Do you think there are enough tests for boxed fields and oneof fields?

prost-build/src/code_generator.rs Show resolved Hide resolved
Comment on lines 1030 to 1032
if field.label == Some(Label::Repeated as i32) {
return false;
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

The quick fix is to split this function into a boxed_field and boxed_oneof variants. Make sure to document why two variants are needed.

Maybe you could add a deprecation warning like this:

println!("cargo:warning=Field X is repeated and manually marked as boxed. This is deprecated and support will be removed in a later release");

A helper method to capture the logic of deciding whether a field
needs to be boxed. This follows the pattern with other methods like
`optional`, and will allow reusing the logic in the upcoming builder
codegen.
The bit in CodeGenerator::append_oneof was pretty much the same,
except the configuration is looked up for the oneof name.

Rearrange the logic so that intermediate values are bound when needed.
If a repeated fields is configured to be boxed, a deprecation warning
will be emitted by the build script.
Copy link
Collaborator

@caspermeijn caspermeijn left a comment

Choose a reason for hiding this comment

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

I like the current version. I found one logic error, then this is ready.

prost-build/src/code_generator.rs Outdated Show resolved Hide resolved
Co-authored-by: Casper Meijn <casper@meijn.net>
@mzabaluev mzabaluev requested a review from caspermeijn May 4, 2024 02:17
@caspermeijn caspermeijn added this pull request to the merge queue May 5, 2024
Merged via the queue into tokio-rs:master with commit 1f38ea6 May 5, 2024
15 checks passed
@caspermeijn
Copy link
Collaborator

Thank you for your contribution. I appreciate your patience during the review.

caspermeijn added a commit to caspermeijn/prost that referenced this pull request May 5, 2024
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files.

This patch update brings new fixes:

- fix: include_file should handle proto without package (tokio-rs#1002)
- Place Config::format behind the format feature flag
- Handle keyword `Self` after stripping enum type prefix (tokio-rs#998)

## Documentation
- fix(readme): fix the link and badge for CI (tokio-rs#1049)

## Internal
- style(codegen): `Syntax` to a separate file (tokio-rs#1029)
- chore(codegen): extract c string escaping to a separate file (tokio-rs#1028)
- style(prost-build): `CodeGenerator::boxed` method (tokio-rs#1019)
- style(prost-build): Consolidate field data into struct (tokio-rs#1017)
- style(prost-build): `BytesType and MapType` into a `collections` module. (tokio-rs#1030)
- style(prost-build): Split `Config` and `Module` into a separate module and files (tokio-rs#1020)
- style(prost-build): prost_path helper (tokio-rs#1018)
- style: Fix toml indent (tokio-rs#1048)
- style: Fix clippy warnings and enable clippy in CI (tokio-rs#1008)
- build: Use git submodule to download protobuf sources (tokio-rs#1014)
- ci: Add TOML validation with `taplo` (tokio-rs#1034)
- tests: Create a separate tempdir for each test (tokio-rs#1044)
- tests: Remove GoogleMessage3 and GoogleMessage4 benchmarks (tokio-rs#1037)
- chore: Update internal crates to Rust edition 2021 (tokio-rs#1039)
- chore: Update crate descriptions (tokio-rs#1038)
- chore: Fix clippy checks in CI (tokio-rs#1032)
- chore: Add Casper Meijn as author (tokio-rs#1025)
github-merge-queue bot pushed a commit that referenced this pull request May 8, 2024
_PROST!_ is a [Protocol Buffers](https://developers.google.com/protocol-buffers/) implementation for the [Rust Language](https://www.rust-lang.org/). `prost` generates simple, idiomatic Rust code from `proto2` and `proto3` files.

This patch update brings new fixes:

- fix: include_file should handle proto without package (#1002)
- Place Config::format behind the format feature flag
- Handle keyword `Self` after stripping enum type prefix (#998)

## Documentation
- fix(readme): fix the link and badge for CI (#1049)

## Internal
- style(codegen): `Syntax` to a separate file (#1029)
- chore(codegen): extract c string escaping to a separate file (#1028)
- style(prost-build): `CodeGenerator::boxed` method (#1019)
- style(prost-build): Consolidate field data into struct (#1017)
- style(prost-build): `BytesType and MapType` into a `collections` module. (#1030)
- style(prost-build): Split `Config` and `Module` into a separate module and files (#1020)
- style(prost-build): prost_path helper (#1018)
- style: Fix toml indent (#1048)
- style: Fix clippy warnings and enable clippy in CI (#1008)
- build: Use git submodule to download protobuf sources (#1014)
- ci: Add TOML validation with `taplo` (#1034)
- tests: Create a separate tempdir for each test (#1044)
- tests: Remove GoogleMessage3 and GoogleMessage4 benchmarks (#1037)
- chore: Update internal crates to Rust edition 2021 (#1039)
- chore: Update crate descriptions (#1038)
- chore: Fix clippy checks in CI (#1032)
- chore: Add Casper Meijn as author (#1025)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants