Index: third_party/dom_distiller_js/protoc_plugins/util/types.py |
diff --git a/third_party/dom_distiller_js/protoc_plugins/util/types.py b/third_party/dom_distiller_js/protoc_plugins/util/types.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..99513be5cac599a6bad4e1be6ce26ac856dadeab |
--- /dev/null |
+++ b/third_party/dom_distiller_js/protoc_plugins/util/types.py |
@@ -0,0 +1,150 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+from google.protobuf.descriptor_pb2 import FieldDescriptorProto |
+ |
+import plugin |
+ |
+_cpp_base_type_map = { |
+ FieldDescriptorProto.TYPE_DOUBLE: 'double', |
+ FieldDescriptorProto.TYPE_FLOAT: 'float', |
+ FieldDescriptorProto.TYPE_INT64: None, |
+ FieldDescriptorProto.TYPE_UINT64: None, |
+ FieldDescriptorProto.TYPE_INT32: 'int', |
+ FieldDescriptorProto.TYPE_FIXED64: None, |
+ FieldDescriptorProto.TYPE_FIXED32: None, |
+ FieldDescriptorProto.TYPE_BOOL: 'bool', |
+ FieldDescriptorProto.TYPE_STRING: 'std::string', |
+ FieldDescriptorProto.TYPE_GROUP: None, |
+ FieldDescriptorProto.TYPE_MESSAGE: None, |
+ FieldDescriptorProto.TYPE_BYTES: None, |
+ FieldDescriptorProto.TYPE_UINT32: None, |
+ FieldDescriptorProto.TYPE_ENUM: 'int', |
+ FieldDescriptorProto.TYPE_SFIXED32: None, |
+ FieldDescriptorProto.TYPE_SFIXED64: None, |
+ FieldDescriptorProto.TYPE_SINT32: None, |
+ FieldDescriptorProto.TYPE_SINT64: None, |
+} |
+ |
+# Maps c++ types to names used in base::Value methods (like GetDouble, |
+# GetInteger, etc). |
+_cpp_type_to_value_type_map = { |
+ 'double': 'Double', |
+ 'float': 'Double', |
+ 'int': 'Integer', |
+ 'bool': 'Boolean', |
+ 'std::string': 'String', |
+} |
+ |
+ |
+def GetCppPrimitiveType(type_name): |
+ return _cpp_base_type_map[type_name] |
+ |
+ |
+def GetCppValueType(primitive_type): |
+ return _cpp_type_to_value_type_map[primitive_type] |
+ |
+ |
+# TYPE_ENUM and TYPE_MESSAGE are supported, but their types depend on type_name. |
+_java_base_type_map = { |
+ FieldDescriptorProto.TYPE_DOUBLE: 'double', |
+ FieldDescriptorProto.TYPE_FLOAT: 'float', |
+ FieldDescriptorProto.TYPE_INT64: None, |
+ FieldDescriptorProto.TYPE_UINT64: None, |
+ FieldDescriptorProto.TYPE_INT32: 'int', |
+ FieldDescriptorProto.TYPE_FIXED64: None, |
+ FieldDescriptorProto.TYPE_FIXED32: None, |
+ FieldDescriptorProto.TYPE_BOOL: 'boolean', |
+ FieldDescriptorProto.TYPE_STRING: 'String', |
+ FieldDescriptorProto.TYPE_GROUP: None, |
+ FieldDescriptorProto.TYPE_MESSAGE: None, |
+ FieldDescriptorProto.TYPE_BYTES: None, |
+ FieldDescriptorProto.TYPE_UINT32: None, |
+ FieldDescriptorProto.TYPE_ENUM: None, |
+ FieldDescriptorProto.TYPE_SFIXED32: None, |
+ FieldDescriptorProto.TYPE_SFIXED64: None, |
+ FieldDescriptorProto.TYPE_SINT32: None, |
+ FieldDescriptorProto.TYPE_SINT64: None, |
+} |
+ |
+ |
+# Maps java primitive types to java types usable in containers (e.g. |
+# List<Integer>). |
+_java_primitive_to_object_map = { |
+ 'boolean': 'Boolean', |
+ 'int': 'Integer', |
+ 'long': 'Long', |
+ 'float': 'Float', |
+ 'double': 'Double', |
+} |
+ |
+ |
+def GetJavaPrimitiveType(field_type): |
+ return _java_base_type_map[field_type] |
+ |
+ |
+def GetJavaObjectType(java_base_type): |
+ if not java_base_type in _java_primitive_to_object_map: |
+ return java_base_type |
+ return _java_primitive_to_object_map[java_base_type] |
+ |
+ |
+_proto_cpp_converter_class_map = {} |
+_proto_java_class_map = {} |
+ |
+def ResolveCppConverterType(s): |
+ if s.startswith('.'): |
+ s = s[1:] |
+ return _proto_cpp_converter_class_map[s] |
+ return s |
+ |
+ |
+def ResolveJavaClassType(s): |
+ if s.startswith('.'): |
+ s = s[1:] |
+ return _proto_java_class_map[s] |
+ return s |
+ |
+ |
+class QualifiedTypes(object): |
+ def __init__(self, proto, java, cpp_base, cpp_converter): |
+ self.proto = proto |
+ self.java = java |
+ |
+ # cpp_base is the standard protoc-generated class for this type. |
+ self.cpp_base = cpp_base |
+ self.cpp_converter = cpp_converter |
+ |
+ def Register(self): |
+ _proto_cpp_converter_class_map[self.proto] = self.cpp_converter |
+ _proto_java_class_map[self.proto] = self.java |
+ |
+ |
+def QualifiedTypesForChild(name, parent_typenames): |
+ title_name = plugin.TitleCase(name) |
+ proto = parent_typenames.proto + '.' + name |
+ java = parent_typenames.java + '.' + title_name |
+ cpp_base = parent_typenames.cpp_base + '::' + title_name |
+ cpp_converter = parent_typenames.cpp_converter + '::' + title_name |
+ return QualifiedTypes(proto, java, cpp_base, cpp_converter) |
+ |
+ |
+def RegisterTypesForEnum(proto_enum): |
+ proto_enum.QualifiedTypes().Register() |
+ |
+ |
+def RegisterTypesForMessage(proto_message): |
+ proto_message.QualifiedTypes().Register() |
+ for enum in proto_message.GetEnums(): |
+ RegisterTypesForEnum(enum) |
+ for child in proto_message.GetMessages(): |
+ RegisterTypesForMessage(child) |
+ |
+ |
+def RegisterTypesForFile(proto_file): |
+ for enum in proto_file.GetEnums(): |
+ RegisterTypesForEnum(enum) |
+ for message in proto_file.GetMessages(): |
+ RegisterTypesForMessage(message) |
+ |