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
Grpc.Tools: support generated filename corner cases #18470
Conversation
protoc and gRPC codegens differently treat non-ASCII letter characters and symbols other than underscores when constructing their respective output filenames for generated .cs files. This change reproduces their respective behaviors exactly. Fixes grpc#17661
@@ -109,6 +108,26 @@ string LowerUnderscoreToUpperCamel(string str) | |||
} | |||
return result.ToString(); | |||
} | |||
|
|||
// This is how the protoc codegen constructs its output filename. | |||
// See protobuf/compiler/csharp/csharp_helpers.cc:356. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
for comparison, the logic is here:
https://github.com/protocolbuffers/protobuf/blob/3a3956e8a258784461270961c6577341356bce52/src/google/protobuf/compiler/csharp/csharp_helpers.cc#L137 with cap_next_letter=true
and preserve_period=false
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yup, this is where I got it from. Looks like I gave a wrong line number, will fix in a moment.
I do not understand what is this last #
check at the very end of the function, but it does not seem to be important?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
{ | ||
result.Append(cap ? upperC : c); | ||
} | ||
cap = !isAsciiLetter; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I believe there's still a subtle problem - after a digit, protoc will still capitalize the next letter:
I tested and one123two.cs
generates One123Two.cs
and One123twoGrpc.cs
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Uhhhh, thanks! I'll take care of this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This passes, I added a test and verified a real build, too. cap = !isAsciiLetter;
will be true after a digit, as well as after any (non-emitted) other character. I'll push the test case tho, so that we have it, just in case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done, aa40424.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ah, thanks for clarification!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM.
protoc and gRPC codegens differently treat non-ASCII letter characters and symbols other than underscores when constructing their respective output filenames for generated .cs files. This change reproduces their respective behaviors exactly.
I added test cases similar to my hello.world.proto flop, and verified the built dll by dropping it into the .nuget directory on a Linux machine. Build failed with a repro of #17661 before, succeeded after.
Closes #17661