|
|
Chromium Code Reviews|
Created:
3 years, 10 months ago by Sam McNally Modified:
3 years, 8 months ago Reviewers:
yzshen1 CC:
chromium-reviews, qsr+mojo_chromium.org, viettrungluu+watch_chromium.org, yzshen+watch_chromium.org, abarth-chromium, Aaron Boodman, darin (slow to review), chrome-apps-syd-reviews_chromium.org Target Ref:
refs/heads/master Project:
chromium Visibility:
Public. |
DescriptionAdd field-initializing factory static methods to generated mojo unions.
Review-Url: https://codereview.chromium.org/2694843003
Cr-Commit-Position: refs/heads/master@{#463167}
Committed: https://chromium.googlesource.com/chromium/src/+/7dfe5a09c6622a2079b5cc94cfc0cd565e1c0601
Patch Set 1 : #Patch Set 2 : rebase #Patch Set 3 : #
Total comments: 3
Patch Set 4 : #
Total comments: 2
Patch Set 5 : #Patch Set 6 : #
Messages
Total messages: 80 (68 generated)
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: android_cronet on master.tryserver.chromium.android (JOB_FAILED, https://build.chromium.org/p/tryserver.chromium.android/builders/android_cron...) cast_shell_android on master.tryserver.chromium.android (JOB_FAILED, https://build.chromium.org/p/tryserver.chromium.android/builders/cast_shell_a...) linux_chromium_rel_ng on master.tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_...) mac_chromium_compile_dbg_ng on master.tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/mac_chromium_comp...)
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: win_chromium_rel_ng on master.tryserver.chromium.win (JOB_TIMED_OUT, http://build.chromium.org/p/tryserver.chromium.win/builders/win_chromium_rel_...) win_chromium_x64_rel_ng on master.tryserver.chromium.win (JOB_TIMED_OUT, http://build.chromium.org/p/tryserver.chromium.win/builders/win_chromium_x64_...)
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: win_chromium_rel_ng on master.tryserver.chromium.win (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.win/builders/win_chromium_rel_...)
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
Patchset #5 (id:80001) has been deleted
Patchset #4 (id:60001) has been deleted
Patchset #3 (id:40001) has been deleted
Patchset #2 (id:20001) has been deleted
Patchset #1 (id:1) has been deleted
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: linux_chromium_chromeos_rel_ng on master.tryserver.chromium.linux (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.linux/builders/linux_chromium_...)
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
sammc@chromium.org changed reviewers: + yzshen@chromium.org
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: This issue passed the CQ dry run.
ping
Sorry for late reply. I missed the notification mail at the beginning. (Please feel free to ping me earlier next time if I don't respond in one working day.) I am thinking maybe it doesn't gain us much to add these constructors: - The first constructor (which doesn't explicitly specify the tag) is not always available. Besides, sometimes it maybe a little confusing to readers. - The second/third constructor uses something like FooUnion::TagType<FooUnion::Tag::F_BAR>() to specify the type, which doesn't seem convenient enough. - We use much fewer unions comparing with structs. Besides, for union initialization users only need to set a single field (while users may need to set multiple fields for structs without constructors.) WDYT? Thanks!
On 2017/03/06 16:57:50, yzshen1 wrote: > Sorry for late reply. I missed the notification mail at the beginning. (Please > feel free to ping me earlier next time if I don't respond in one working day.) > > I am thinking maybe it doesn't gain us much to add these constructors: > - The first constructor (which doesn't explicitly specify the tag) is not always > available. Besides, sometimes it maybe a little confusing to readers. > When is it not available? > > - The second/third constructor uses something like > FooUnion::TagType<FooUnion::Tag::F_BAR>() to specify the type, which doesn't > seem convenient enough. Perhaps, but they should only matter when a type is repeated in the union. > > - We use much fewer unions comparing with structs. Besides, for union > initialization users only need to set a single field (while users may need to > set multiple fields for structs without constructors.) The inconvenience of generated unions and perhaps https://crbug.com/510123 may be contributing to that. Responses that consist of a nullable value and a nullable error where exactly one should be non-null are not uncommon. The problem isn't the number of statements, it's that a statement is required to produce an initialized union. With a constructor, only an expression is necessary; that enables more succinct code. Compare auto result_ptr = FooResultUnion::New(); result_ptr->set_result(FooResult::New(...)); callback.Run(std::move(result_ptr); with callback.Run(FooResultUnion::New(FooResult::New(...))); > > WDYT? Thanks!
On 2017/03/07 03:13:11, Sam McNally wrote:
> On 2017/03/06 16:57:50, yzshen1 wrote:
> > Sorry for late reply. I missed the notification mail at the beginning.
(Please
> > feel free to ping me earlier next time if I don't respond in one working
day.)
> >
> > I am thinking maybe it doesn't gain us much to add these constructors:
> > - The first constructor (which doesn't explicitly specify the tag) is not
> always
> > available. Besides, sometimes it maybe a little confusing to readers.
> >
>
> When is it not available?
When the union has multiple fields that are of the same type, we don't generate
those "tag-less" constructors. (IIUC)
Even if the constructors are available, sometimes which one is used is not
obvious:
union Foo {
uint16 field1,
uint32 field2
};
If the code reads "Foo::New(2)", readers may wonder which field is set.
I think the basic issue is that fields are not identified by their data types,
but their names.
> >
> > - The second/third constructor uses something like
> > FooUnion::TagType<FooUnion::Tag::F_BAR>() to specify the type, which doesn't
> > seem convenient enough.
>
> Perhaps, but they should only matter when a type is repeated in the union.
And that is the thing that I am a little concerned about. :)
> >
> > - We use much fewer unions comparing with structs. Besides, for union
> > initialization users only need to set a single field (while users may need
to
> > set multiple fields for structs without constructors.)
>
> The inconvenience of generated unions and perhaps https://crbug.com/510123 may
> be contributing to that. Responses that consist of a nullable value and a
> nullable error where exactly one should be non-null are not uncommon. The
> problem isn't the number of statements, it's that a statement is required to
> produce an initialized union. With a constructor, only an expression is
> necessary; that enables more succinct code. Compare
>
> auto result_ptr = FooResultUnion::New();
> result_ptr->set_result(FooResult::New(...));
> callback.Run(std::move(result_ptr);
>
> with
>
> callback.Run(FooResultUnion::New(FooResult::New(...)));
I can see the benefit to have more succinct code. But clear code is more
important, even if it is a little verbose.
Does the following alternative make sense?
union Foo {
uint32 field1,
uint32 field2,
bool field3
};
// Generated constructors:
Foo(Tag tag, uint32_t value) {
CHECK(tag == Tag::FIELD1 || tag == Tag::FIELD2);
if (tag == Tag::FIELD1) {
...
} else if (tag == Tag::FIELD2) {
...
}
}
Foo(Tag tag, bool value) {
CHECK(tag == Tag::FIELD3);
...
}
That way users don't need to deal with the magical template Foo::TagType<>, and
it is always obvious. But the cost is compile-time type safety. :/
WDYT? Thanks!
>
> >
> > WDYT? Thanks!
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
Patchset #3 (id:140001) has been deleted
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: ios-device on master.tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/ios-device/builds...) ios-simulator on master.tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/ios-simulator/bui...) ios-simulator-xcode-clang on master.tryserver.chromium.mac (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.mac/builders/ios-simulator-xco...)
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
Patchset #4 (id:180001) has been deleted
Patchset #3 (id:160001) has been deleted
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
On 2017/03/07 05:05:48, yzshen1 wrote:
> On 2017/03/07 03:13:11, Sam McNally wrote:
> > On 2017/03/06 16:57:50, yzshen1 wrote:
> > > Sorry for late reply. I missed the notification mail at the beginning.
> (Please
> > > feel free to ping me earlier next time if I don't respond in one working
> day.)
> > >
> > > I am thinking maybe it doesn't gain us much to add these constructors:
> > > - The first constructor (which doesn't explicitly specify the tag) is not
> > always
> > > available. Besides, sometimes it maybe a little confusing to readers.
> > >
> >
> > When is it not available?
>
> When the union has multiple fields that are of the same type, we don't
generate
> those "tag-less" constructors. (IIUC)
>
> Even if the constructors are available, sometimes which one is used is not
> obvious:
> union Foo {
> uint16 field1,
> uint32 field2
> };
>
> If the code reads "Foo::New(2)", readers may wonder which field is set.
>
> I think the basic issue is that fields are not identified by their data types,
> but their names.
>
> > >
> > > - The second/third constructor uses something like
> > > FooUnion::TagType<FooUnion::Tag::F_BAR>() to specify the type, which
doesn't
> > > seem convenient enough.
> >
> > Perhaps, but they should only matter when a type is repeated in the union.
>
> And that is the thing that I am a little concerned about. :)
>
> > >
> > > - We use much fewer unions comparing with structs. Besides, for union
> > > initialization users only need to set a single field (while users may need
> to
> > > set multiple fields for structs without constructors.)
> >
> > The inconvenience of generated unions and perhaps https://crbug.com/510123
may
> > be contributing to that. Responses that consist of a nullable value and a
> > nullable error where exactly one should be non-null are not uncommon. The
> > problem isn't the number of statements, it's that a statement is required to
> > produce an initialized union. With a constructor, only an expression is
> > necessary; that enables more succinct code. Compare
> >
> > auto result_ptr = FooResultUnion::New();
> > result_ptr->set_result(FooResult::New(...));
> > callback.Run(std::move(result_ptr);
> >
> > with
> >
> > callback.Run(FooResultUnion::New(FooResult::New(...)));
>
> I can see the benefit to have more succinct code. But clear code is more
> important, even if it is a little verbose.
> Does the following alternative make sense?
>
> union Foo {
> uint32 field1,
> uint32 field2,
> bool field3
> };
>
> // Generated constructors:
> Foo(Tag tag, uint32_t value) {
> CHECK(tag == Tag::FIELD1 || tag == Tag::FIELD2);
> if (tag == Tag::FIELD1) {
> ...
> } else if (tag == Tag::FIELD2) {
> ...
> }
> }
>
> Foo(Tag tag, bool value) {
> CHECK(tag == Tag::FIELD3);
> ...
> }
>
> That way users don't need to deal with the magical template Foo::TagType<>,
and
> it is always obvious. But the cost is compile-time type safety. :/
>
> WDYT? Thanks!
>
>
I've added nicer tag type values so that the calling side is
Foo::New(Foo::field1, value);
and removed the single parameter overloads for primitive types.
>
> >
> > >
> > > WDYT? Thanks!
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: Try jobs failed on following builders: win_chromium_rel_ng on master.tryserver.chromium.win (JOB_FAILED, http://build.chromium.org/p/tryserver.chromium.win/builders/win_chromium_rel_...)
https://codereview.chromium.org/2694843003/diff/200001/mojo/public/tools/bind... File mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl (right): https://codereview.chromium.org/2694843003/diff/200001/mojo/public/tools/bind... mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl:34: explicit {{union.name}}(Tag tag); With the current constructors, users would do: FooUnion(FooUnion::Tag::BAR); FooUnion(FooUnion::bar, bar_value); It seems unfortunate to have Tag and TagTypes_. We should avoid having two ways of specifying tags. I would rather we use Tag values consistently, although we lose some compile-time type safety. More thoughts on naming for discussion: actually the current field getter FooUnion::get_bar() is not very consistent with our style guide, we should have used FooUnion::bar() as the getter name. WDYT? https://codereview.chromium.org/2694843003/diff/200001/mojo/public/tools/bind... mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl:40: explicit {{union.name}}({{field.kind|cpp_wrapper_param_type}} in) I still think we should avoid this distinct-type-to-identify-field overload. https://codereview.chromium.org/2694843003/diff/200001/mojo/public/tools/bind... mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_declaration.tmpl:44: {{union.name}}(TagTypes_::{{field.name|under_to_camel}}); There is already a similar one on line 34. And it is less consistent: a constructor for object fields but not primitive type fields.
Description was changed from ========== Add initializing constructors to generated mojo unions. ========== to ========== Add field-initializing factory static methods to generated mojo unions. ==========
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: This issue passed the CQ dry run.
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Patchset #4 (id:220001) has been deleted
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
Patchset #4 (id:240001) has been deleted
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
I've changed this to add factory static methods to generated unions instead of constructors. PTAL.
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: This issue passed the CQ dry run.
LGTM Thanks! https://codereview.chromium.org/2694843003/diff/260001/mojo/public/tools/bind... File mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl (right): https://codereview.chromium.org/2694843003/diff/260001/mojo/public/tools/bind... mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl:3: {%- if default_field.kind|is_string_kind or default_field.kind|is_object_kind or nit: is_object_kind includes is_string_kind, so it should be okey to remove the first part.
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
https://codereview.chromium.org/2694843003/diff/260001/mojo/public/tools/bind... File mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl (right): https://codereview.chromium.org/2694843003/diff/260001/mojo/public/tools/bind... mojo/public/tools/bindings/generators/cpp_templates/wrapper_union_class_definition.tmpl:3: {%- if default_field.kind|is_string_kind or default_field.kind|is_object_kind or On 2017/04/09 23:32:31, yzshen1 wrote: > nit: is_object_kind includes is_string_kind, so it should be okey to remove the > first part. Done.
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: This issue passed the CQ dry run.
The CQ bit was checked by sammc@chromium.org to run a CQ dry run
Dry run: CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
The CQ bit was unchecked by commit-bot@chromium.org
Dry run: This issue passed the CQ dry run.
The CQ bit was checked by sammc@chromium.org
The patchset sent to the CQ was uploaded after l-g-t-m from yzshen@chromium.org Link to the patchset: https://codereview.chromium.org/2694843003/#ps300001 (title: " ")
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.or...
CQ is committing da patch.
Bot data: {"patchset_id": 300001, "attempt_start_ts": 1491792450834160,
"parent_rev": "7e01649ec8b61ba9f5e934bf036eb996530e7d7b", "commit_rev":
"7dfe5a09c6622a2079b5cc94cfc0cd565e1c0601"}
Message was sent while issue was closed.
Description was changed from ========== Add field-initializing factory static methods to generated mojo unions. ========== to ========== Add field-initializing factory static methods to generated mojo unions. Review-Url: https://codereview.chromium.org/2694843003 Cr-Commit-Position: refs/heads/master@{#463167} Committed: https://chromium.googlesource.com/chromium/src/+/7dfe5a09c6622a2079b5cc94cfc0... ==========
Message was sent while issue was closed.
Committed patchset #6 (id:300001) as https://chromium.googlesource.com/chromium/src/+/7dfe5a09c6622a2079b5cc94cfc0... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
