summaryrefslogtreecommitdiffstats
path: root/mojo/public/tools
diff options
context:
space:
mode:
authorsammc <sammc@chromium.org>2016-01-20 21:30:18 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-21 05:31:02 +0000
commit16fb38a8b87fe700645055e472d84de7aefe48a5 (patch)
tree02d83267f9a8a9f8e182c6a857347a7a683e81e6 /mojo/public/tools
parentc8a1187b4dfc11061d8ba792c73225196c56c6aa (diff)
downloadchromium_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')
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/enum_macros.tmpl27
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/module.h.tmpl15
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl2
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl2
-rw-r--r--mojo/public/tools/bindings/generators/mojom_cpp_generator.py4
-rw-r--r--mojo/public/tools/bindings/pylib/mojom/generate/generator.py4
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('_'))