diff options
author | sammc <sammc@chromium.org> | 2016-01-20 21:30:18 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-21 05:31:02 +0000 |
commit | 16fb38a8b87fe700645055e472d84de7aefe48a5 (patch) | |
tree | 02d83267f9a8a9f8e182c6a857347a7a683e81e6 /mojo/public/tools | |
parent | c8a1187b4dfc11061d8ba792c73225196c56c6aa (diff) | |
download | chromium_src-16fb38a8b87fe700645055e472d84de7aefe48a5.zip chromium_src-16fb38a8b87fe700645055e472d84de7aefe48a5.tar.gz chromium_src-16fb38a8b87fe700645055e472d84de7aefe48a5.tar.bz2 |
Change mojo enums to be scoped enums in the generated C++ bindings.
Some mojo enums were previously not proper enums: they were constants
for bitfields. These have been replaced by const int32s in the mojoms:
- mus.mojom.EventFlags
- mus.mojom.MouseEventFlags
- mus.mojom.ResizeBehavior
- mus.mojom.WindowTree.AccessPolicy
Some mojo enum values now conflict with macros (mostly on Windows) and
needed to change:
- mus.mojom.Cursor.NULL became CURSOR_NULL (again)
- mus.mojom.KeyboardCode.DELETE became DELETE_KEY
- mus.mojom.WindowManagerErrorCode.ERROR_ACCESS_DENIED became
ACCESS_DENIED
- device.usb.TransferDirection.IN became INBOUND
- device.usb.TransferDirection.OUT became OUTBOUND
- device.usb.TransferStatus.ERROR became TRANSFER_ERROR
- device.NFCRecordType.OPAQUE became OPAQUE_RECORD
- media.interfaces.Decryptor.Status.ERROR became DECRYPTION_ERROR
- skia.AlphaType.OPAQUE became ALPHA_TYPE_OPAQUE
Review URL: https://codereview.chromium.org/1527183003
Cr-Commit-Position: refs/heads/master@{#370632}
Diffstat (limited to 'mojo/public/tools')
6 files changed, 44 insertions, 10 deletions
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl index 0e44acd..d11b198 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl @@ -4,12 +4,12 @@ which case associated functions need to be static. ---#} {%- macro enum_decl(enum, is_static=false) %} -enum {{enum.name}} : int32_t { +enum class {{enum.name}} : int32_t { {%- for field in enum.fields %} {%- if field.value %} - {{enum.name|to_all_caps}}_{{field.name}} = {{field.value|expression_to_text}}, + {{field.name}} = {{field.value|expression_to_text}}, {%- else %} - {{enum.name|to_all_caps}}_{{field.name}}, + {{field.name}}, {%- endif %} {%- endfor %} }; @@ -27,6 +27,27 @@ enum {{enum.name}} : int32_t { bool {{enum.name}}_IsValidValue({{enum.name}} value); {%- endmacro %} +{%- macro enum_stream_operator(enum) %} +inline std::ostream& operator<<(std::ostream& os, {{enum|get_name_for_kind}} value) { + switch(value) { +{%- for _, values in enum.fields|groupby('numeric_value') %} + case {{enum|get_name_for_kind}}::{{values[0].name}}: + return os << "{{enum|get_name_for_kind}}:: +{%- if values|length > 1 -%} + {{'{'}} +{%- endif -%} + {{values|map(attribute='name')|join(', ')}} +{%- if values|length > 1 -%} + {{'}'}} +{%- endif -%} + "; +{%- endfor %} + default: + return os << "Unknown {{enum|get_name_for_kind}} value: " << static_cast<int32_t>(value); + } +} +{%- endmacro %} + {%- macro is_valid_enum_def(enum, class_name = '') %} {% if class_name != '' -%} // static diff --git a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl index f29d3d8..5ef35a2 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl @@ -16,6 +16,7 @@ #define {{header_guard}} #include <stdint.h> +#include <ostream> #include "mojo/public/cpp/bindings/array.h" #include "mojo/public/cpp/bindings/associated_interface_ptr.h" @@ -49,8 +50,10 @@ namespace {{variant}} { {#--- Enums #} {% from "enum_macros.tmpl" import enum_decl -%} +{% from "enum_macros.tmpl" import enum_stream_operator -%} {% for enum in enums %} {{enum_decl(enum)}} + {{enum_stream_operator(enum)}} {%- endfor %} {#--- Constants #} @@ -158,6 +161,18 @@ typedef mojo::StructPtr<{{union.name}}> {{union.name}}Ptr; {%- endfor %} {%- endif %} +{% for struct in structs %} +{% for enum in struct.enums %} +{{enum_stream_operator(enum)}} +{%- endfor %} +{%- endfor %} + +{% for interface in interfaces %} +{% for enum in interface.enums %} +{{enum_stream_operator(enum)}} +{%- endfor %} +{%- endfor %} + {%- if variant %} } // namespace {{variant}} {%- endif %} diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl index 47068c5..ebc6048 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl @@ -110,6 +110,8 @@ {%- else %} {{output}}->{{name}} = mojo::internal::AssociatedInterfaceRequestHelper::PassHandle(&{{input_field}}).release(); {%- endif %} +{%- elif kind|is_enum_kind %} + {{output}}->{{name}} = static_cast<int32_t>({{input_field}}); {%- else %} {{output}}->{{name}} = {{input_field}}; {%- endif %} diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl index 5321d29..f067e64 100644 --- a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl +++ b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl @@ -78,6 +78,8 @@ void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf, std::move(*input_acc.data()->{{field.name}}), {{field.name}}); {%- elif field.kind|is_associated_kind %} // TODO(yzshen): add seralization logic for associated kinds. +{% elif field.kind|is_enum_kind %} + result->data.f_{{field.name}} = static_cast<int32_t>(input_acc.data()->{{field.name}}); {% else %} result->data.f_{{field.name}} = input_acc.data()->{{field.name}}; {%- endif %} diff --git a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py index 45d7476..eb2f03b 100644 --- a/mojo/public/tools/bindings/generators/mojom_cpp_generator.py +++ b/mojo/public/tools/bindings/generators/mojom_cpp_generator.py @@ -334,8 +334,7 @@ def TranslateConstants(token, kind): if token.parent_kind: name.append(token.parent_kind.name) if isinstance(token, mojom.EnumValue): - name.append( - "%s_%s" % (generator.CamelCaseToAllCaps(token.enum.name), token.name)) + name.extend([token.enum.name, token.name]) else: name.append(token.name) return "::".join(name) @@ -463,7 +462,6 @@ class Generator(generator.Generator): "passes_associated_kinds": mojom.PassesAssociatedKinds, "struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE, "stylize_method": generator.StudlyCapsToCamel, - "to_all_caps": generator.CamelCaseToAllCaps, "under_to_camel": generator.UnderToCamel, } diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py index 9c225b4..0ecc615 100644 --- a/mojo/public/tools/bindings/pylib/mojom/generate/generator.py +++ b/mojo/public/tools/bindings/pylib/mojom/generate/generator.py @@ -20,10 +20,6 @@ def ExpectedArraySize(kind): def StudlyCapsToCamel(studly): return studly[0].lower() + studly[1:] -def CamelCaseToAllCaps(camel_case): - return '_'.join( - word for word in re.split(r'([A-Z][^A-Z]+)', camel_case) if word).upper() - def UnderToCamel(under): """Converts underscore_separated strings to CamelCase strings.""" return ''.join(word.capitalize() for word in under.split('_')) |