cpp_util.py revision f2477e01787aa58f445919b809d89e252beef54f
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
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)from model import PropertyType
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)"""
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GENERATED_FEATURE_MESSAGE = """// GENERATED FROM THE FEATURE DEFINITIONS IN
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//   %s
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// DO NOT EDIT.
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)"""
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Classname(s):
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Translates a namespace name or function name into something more
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  suited to C++.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eg experimental.downloads -> Experimental_Downloads
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  updateAll -> UpdateAll.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return '_'.join([x[0].upper() + x[1:] for x in re.split('\W', s)])
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def GetAsFundamentalValue(type_, src, dst):
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Returns the C++ code for retrieving a fundamental type from a
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Value into a variable.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  src: Value*
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dst: Property*
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.BOOLEAN: '%s->GetAsBoolean(%s)',
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PropertyType.DOUBLE: '%s->GetAsDouble(%s)',
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.INTEGER: '%s->GetAsInteger(%s)',
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.STRING: '%s->GetAsString(%s)',
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }[type_.property_type] % (src, dst)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetValueType(type_):
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  """Returns the Value::Type corresponding to the model.Type.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return {
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.ARRAY: 'base::Value::TYPE_LIST',
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.BINARY: 'base::Value::TYPE_BINARY',
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.BOOLEAN: 'base::Value::TYPE_BOOLEAN',
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      # PropertyType.CHOICES can be any combination of types.
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.DOUBLE: 'base::Value::TYPE_DOUBLE',
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.ENUM: 'base::Value::TYPE_STRING',
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.FUNCTION: 'base::Value::TYPE_DICTIONARY',
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.INTEGER: 'base::Value::TYPE_INTEGER',
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.OBJECT: 'base::Value::TYPE_DICTIONARY',
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      PropertyType.STRING: 'base::Value::TYPE_STRING',
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }[type_.property_type]
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GetParameterDeclaration(param, type_):
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Gets a parameter declaration of a given model.Property and its C++
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  type.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if param.type_.property_type in (PropertyType.ANY,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   PropertyType.ARRAY,
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   PropertyType.CHOICES,
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   PropertyType.OBJECT,
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   PropertyType.REF,
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                   PropertyType.STRING):
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    arg = 'const %(type)s& %(name)s'
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg = '%(type)s %(name)s'
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return arg % {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': type_,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'name': param.unix_name,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def GenerateIfndefName(path, filename):
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Formats a path and filename as a #define name.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  e.g chrome/extensions/gen, file.h becomes CHROME_EXTENSIONS_GEN_FILE_H__.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (('%s_%s_H__' % (path, filename))
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .upper().replace(os.sep, '_').replace('/', '_'))
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def PadForGenerics(var):
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Appends a space to |var| if it ends with a >, so that it can be compiled
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  within generic types.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ('%s ' % var) if var.endswith('>') else var
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def OpenNamespace(namespace):
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Get opening root namespace declarations.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  c = Code()
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for component in namespace.split('::'):
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    c.Append('namespace %s {' % component)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return c
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def CloseNamespace(namespace):
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Get closing root namespace declarations.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  c = Code()
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for component in reversed(namespace.split('::')):
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    c.Append('}  // namespace %s' % component)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return c
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ConstantName(feature_name):
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  """Returns a kName for a feature's name.
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  """
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ('k' + ''.join(word[0].upper() + word[1:]
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for word in feature_name.replace('.', ' ').split()))
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def CamelCase(unix_name):
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ''.join(word.capitalize() for word in unix_name.split('_'))
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ClassName(filepath):
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return CamelCase(os.path.split(filepath)[1])
140