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)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def GenerateIfndefName(file_path):
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  """Formats |file_path| as a #define name. Presumably |file_path| is a header
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  file, or there's little point in generating a #define for it.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  e.g chrome/extensions/gen/file.h becomes CHROME_EXTENSIONS_GEN_FILE_H__.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return (('%s__' % file_path).upper()
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      .replace('\\', '_')
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      .replace('/', '_')
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      .replace('.', '_'))
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)def PadForGenerics(var):
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Appends a space to |var| if it ends with a >, so that it can be compiled
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  within generic types.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ('%s ' % var) if var.endswith('>') else var
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def OpenNamespace(cpp_namespace):
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Get opening root namespace declarations.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  c = Code()
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for component in cpp_namespace.split('::'):
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    c.Append('namespace %s {' % component)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return c
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def CloseNamespace(cpp_namespace):
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  """Get closing root namespace declarations.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  c = Code()
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  for component in reversed(cpp_namespace.split('::')):
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    c.Append('}  // namespace %s' % component)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return c
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ConstantName(feature_name):
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  """Returns a kName for a feature's name.
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  """
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ('k' + ''.join(word[0].upper() + word[1:]
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for word in feature_name.replace('.', ' ').split()))
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def CamelCase(unix_name):
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ''.join(word.capitalize() for word in unix_name.split('_'))
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)def ClassName(filepath):
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return CamelCase(os.path.split(filepath)[1])
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)def GetCppNamespace(pattern, namespace):
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  '''Returns the C++ namespace given |pattern| which includes a %(namespace)s
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  substitution, and the |namespace| to substitute. It is expected that |pattern|
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  has been passed as a flag to compiler.py from GYP/GN.
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  '''
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  # For some reason Windows builds escape the % characters, so unescape them.
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  # This means that %% can never appear legitimately within a pattern, but
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  # that's ok. It should never happen.
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  cpp_namespace = pattern.replace('%%', '%') % { 'namespace': namespace }
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  assert '%' not in cpp_namespace, \
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         ('Did not manage to fully substitute namespace "%s" into pattern "%s"'
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           % (namespace, pattern))
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return cpp_namespace
159