| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from code import Code | 5 from code import Code |
| 6 from model import PropertyType | 6 from model import PropertyType |
| 7 import cpp_util | 7 import cpp_util |
| 8 import schema_util | 8 import schema_util |
| 9 import util_cc_helper | 9 import util_cc_helper |
| 10 from cpp_namespace_environment import CppNamespaceEnvironment | 10 from cpp_namespace_environment import CppNamespaceEnvironment |
| (...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 404 'src': src, | 404 'src': src, |
| 405 'dst': dst, | 405 'dst': dst, |
| 406 'name': prop.unix_name | 406 'name': prop.unix_name |
| 407 }) | 407 }) |
| 408 return c | 408 return c |
| 409 | 409 |
| 410 def _GenerateTypeFromValue(self, cpp_namespace, type_): | 410 def _GenerateTypeFromValue(self, cpp_namespace, type_): |
| 411 classname = cpp_util.Classname(schema_util.StripNamespace(type_.name)) | 411 classname = cpp_util.Classname(schema_util.StripNamespace(type_.name)) |
| 412 c = Code() | 412 c = Code() |
| 413 (c.Append('// static') | 413 (c.Append('// static') |
| 414 .Append('scoped_ptr<%s> %s::FromValue(%s) {' % (classname, | 414 .Append('std::unique_ptr<%s> %s::FromValue(%s) {' % (classname, |
| 415 cpp_namespace, self._GenerateParams(('const base::Value& value',)))) | 415 cpp_namespace, self._GenerateParams(('const base::Value& value',)))) |
| 416 ) | 416 ) |
| 417 if self._generate_error_messages: | 417 if self._generate_error_messages: |
| 418 c.Append('DCHECK(error);') | 418 c.Append('DCHECK(error);') |
| 419 (c.Append(' scoped_ptr<%s> out(new %s());' % (classname, classname)) | 419 (c.Append(' std::unique_ptr<%s> out(new %s());' % (classname, classname)) |
| 420 .Append(' if (!Populate(%s))' % self._GenerateArgs( | 420 .Append(' if (!Populate(%s))' % self._GenerateArgs( |
| 421 ('value', 'out.get()'))) | 421 ('value', 'out.get()'))) |
| 422 .Append(' return scoped_ptr<%s>();' % classname) | 422 .Append(' return nullptr;') |
| 423 .Append(' return out;') | 423 .Append(' return out;') |
| 424 .Append('}') | 424 .Append('}') |
| 425 ) | 425 ) |
| 426 return c | 426 return c |
| 427 | 427 |
| 428 def _GenerateTypeToValue(self, cpp_namespace, type_): | 428 def _GenerateTypeToValue(self, cpp_namespace, type_): |
| 429 """Generates a function that serializes the type into a base::Value. | 429 """Generates a function that serializes the type into a base::Value. |
| 430 E.g. for type "Foo" generates Foo::ToValue() | 430 E.g. for type "Foo" generates Foo::ToValue() |
| 431 """ | 431 """ |
| 432 if type_.property_type == PropertyType.OBJECT: | 432 if type_.property_type == PropertyType.OBJECT: |
| 433 return self._GenerateObjectTypeToValue(cpp_namespace, type_) | 433 return self._GenerateObjectTypeToValue(cpp_namespace, type_) |
| 434 elif type_.property_type == PropertyType.CHOICES: | 434 elif type_.property_type == PropertyType.CHOICES: |
| 435 return self._GenerateChoiceTypeToValue(cpp_namespace, type_) | 435 return self._GenerateChoiceTypeToValue(cpp_namespace, type_) |
| 436 else: | 436 else: |
| 437 raise ValueError("Unsupported property type %s" % type_.type_) | 437 raise ValueError("Unsupported property type %s" % type_.type_) |
| 438 | 438 |
| 439 def _GenerateObjectTypeToValue(self, cpp_namespace, type_): | 439 def _GenerateObjectTypeToValue(self, cpp_namespace, type_): |
| 440 """Generates a function that serializes an object-representing type | 440 """Generates a function that serializes an object-representing type |
| 441 into a base::DictionaryValue. | 441 into a base::DictionaryValue. |
| 442 """ | 442 """ |
| 443 c = Code() | 443 c = Code() |
| 444 (c.Sblock('scoped_ptr<base::DictionaryValue> %s::ToValue() const {' % | 444 (c.Sblock('std::unique_ptr<base::DictionaryValue> %s::ToValue() const {' % |
| 445 cpp_namespace) | 445 cpp_namespace) |
| 446 .Append('scoped_ptr<base::DictionaryValue> value(' | 446 .Append('std::unique_ptr<base::DictionaryValue> value(' |
| 447 'new base::DictionaryValue());') | 447 'new base::DictionaryValue());') |
| 448 .Append() | 448 .Append() |
| 449 ) | 449 ) |
| 450 | 450 |
| 451 for prop in type_.properties.values(): | 451 for prop in type_.properties.values(): |
| 452 prop_var = 'this->%s' % prop.unix_name | 452 prop_var = 'this->%s' % prop.unix_name |
| 453 if prop.optional: | 453 if prop.optional: |
| 454 underlying_type = self._type_helper.FollowRef(prop.type_) | 454 underlying_type = self._type_helper.FollowRef(prop.type_) |
| 455 if underlying_type.property_type == PropertyType.ENUM: | 455 if underlying_type.property_type == PropertyType.ENUM: |
| 456 # Optional enum values are generated with a NONE enum value, | 456 # Optional enum values are generated with a NONE enum value, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 | 493 |
| 494 return (c.Append() | 494 return (c.Append() |
| 495 .Append('return value;') | 495 .Append('return value;') |
| 496 .Eblock('}')) | 496 .Eblock('}')) |
| 497 | 497 |
| 498 def _GenerateChoiceTypeToValue(self, cpp_namespace, type_): | 498 def _GenerateChoiceTypeToValue(self, cpp_namespace, type_): |
| 499 """Generates a function that serializes a choice-representing type | 499 """Generates a function that serializes a choice-representing type |
| 500 into a base::Value. | 500 into a base::Value. |
| 501 """ | 501 """ |
| 502 c = Code() | 502 c = Code() |
| 503 c.Sblock('scoped_ptr<base::Value> %s::ToValue() const {' % cpp_namespace) | 503 c.Sblock('std::unique_ptr<base::Value> %s::ToValue() const {' % |
| 504 c.Append('scoped_ptr<base::Value> result;') | 504 cpp_namespace) |
| 505 c.Append('std::unique_ptr<base::Value> result;') |
| 505 for choice in type_.choices: | 506 for choice in type_.choices: |
| 506 choice_var = 'as_%s' % choice.unix_name | 507 choice_var = 'as_%s' % choice.unix_name |
| 507 # Enums cannot be wrapped with scoped_ptr, but the XXX_NONE enum value | 508 # Enums cannot be wrapped with scoped_ptr, but the XXX_NONE enum value |
| 508 # is equal to 0. | 509 # is equal to 0. |
| 509 (c.Sblock('if (%s) {' % choice_var) | 510 (c.Sblock('if (%s) {' % choice_var) |
| 510 .Append('DCHECK(!result) << "Cannot set multiple choices for %s";' % | 511 .Append('DCHECK(!result) << "Cannot set multiple choices for %s";' % |
| 511 type_.unix_name) | 512 type_.unix_name) |
| 512 .Cblock(self._CreateValueFromType('result.reset(%s);', | 513 .Cblock(self._CreateValueFromType('result.reset(%s);', |
| 513 choice.name, | 514 choice.name, |
| 514 choice, | 515 choice, |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 672 if num_required == len(function.params): | 673 if num_required == len(function.params): |
| 673 c.Sblock('if (%(var)s.GetSize() != %(total)d) {') | 674 c.Sblock('if (%(var)s.GetSize() != %(total)d) {') |
| 674 elif not num_required: | 675 elif not num_required: |
| 675 c.Sblock('if (%(var)s.GetSize() > %(total)d) {') | 676 c.Sblock('if (%(var)s.GetSize() > %(total)d) {') |
| 676 else: | 677 else: |
| 677 c.Sblock('if (%(var)s.GetSize() < %(required)d' | 678 c.Sblock('if (%(var)s.GetSize() < %(required)d' |
| 678 ' || %(var)s.GetSize() > %(total)d) {') | 679 ' || %(var)s.GetSize() > %(total)d) {') |
| 679 (c.Concat(self._GenerateError( | 680 (c.Concat(self._GenerateError( |
| 680 '"expected %%(total)d arguments, got " ' | 681 '"expected %%(total)d arguments, got " ' |
| 681 '+ base::IntToString(%%(var)s.GetSize())')) | 682 '+ base::IntToString(%%(var)s.GetSize())')) |
| 682 .Append('return scoped_ptr<Params>();') | 683 .Append('return nullptr;') |
| 683 .Eblock('}') | 684 .Eblock('}') |
| 684 .Substitute({ | 685 .Substitute({ |
| 685 'var': var, | 686 'var': var, |
| 686 'required': num_required, | 687 'required': num_required, |
| 687 'total': len(function.params), | 688 'total': len(function.params), |
| 688 })) | 689 })) |
| 689 return c | 690 return c |
| 690 | 691 |
| 691 def _GenerateFunctionParamsCreate(self, function): | 692 def _GenerateFunctionParamsCreate(self, function): |
| 692 """Generate function to create an instance of Params. The generated | 693 """Generate function to create an instance of Params. The generated |
| 693 function takes a base::ListValue of arguments. | 694 function takes a base::ListValue of arguments. |
| 694 | 695 |
| 695 E.g for function "Bar", generate Bar::Params::Create() | 696 E.g for function "Bar", generate Bar::Params::Create() |
| 696 """ | 697 """ |
| 697 c = Code() | 698 c = Code() |
| 698 (c.Append('// static') | 699 (c.Append('// static') |
| 699 .Sblock('scoped_ptr<Params> Params::Create(%s) {' % self._GenerateParams( | 700 .Sblock('std::unique_ptr<Params> Params::Create(%s) {' % |
| 700 ['const base::ListValue& args'])) | 701 self._GenerateParams(['const base::ListValue& args'])) |
| 701 ) | 702 ) |
| 702 if self._generate_error_messages: | 703 if self._generate_error_messages: |
| 703 c.Append('DCHECK(error);') | 704 c.Append('DCHECK(error);') |
| 704 (c.Concat(self._GenerateParamsCheck(function, 'args')) | 705 (c.Concat(self._GenerateParamsCheck(function, 'args')) |
| 705 .Append('scoped_ptr<Params> params(new Params());') | 706 .Append('std::unique_ptr<Params> params(new Params());') |
| 706 ) | 707 ) |
| 707 | 708 |
| 708 for param in function.params: | 709 for param in function.params: |
| 709 c.Concat(self._InitializePropertyToDefault(param, 'params')) | 710 c.Concat(self._InitializePropertyToDefault(param, 'params')) |
| 710 | 711 |
| 711 for i, param in enumerate(function.params): | 712 for i, param in enumerate(function.params): |
| 712 # Any failure will cause this function to return. If any argument is | 713 # Any failure will cause this function to return. If any argument is |
| 713 # incorrect or missing, those following it are not processed. Note that | 714 # incorrect or missing, those following it are not processed. Note that |
| 714 # for optional arguments, we allow missing arguments and proceed because | 715 # for optional arguments, we allow missing arguments and proceed because |
| 715 # there may be other arguments following it. | 716 # there may be other arguments following it. |
| 716 failure_value = 'scoped_ptr<Params>()' | 717 failure_value = 'std::unique_ptr<Params>()' |
| 717 c.Append() | 718 c.Append() |
| 718 value_var = param.unix_name + '_value' | 719 value_var = param.unix_name + '_value' |
| 719 (c.Append('const base::Value* %(value_var)s = NULL;') | 720 (c.Append('const base::Value* %(value_var)s = NULL;') |
| 720 .Append('if (args.Get(%(i)s, &%(value_var)s) &&') | 721 .Append('if (args.Get(%(i)s, &%(value_var)s) &&') |
| 721 .Sblock(' !%(value_var)s->IsType(base::Value::TYPE_NULL)) {') | 722 .Sblock(' !%(value_var)s->IsType(base::Value::TYPE_NULL)) {') |
| 722 .Concat(self._GeneratePopulatePropertyFromValue( | 723 .Concat(self._GeneratePopulatePropertyFromValue( |
| 723 param, value_var, 'params', failure_value)) | 724 param, value_var, 'params', failure_value)) |
| 724 .Eblock('}') | 725 .Eblock('}') |
| 725 ) | 726 ) |
| 726 if not param.optional: | 727 if not param.optional: |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 805 .Concat(self._GenerateError( | 806 .Concat(self._GenerateError( |
| 806 '"\'%%(key)s\': expected dictionary, got " + ' + | 807 '"\'%%(key)s\': expected dictionary, got " + ' + |
| 807 self._util_cc_helper.GetValueTypeString('%%(src_var)s', True)))) | 808 self._util_cc_helper.GetValueTypeString('%%(src_var)s', True)))) |
| 808 # If an optional property fails to populate, the population can still | 809 # If an optional property fails to populate, the population can still |
| 809 # succeed with a warning. If no error messages are generated, this | 810 # succeed with a warning. If no error messages are generated, this |
| 810 # warning is not set and we fail out instead. | 811 # warning is not set and we fail out instead. |
| 811 if not self._generate_error_messages: | 812 if not self._generate_error_messages: |
| 812 c.Append('return %(failure_value)s;') | 813 c.Append('return %(failure_value)s;') |
| 813 (c.Eblock('}') | 814 (c.Eblock('}') |
| 814 .Sblock('else {') | 815 .Sblock('else {') |
| 815 .Append('scoped_ptr<%(cpp_type)s> temp(new %(cpp_type)s());') | 816 .Append('std::unique_ptr<%(cpp_type)s> temp(new %(cpp_type)s());') |
| 816 .Append('if (!%%(cpp_type)s::Populate(%s)) {' % self._GenerateArgs( | 817 .Append('if (!%%(cpp_type)s::Populate(%s)) {' % self._GenerateArgs( |
| 817 ('*dictionary', 'temp.get()'))) | 818 ('*dictionary', 'temp.get()'))) |
| 818 .Append(' return %(failure_value)s;') | 819 .Append(' return %(failure_value)s;') |
| 819 ) | 820 ) |
| 820 (c.Append('}') | 821 (c.Append('}') |
| 821 .Append('else') | 822 .Append('else') |
| 822 .Append(' %(dst_var)s = std::move(temp);') | 823 .Append(' %(dst_var)s = std::move(temp);') |
| 823 .Eblock('}') | 824 .Eblock('}') |
| 824 ) | 825 ) |
| 825 else: | 826 else: |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 c.Concat(self._GenerateError( | 870 c.Concat(self._GenerateError( |
| 870 '"unable to populate array \'%%(parent_key)s\'"')) | 871 '"unable to populate array \'%%(parent_key)s\'"')) |
| 871 if is_ptr and self._generate_error_messages: | 872 if is_ptr and self._generate_error_messages: |
| 872 c.Append('%(dst_var)s.reset();') | 873 c.Append('%(dst_var)s.reset();') |
| 873 else: | 874 else: |
| 874 c.Append('return %(failure_value)s;') | 875 c.Append('return %(failure_value)s;') |
| 875 c.Eblock('}') | 876 c.Eblock('}') |
| 876 c.Eblock('}') | 877 c.Eblock('}') |
| 877 elif underlying_type.property_type == PropertyType.CHOICES: | 878 elif underlying_type.property_type == PropertyType.CHOICES: |
| 878 if is_ptr: | 879 if is_ptr: |
| 879 (c.Append('scoped_ptr<%(cpp_type)s> temp(new %(cpp_type)s());') | 880 (c.Append('std::unique_ptr<%(cpp_type)s> temp(new %(cpp_type)s());') |
| 880 .Append('if (!%%(cpp_type)s::Populate(%s))' % self._GenerateArgs( | 881 .Append('if (!%%(cpp_type)s::Populate(%s))' % self._GenerateArgs( |
| 881 ('*%(src_var)s', 'temp.get()'))) | 882 ('*%(src_var)s', 'temp.get()'))) |
| 882 .Append(' return %(failure_value)s;') | 883 .Append(' return %(failure_value)s;') |
| 883 .Append('%(dst_var)s = std::move(temp);') | 884 .Append('%(dst_var)s = std::move(temp);') |
| 884 ) | 885 ) |
| 885 else: | 886 else: |
| 886 (c.Append('if (!%%(cpp_type)s::Populate(%s))' % self._GenerateArgs( | 887 (c.Append('if (!%%(cpp_type)s::Populate(%s))' % self._GenerateArgs( |
| 887 ('*%(src_var)s', '&%(dst_var)s'))) | 888 ('*%(src_var)s', '&%(dst_var)s'))) |
| 888 .Append(' return %(failure_value)s;')) | 889 .Append(' return %(failure_value)s;')) |
| 889 elif underlying_type.property_type == PropertyType.ENUM: | 890 elif underlying_type.property_type == PropertyType.ENUM: |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1078 E.g for event "Baz", generate Baz::Create | 1079 E.g for event "Baz", generate Baz::Create |
| 1079 | 1080 |
| 1080 function_scope: the function scope path, e.g. Foo::Bar for the function | 1081 function_scope: the function scope path, e.g. Foo::Bar for the function |
| 1081 Foo::Bar::Baz(). May be None if there is no function scope. | 1082 Foo::Bar::Baz(). May be None if there is no function scope. |
| 1082 callback: the Function object we are creating callback arguments for. | 1083 callback: the Function object we are creating callback arguments for. |
| 1083 """ | 1084 """ |
| 1084 c = Code() | 1085 c = Code() |
| 1085 params = callback.params | 1086 params = callback.params |
| 1086 c.Concat(self._GeneratePropertyFunctions(function_scope, params)) | 1087 c.Concat(self._GeneratePropertyFunctions(function_scope, params)) |
| 1087 | 1088 |
| 1088 (c.Sblock('scoped_ptr<base::ListValue> %(function_scope)s' | 1089 (c.Sblock('std::unique_ptr<base::ListValue> %(function_scope)s' |
| 1089 'Create(%(declaration_list)s) {') | 1090 'Create(%(declaration_list)s) {') |
| 1090 .Append('scoped_ptr<base::ListValue> create_results(' | 1091 .Append('std::unique_ptr<base::ListValue> create_results(' |
| 1091 'new base::ListValue());') | 1092 'new base::ListValue());') |
| 1092 ) | 1093 ) |
| 1093 declaration_list = [] | 1094 declaration_list = [] |
| 1094 for param in params: | 1095 for param in params: |
| 1095 declaration_list.append(cpp_util.GetParameterDeclaration( | 1096 declaration_list.append(cpp_util.GetParameterDeclaration( |
| 1096 param, self._type_helper.GetCppType(param.type_))) | 1097 param, self._type_helper.GetCppType(param.type_))) |
| 1097 c.Cblock(self._CreateValueFromType('create_results->Append(%s);', | 1098 c.Cblock(self._CreateValueFromType('create_results->Append(%s);', |
| 1098 param.name, | 1099 param.name, |
| 1099 param.type_, | 1100 param.type_, |
| 1100 param.unix_name)) | 1101 param.unix_name)) |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1155 if self._generate_error_messages: | 1156 if self._generate_error_messages: |
| 1156 params = list(params) + ['base::string16* error'] | 1157 params = list(params) + ['base::string16* error'] |
| 1157 return ', '.join(str(p) for p in params) | 1158 return ', '.join(str(p) for p in params) |
| 1158 | 1159 |
| 1159 def _GenerateArgs(self, args): | 1160 def _GenerateArgs(self, args): |
| 1160 """Builds the argument list for a function, given an array of arguments. | 1161 """Builds the argument list for a function, given an array of arguments. |
| 1161 """ | 1162 """ |
| 1162 if self._generate_error_messages: | 1163 if self._generate_error_messages: |
| 1163 args = list(args) + ['error'] | 1164 args = list(args) + ['error'] |
| 1164 return ', '.join(str(a) for a in args) | 1165 return ', '.join(str(a) for a in args) |
| OLD | NEW |