Commit 0ef7f5a1 authored by cduvall@chromium.org's avatar cduvall@chromium.org

JSON schema compiler can't handle strings as types

JSON schema compiler now supports having strings as types.

Similar to http://crbug.com/122075

BUG=124771
TEST=cpp_type_generator_test.py


Review URL: http://codereview.chromium.org/10206034

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@134674 0039d316-1c4b-4281-b951-d872f2087c98
parent 8011b8f5
......@@ -20,6 +20,7 @@
'json_schema_files': [
'browserAction.json',
'experimental.declarative.json',
'experimental.fontSettings.json',
'permissions.json',
'storage.json',
'tabs.json',
......
......@@ -166,7 +166,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"type": "function",
......@@ -184,7 +185,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"name": "callback",
......@@ -235,7 +237,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"type": "function",
......@@ -253,7 +256,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"name": "callback",
......@@ -304,7 +308,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"type": "function",
......@@ -322,7 +327,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"name": "callback",
......@@ -373,7 +379,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"type": "function",
......@@ -391,7 +398,8 @@
"name": "details",
"type": "object",
"optional": true,
"description": "This parameter is currently unused."
"description": "This parameter is currently unused.",
"properties": {}
},
{
"name": "callback",
......
......@@ -388,6 +388,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -472,6 +476,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -556,6 +564,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -777,6 +789,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -861,6 +877,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -999,6 +1019,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -1137,6 +1161,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......@@ -1556,6 +1584,10 @@ directory. For other examples and for help in viewing the source code, see
</dt>
<dd>This parameter is currently unused.</dd>
<!-- OBJECT PROPERTIES -->
<dd>
<dl>
</dl>
</dd>
<!-- OBJECT METHODS -->
<!-- OBJECT EVENT FIELDS -->
<!-- FUNCTION PARAMETERS -->
......
......@@ -354,7 +354,7 @@ class CCGenerator(object):
return '%s.release()' % self._util_cc_helper.CreateValueFromArray(
self._cpp_type_generator.GetReferencedProperty(prop), var,
prop.optional)
elif prop.type_.is_fundamental:
elif self._IsFundamentalOrFundamentalRef(prop):
if prop.optional:
var = '*' + var
return {
......@@ -461,17 +461,22 @@ class CCGenerator(object):
.Append(' return %(failure_value)s;')
)
if prop.type_.is_fundamental:
if self._IsFundamentalOrFundamentalRef(prop):
if prop.optional:
(c.Append('%(ctype)s temp;')
.Append('if (%s)' %
cpp_util.GetAsFundamentalValue(prop, value_var, '&temp'))
cpp_util.GetAsFundamentalValue(
self._cpp_type_generator.GetReferencedProperty(prop),
value_var,
'&temp'))
.Append(' %(dst)s->%(name)s.reset(new %(ctype)s(temp));')
)
else:
(c.Append('if (!%s)' %
cpp_util.GetAsFundamentalValue(
prop, value_var, '&%s->%s' % (dst, prop.unix_name)))
self._cpp_type_generator.GetReferencedProperty(prop),
value_var,
'&%s->%s' % (dst, prop.unix_name)))
.Append('return %(failure_value)s;')
)
elif self._IsObjectOrObjectRef(prop):
......@@ -657,3 +662,10 @@ class CCGenerator(object):
"""
return (self._cpp_type_generator.GetReferencedProperty(prop).type_ ==
PropertyType.ARRAY)
def _IsFundamentalOrFundamentalRef(self, prop):
"""Determines if this property is a Fundamental type or is a ref to a
Fundamental type.
"""
return (self._cpp_type_generator.GetReferencedProperty(prop).type_.
is_fundamental)
......@@ -78,7 +78,7 @@ def handle_single_schema(filename, dest_dir, root, root_namespace):
continue
type_generator.AddNamespace(
referenced_namespace,
referenced_namespace.unix_name)
referenced_namespace.name)
h_code = (h_generator.HGenerator(namespace, type_generator)
.Generate().Render())
......@@ -120,7 +120,7 @@ def handle_bundle_schema(filenames, dest_dir, root, root_namespace):
for referenced_namespace in api_model.namespaces.values():
type_generator.AddNamespace(
referenced_namespace,
referenced_namespace.unix_name)
referenced_namespace.name)
generator = schema_bundle_generator.SchemaBundleGenerator(
api_model, api_defs, type_generator)
......
......@@ -175,12 +175,19 @@ class CppTypeGenerator(object):
for namespace, types in sorted(self._NamespaceTypeDependencies().items()):
c.Append('namespace %s {' % namespace.name)
for type_ in types:
if namespace.types[type_].type_ != PropertyType.ARRAY:
if namespace.types[type_].type_ == PropertyType.STRING:
c.Append('typedef std::string %s;' % type_)
elif namespace.types[type_].type_ == PropertyType.ARRAY:
c.Append('typedef std::vector<%(item_type)s> %(name)s;')
c.Substitute({'name': type_, 'item_type':
self.GetType(namespace.types[type_].item_type,
wrap_optional=True)})
else:
c.Append('struct %s;' % type_)
c.Append('}')
c.Concat(self.GetNamespaceStart())
for (name, type_) in self._namespace.types.items():
if not type_.functions and type_.type_ != PropertyType.ARRAY:
if not type_.functions and type_.type_ == PropertyType.OBJECT:
c.Append('struct %s;' % name)
c.Concat(self.GetNamespaceEnd())
return c
......
......@@ -27,6 +27,14 @@ class CppTypeGeneratorTest(unittest.TestCase):
self.model.AddNamespace(self.browser_action_json[0],
'path/to/browserAction.json')
self.browser_action = self.model.namespaces.get('browserAction')
self.font_settings_json = CachedLoad('test/fontSettings.json')
self.model.AddNamespace(self.font_settings_json[0],
'path/to/fontSettings.json')
self.font_settings = self.model.namespaces.get('fontSettings')
self.dependency_tester_json = CachedLoad('test/dependencyTester.json')
self.model.AddNamespace(self.dependency_tester_json[0],
'path/to/dependencyTester.json')
self.dependency_tester = self.model.namespaces.get('dependencyTester')
def testGenerateIncludesAndForwardDeclarations(self):
manager = CppTypeGenerator('', self.windows, self.windows.unix_name)
......@@ -71,6 +79,32 @@ class CppTypeGeneratorTest(unittest.TestCase):
'} // windows',
manager.GenerateForwardDeclarations().Render())
def testGenerateIncludesAndForwardDeclarationsDependencies(self):
m = model.Model()
browser_action_namespace = m.AddNamespace(self.browser_action_json[0],
'path/to/browserAction.json')
font_settings_namespace = m.AddNamespace(self.font_settings_json[0],
'path/to/fontSettings.json')
manager = CppTypeGenerator('', self.dependency_tester,
self.dependency_tester.unix_name)
manager.AddNamespace(browser_action_namespace,
self.browser_action.unix_name)
manager.AddNamespace(font_settings_namespace,
self.font_settings.unix_name)
self.assertEquals('#include "path/to/browser_action.h"\n'
'#include "path/to/font_settings.h"',
manager.GenerateIncludes().Render())
self.assertEquals(
'namespace browserAction {\n'
'typedef std::vector<int> ColorArray;\n'
'}\n'
'namespace fontSettings {\n'
'typedef std::string ScriptCode;\n'
'}\n'
'namespace dependency_tester {\n'
'} // dependency_tester',
manager.GenerateForwardDeclarations().Render())
def testChoicesEnum(self):
manager = CppTypeGenerator('', self.tabs, self.tabs.unix_name)
prop = self.tabs.functions['move'].params[0]
......@@ -93,6 +127,13 @@ class CppTypeGeneratorTest(unittest.TestCase):
manager.GetType(
self.tabs.types['Tab'].properties['selected']))
def testStringAsType(self):
manager = CppTypeGenerator('', self.font_settings,
self.font_settings.unix_name)
self.assertEquals('std::string',
manager.GetType(
self.font_settings.types['ScriptCode']))
def testArrayAsType(self):
manager = CppTypeGenerator('', self.browser_action,
self.browser_action.unix_name)
......
......@@ -179,6 +179,11 @@ class HGenerator(object):
c.Substitute({'classname': classname, 'item_type':
self._cpp_type_generator.GetType(type_.item_type,
wrap_optional=True)})
elif type_.type_ == PropertyType.STRING:
if type_.description:
c.Comment(type_.description)
c.Append('typedef std::string %(classname)s;')
c.Substitute({'classname': classname})
else:
if type_.description:
c.Comment(type_.description)
......
......@@ -76,6 +76,8 @@ class Type(object):
self.item_type = Property(self, name + "Element", json['items'],
from_json=True,
from_client=True)
elif json.get('type') == 'string':
self.type_ = PropertyType.STRING
else:
if not (
'properties' in json or
......
// Copyright (c) 2012 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.
[
{
"namespace": "dependencyTester",
"dependencies": [ "browserAction", "fontSettings" ],
"types": [],
"functions": [
{
"name": "setTitle",
"type": "function",
"description": "hi",
"parameters": [
{
"name": "details",
"type": "object",
"properties": {
"color": {
"$ref": "ColorArray"
},
"scriptCode": {
"$ref": "ScriptCode"
}
}
}
]
}
]
}
]
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment