features_cc_generator.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # Copyright 2013 The Chromium Authors. All rights reserved.
  2. # Use of this source code is governed by a BSD-style license that can be
  3. # found in the LICENSE file.
  4. import os.path
  5. from code import Code
  6. import cpp_util
  7. class CCGenerator(object):
  8. def Generate(self, feature_defs, source_file, namespace):
  9. return _Generator(feature_defs, source_file, namespace).Generate()
  10. class _Generator(object):
  11. """A .cc generator for features.
  12. """
  13. def __init__(self, feature_defs, source_file, namespace):
  14. self._feature_defs = feature_defs
  15. self._source_file = source_file
  16. self._source_file_filename, _ = os.path.splitext(source_file)
  17. self._class_name = cpp_util.ClassName(self._source_file_filename)
  18. self._namespace = namespace
  19. def Generate(self):
  20. """Generates a Code object for features.
  21. """
  22. c = Code()
  23. (c.Append(cpp_util.CHROMIUM_LICENSE)
  24. .Append()
  25. .Append(cpp_util.GENERATED_FEATURE_MESSAGE %
  26. cpp_util.ToPosixPath(self._source_file))
  27. .Append()
  28. .Append('#include <string>')
  29. .Append()
  30. .Append('#include "%s.h"' %
  31. cpp_util.ToPosixPath(self._source_file_filename))
  32. .Append()
  33. .Append('#include "base/notreached.h"')
  34. .Append()
  35. .Concat(cpp_util.OpenNamespace(self._namespace))
  36. .Append()
  37. )
  38. # Generate the constructor.
  39. (c.Append('%s::%s() {' % (self._class_name, self._class_name))
  40. .Sblock()
  41. )
  42. for feature in self._feature_defs:
  43. c.Append('features_["%s"] = %s;'
  44. % (feature.name,
  45. cpp_util.FeatureNameToConstantName(feature.name)))
  46. (c.Eblock()
  47. .Append('}')
  48. .Append()
  49. )
  50. # Generate the ToString function.
  51. (c.Append('const char* %s::ToString('
  52. '%s::ID id) const {' % (self._class_name, self._class_name))
  53. .Sblock()
  54. .Append('switch (id) {')
  55. .Sblock()
  56. )
  57. for feature in self._feature_defs:
  58. c.Append('case %s: return "%s";' %
  59. (cpp_util.FeatureNameToConstantName(feature.name), feature.name))
  60. (c.Append('case kUnknown: break;')
  61. .Append('case kEnumBoundary: break;')
  62. .Eblock()
  63. .Append('}')
  64. .Append('NOTREACHED();')
  65. .Append('return "";')
  66. )
  67. (c.Eblock()
  68. .Append('}')
  69. .Append()
  70. )
  71. # Generate the FromString function.
  72. (c.Append('%s::ID %s::FromString('
  73. 'const std::string& id) const {'
  74. % (self._class_name, self._class_name))
  75. .Sblock()
  76. .Append('const auto& it = features_.find(id);' % self._class_name)
  77. .Append('return (it == features_.end()) ? kUnknown : it->second;')
  78. .Eblock()
  79. .Append('}')
  80. .Append()
  81. .Cblock(cpp_util.CloseNamespace(self._namespace))
  82. )
  83. return c