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

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

Issue 10639020: Switch the downloads API over to IDL/json_schema_compiler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge Created 8 years, 5 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
« no previous file with comments | « ppapi/generators/idl_parser.py ('k') | tools/json_schema_compiler/cpp_type_generator.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;')
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 prop.type_ == PropertyType.BINARY: 346 elif prop.type_ == PropertyType.BINARY:
349 return '%s->DeepCopy()' % var 347 return '%s->DeepCopy()' % var
350 elif self._IsArrayOrArrayRef(prop): 348 elif self._IsArrayOrArrayRef(prop):
351 return '%s.release()' % self._util_cc_helper.CreateValueFromArray( 349 return '%s.release()' % self._util_cc_helper.CreateValueFromArray(
352 self._cpp_type_generator.GetReferencedProperty(prop), var, 350 self._cpp_type_generator.GetReferencedProperty(prop), var,
353 prop.optional) 351 prop.optional)
354 elif self._IsFundamentalOrFundamentalRef(prop): 352 elif self._IsFundamentalOrFundamentalRef(prop):
355 if prop.optional: 353 if prop.optional:
356 var = '*' + var 354 var = '*' + var
357 prop = self._cpp_type_generator.GetReferencedProperty(prop); 355 prop = self._cpp_type_generator.GetReferencedProperty(prop);
358 return { 356 return {
359 PropertyType.STRING: 'Value::CreateStringValue(%s)', 357 PropertyType.STRING: 'base::Value::CreateStringValue(%s)',
360 PropertyType.BOOLEAN: 'Value::CreateBooleanValue(%s)', 358 PropertyType.BOOLEAN: 'base::Value::CreateBooleanValue(%s)',
361 PropertyType.INTEGER: 'Value::CreateIntegerValue(%s)', 359 PropertyType.INTEGER: 'base::Value::CreateIntegerValue(%s)',
362 PropertyType.DOUBLE: 'Value::CreateDoubleValue(%s)', 360 PropertyType.DOUBLE: 'base::Value::CreateDoubleValue(%s)',
363 }[prop.type_] % var 361 }[prop.type_] % var
364 else: 362 else:
365 raise NotImplementedError('Conversion of %s to Value not ' 363 raise NotImplementedError('Conversion of %s to base::Value not '
366 'implemented' % repr(prop.type_)) 364 'implemented' % repr(prop.type_))
367 365
368 def _GenerateParamsCheck(self, function, var): 366 def _GenerateParamsCheck(self, function, var):
369 """Generates a check for the correct number of arguments when creating 367 """Generates a check for the correct number of arguments when creating
370 Params. 368 Params.
371 """ 369 """
372 c = Code() 370 c = Code()
373 num_required = 0 371 num_required = 0
374 for param in function.params: 372 for param in function.params:
375 if not param.optional: 373 if not param.optional:
376 num_required += 1 374 num_required += 1
377 if num_required == len(function.params): 375 if num_required == len(function.params):
378 c.Append('if (%(var)s.GetSize() != %(total)d)') 376 c.Append('if (%(var)s.GetSize() != %(total)d)')
379 elif not num_required: 377 elif not num_required:
380 c.Append('if (%(var)s.GetSize() > %(total)d)') 378 c.Append('if (%(var)s.GetSize() > %(total)d)')
381 else: 379 else:
382 c.Append('if (%(var)s.GetSize() < %(required)d' 380 c.Append('if (%(var)s.GetSize() < %(required)d'
383 ' || %(var)s.GetSize() > %(total)d)') 381 ' || %(var)s.GetSize() > %(total)d)')
384 c.Append(' return scoped_ptr<Params>();') 382 c.Append(' return scoped_ptr<Params>();')
385 c.Substitute({ 383 c.Substitute({
386 'var': var, 384 'var': var,
387 'required': num_required, 385 'required': num_required,
388 'total': len(function.params), 386 'total': len(function.params),
389 }) 387 })
390 return c 388 return c
391 389
392 def _GenerateFunctionParamsCreate(self, cpp_namespace, function): 390 def _GenerateFunctionParamsCreate(self, cpp_namespace, function):
393 """Generate function to create an instance of Params. The generated 391 """Generate function to create an instance of Params. The generated
394 function takes a ListValue of arguments. 392 function takes a base::ListValue of arguments.
395 393
396 E.g for function "Bar", generate Bar::Params::Create() 394 E.g for function "Bar", generate Bar::Params::Create()
397 """ 395 """
398 c = Code() 396 c = Code()
399 (c.Append('// static') 397 (c.Append('// static')
400 .Sblock('scoped_ptr<%(cpp_namespace)s::Params> ' 398 .Sblock('scoped_ptr<%(cpp_namespace)s::Params> '
401 '%(cpp_namespace)s::Params::Create(const ListValue& args) {') 399 '%(cpp_namespace)s::Params::Create(const base::ListValue& args) {')
402 .Concat(self._GenerateParamsCheck(function, 'args')) 400 .Concat(self._GenerateParamsCheck(function, 'args'))
403 .Append('scoped_ptr<Params> params(new Params());') 401 .Append('scoped_ptr<Params> params(new Params());')
404 ) 402 )
405 c.Substitute({'cpp_namespace': cpp_namespace}) 403 c.Substitute({'cpp_namespace': cpp_namespace})
406 404
407 for param in function.params: 405 for param in function.params:
408 c.Concat(self._InitializePropertyToDefault(param, 'params')) 406 c.Concat(self._InitializePropertyToDefault(param, 'params'))
409 407
410 for i, param in enumerate(function.params): 408 for i, param in enumerate(function.params):
411 # Any failure will cause this function to return. If any argument is 409 # Any failure will cause this function to return. If any argument is
412 # incorrect or missing, those following it are not processed. Note that 410 # incorrect or missing, those following it are not processed. Note that
413 # for optional arguments, we allow missing arguments and proceed because 411 # for optional arguments, we allow missing arguments and proceed because
414 # there may be other arguments following it. 412 # there may be other arguments following it.
415 failure_value = 'scoped_ptr<Params>()' 413 failure_value = 'scoped_ptr<Params>()'
416 c.Append() 414 c.Append()
417 value_var = param.unix_name + '_value' 415 value_var = param.unix_name + '_value'
418 (c.Append('Value* %(value_var)s = NULL;') 416 (c.Append('base::Value* %(value_var)s = NULL;')
419 .Append('if (args.Get(%(i)s, &%(value_var)s) && ' 417 .Append('if (args.Get(%(i)s, &%(value_var)s) &&\n'
420 '!%(value_var)s->IsType(Value::TYPE_NULL))') 418 ' !%(value_var)s->IsType(base::Value::TYPE_NULL))')
421 .Sblock('{') 419 .Sblock('{')
422 .Concat(self._GeneratePopulatePropertyFromValue( 420 .Concat(self._GeneratePopulatePropertyFromValue(
423 param, value_var, 'params', failure_value)) 421 param, value_var, 'params', failure_value))
424 .Eblock('}') 422 .Eblock('}')
425 ) 423 )
426 if not param.optional: 424 if not param.optional:
427 (c.Sblock('else {') 425 (c.Sblock('else {')
428 .Append('return %s;' % failure_value) 426 .Append('return %s;' % failure_value)
429 .Eblock('}') 427 .Eblock('}')
430 ) 428 )
431 c.Substitute({'value_var': value_var, 'i': i}) 429 c.Substitute({'value_var': value_var, 'i': i})
432 (c.Append() 430 (c.Append()
433 .Append('return params.Pass();') 431 .Append('return params.Pass();')
434 .Eblock('}') 432 .Eblock('}')
435 .Append() 433 .Append()
436 ) 434 )
437 435
438 return c 436 return c
439 437
440 def _GeneratePopulatePropertyFromValue( 438 def _GeneratePopulatePropertyFromValue(
441 self, prop, value_var, dst, failure_value, check_type=True): 439 self, prop, value_var, dst, failure_value, check_type=True):
442 """Generates code to populate a model.Property given a Value*. The 440 """Generates code to populate a model.Property given a base::Value*. The
443 existence of data inside the Value* is assumed so checks for existence 441 existence of data inside the base::Value* is assumed so checks for existence
444 should be performed before the code this generates. 442 should be performed before the code this generates.
445 443
446 prop: the property the code is populating. 444 prop: the property the code is populating.
447 value_var: a Value* that should represent |prop|. 445 value_var: a base::Value* that should represent |prop|.
448 dst: the object with |prop| as a member. 446 dst: the object with |prop| as a member.
449 failure_value: the value to return if |prop| cannot be extracted from 447 failure_value: the value to return if |prop| cannot be extracted from
450 |value_var| 448 |value_var|
451 check_type: if true, will check if |value_var| is the correct Value::Type 449 check_type: if true, will check if |value_var| is the correct
450 base::Value::Type
452 """ 451 """
453 c = Code() 452 c = Code()
454 c.Sblock('{') 453 c.Sblock('{')
455 454
456 if self._IsFundamentalOrFundamentalRef(prop): 455 if self._IsFundamentalOrFundamentalRef(prop):
457 if prop.optional: 456 if prop.optional:
458 (c.Append('%(ctype)s temp;') 457 (c.Append('%(ctype)s temp;')
459 .Append('if (!%s)' % 458 .Append('if (!%s)' %
460 cpp_util.GetAsFundamentalValue( 459 cpp_util.GetAsFundamentalValue(
461 self._cpp_type_generator.GetReferencedProperty(prop), 460 self._cpp_type_generator.GetReferencedProperty(prop),
462 value_var, 461 value_var,
463 '&temp')) 462 '&temp'))
464 .Append(' return %(failure_value)s;') 463 .Append(' return %(failure_value)s;')
465 .Append('%(dst)s->%(name)s.reset(new %(ctype)s(temp));') 464 .Append('%(dst)s->%(name)s.reset(new %(ctype)s(temp));')
466 ) 465 )
467 else: 466 else:
468 (c.Append('if (!%s)' % 467 (c.Append('if (!%s)' %
469 cpp_util.GetAsFundamentalValue( 468 cpp_util.GetAsFundamentalValue(
470 self._cpp_type_generator.GetReferencedProperty(prop), 469 self._cpp_type_generator.GetReferencedProperty(prop),
471 value_var, 470 value_var,
472 '&%s->%s' % (dst, prop.unix_name))) 471 '&%s->%s' % (dst, prop.unix_name)))
473 .Append(' return %(failure_value)s;') 472 .Append(' return %(failure_value)s;')
474 ) 473 )
475 elif self._IsObjectOrObjectRef(prop): 474 elif self._IsObjectOrObjectRef(prop):
476 if prop.optional: 475 if prop.optional:
477 (c.Append('DictionaryValue* dictionary = NULL;') 476 (c.Append('base::DictionaryValue* dictionary = NULL;')
478 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))') 477 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))')
479 .Append(' return %(failure_value)s;') 478 .Append(' return %(failure_value)s;')
480 .Append('scoped_ptr<%(ctype)s> temp(new %(ctype)s());') 479 .Append('scoped_ptr<%(ctype)s> temp(new %(ctype)s());')
481 .Append('if (!%(ctype)s::Populate(*dictionary, temp.get()))') 480 .Append('if (!%(ctype)s::Populate(*dictionary, temp.get()))')
482 .Append(' return %(failure_value)s;') 481 .Append(' return %(failure_value)s;')
483 .Append('%(dst)s->%(name)s = temp.Pass();') 482 .Append('%(dst)s->%(name)s = temp.Pass();')
484 ) 483 )
485 else: 484 else:
486 (c.Append('DictionaryValue* dictionary = NULL;') 485 (c.Append('base::DictionaryValue* dictionary = NULL;')
487 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))') 486 .Append('if (!%(value_var)s->GetAsDictionary(&dictionary))')
488 .Append(' return %(failure_value)s;') 487 .Append(' return %(failure_value)s;')
489 .Append( 488 .Append(
490 'if (!%(ctype)s::Populate(*dictionary, &%(dst)s->%(name)s))') 489 'if (!%(ctype)s::Populate(*dictionary, &%(dst)s->%(name)s))')
491 .Append(' return %(failure_value)s;') 490 .Append(' return %(failure_value)s;')
492 ) 491 )
493 elif prop.type_ == PropertyType.ANY: 492 elif prop.type_ == PropertyType.ANY:
494 if prop.optional: 493 if prop.optional:
495 c.Append('%(dst)s->%(name)s.reset(new Any());') 494 c.Append('%(dst)s->%(name)s.reset(new ' + any_helper.ANY_CLASS + '());')
496 c.Append(self._any_helper.Init(prop, value_var, dst) + ';') 495 c.Append(self._any_helper.Init(prop, value_var, dst) + ';')
497 elif self._IsArrayOrArrayRef(prop): 496 elif self._IsArrayOrArrayRef(prop):
498 # util_cc_helper deals with optional and required arrays 497 # util_cc_helper deals with optional and required arrays
499 (c.Append('ListValue* list = NULL;') 498 (c.Append('base::ListValue* list = NULL;')
500 .Append('if (!%(value_var)s->GetAsList(&list))') 499 .Append('if (!%(value_var)s->GetAsList(&list))')
501 .Append(' return %(failure_value)s;')) 500 .Append(' return %(failure_value)s;'))
502 if prop.item_type.type_ == PropertyType.ENUM: 501 if prop.item_type.type_ == PropertyType.ENUM:
503 self._GenerateListValueToEnumArrayConversion(c, prop) 502 self._GenerateListValueToEnumArrayConversion(c, prop)
504 else: 503 else:
505 (c.Append('if (!%s)' % self._util_cc_helper.PopulateArrayFromList( 504 (c.Append('if (!%s)' % self._util_cc_helper.PopulateArrayFromList(
506 self._cpp_type_generator.GetReferencedProperty(prop), 'list', 505 self._cpp_type_generator.GetReferencedProperty(prop), 'list',
507 dst + '->' + prop.unix_name, prop.optional)) 506 dst + '->' + prop.unix_name, prop.optional))
508 .Append(' return %(failure_value)s;') 507 .Append(' return %(failure_value)s;')
509 ) 508 )
(...skipping 16 matching lines...) Expand all
526 .Append(' return %(failure_value)s;') 525 .Append(' return %(failure_value)s;')
527 ) 526 )
528 c.Eblock('}') 527 c.Eblock('}')
529 elif prop.type_ == PropertyType.ENUM: 528 elif prop.type_ == PropertyType.ENUM:
530 c.Sblock('{') 529 c.Sblock('{')
531 self._GenerateStringToEnumConversion(c, prop, value_var, 'enum_temp') 530 self._GenerateStringToEnumConversion(c, prop, value_var, 'enum_temp')
532 c.Append('%(dst)s->%(name)s = enum_temp;') 531 c.Append('%(dst)s->%(name)s = enum_temp;')
533 c.Eblock('}') 532 c.Eblock('}')
534 elif prop.type_ == PropertyType.BINARY: 533 elif prop.type_ == PropertyType.BINARY:
535 # This is the same if the property is optional or not. We need a pointer 534 # This is the same if the property is optional or not. We need a pointer
536 # to the BinaryValue to be able to populate it, so a scoped_ptr is used 535 # to the base::BinaryValue to be able to populate it, so a scoped_ptr is
537 # whether it is optional or required. 536 # used whether it is optional or required.
538 (c.Append('if (!%(value_var)s->IsType(%(value_type)s))') 537 (c.Append('if (!%(value_var)s->IsType(%(value_type)s))')
539 .Append(' return %(failure_value)s;') 538 .Append(' return %(failure_value)s;')
540 .Append('%(dst)s->%(name)s.reset(') 539 .Append('%(dst)s->%(name)s.reset(')
541 .Append(' static_cast<BinaryValue*>(%(value_var)s)->DeepCopy());') 540 .Append(' static_cast<base::BinaryValue*>(%(value_var)s)'
541 '->DeepCopy());')
542 ) 542 )
543 else: 543 else:
544 raise NotImplementedError(prop.type_) 544 raise NotImplementedError(prop.type_)
545 c.Eblock('}') 545 c.Eblock('}')
546 sub = { 546 sub = {
547 'value_var': value_var, 547 'value_var': value_var,
548 'name': prop.unix_name, 548 'name': prop.unix_name,
549 'dst': dst, 549 'dst': dst,
550 'failure_value': failure_value, 550 'failure_value': failure_value,
551 } 551 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 625
626 def _GenerateFunctionResultCreate(self, cpp_namespace, function): 626 def _GenerateFunctionResultCreate(self, cpp_namespace, function):
627 """Generate function to create a Result given the return value. 627 """Generate function to create a Result given the return value.
628 628
629 E.g for function "Bar", generate Bar::Result::Create 629 E.g for function "Bar", generate Bar::Result::Create
630 """ 630 """
631 c = Code() 631 c = Code()
632 params = function.callback.params 632 params = function.callback.params
633 633
634 if not params: 634 if not params:
635 (c.Append('Value* %s::Result::Create() {' % cpp_namespace) 635 (c.Append('base::Value* %s::Result::Create() {' % cpp_namespace)
636 .Append(' return Value::CreateNullValue();') 636 .Append(' return base::Value::CreateNullValue();')
637 .Append('}') 637 .Append('}')
638 ) 638 )
639 else: 639 else:
640 expanded_params = self._cpp_type_generator.GetExpandedChoicesInParams( 640 expanded_params = self._cpp_type_generator.GetExpandedChoicesInParams(
641 params) 641 params)
642 c.Concat(self._GeneratePropertyFunctions( 642 c.Concat(self._GeneratePropertyFunctions(
643 cpp_namespace + '::Result', expanded_params)) 643 cpp_namespace + '::Result', expanded_params))
644 644
645 # If there is a single parameter, this is straightforward. However, if 645 # If there is a single parameter, this is straightforward. However, if
646 # the callback parameter is of 'choices', this generates a Create method 646 # the callback parameter is of 'choices', this generates a Create method
647 # for each choice. This works because only 1 choice can be returned at a 647 # for each choice. This works because only 1 choice can be returned at a
648 # time. 648 # time.
649 for param in expanded_params: 649 for param in expanded_params:
650 if param.type_ == PropertyType.ANY: 650 if param.type_ == PropertyType.ANY:
651 # Generation of Value* Create(Value*) is redundant. 651 # Generation of base::Value* Create(base::Value*) is redundant.
652 continue 652 continue
653 # We treat this argument as 'required' to avoid wrapping it in a 653 # We treat this argument as 'required' to avoid wrapping it in a
654 # scoped_ptr if it's optional. 654 # scoped_ptr if it's optional.
655 param_copy = param.Copy() 655 param_copy = param.Copy()
656 param_copy.optional = False 656 param_copy.optional = False
657 c.Sblock('Value* %(cpp_namespace)s::Result::Create(const %(arg)s) {') 657 c.Sblock('base::Value* %(cpp_namespace)s::Result::Create('
658 'const %(arg)s) {')
658 c.Append('return %s;' % 659 c.Append('return %s;' %
659 self._CreateValueFromProperty(param_copy, param_copy.unix_name)) 660 self._CreateValueFromProperty(param_copy, param_copy.unix_name))
660 c.Eblock('}') 661 c.Eblock('}')
661 c.Substitute({ 662 c.Substitute({
662 'cpp_namespace': cpp_namespace, 663 'cpp_namespace': cpp_namespace,
663 'arg': cpp_util.GetParameterDeclaration( 664 'arg': cpp_util.GetParameterDeclaration(
664 param_copy, self._cpp_type_generator.GetType(param_copy)) 665 param_copy, self._cpp_type_generator.GetType(param_copy))
665 }) 666 })
666 667
667 return c 668 return c
(...skipping 28 matching lines...) Expand all
696 """ 697 """
697 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ == 698 return (self._cpp_type_generator.GetReferencedProperty(prop).type_ ==
698 PropertyType.ARRAY) 699 PropertyType.ARRAY)
699 700
700 def _IsFundamentalOrFundamentalRef(self, prop): 701 def _IsFundamentalOrFundamentalRef(self, prop):
701 """Determines if this property is a Fundamental type or is a ref to a 702 """Determines if this property is a Fundamental type or is a ref to a
702 Fundamental type. 703 Fundamental type.
703 """ 704 """
704 return (self._cpp_type_generator.GetReferencedProperty(prop).type_. 705 return (self._cpp_type_generator.GetReferencedProperty(prop).type_.
705 is_fundamental) 706 is_fundamental)
OLDNEW
« no previous file with comments | « ppapi/generators/idl_parser.py ('k') | tools/json_schema_compiler/cpp_type_generator.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698