summaryrefslogtreecommitdiffstats
path: root/tools/json_schema_compiler/cc_generator.py
diff options
context:
space:
mode:
authorDHNishi@gmail.com <DHNishi@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-11 03:58:48 +0000
committerDHNishi@gmail.com <DHNishi@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-11 03:58:48 +0000
commit7bd7a206a339e58cab30373804b7cce5d4778489 (patch)
tree48d79494a59823430bfaf4ea08fc2678629cd520 /tools/json_schema_compiler/cc_generator.py
parente5ad60adeaaf30793f124d78f7f147e4c7005f07 (diff)
downloadchromium_src-7bd7a206a339e58cab30373804b7cce5d4778489.zip
chromium_src-7bd7a206a339e58cab30373804b7cce5d4778489.tar.gz
chromium_src-7bd7a206a339e58cab30373804b7cce5d4778489.tar.bz2
Make JSON Schema Compiler errors into warnings if recoverable.
BUG=317194 Review URL: https://codereview.chromium.org/81403003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@256120 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/json_schema_compiler/cc_generator.py')
-rw-r--r--tools/json_schema_compiler/cc_generator.py82
1 files changed, 57 insertions, 25 deletions
diff --git a/tools/json_schema_compiler/cc_generator.py b/tools/json_schema_compiler/cc_generator.py
index 04d951b..2c47b5e 100644
--- a/tools/json_schema_compiler/cc_generator.py
+++ b/tools/json_schema_compiler/cc_generator.py
@@ -49,6 +49,8 @@ class _Generator(object):
(self._namespace.source_file_dir, self._namespace.short_filename))
.Cblock(self._type_helper.GenerateIncludes(include_soft=True))
.Append()
+ .Append('using base::UTF8ToUTF16;')
+ .Append()
.Concat(cpp_util.OpenNamespace(self._cpp_namespace))
.Cblock(self._type_helper.GetNamespaceStart())
)
@@ -529,7 +531,8 @@ class _Generator(object):
.Sblock('scoped_ptr<Params> Params::Create(%s) {' % self._GenerateParams(
['const base::ListValue& args']))
.Concat(self._GenerateParamsCheck(function, 'args'))
- .Append('scoped_ptr<Params> params(new Params());'))
+ .Append('scoped_ptr<Params> params(new Params());')
+ )
for param in function.params:
c.Concat(self._InitializePropertyToDefault(param, 'params'))
@@ -603,10 +606,13 @@ class _Generator(object):
'"\'%%(key)s\': expected ' + '%s, got " + %s' % (
type_.name,
self._util_cc_helper.GetValueTypeString(
- '%%(src_var)s', True))))
- .Append('return %(failure_value)s;')
- .Eblock('}')
- .Append('%(dst_var)s.reset(new %(cpp_type)s(temp));')
+ '%%(src_var)s', True)))))
+ c.Append('%(dst_var)s.reset();')
+ if not self._generate_error_messages:
+ c.Append('return %(failure_value)s;')
+ (c.Eblock('}')
+ .Append('else')
+ .Append(' %(dst_var)s.reset(new %(cpp_type)s(temp));')
)
else:
(c.Sblock('if (!%s) {' % cpp_util.GetAsFundamentalValue(
@@ -627,15 +633,23 @@ class _Generator(object):
.Sblock('if (!%(src_var)s->GetAsDictionary(&dictionary)) {')
.Concat(self._GenerateError(
'"\'%%(key)s\': expected dictionary, got " + ' +
- self._util_cc_helper.GetValueTypeString('%%(src_var)s', True)))
- .Append('return %(failure_value)s;')
- .Eblock('}')
+ self._util_cc_helper.GetValueTypeString('%%(src_var)s', True))))
+ # If an optional property fails to populate, the population can still
+ # succeed with a warning. If no error messages are generated, this
+ # warning is not set and we fail out instead.
+ if not self._generate_error_messages:
+ c.Append('return %(failure_value)s;')
+ (c.Eblock('}')
+ .Sblock('else {')
.Append('scoped_ptr<%(cpp_type)s> temp(new %(cpp_type)s());')
.Append('if (!%%(cpp_type)s::Populate(%s)) {' % self._GenerateArgs(
('*dictionary', 'temp.get()')))
.Append(' return %(failure_value)s;')
- .Append('}')
- .Append('%(dst_var)s = temp.Pass();')
+ )
+ (c.Append('}')
+ .Append('else')
+ .Append(' %(dst_var)s = temp.Pass();')
+ .Eblock('}')
)
else:
(c.Append('const base::DictionaryValue* dictionary = NULL;')
@@ -662,8 +676,13 @@ class _Generator(object):
.Concat(self._GenerateError(
'"\'%%(key)s\': expected list, got " + ' +
self._util_cc_helper.GetValueTypeString('%%(src_var)s', True)))
- .Append('return %(failure_value)s;')
- .Eblock('}'))
+ )
+ if is_ptr and self._generate_error_messages:
+ c.Append('%(dst_var)s.reset();')
+ else:
+ c.Append('return %(failure_value)s;')
+ c.Eblock('}')
+ c.Sblock('else {')
item_type = self._type_helper.FollowRef(underlying_type.item_type)
if item_type.property_type == PropertyType.ENUM:
c.Concat(self._GenerateListValueToEnumArrayConversion(
@@ -677,12 +696,15 @@ class _Generator(object):
underlying_type,
'list',
dst_var,
- is_ptr))
- .Concat(self._GenerateError(
+ is_ptr)))
+ c.Concat(self._GenerateError(
'"unable to populate array \'%%(parent_key)s\'"'))
- .Append('return %(failure_value)s;')
- .Eblock('}')
- )
+ if is_ptr and self._generate_error_messages:
+ c.Append('%(dst_var)s.reset();')
+ else:
+ c.Append('return %(failure_value)s;')
+ c.Eblock('}')
+ c.Eblock('}')
elif underlying_type.property_type == PropertyType.CHOICES:
if is_ptr:
(c.Append('scoped_ptr<%(cpp_type)s> temp(new %(cpp_type)s());')
@@ -701,14 +723,18 @@ class _Generator(object):
dst_var,
failure_value))
elif underlying_type.property_type == PropertyType.BINARY:
- (c.Sblock('if (!%(src_var)s->IsType(base::Value::TYPE_BINARY)) {')
+ (c.Append('const base::BinaryValue* binary_value = NULL;')
+ .Sblock('if (!%(src_var)s->IsType(base::Value::TYPE_BINARY)) {')
.Concat(self._GenerateError(
'"\'%%(key)s\': expected binary, got " + ' +
self._util_cc_helper.GetValueTypeString('%%(src_var)s', True)))
- .Append('return %(failure_value)s;')
- .Eblock('}')
- .Append('const base::BinaryValue* binary_value =')
- .Append(' static_cast<const base::BinaryValue*>(%(src_var)s);')
+ )
+ if not self._generate_error_messages:
+ c.Append('return %(failure_value)s;')
+ (c.Eblock('}')
+ .Sblock('else {')
+ .Append(' binary_value =')
+ .Append(' static_cast<const base::BinaryValue*>(%(src_var)s);')
)
if is_ptr:
(c.Append('%(dst_var)s.reset(')
@@ -719,6 +745,7 @@ class _Generator(object):
(c.Append('%(dst_var)s.assign(binary_value->GetBuffer(),')
.Append(' binary_value->GetSize());')
)
+ c.Eblock('}')
else:
raise NotImplementedError(type_)
if c.IsEmpty():
@@ -729,7 +756,7 @@ class _Generator(object):
'dst_var': dst_var,
'failure_value': failure_value,
'key': type_.name,
- 'parent_key': type_.parent.name
+ 'parent_key': type_.parent.name,
})).Eblock('}')
def _GenerateListValueToEnumArrayConversion(self,
@@ -927,8 +954,13 @@ class _Generator(object):
c = Code()
if not self._generate_error_messages:
return c
- (c.Append('if (error)')
- .Append(' *error = base::UTF8ToUTF16(' + body + ');'))
+ (c.Append('if (error) {')
+ .Append(' if (error->length())')
+ .Append(' error->append(UTF8ToUTF16("; "));')
+ .Append(' error->append(UTF8ToUTF16(%s));' % body)
+ .Append('}')
+ .Append('else')
+ .Append(' *error = UTF8ToUTF16(%s);' % body))
return c
def _GenerateParams(self, params):