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 15namespace chromeos_dbus_bindings { 16 17namespace { 18 19void AddOpenNamespace(IndentedText *text, const std::string& name) { 20 text->AddLine(base::StringPrintf("namespace %s {", name.c_str())); 21} 22 23void AddCloseNamespace(IndentedText *text, const std::string& name) { 24 text->AddLine(base::StringPrintf("} // namespace %s", name.c_str())); 25} 26 27} // anonymous namespace 28 29NameParser::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 36std::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 42std::string NameParser::MakeFullCppName() const { 43 return MakeFullyQualified(type_name); 44} 45 46std::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 63std::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 68std::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 73std::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 78void 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 88void 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