diff options
author | DHNishi@gmail.com <DHNishi@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-11 03:58:48 +0000 |
---|---|---|
committer | DHNishi@gmail.com <DHNishi@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-03-11 03:58:48 +0000 |
commit | 7bd7a206a339e58cab30373804b7cce5d4778489 (patch) | |
tree | 48d79494a59823430bfaf4ea08fc2678629cd520 /tools/json_schema_compiler/cc_generator.py | |
parent | e5ad60adeaaf30793f124d78f7f147e4c7005f07 (diff) | |
download | chromium_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.py | 82 |
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): |