diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-24 22:56:19 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-01-24 22:56:19 +0000 |
commit | b2c99dd3bd217083fafaca9964e1a89f323ba232 (patch) | |
tree | 303f34266f1c365976d17426d446d5f8d6ef933e /mojo | |
parent | b4aaf71e921f4b31d7199dbb9a24f237c03330a2 (diff) | |
download | chromium_src-b2c99dd3bd217083fafaca9964e1a89f323ba232.zip chromium_src-b2c99dd3bd217083fafaca9964e1a89f323ba232.tar.gz chromium_src-b2c99dd3bd217083fafaca9964e1a89f323ba232.tar.bz2 |
Support default values for arrays of POD data types in mojom.
TODO: defaults values for structs
BUG=320082
Review URL: https://codereview.chromium.org/141893004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@246994 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo')
7 files changed, 43 insertions, 2 deletions
diff --git a/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl b/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl index 3841f4d..e1fc09e 100644 --- a/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl +++ b/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl @@ -9,6 +9,14 @@ {%- macro set_default(field) -%} {%- if field.kind|is_string_kind -%} set_{{field.name}}(mojo::String({{field.default}})); +{%- elif field.kind|is_array_kind -%} +{ + {{field.kind|cpp_wrapper_type}}::Builder tmp({{field.default|length}}); +{%- for element in field.default %} + tmp[{{loop.index0}}] = {{element}}; +{%- endfor %} + set_{{field.name}}(tmp.Finish()); +} {%- elif field.kind|is_object_kind -%} { {{field.kind|cpp_wrapper_type}}::Builder tmp; diff --git a/mojo/public/bindings/generators/mojom_cpp_generator.py b/mojo/public/bindings/generators/mojom_cpp_generator.py index 2532841..b8067b3 100644 --- a/mojo/public/bindings/generators/mojom_cpp_generator.py +++ b/mojo/public/bindings/generators/mojom_cpp_generator.py @@ -107,6 +107,7 @@ class Generator(mojom_generator.Generator): "is_handle_kind": mojom_generator.IsHandleKind, "is_object_kind": mojom_generator.IsObjectKind, "is_string_kind": mojom_generator.IsStringKind, + "is_array_kind": lambda kind: isinstance(kind, mojom.Array), "is_struct_with_handles": IsStructWithHandles, "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE, "struct_from_method": mojom_generator.GetStructFromMethod, diff --git a/mojo/public/bindings/generators/mojom_js_generator.py b/mojo/public/bindings/generators/mojom_js_generator.py index 0596e88..427ae99 100644 --- a/mojo/public/bindings/generators/mojom_js_generator.py +++ b/mojo/public/bindings/generators/mojom_js_generator.py @@ -33,7 +33,12 @@ _kind_to_javascript_default_value = { def JavaScriptDefaultValue(field): if field.default: - return field.default + if isinstance(field.default, list): + # TODO(mpcomplete): This will need to be more sophisticated to support + # arrays of objects/arrays. + return "[" + ", ".join(field.default) + "]" + else: + return field.default if field.kind in mojom.PRIMITIVES: return _kind_to_javascript_default_value[field.kind] if isinstance(field.kind, mojom.Struct): diff --git a/mojo/public/bindings/pylib/parse/mojo_parser.py b/mojo/public/bindings/pylib/parse/mojo_parser.py index 71da823..ccdf828 100755 --- a/mojo/public/bindings/pylib/parse/mojo_parser.py +++ b/mojo/public/bindings/pylib/parse/mojo_parser.py @@ -100,6 +100,7 @@ class Parser(object): def p_default(self, p): """default : EQUALS expression + | EQUALS expression_array | """ if len(p) > 2: p[0] = p[2] @@ -189,6 +190,23 @@ class Parser(object): ### Expressions ### + def p_expression_array(self, p): + """expression_array : expression + | LBRACKET expression_array_elements RBRACKET """ + if len(p) < 3: + p[0] = p[1] + else: + p[0] = p[2] + + def p_expression_array_elements(self, p): + """expression_array_elements : expression + | expression COMMA expression_array_elements + | """ + if len(p) == 2: + p[0] = ListFromConcat(p[1]) + elif len(p) > 3: + p[0] = ListFromConcat(p[1], p[3]) + def p_expression(self, p): """expression : conditional_expression""" p[0] = p[1] diff --git a/mojo/public/bindings/sample/sample_service_unittests.js b/mojo/public/bindings/sample/sample_service_unittests.js index 1a8400a..9b9165d 100644 --- a/mojo/public/bindings/sample/sample_service_unittests.js +++ b/mojo/public/bindings/sample/sample_service_unittests.js @@ -93,6 +93,11 @@ define([ var foo = new sample.Foo(); expect(foo.name).toBe("Fooby"); expect(foo.a).toBeTruthy(); + + expect(foo.data.length).toBe(3); + expect(foo.data[0]).toBe(1); + expect(foo.data[1]).toBe(2); + expect(foo.data[2]).toBe(3); } function ServiceImpl() { diff --git a/mojo/public/tests/bindings/sample_service.mojom b/mojo/public/tests/bindings/sample_service.mojom index 267ee62..b7d328a 100644 --- a/mojo/public/tests/bindings/sample_service.mojom +++ b/mojo/public/tests/bindings/sample_service.mojom @@ -28,7 +28,7 @@ struct Foo { bool c @4; Bar bar @5; Bar[] extra_bars @7; - uint8[] data @6; + uint8[] data = [1,2,3] @6; handle<message_pipe> source @9; handle<data_pipe_consumer>[] input_streams @10; handle<data_pipe_producer>[] output_streams @11; diff --git a/mojo/public/tests/bindings/sample_service_unittest.cc b/mojo/public/tests/bindings/sample_service_unittest.cc index b6a75e5..62b144b 100644 --- a/mojo/public/tests/bindings/sample_service_unittest.cc +++ b/mojo/public/tests/bindings/sample_service_unittest.cc @@ -321,6 +321,10 @@ TEST(BindingsSampleTest, DefaultValues) { ASSERT_FALSE(foo.name().is_null()); EXPECT_EQ("Fooby", foo.name().To<std::string>()); EXPECT_TRUE(foo.a()); + EXPECT_EQ(3u, foo.data().size()); + EXPECT_EQ(1, foo.data()[0]); + EXPECT_EQ(2, foo.data()[1]); + EXPECT_EQ(3, foo.data()[2]); } } // namespace sample |