| Index: tools/json_schema_compiler/cpp_bundle_generator.py
|
| diff --git a/tools/json_schema_compiler/cpp_bundle_generator.py b/tools/json_schema_compiler/cpp_bundle_generator.py
|
| index 453e4466cc03a240007ce3f26c959897c03770a8..580bca852080297cb3829eaa29b214b2664e0b10 100644
|
| --- a/tools/json_schema_compiler/cpp_bundle_generator.py
|
| +++ b/tools/json_schema_compiler/cpp_bundle_generator.py
|
| @@ -215,14 +215,23 @@ class _SchemasHGenerator(object):
|
| c.Append()
|
| c.Append('class GeneratedSchemas {')
|
| c.Sblock(' public:')
|
| - c.Append('// Puts all API schemas in |schemas|.')
|
| - c.Append('static void Get('
|
| - 'std::map<std::string, base::StringPiece>* schemas);')
|
| + c.Append('// Determines if schema named |name| is generated.')
|
| + c.Append('static bool IsGenerated(std::string name);')
|
| + c.Append()
|
| + c.Append('// Gets the API schema named |name|.')
|
| + c.Append('static base::StringPiece Get(const std::string& name);')
|
| c.Eblock('};');
|
| c.Append()
|
| c.Concat(cpp_util.CloseNamespace(self._bundle._cpp_namespace))
|
| return self._bundle._GenerateHeader('generated_schemas', c)
|
|
|
| +def _FormatNameAsConstant(name):
|
| + """Formats a name to be a C++ constant of the form kConstantName"""
|
| + name = '%s%s' % (name[0].upper(), name[1:])
|
| + return 'k%s' % re.sub('_[a-z]',
|
| + lambda m: m.group(0)[1].upper(),
|
| + name.replace('.', '_'))
|
| +
|
| class _SchemasCCGenerator(object):
|
| """Generates a code.Code object for the generated schemas .cc file"""
|
|
|
| @@ -236,11 +245,9 @@ class _SchemasCCGenerator(object):
|
| c.Append('#include "%s"' % (os.path.join(SOURCE_BASE_PATH,
|
| 'generated_schemas.h')))
|
| c.Append()
|
| - c.Concat(cpp_util.OpenNamespace(self._bundle._cpp_namespace))
|
| + c.Append('#include "base/lazy_instance.h"')
|
| c.Append()
|
| - c.Append('// static')
|
| - c.Sblock('void GeneratedSchemas::Get('
|
| - 'std::map<std::string, base::StringPiece>* schemas) {')
|
| + c.Append('namespace {')
|
| for api in self._bundle._api_defs:
|
| namespace = self._bundle._model.namespaces[api.get('namespace')]
|
| # JSON parsing code expects lists of schemas, so dump a singleton list.
|
| @@ -249,7 +256,34 @@ class _SchemasCCGenerator(object):
|
| # Escape all double-quotes and backslashes. For this to output a valid
|
| # JSON C string, we need to escape \ and ".
|
| json_content = json_content.replace('\\', '\\\\').replace('"', '\\"')
|
| - c.Append('(*schemas)["%s"] = "%s";' % (namespace.name, json_content))
|
| + c.Append('const char %s[] = "%s";' %
|
| + (_FormatNameAsConstant(namespace.name), json_content))
|
| + c.Append('}')
|
| + c.Concat(cpp_util.OpenNamespace(self._bundle._cpp_namespace))
|
| + c.Append()
|
| + c.Sblock('struct Static {')
|
| + c.Sblock('Static() {')
|
| + for api in self._bundle._api_defs:
|
| + namespace = self._bundle._model.namespaces[api.get('namespace')]
|
| + c.Append('schemas["%s"] = %s;' % (namespace.name,
|
| + _FormatNameAsConstant(namespace.name)))
|
| + c.Eblock('}');
|
| + c.Append()
|
| + c.Append('std::map<std::string, const char*> schemas;')
|
| + c.Eblock('};');
|
| + c.Append()
|
| + c.Append('base::LazyInstance<Static> g_lazy_instance;')
|
| + c.Append()
|
| + c.Append('// static')
|
| + c.Sblock('base::StringPiece GeneratedSchemas::Get('
|
| + 'const std::string& name) {')
|
| + c.Append('return IsGenerated(name) ? '
|
| + 'g_lazy_instance.Get().schemas[name] : "";')
|
| + c.Eblock('}')
|
| + c.Append()
|
| + c.Append('// static')
|
| + c.Sblock('bool GeneratedSchemas::IsGenerated(std::string name) {')
|
| + c.Append('return g_lazy_instance.Get().schemas.count(name) > 0;')
|
| c.Eblock('}')
|
| c.Append()
|
| c.Concat(cpp_util.CloseNamespace(self._bundle._cpp_namespace))
|
|
|