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 any_helper | 7 import any_helper |
8 import cpp_util | 8 import cpp_util |
9 import model | 9 import model |
10 import schema_util | 10 import schema_util |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
246 .Append('scoped_ptr<base::DictionaryValue> value(' | 246 .Append('scoped_ptr<base::DictionaryValue> value(' |
247 'new base::DictionaryValue());') | 247 'new base::DictionaryValue());') |
248 .Append() | 248 .Append() |
249 ) | 249 ) |
250 for prop in type_.properties.values(): | 250 for prop in type_.properties.values(): |
251 if prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: | 251 if prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: |
252 c.Append('value->MergeDictionary(&%s);' % prop.unix_name) | 252 c.Append('value->MergeDictionary(&%s);' % prop.unix_name) |
253 else: | 253 else: |
254 if prop.optional: | 254 if prop.optional: |
255 if prop.type_ == PropertyType.ENUM: | 255 if prop.type_ == PropertyType.ENUM: |
256 c.Sblock('if (%s != %s)' % | 256 c.Sblock('if (%s != %s) {' % |
257 (prop.unix_name, | 257 (prop.unix_name, |
258 self._cpp_type_generator.GetEnumNoneValue(prop))) | 258 self._cpp_type_generator.GetEnumNoneValue(prop))) |
259 elif prop.type_ == PropertyType.CHOICES: | 259 elif prop.type_ == PropertyType.CHOICES: |
260 c.Sblock('if (%s_type != %s)' % | 260 c.Sblock('if (%s_type != %s) {' % |
261 (prop.unix_name, | 261 (prop.unix_name, |
262 self._cpp_type_generator.GetEnumNoneValue(prop))) | 262 self._cpp_type_generator.GetEnumNoneValue(prop))) |
263 else: | 263 else: |
264 c.Sblock('if (%s.get())' % prop.unix_name) | 264 c.Sblock('if (%s.get()) {' % prop.unix_name) |
265 c.Append('value->SetWithoutPathExpansion("%s", %s);' % ( | 265 |
266 prop.name, | 266 if prop.type_ == prop.compiled_type: |
267 self._CreateValueFromProperty(prop, 'this->' + prop.unix_name))) | 267 c.Append('value->SetWithoutPathExpansion("%s", %s);' % ( |
268 prop.name, | |
269 self._CreateValueFromProperty(prop, 'this->' + prop.unix_name))) | |
270 else: | |
271 conversion_src = 'this->' + prop.unix_name | |
272 if prop.optional: | |
273 conversion_src = '*' + conversion_src | |
274 (c.Append('%s %s;' % (self._cpp_type_generator.GetType(prop), | |
275 prop.unix_name)) | |
276 .Append(cpp_util.GenerateCompiledTypeToTypeConversion( | |
277 self._cpp_type_generator.GetReferencedProperty(prop), | |
278 conversion_src, | |
279 prop.unix_name) + ';') | |
280 .Append('value->SetWithoutPathExpansion("%s", %s);' % ( | |
281 prop.unix_name, | |
282 self._CreateValueFromProperty(prop, prop.unix_name))) | |
283 ) | |
268 if prop.optional: | 284 if prop.optional: |
269 c.Eblock(); | 285 c.Eblock('}'); |
270 (c.Append() | 286 (c.Append() |
271 .Append('return value.Pass();') | 287 .Append('return value.Pass();') |
272 .Eblock('}') | 288 .Eblock('}') |
273 ) | 289 ) |
274 return c | 290 return c |
275 | 291 |
276 def _GenerateFunction(self, cpp_namespace, function): | 292 def _GenerateFunction(self, cpp_namespace, function): |
277 """Generates the definitions for function structs. | 293 """Generates the definitions for function structs. |
278 """ | 294 """ |
279 c = Code() | 295 c = Code() |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 vardot = var + '->' | 346 vardot = var + '->' |
331 else: | 347 else: |
332 vardot = var + '.' | 348 vardot = var + '.' |
333 return ('base::BinaryValue::CreateWithCopiedBuffer(%sdata(), %ssize())' % | 349 return ('base::BinaryValue::CreateWithCopiedBuffer(%sdata(), %ssize())' % |
334 (vardot, vardot)) | 350 (vardot, vardot)) |
335 elif self._IsArrayOrArrayRef(prop): | 351 elif self._IsArrayOrArrayRef(prop): |
336 return '%s.release()' % self._util_cc_helper.CreateValueFromArray( | 352 return '%s.release()' % self._util_cc_helper.CreateValueFromArray( |
337 self._cpp_type_generator.GetReferencedProperty(prop), var, | 353 self._cpp_type_generator.GetReferencedProperty(prop), var, |
338 prop.optional) | 354 prop.optional) |
339 elif self._IsFundamentalOrFundamentalRef(prop): | 355 elif self._IsFundamentalOrFundamentalRef(prop): |
340 if prop.optional: | 356 if prop.optional and prop.type_ == prop.compiled_type: |
not at google - send to devlin
2012/07/31 06:37:41
line surprises me. Explain in comment perhaps?
mitchellwrosen
2012/07/31 17:50:25
Done.
| |
341 var = '*' + var | 357 var = '*' + var |
342 prop = self._cpp_type_generator.GetReferencedProperty(prop); | 358 prop = self._cpp_type_generator.GetReferencedProperty(prop); |
343 return { | 359 return { |
344 PropertyType.STRING: 'base::Value::CreateStringValue(%s)', | 360 PropertyType.STRING: 'base::Value::CreateStringValue(%s)', |
345 PropertyType.BOOLEAN: 'base::Value::CreateBooleanValue(%s)', | 361 PropertyType.BOOLEAN: 'base::Value::CreateBooleanValue(%s)', |
346 PropertyType.INTEGER: 'base::Value::CreateIntegerValue(%s)', | 362 PropertyType.INTEGER: 'base::Value::CreateIntegerValue(%s)', |
347 PropertyType.DOUBLE: 'base::Value::CreateDoubleValue(%s)', | 363 PropertyType.DOUBLE: 'base::Value::CreateDoubleValue(%s)', |
348 }[prop.type_] % var | 364 }[prop.type_] % var |
349 else: | 365 else: |
350 raise NotImplementedError('Conversion of %s to base::Value not ' | 366 raise NotImplementedError('Conversion of %s to base::Value not ' |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
441 | 457 |
442 if self._IsFundamentalOrFundamentalRef(prop): | 458 if self._IsFundamentalOrFundamentalRef(prop): |
443 if prop.optional: | 459 if prop.optional: |
444 (c.Append('%(ctype)s temp;') | 460 (c.Append('%(ctype)s temp;') |
445 .Append('if (!%s)' % | 461 .Append('if (!%s)' % |
446 cpp_util.GetAsFundamentalValue( | 462 cpp_util.GetAsFundamentalValue( |
447 self._cpp_type_generator.GetReferencedProperty(prop), | 463 self._cpp_type_generator.GetReferencedProperty(prop), |
448 value_var, | 464 value_var, |
449 '&temp')) | 465 '&temp')) |
450 .Append(' return %(failure_value)s;') | 466 .Append(' return %(failure_value)s;') |
451 .Append('%(dst)s->%(name)s.reset(new %(ctype)s(temp));') | |
452 ) | 467 ) |
468 if prop.type_ != prop.compiled_type: | |
469 (c.Append('%(compiled_ctype)s temp2;') | |
470 .Append('if (!%s)' % | |
471 cpp_util.GenerateTypeToCompiledTypeConversion( | |
472 self._cpp_type_generator.GetReferencedProperty(prop), | |
473 'temp', | |
474 'temp2')) | |
475 .Append(' return %(failure_value)s;') | |
476 .Append('%(dst)s->%(name)s.reset(new %(compiled_ctype)s(temp2));') | |
477 ) | |
478 else: | |
479 c.Append('%(dst)s->%(name)s.reset(new %(ctype)s(temp));') | |
480 | |
453 else: | 481 else: |
482 if prop.type_ == prop.compiled_type: | |
483 assignment_target = '&%s->%s' % (dst, prop.unix_name) | |
484 else: | |
485 c.Append('%(ctype)s temp;') | |
486 assignment_target = '&temp' | |
454 (c.Append('if (!%s)' % | 487 (c.Append('if (!%s)' % |
455 cpp_util.GetAsFundamentalValue( | 488 cpp_util.GetAsFundamentalValue( |
456 self._cpp_type_generator.GetReferencedProperty(prop), | 489 self._cpp_type_generator.GetReferencedProperty(prop), |
457 value_var, | 490 value_var, |
458 '&%s->%s' % (dst, prop.unix_name))) | 491 assignment_target)) |
459 .Append(' return %(failure_value)s;') | 492 .Append(' return %(failure_value)s;') |
460 ) | 493 ) |
494 if prop.type_ != prop.compiled_type: | |
495 (c.Append('if (!%s)' % | |
496 cpp_util.GenerateTypeToCompiledTypeConversion( | |
497 self._cpp_type_generator.GetReferencedProperty(prop), | |
498 'temp', | |
499 '%s->%s' % (dst, prop.unix_name))) | |
500 .Append(' return %(failure_value)s;') | |
501 ) | |
502 | |
461 elif self._IsObjectOrObjectRef(prop): | 503 elif self._IsObjectOrObjectRef(prop): |
462 if prop.optional: | 504 if prop.optional: |
463 (c.Append('const base::DictionaryValue* dictionary = NULL;') | 505 (c.Append('const base::DictionaryValue* dictionary = NULL;') |
464 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))') | 506 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))') |
465 .Append(' return %(failure_value)s;') | 507 .Append(' return %(failure_value)s;') |
466 .Append('scoped_ptr<%(ctype)s> temp(new %(ctype)s());') | 508 .Append('scoped_ptr<%(ctype)s> temp(new %(ctype)s());') |
467 .Append('if (!%(ctype)s::Populate(*dictionary, temp.get()))') | 509 .Append('if (!%(ctype)s::Populate(*dictionary, temp.get()))') |
468 .Append(' return %(failure_value)s;') | 510 .Append(' return %(failure_value)s;') |
469 .Append('%(dst)s->%(name)s = temp.Pass();') | 511 .Append('%(dst)s->%(name)s = temp.Pass();') |
470 ) | 512 ) |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
535 (c.Append('%(dst)s->%(name)s.assign(binary_value->GetBuffer(),') | 577 (c.Append('%(dst)s->%(name)s.assign(binary_value->GetBuffer(),') |
536 .Append(' binary_value->GetSize());') | 578 .Append(' binary_value->GetSize());') |
537 ) | 579 ) |
538 else: | 580 else: |
539 raise NotImplementedError(prop.type_) | 581 raise NotImplementedError(prop.type_) |
540 c.Eblock('}') | 582 c.Eblock('}') |
541 sub = { | 583 sub = { |
542 'value_var': value_var, | 584 'value_var': value_var, |
543 'name': prop.unix_name, | 585 'name': prop.unix_name, |
544 'dst': dst, | 586 'dst': dst, |
545 'failure_value': failure_value, | 587 'failure_value': failure_value |
not at google - send to devlin
2012/07/31 06:37:41
ending with comma is fine, in fact nitfully prefer
mitchellwrosen
2012/07/31 17:50:25
'nitfully' - I like that. Done.
| |
546 } | 588 } |
547 if prop.type_ not in (PropertyType.CHOICES, PropertyType.ANY): | 589 if prop.type_ not in (PropertyType.CHOICES, PropertyType.ANY): |
548 sub['ctype'] = self._cpp_type_generator.GetType(prop) | 590 sub['ctype'] = self._cpp_type_generator.GetType(prop) |
591 sub['compiled_ctype'] = self._cpp_type_generator.GetCompiledType(prop) | |
549 sub['value_type'] = cpp_util.GetValueType(self._cpp_type_generator | 592 sub['value_type'] = cpp_util.GetValueType(self._cpp_type_generator |
550 .GetReferencedProperty(prop).type_) | 593 .GetReferencedProperty(prop).type_) |
551 c.Substitute(sub) | 594 c.Substitute(sub) |
552 return c | 595 return c |
553 | 596 |
554 def _GenerateListValueToEnumArrayConversion(self, c, prop): | 597 def _GenerateListValueToEnumArrayConversion(self, c, prop): |
555 """Appends code that converts a ListValue of string contstants to | 598 """Appends code that converts a ListValue of string contstants to |
556 an array of enums in dst. | 599 an array of enums in dst. |
557 Leaves dst, name, and failure_value unsubstituted. | 600 Leaves dst, name, and failure_value unsubstituted. |
558 | 601 |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
714 'Create(%(declaration_list)s) {') | 757 'Create(%(declaration_list)s) {') |
715 .Append('scoped_ptr<base::ListValue> create_results(' | 758 .Append('scoped_ptr<base::ListValue> create_results(' |
716 'new base::ListValue());') | 759 'new base::ListValue());') |
717 ) | 760 ) |
718 declaration_list = [] | 761 declaration_list = [] |
719 for param in param_list: | 762 for param in param_list: |
720 # We treat this argument as 'required' to avoid wrapping it in a | 763 # We treat this argument as 'required' to avoid wrapping it in a |
721 # scoped_ptr if it's optional. | 764 # scoped_ptr if it's optional. |
722 param_copy = param.Copy() | 765 param_copy = param.Copy() |
723 param_copy.optional = False | 766 param_copy.optional = False |
767 declaration_list.append("const %s" % cpp_util.GetParameterDeclaration( | |
768 param_copy, self._cpp_type_generator.GetCompiledType(param_copy))) | |
769 param_name = param_copy.unix_name | |
770 if param_copy.type_ != param_copy.compiled_type: | |
771 param_name = 'temp_' + param_name | |
772 (c.Append('%s %s;' % (self._cpp_type_generator.GetType(param_copy), | |
773 param_name)) | |
774 .Append(cpp_util.GenerateCompiledTypeToTypeConversion( | |
775 param_copy, | |
776 param_copy.unix_name, | |
777 param_name) + ';') | |
778 ) | |
724 c.Append('create_results->Append(%s);' % | 779 c.Append('create_results->Append(%s);' % |
725 self._CreateValueFromProperty(param_copy, param_copy.unix_name)) | 780 self._CreateValueFromProperty(param_copy, param_name)) |
726 declaration_list.append("const %s" % cpp_util.GetParameterDeclaration( | |
727 param_copy, self._cpp_type_generator.GetType(param_copy))) | |
728 | 781 |
729 c.Append('return create_results.Pass();') | 782 c.Append('return create_results.Pass();') |
730 c.Eblock('}') | 783 c.Eblock('}') |
731 if generate_to_json: | 784 if generate_to_json: |
732 c.Append() | 785 c.Append() |
733 (c.Sblock('std::string %(function_scope)s::' | 786 (c.Sblock('std::string %(function_scope)s::' |
734 'ToJson(%(declaration_list)s) {') | 787 'ToJson(%(declaration_list)s) {') |
735 .Append('scoped_ptr<base::ListValue> create_results = ' | 788 .Append('scoped_ptr<base::ListValue> create_results = ' |
736 '%(function_scope)s::Create(%(param_list)s);') | 789 '%(function_scope)s::Create(%(param_list)s);') |
737 .Append('std::string json;') | 790 .Append('std::string json;') |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
778 """ | 831 """ |
779 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ == | 832 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ == |
780 PropertyType.ARRAY) | 833 PropertyType.ARRAY) |
781 | 834 |
782 def _IsFundamentalOrFundamentalRef(self, prop): | 835 def _IsFundamentalOrFundamentalRef(self, prop): |
783 """Determines if this property is a Fundamental type or is a ref to a | 836 """Determines if this property is a Fundamental type or is a ref to a |
784 Fundamental type. | 837 Fundamental type. |
785 """ | 838 """ |
786 return (self._cpp_type_generator.GetReferencedProperty(prop).type_. | 839 return (self._cpp_type_generator.GetReferencedProperty(prop).type_. |
787 is_fundamental) | 840 is_fundamental) |
OLD | NEW |