cpp_util.py revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Utilies and constants specific to Chromium C++ code.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from code import Code
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from datetime import datetime
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from model import Property, PropertyType, Type
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import re
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CHROMIUM_LICENSE = (
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""// Copyright (c) %d The Chromium Authors. All rights reserved.
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.""" % datetime.now().year
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles))
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GENERATED_FILE_MESSAGE = """// GENERATED FROM THE API DEFINITION IN
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   %s
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GENERATED_BUNDLE_FILE_MESSAGE = """// GENERATED FROM THE API DEFINITIONS IN
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   %s
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Classname(s):
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Translates a namespace name or function name into something more
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suited to C++.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eg experimental.downloads -> Experimental_Downloads
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updateAll -> UpdateAll.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return '_'.join([x[0].upper() + x[1:] for x in re.split('\W', s)])
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def GetAsFundamentalValue(type_, src, dst):
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the C++ code for retrieving a fundamental type from a
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value into a variable.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  src: Value*
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dst: Property*
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.STRING: '%s->GetAsString(%s)',
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.BOOLEAN: '%s->GetAsBoolean(%s)',
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.INTEGER: '%s->GetAsInteger(%s)',
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.DOUBLE: '%s->GetAsDouble(%s)',
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }[type_.property_type] % (src, dst)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetValueType(type_):
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the Value::Type corresponding to the model.PropertyType.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.STRING: 'Value::TYPE_STRING',
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.INTEGER: 'Value::TYPE_INTEGER',
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.BOOLEAN: 'Value::TYPE_BOOLEAN',
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.DOUBLE: 'Value::TYPE_DOUBLE',
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.ENUM: 'Value::TYPE_STRING',
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.OBJECT: 'Value::TYPE_DICTIONARY',
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.FUNCTION: 'Value::TYPE_DICTIONARY',
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.ARRAY: 'Value::TYPE_LIST',
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.BINARY: 'Value::TYPE_BINARY',
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }[type_.property_type]
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetParameterDeclaration(param, type_):
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Gets a parameter declaration of a given model.Property and its C++
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  type.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if param.type_.property_type in (PropertyType.REF,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PropertyType.OBJECT,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PropertyType.ARRAY,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PropertyType.STRING,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PropertyType.ANY):
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    arg = 'const %(type)s& %(name)s'
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg = '%(type)s %(name)s'
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg % {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': type_,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'name': param.unix_name,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GenerateIfndefName(path, filename):
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Formats a path and filename as a #define name.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  e.g chrome/extensions/gen, file.h becomes CHROME_EXTENSIONS_GEN_FILE_H__.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (('%s_%s_H__' % (path, filename))
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .upper().replace(os.sep, '_').replace('/', '_'))
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def PadForGenerics(var):
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Appends a space to |var| if it ends with a >, so that it can be compiled
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  within generic types.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ('%s ' % var) if var.endswith('>') else var
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def OpenNamespace(namespace):
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Get opening root namespace declarations.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  c = Code()
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for component in namespace.split('::'):
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    c.Append('namespace %s {' % component)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return c
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def CloseNamespace(namespace):
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Get closing root namespace declarations.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  c = Code()
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for component in reversed(namespace.split('::')):
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    c.Append('}  // namespace %s' % component)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return c
112