• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium OS 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 
5 #include "chromeos-dbus-bindings/name_parser.h"
6 
7 #include <string>
8 
9 #include <base/strings/string_util.h>
10 #include <base/strings/stringprintf.h>
11 #include <brillo/strings/string_utils.h>
12 
13 #include "chromeos-dbus-bindings/indented_text.h"
14 
15 namespace chromeos_dbus_bindings {
16 
17 namespace {
18 
AddOpenNamespace(IndentedText * text,const std::string & name)19 void AddOpenNamespace(IndentedText *text, const std::string& name) {
20   text->AddLine(base::StringPrintf("namespace %s {", name.c_str()));
21 }
22 
AddCloseNamespace(IndentedText * text,const std::string & name)23 void AddCloseNamespace(IndentedText *text, const std::string& name) {
24   text->AddLine(base::StringPrintf("}  // namespace %s", name.c_str()));
25 }
26 
27 }  // anonymous namespace
28 
NameParser(const std::string & name)29 NameParser::NameParser(const std::string& name)
30     : namespaces{brillo::string_utils::Split(name, ".")} {
31   CHECK(!namespaces.empty()) << "Empty name specified";
32   type_name = namespaces.back();
33   namespaces.pop_back();
34 }
35 
MakeFullyQualified(const std::string & name) const36 std::string NameParser::MakeFullyQualified(const std::string& name) const {
37   std::vector<std::string> parts = namespaces;
38   parts.push_back(name);
39   return brillo::string_utils::Join("::", parts);
40 }
41 
MakeFullCppName() const42 std::string NameParser::MakeFullCppName() const {
43   return MakeFullyQualified(type_name);
44 }
45 
MakeVariableName() const46 std::string NameParser::MakeVariableName() const {
47   // Convert CamelCase name to google_style variable name.
48   std::string result;
49   bool last_upper = true;
50   for (char c : type_name) {
51     bool is_upper = isupper(c);
52     if (is_upper) {
53       if (!last_upper)
54         result += '_';
55       c = base::ToLowerASCII(c);
56     }
57     last_upper = is_upper;
58     result.push_back(c);
59   }
60   return result;
61 }
62 
MakeInterfaceName(bool fully_qualified) const63 std::string NameParser::MakeInterfaceName(bool fully_qualified) const {
64   std::string interface_name = type_name + "Interface";
65   return fully_qualified ? MakeFullyQualified(interface_name) : interface_name;
66 }
67 
MakeProxyName(bool fully_qualified) const68 std::string NameParser::MakeProxyName(bool fully_qualified) const {
69   std::string proxy_name = type_name + "Proxy";
70   return fully_qualified ? MakeFullyQualified(proxy_name) : proxy_name;
71 }
72 
MakeAdaptorName(bool fully_qualified) const73 std::string NameParser::MakeAdaptorName(bool fully_qualified) const {
74   std::string adaptor_name = type_name + "Adaptor";
75   return fully_qualified ? MakeFullyQualified(adaptor_name) : adaptor_name;
76 }
77 
AddOpenNamespaces(IndentedText * text,bool add_main_type) const78 void NameParser::AddOpenNamespaces(IndentedText *text,
79                                    bool add_main_type) const {
80   for (const auto& ns : namespaces) {
81     AddOpenNamespace(text, ns);
82   }
83 
84   if (add_main_type)
85     AddOpenNamespace(text, type_name);
86 }
87 
AddCloseNamespaces(IndentedText * text,bool add_main_type) const88 void NameParser::AddCloseNamespaces(IndentedText *text,
89                                     bool add_main_type) const {
90   if (add_main_type)
91     AddCloseNamespace(text, type_name);
92 
93   for (auto it = namespaces.rbegin(); it != namespaces.rend(); ++it) {
94     AddCloseNamespace(text, *it);
95   }
96 }
97 
98 }  // namespace chromeos_dbus_bindings
99