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 |