blob: 92699fa8ce998378529a9c6ed38de8b960591296 [file] [log] [blame]
# 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
_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',
}
_proto_path_to_file_map = {}
def RegisterProtoFile(proto_file):
_proto_path_to_file_map[proto_file.Filename()] = proto_file
RegisterTypesForFile(proto_file)
def GetProtoFileForFilename(filename):
proto_file = _proto_path_to_file_map[filename]
assert proto_file
return proto_file
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 TitleCase(s):
return ''.join(p[0].upper() + p[1:] for p in s.split('_'))
def QualifiedTypesForChild(name, parent_typenames):
title_name = 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)