Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Refactors the macro-generated code to avoid generating giant method bodies.
Before the fix, the
@service
macro would generate the following code for thebindService
method:One tuple is added for each endpoint
Foo
,Bar
, ... in the service.The problem is that
FooMethodDescriptor
is a call to a (macro-generated) method which looks like:When the macro-generated code is compiled, the implicits are expanded. Because these marshallers are auto-derived using avro4s or PBDirect, the resulting reified code can be huge, and that huge chunk of bytecode ends up inside the body of
bindService
. This can lead toMethod too large
errors when emitting the bytecode.Fixed by refactoring the generated code. It now looks like:
This way the huge chunks of reified code end up inside the static initializers of the
MyService$FooMethodDescriptor$
andMyService$BarMethodDescriptor$
classes instead of inside the body ofbindService
.It's still possible to run into the
Method too large
error if the models are really big and deeply nested, but this gives us a bit of breathing space because the code has been split up by endpoint.