Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1159)

Side by Side Diff: tools/json_schema_compiler/cc_generator.py

Issue 9617010: Move chrome.downloads out of experimental to dev (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 24 matching lines...) Expand all
35 .Append('#include "%s/%s.h"' % 35 .Append('#include "%s/%s.h"' %
36 (self._namespace.source_file_dir, self._namespace.unix_name)) 36 (self._namespace.source_file_dir, self._namespace.unix_name))
37 ) 37 )
38 includes = self._cpp_type_generator.GenerateIncludes() 38 includes = self._cpp_type_generator.GenerateIncludes()
39 if not includes.IsEmpty(): 39 if not includes.IsEmpty():
40 (c.Concat(includes) 40 (c.Concat(includes)
41 .Append() 41 .Append()
42 ) 42 )
43 43
44 (c.Append() 44 (c.Append()
45 .Append('using base::Value;')
46 .Append('using base::DictionaryValue;')
47 .Append('using base::ListValue;')
48 .Append('using base::BinaryValue;')
not at google - send to devlin 2012/06/12 18:34:38 why? This is a cc file. I would prefer to keep th
benjhayden 2012/06/12 20:15:42 I ran into a very confusing name collision with an
49 .Append('using %s;' % any_helper.ANY_CLASS)
50 .Append()
51 .Concat(self._cpp_type_generator.GetRootNamespaceStart()) 45 .Concat(self._cpp_type_generator.GetRootNamespaceStart())
52 .Concat(self._cpp_type_generator.GetNamespaceStart()) 46 .Concat(self._cpp_type_generator.GetNamespaceStart())
53 .Append() 47 .Append()
54 ) 48 )
55 if self._namespace.properties: 49 if self._namespace.properties:
56 (c.Append('//') 50 (c.Append('//')
57 .Append('// Properties') 51 .Append('// Properties')
58 .Append('//') 52 .Append('//')
59 .Append() 53 .Append()
60 ) 54 )
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 160
167 def _GenerateTypePopulate(self, cpp_namespace, type_): 161 def _GenerateTypePopulate(self, cpp_namespace, type_):
168 """Generates the function for populating a type given a pointer to it. 162 """Generates the function for populating a type given a pointer to it.
169 163
170 E.g for type "Foo", generates Foo::Populate() 164 E.g for type "Foo", generates Foo::Populate()
171 """ 165 """
172 classname = cpp_util.Classname(schema_util.StripSchemaNamespace(type_.name)) 166 classname = cpp_util.Classname(schema_util.StripSchemaNamespace(type_.name))
173 c = Code() 167 c = Code()
174 (c.Append('// static') 168 (c.Append('// static')
175 .Sblock('bool %(namespace)s::Populate' 169 .Sblock('bool %(namespace)s::Populate'
176 '(const Value& value, %(name)s* out) {') 170 '(const base::Value& value, %(name)s* out) {')
177 .Append('if (!value.IsType(Value::TYPE_DICTIONARY))') 171 .Append('if (!value.IsType(base::Value::TYPE_DICTIONARY))')
178 .Append(' return false;') 172 .Append(' return false;')
179 ) 173 )
180 if type_.properties: 174 if type_.properties:
181 (c.Append('const DictionaryValue* dict = ' 175 (c.Append('const base::DictionaryValue* dict = '
182 'static_cast<const DictionaryValue*>(&value);') 176 'static_cast<const base::DictionaryValue*>(&value);')
183 .Append() 177 .Append()
184 ) 178 )
185 for prop in type_.properties.values(): 179 for prop in type_.properties.values():
186 c.Concat(self._InitializePropertyToDefault(prop, 'out')) 180 c.Concat(self._InitializePropertyToDefault(prop, 'out'))
187 for prop in type_.properties.values(): 181 for prop in type_.properties.values():
188 if prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: 182 if prop.type_ == PropertyType.ADDITIONAL_PROPERTIES:
189 c.Append('out->additional_properties.MergeDictionary(dict);') 183 c.Append('out->additional_properties.MergeDictionary(dict);')
190 # remove all keys that are actual properties 184 # remove all keys that are actual properties
191 for cur_prop in type_.properties.values(): 185 for cur_prop in type_.properties.values():
192 if prop != cur_prop: 186 if prop != cur_prop:
193 c.Append('out->additional_properties' 187 c.Append('out->additional_properties'
194 '.RemoveWithoutPathExpansion("%s", NULL);' % cur_prop.name) 188 '.RemoveWithoutPathExpansion("%s", NULL);' % cur_prop.name)
195 c.Append() 189 c.Append()
196 else: 190 else:
197 c.Concat(self._GenerateTypePopulateProperty(prop, 'dict', 'out')) 191 c.Concat(self._GenerateTypePopulateProperty(prop, 'dict', 'out'))
198 (c.Append('return true;') 192 (c.Append('return true;')
199 .Eblock('}') 193 .Eblock('}')
200 ) 194 )
201 c.Substitute({'namespace': cpp_namespace, 'name': classname}) 195 c.Substitute({'namespace': cpp_namespace, 'name': classname})
202 return c 196 return c
203 197
204 def _GenerateTypePopulateProperty(self, prop, src, dst): 198 def _GenerateTypePopulateProperty(self, prop, src, dst):
205 """Generate the code to populate a single property in a type. 199 """Generate the code to populate a single property in a type.
206 200
207 src: DictionaryValue* 201 src: base::DictionaryValue*
208 dst: Type* 202 dst: Type*
209 """ 203 """
210 c = Code() 204 c = Code()
211 value_var = prop.unix_name + '_value' 205 value_var = prop.unix_name + '_value'
212 c.Append('Value* %(value_var)s = NULL;') 206 c.Append('base::Value* %(value_var)s = NULL;')
213 if prop.optional: 207 if prop.optional:
214 (c.Sblock( 208 (c.Sblock(
215 'if (%(src)s->GetWithoutPathExpansion("%(key)s", &%(value_var)s)) {' 209 'if (%(src)s->GetWithoutPathExpansion("%(key)s", &%(value_var)s)) {'
216 ) 210 )
217 .Concat(self._GeneratePopulatePropertyFromValue( 211 .Concat(self._GeneratePopulatePropertyFromValue(
218 prop, value_var, dst, 'false')) 212 prop, value_var, dst, 'false'))
219 .Eblock('}') 213 .Eblock('}')
220 ) 214 )
221 else: 215 else:
222 (c.Append( 216 (c.Append(
223 'if (!%(src)s->GetWithoutPathExpansion("%(key)s", &%(value_var)s))') 217 'if (!%(src)s->GetWithoutPathExpansion("%(key)s", &%(value_var)s))')
224 .Append(' return false;') 218 .Append(' return false;')
225 .Concat(self._GeneratePopulatePropertyFromValue( 219 .Concat(self._GeneratePopulatePropertyFromValue(
226 prop, value_var, dst, 'false')) 220 prop, value_var, dst, 'false'))
227 ) 221 )
228 c.Append() 222 c.Append()
229 c.Substitute({'value_var': value_var, 'key': prop.name, 'src': src}) 223 c.Substitute({'value_var': value_var, 'key': prop.name, 'src': src})
230 return c 224 return c
231 225
232 def _GenerateTypeToValue(self, cpp_namespace, type_): 226 def _GenerateTypeToValue(self, cpp_namespace, type_):
233 """Generates a function that serializes the type into a |DictionaryValue|. 227 """Generates a function that serializes the type into a
228 |base::DictionaryValue|.
234 229
235 E.g. for type "Foo" generates Foo::ToValue() 230 E.g. for type "Foo" generates Foo::ToValue()
236 """ 231 """
237 c = Code() 232 c = Code()
238 (c.Sblock('scoped_ptr<DictionaryValue> %s::ToValue() const {' % 233 (c.Sblock('scoped_ptr<base::DictionaryValue> %s::ToValue() const {' %
239 cpp_namespace) 234 cpp_namespace)
240 .Append('scoped_ptr<DictionaryValue> value(new DictionaryValue());') 235 .Append('scoped_ptr<base::DictionaryValue> value(' +
236 'new base::DictionaryValue());')
241 .Append() 237 .Append()
242 ) 238 )
243 for prop in type_.properties.values(): 239 for prop in type_.properties.values():
244 if prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: 240 if prop.type_ == PropertyType.ADDITIONAL_PROPERTIES:
245 c.Append('value->MergeDictionary(&%s);' % prop.unix_name) 241 c.Append('value->MergeDictionary(&%s);' % prop.unix_name)
246 else: 242 else:
247 if prop.optional: 243 if prop.optional:
248 if prop.type_ == PropertyType.ENUM: 244 if prop.type_ == PropertyType.ENUM:
249 c.Sblock('if (%s != %s)' % 245 c.Sblock('if (%s != %s)' %
250 (prop.unix_name, 246 (prop.unix_name,
(...skipping 29 matching lines...) Expand all
280 276
281 # Result::Create function 277 # Result::Create function
282 if function.callback: 278 if function.callback:
283 c.Concat(self._GenerateFunctionResultCreate(cpp_namespace, function)) 279 c.Concat(self._GenerateFunctionResultCreate(cpp_namespace, function))
284 280
285 c.Substitute({'cpp_namespace': cpp_namespace}) 281 c.Substitute({'cpp_namespace': cpp_namespace})
286 282
287 return c 283 return c
288 284
289 def _GenerateCreateEnumValue(self, cpp_namespace, prop): 285 def _GenerateCreateEnumValue(self, cpp_namespace, prop):
290 """Generates CreateEnumValue() that returns the |StringValue| 286 """Generates CreateEnumValue() that returns the |base::StringValue|
291 representation of an enum. 287 representation of an enum.
292 """ 288 """
293 c = Code() 289 c = Code()
294 c.Append('// static') 290 c.Append('// static')
295 c.Sblock('scoped_ptr<Value> %(cpp_namespace)s::CreateEnumValue(%(arg)s) {') 291 c.Sblock('scoped_ptr<base::Value> %(cpp_namespace)s::CreateEnumValue(' +
292 '%(arg)s) {')
296 c.Sblock('switch (%s) {' % prop.unix_name) 293 c.Sblock('switch (%s) {' % prop.unix_name)
297 if prop.optional: 294 if prop.optional:
298 (c.Append('case %s: {' % self._cpp_type_generator.GetEnumNoneValue(prop)) 295 (c.Append('case %s: {' % self._cpp_type_generator.GetEnumNoneValue(prop))
299 .Append(' return scoped_ptr<Value>();') 296 .Append(' return scoped_ptr<base::Value>();')
300 .Append('}') 297 .Append('}')
301 ) 298 )
302 for enum_value in prop.enum_values: 299 for enum_value in prop.enum_values:
303 (c.Append('case %s: {' % 300 (c.Append('case %s: {' %
304 self._cpp_type_generator.GetEnumValue(prop, enum_value)) 301 self._cpp_type_generator.GetEnumValue(prop, enum_value))
305 .Append(' return scoped_ptr<Value>(Value::CreateStringValue("%s"));' % 302 .Append(' return scoped_ptr<base::Value>(' +
306 enum_value) 303 'base::Value::CreateStringValue("%s"));' %
304 enum_value)
307 .Append('}') 305 .Append('}')
308 ) 306 )
309 (c.Append('default: {') 307 (c.Append('default: {')
310 .Append(' return scoped_ptr<Value>();') 308 .Append(' return scoped_ptr<base::Value>();')
311 .Append('}') 309 .Append('}')
312 ) 310 )
313 c.Eblock('}') 311 c.Eblock('}')
314 c.Eblock('}') 312 c.Eblock('}')
315 c.Substitute({ 313 c.Substitute({
316 'cpp_namespace': cpp_namespace, 314 'cpp_namespace': cpp_namespace,
317 'arg': cpp_util.GetParameterDeclaration( 315 'arg': cpp_util.GetParameterDeclaration(
318 prop, self._cpp_type_generator.GetType(prop)) 316 prop, self._cpp_type_generator.GetType(prop))
319 }) 317 })
320 return c 318 return c
321 319
322 def _CreateValueFromProperty(self, prop, var): 320 def _CreateValueFromProperty(self, prop, var):
323 """Creates a Value given a property. Generated code passes ownership 321 """Creates a base::Value given a property. Generated code passes ownership
324 to caller. 322 to caller.
325 323
326 var: variable or variable* 324 var: variable or variable*
327 325
328 E.g for std::string, generate Value::CreateStringValue(var) 326 E.g for std::string, generate base::Value::CreateStringValue(var)
329 """ 327 """
330 if prop.type_ == PropertyType.CHOICES: 328 if prop.type_ == PropertyType.CHOICES:
331 # CHOICES conversion not implemented. If needed, write something to 329 # CHOICES conversion not implemented. If needed, write something to
332 # generate a function that returns a scoped_ptr<Value> and put it in 330 # generate a function that returns a scoped_ptr<base::Value> and put it in
333 # _GeneratePropertyFunctions, then use it here. Look at CreateEnumValue() 331 # _GeneratePropertyFunctions, then use it here. Look at CreateEnumValue()
334 # for reference. 332 # for reference.
335 raise NotImplementedError( 333 raise NotImplementedError(
336 'Conversion of CHOICES to Value not implemented') 334 'Conversion of CHOICES to base::Value not implemented')
337 if self._IsObjectOrObjectRef(prop): 335 if self._IsObjectOrObjectRef(prop):
338 if prop.optional: 336 if prop.optional:
339 return '%s->ToValue().release()' % var 337 return '%s->ToValue().release()' % var
340 else: 338 else:
341 return '%s.ToValue().release()' % var 339 return '%s.ToValue().release()' % var
342 elif prop.type_ == PropertyType.ANY: 340 elif prop.type_ == PropertyType.ANY:
343 return '%s.DeepCopy()' % self._any_helper.GetValue(prop, var) 341 return '%s.DeepCopy()' % self._any_helper.GetValue(prop, var)
344 elif prop.type_ == PropertyType.ADDITIONAL_PROPERTIES: 342 elif prop.type_ == PropertyType.ADDITIONAL_PROPERTIES:
345 return '%s.DeepCopy()' % var 343 return '%s.DeepCopy()' % var
346 elif prop.type_ == PropertyType.ENUM: 344 elif prop.type_ == PropertyType.ENUM:
347 return 'CreateEnumValue(%s).release()' % var 345 return 'CreateEnumValue(%s).release()' % var
348 elif self._IsArrayOrArrayRef(prop): 346 elif self._IsArrayOrArrayRef(prop):
349 return '%s.release()' % self._util_cc_helper.CreateValueFromArray( 347 return '%s.release()' % self._util_cc_helper.CreateValueFromArray(
350 self._cpp_type_generator.GetReferencedProperty(prop), var, 348 self._cpp_type_generator.GetReferencedProperty(prop), var,
351 prop.optional) 349 prop.optional)
352 elif self._IsFundamentalOrFundamentalRef(prop): 350 elif self._IsFundamentalOrFundamentalRef(prop):
353 if prop.optional: 351 if prop.optional:
354 var = '*' + var 352 var = '*' + var
355 prop = self._cpp_type_generator.GetReferencedProperty(prop); 353 prop = self._cpp_type_generator.GetReferencedProperty(prop);
356 return { 354 return {
357 PropertyType.STRING: 'Value::CreateStringValue(%s)', 355 PropertyType.STRING: 'base::Value::CreateStringValue(%s)',
358 PropertyType.BOOLEAN: 'Value::CreateBooleanValue(%s)', 356 PropertyType.BOOLEAN: 'base::Value::CreateBooleanValue(%s)',
359 PropertyType.INTEGER: 'Value::CreateIntegerValue(%s)', 357 PropertyType.INTEGER: 'base::Value::CreateIntegerValue(%s)',
360 PropertyType.DOUBLE: 'Value::CreateDoubleValue(%s)', 358 PropertyType.DOUBLE: 'base::Value::CreateDoubleValue(%s)',
361 }[prop.type_] % var 359 }[prop.type_] % var
362 else: 360 else:
363 raise NotImplementedError('Conversion of %s to Value not ' 361 raise NotImplementedError('Conversion of %s to base::Value not '
364 'implemented' % repr(prop.type_)) 362 'implemented' % repr(prop.type_))
365 363
366 def _GenerateParamsCheck(self, function, var): 364 def _GenerateParamsCheck(self, function, var):
367 """Generates a check for the correct number of arguments when creating 365 """Generates a check for the correct number of arguments when creating
368 Params. 366 Params.
369 """ 367 """
370 c = Code() 368 c = Code()
371 num_required = 0 369 num_required = 0
372 for param in function.params: 370 for param in function.params:
373 if not param.optional: 371 if not param.optional:
374 num_required += 1 372 num_required += 1
375 if num_required == len(function.params): 373 if num_required == len(function.params):
376 c.Append('if (%(var)s.GetSize() != %(total)d)') 374 c.Append('if (%(var)s.GetSize() != %(total)d)')
377 elif not num_required: 375 elif not num_required:
378 c.Append('if (%(var)s.GetSize() > %(total)d)') 376 c.Append('if (%(var)s.GetSize() > %(total)d)')
379 else: 377 else:
380 c.Append('if (%(var)s.GetSize() < %(required)d' 378 c.Append('if (%(var)s.GetSize() < %(required)d'
381 ' || %(var)s.GetSize() > %(total)d)') 379 ' || %(var)s.GetSize() > %(total)d)')
382 c.Append(' return scoped_ptr<Params>();') 380 c.Append(' return scoped_ptr<Params>();')
383 c.Substitute({ 381 c.Substitute({
384 'var': var, 382 'var': var,
385 'required': num_required, 383 'required': num_required,
386 'total': len(function.params), 384 'total': len(function.params),
387 }) 385 })
388 return c 386 return c
389 387
390 def _GenerateFunctionParamsCreate(self, cpp_namespace, function): 388 def _GenerateFunctionParamsCreate(self, cpp_namespace, function):
391 """Generate function to create an instance of Params. The generated 389 """Generate function to create an instance of Params. The generated
392 function takes a ListValue of arguments. 390 function takes a base::ListValue of arguments.
393 391
394 E.g for function "Bar", generate Bar::Params::Create() 392 E.g for function "Bar", generate Bar::Params::Create()
395 """ 393 """
396 c = Code() 394 c = Code()
397 (c.Append('// static') 395 (c.Append('// static')
398 .Sblock('scoped_ptr<%(cpp_namespace)s::Params> ' 396 .Sblock('scoped_ptr<%(cpp_namespace)s::Params> '
399 '%(cpp_namespace)s::Params::Create(const ListValue& args) {') 397 '%(cpp_namespace)s::Params::Create(const base::ListValue& args) {')
400 .Concat(self._GenerateParamsCheck(function, 'args')) 398 .Concat(self._GenerateParamsCheck(function, 'args'))
401 .Append('scoped_ptr<Params> params(new Params());') 399 .Append('scoped_ptr<Params> params(new Params());')
402 ) 400 )
403 c.Substitute({'cpp_namespace': cpp_namespace}) 401 c.Substitute({'cpp_namespace': cpp_namespace})
404 402
405 for param in function.params: 403 for param in function.params:
406 c.Concat(self._InitializePropertyToDefault(param, 'params')) 404 c.Concat(self._InitializePropertyToDefault(param, 'params'))
407 405
408 for i, param in enumerate(function.params): 406 for i, param in enumerate(function.params):
409 # Any failure will cause this function to return. If any argument is 407 # Any failure will cause this function to return. If any argument is
410 # incorrect or missing, those following it are not processed. Note that 408 # incorrect or missing, those following it are not processed. Note that
411 # for optional arguments, we allow missing arguments and proceed because 409 # for optional arguments, we allow missing arguments and proceed because
412 # there may be other arguments following it. 410 # there may be other arguments following it.
413 failure_value = 'scoped_ptr<Params>()' 411 failure_value = 'scoped_ptr<Params>()'
414 c.Append() 412 c.Append()
415 value_var = param.unix_name + '_value' 413 value_var = param.unix_name + '_value'
416 (c.Append('Value* %(value_var)s = NULL;') 414 (c.Append('base::Value* %(value_var)s = NULL;')
417 .Append('if (args.Get(%(i)s, &%(value_var)s) && ' 415 .Append('if (args.Get(%(i)s, &%(value_var)s) && '
418 '!%(value_var)s->IsType(Value::TYPE_NULL))') 416 '!%(value_var)s->IsType(base::Value::TYPE_NULL))')
419 .Sblock('{') 417 .Sblock('{')
420 .Concat(self._GeneratePopulatePropertyFromValue( 418 .Concat(self._GeneratePopulatePropertyFromValue(
421 param, value_var, 'params', failure_value)) 419 param, value_var, 'params', failure_value))
422 .Eblock('}') 420 .Eblock('}')
423 ) 421 )
424 if not param.optional: 422 if not param.optional:
425 (c.Sblock('else {') 423 (c.Sblock('else {')
426 .Append('return %s;' % failure_value) 424 .Append('return %s;' % failure_value)
427 .Eblock('}') 425 .Eblock('}')
428 ) 426 )
429 c.Substitute({'value_var': value_var, 'i': i}) 427 c.Substitute({'value_var': value_var, 'i': i})
430 (c.Append() 428 (c.Append()
431 .Append('return params.Pass();') 429 .Append('return params.Pass();')
432 .Eblock('}') 430 .Eblock('}')
433 .Append() 431 .Append()
434 ) 432 )
435 433
436 return c 434 return c
437 435
438 def _GeneratePopulatePropertyFromValue( 436 def _GeneratePopulatePropertyFromValue(
439 self, prop, value_var, dst, failure_value, check_type=True): 437 self, prop, value_var, dst, failure_value, check_type=True):
440 """Generates code to populate a model.Property given a Value*. The 438 """Generates code to populate a model.Property given a base::Value*. The
441 existence of data inside the Value* is assumed so checks for existence 439 existence of data inside the base::Value* is assumed so checks for existence
442 should be performed before the code this generates. 440 should be performed before the code this generates.
443 441
444 prop: the property the code is populating. 442 prop: the property the code is populating.
445 value_var: a Value* that should represent |prop|. 443 value_var: a base::Value* that should represent |prop|.
446 dst: the object with |prop| as a member. 444 dst: the object with |prop| as a member.
447 failure_value: the value to return if |prop| cannot be extracted from 445 failure_value: the value to return if |prop| cannot be extracted from
448 |value_var| 446 |value_var|
449 check_type: if true, will check if |value_var| is the correct Value::Type 447 check_type: if true, will check if |value_var| is the correct
448 base::Value::Type
450 """ 449 """
451 c = Code() 450 c = Code()
452 c.Sblock('{') 451 c.Sblock('{')
453 452
454 if self._IsFundamentalOrFundamentalRef(prop): 453 if self._IsFundamentalOrFundamentalRef(prop):
455 if prop.optional: 454 if prop.optional:
456 (c.Append('%(ctype)s temp;') 455 (c.Append('%(ctype)s temp;')
457 .Append('if (!%s)' % 456 .Append('if (!%s)' %
458 cpp_util.GetAsFundamentalValue( 457 cpp_util.GetAsFundamentalValue(
459 self._cpp_type_generator.GetReferencedProperty(prop), 458 self._cpp_type_generator.GetReferencedProperty(prop),
460 value_var, 459 value_var,
461 '&temp')) 460 '&temp'))
462 .Append(' return %(failure_value)s;') 461 .Append(' return %(failure_value)s;')
463 .Append('%(dst)s->%(name)s.reset(new %(ctype)s(temp));') 462 .Append('%(dst)s->%(name)s.reset(new %(ctype)s(temp));')
464 ) 463 )
465 else: 464 else:
466 (c.Append('if (!%s)' % 465 (c.Append('if (!%s)' %
467 cpp_util.GetAsFundamentalValue( 466 cpp_util.GetAsFundamentalValue(
468 self._cpp_type_generator.GetReferencedProperty(prop), 467 self._cpp_type_generator.GetReferencedProperty(prop),
469 value_var, 468 value_var,
470 '&%s->%s' % (dst, prop.unix_name))) 469 '&%s->%s' % (dst, prop.unix_name)))
471 .Append(' return %(failure_value)s;') 470 .Append(' return %(failure_value)s;')
472 ) 471 )
473 elif self._IsObjectOrObjectRef(prop): 472 elif self._IsObjectOrObjectRef(prop):
474 if prop.optional: 473 if prop.optional:
475 (c.Append('DictionaryValue* dictionary = NULL;') 474 (c.Append('base::DictionaryValue* dictionary = NULL;')
476 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))') 475 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))')
477 .Append(' return %(failure_value)s;') 476 .Append(' return %(failure_value)s;')
478 .Append('scoped_ptr<%(ctype)s> temp(new %(ctype)s());') 477 .Append('scoped_ptr<%(ctype)s> temp(new %(ctype)s());')
479 .Append('if (!%(ctype)s::Populate(*dictionary, temp.get()))') 478 .Append('if (!%(ctype)s::Populate(*dictionary, temp.get()))')
480 .Append(' return %(failure_value)s;') 479 .Append(' return %(failure_value)s;')
481 .Append('%(dst)s->%(name)s = temp.Pass();') 480 .Append('%(dst)s->%(name)s = temp.Pass();')
482 ) 481 )
483 else: 482 else:
484 (c.Append('DictionaryValue* dictionary = NULL;') 483 (c.Append('base::DictionaryValue* dictionary = NULL;')
485 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))') 484 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))')
486 .Append(' return %(failure_value)s;') 485 .Append(' return %(failure_value)s;')
487 .Append( 486 .Append(
488 'if (!%(ctype)s::Populate(*dictionary, &%(dst)s->%(name)s))') 487 'if (!%(ctype)s::Populate(*dictionary, &%(dst)s->%(name)s))')
489 .Append(' return %(failure_value)s;') 488 .Append(' return %(failure_value)s;')
490 ) 489 )
491 elif prop.type_ == PropertyType.ANY: 490 elif prop.type_ == PropertyType.ANY:
492 if prop.optional: 491 if prop.optional:
493 c.Append('%(dst)s->%(name)s.reset(new Any());') 492 c.Append('%(dst)s->%(name)s.reset(new ' + any_helper.ANY_CLASS + '());')
not at google - send to devlin 2012/06/12 18:34:38 Is this the only non *Value -> base::*Value change
benjhayden 2012/06/12 20:15:42 See my response to your other comment in this file
494 c.Append(self._any_helper.Init(prop, value_var, dst) + ';') 493 c.Append(self._any_helper.Init(prop, value_var, dst) + ';')
495 elif self._IsArrayOrArrayRef(prop): 494 elif self._IsArrayOrArrayRef(prop):
496 # util_cc_helper deals with optional and required arrays 495 # util_cc_helper deals with optional and required arrays
497 (c.Append('ListValue* list = NULL;') 496 (c.Append('base::ListValue* list = NULL;')
498 .Append('if (!%(value_var)s->GetAsList(&list))') 497 .Append('if (!%(value_var)s->GetAsList(&list))')
499 .Append(' return %(failure_value)s;') 498 .Append(' return %(failure_value)s;')
500 .Append('if (!%s)' % self._util_cc_helper.PopulateArrayFromList( 499 .Append('if (!%s)' % self._util_cc_helper.PopulateArrayFromList(
501 self._cpp_type_generator.GetReferencedProperty(prop), 'list', 500 self._cpp_type_generator.GetReferencedProperty(prop), 'list',
502 dst + '->' + prop.unix_name, prop.optional)) 501 dst + '->' + prop.unix_name, prop.optional))
503 .Append(' return %(failure_value)s;') 502 .Append(' return %(failure_value)s;')
504 ) 503 )
505 elif prop.type_ == PropertyType.CHOICES: 504 elif prop.type_ == PropertyType.CHOICES:
506 type_var = '%(dst)s->%(name)s_type' 505 type_var = '%(dst)s->%(name)s_type'
507 c.Sblock('switch (%(value_var)s->GetType()) {') 506 c.Sblock('switch (%(value_var)s->GetType()) {')
(...skipping 25 matching lines...) Expand all
533 .Append(' %s->%s = %s;' % ( 532 .Append(' %s->%s = %s;' % (
534 dst, 533 dst,
535 prop.unix_name, 534 prop.unix_name,
536 self._cpp_type_generator.GetEnumValue(prop, enum_value))) 535 self._cpp_type_generator.GetEnumValue(prop, enum_value)))
537 ) 536 )
538 (c.Append('else') 537 (c.Append('else')
539 .Append(' return %(failure_value)s;') 538 .Append(' return %(failure_value)s;')
540 ) 539 )
541 elif prop.type_ == PropertyType.BINARY: 540 elif prop.type_ == PropertyType.BINARY:
542 # This is the same if the property is optional or not. We need a pointer 541 # This is the same if the property is optional or not. We need a pointer
543 # to the BinaryValue to be able to populate it, so a scoped_ptr is used 542 # to the base::BinaryValue to be able to populate it, so a scoped_ptr is
544 # whether it is optional or required. 543 # used whether it is optional or required.
545 (c.Append('if (!%(value_var)s->IsType(%(value_type)s))') 544 (c.Append('if (!%(value_var)s->IsType(%(value_type)s))')
546 .Append(' return %(failure_value)s;') 545 .Append(' return %(failure_value)s;')
547 .Append('%(dst)s->%(name)s.reset(') 546 .Append('%(dst)s->%(name)s.reset(')
548 .Append(' static_cast<BinaryValue*>(%(value_var)s)->DeepCopy());') 547 .Append(' static_cast<base::BinaryValue*>(%(value_var)s)' +
548 '->DeepCopy());')
549 ) 549 )
550 else: 550 else:
551 raise NotImplementedError(prop.type_) 551 raise NotImplementedError(prop.type_)
552 c.Eblock('}') 552 c.Eblock('}')
553 sub = { 553 sub = {
554 'value_var': value_var, 554 'value_var': value_var,
555 'name': prop.unix_name, 555 'name': prop.unix_name,
556 'dst': dst, 556 'dst': dst,
557 'failure_value': failure_value, 557 'failure_value': failure_value,
558 } 558 }
(...skipping 25 matching lines...) Expand all
584 584
585 def _GenerateFunctionResultCreate(self, cpp_namespace, function): 585 def _GenerateFunctionResultCreate(self, cpp_namespace, function):
586 """Generate function to create a Result given the return value. 586 """Generate function to create a Result given the return value.
587 587
588 E.g for function "Bar", generate Bar::Result::Create 588 E.g for function "Bar", generate Bar::Result::Create
589 """ 589 """
590 c = Code() 590 c = Code()
591 params = function.callback.params 591 params = function.callback.params
592 592
593 if not params: 593 if not params:
594 (c.Append('Value* %s::Result::Create() {' % cpp_namespace) 594 (c.Append('base::Value* %s::Result::Create() {' % cpp_namespace)
595 .Append(' return Value::CreateNullValue();') 595 .Append(' return base::Value::CreateNullValue();')
596 .Append('}') 596 .Append('}')
597 ) 597 )
598 else: 598 else:
599 expanded_params = self._cpp_type_generator.GetExpandedChoicesInParams( 599 expanded_params = self._cpp_type_generator.GetExpandedChoicesInParams(
600 params) 600 params)
601 c.Concat(self._GeneratePropertyFunctions( 601 c.Concat(self._GeneratePropertyFunctions(
602 cpp_namespace + '::Result', expanded_params)) 602 cpp_namespace + '::Result', expanded_params))
603 603
604 # If there is a single parameter, this is straightforward. However, if 604 # If there is a single parameter, this is straightforward. However, if
605 # the callback parameter is of 'choices', this generates a Create method 605 # the callback parameter is of 'choices', this generates a Create method
606 # for each choice. This works because only 1 choice can be returned at a 606 # for each choice. This works because only 1 choice can be returned at a
607 # time. 607 # time.
608 for param in expanded_params: 608 for param in expanded_params:
609 if param.type_ == PropertyType.ANY: 609 if param.type_ == PropertyType.ANY:
610 # Generation of Value* Create(Value*) is redundant. 610 # Generation of base::Value* Create(base::Value*) is redundant.
611 continue 611 continue
612 # We treat this argument as 'required' to avoid wrapping it in a 612 # We treat this argument as 'required' to avoid wrapping it in a
613 # scoped_ptr if it's optional. 613 # scoped_ptr if it's optional.
614 param_copy = param.Copy() 614 param_copy = param.Copy()
615 param_copy.optional = False 615 param_copy.optional = False
616 c.Sblock('Value* %(cpp_namespace)s::Result::Create(const %(arg)s) {') 616 c.Sblock('base::Value* %(cpp_namespace)s::Result::Create(' +
617 'const %(arg)s) {')
617 c.Append('return %s;' % 618 c.Append('return %s;' %
618 self._CreateValueFromProperty(param_copy, param_copy.unix_name)) 619 self._CreateValueFromProperty(param_copy, param_copy.unix_name))
619 c.Eblock('}') 620 c.Eblock('}')
620 c.Substitute({ 621 c.Substitute({
621 'cpp_namespace': cpp_namespace, 622 'cpp_namespace': cpp_namespace,
622 'arg': cpp_util.GetParameterDeclaration( 623 'arg': cpp_util.GetParameterDeclaration(
623 param_copy, self._cpp_type_generator.GetType(param_copy)) 624 param_copy, self._cpp_type_generator.GetType(param_copy))
624 }) 625 })
625 626
626 return c 627 return c
(...skipping 28 matching lines...) Expand all
655 """ 656 """
656 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ == 657 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ ==
657 PropertyType.ARRAY) 658 PropertyType.ARRAY)
658 659
659 def _IsFundamentalOrFundamentalRef(self, prop): 660 def _IsFundamentalOrFundamentalRef(self, prop):
660 """Determines if this property is a Fundamental type or is a ref to a 661 """Determines if this property is a Fundamental type or is a ref to a
661 Fundamental type. 662 Fundamental type.
662 """ 663 """
663 return (self._cpp_type_generator.GetReferencedProperty(prop).type_. 664 return (self._cpp_type_generator.GetReferencedProperty(prop).type_.
664 is_fundamental) 665 is_fundamental)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698