From 59ea5758cf6b93485e1ee679861cf11ee80f2dfa Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Thu, 4 Mar 2021 21:14:13 +0100 Subject: [PATCH] Refactor to_string from CXCursor to clanguml::cx::util namespace --- src/cx/type.h | 21 ++++++++-------- src/cx/util.cc | 35 +++++++++++++++++++++++++++ src/cx/util.h | 43 +++++++++++++++++++++++++++++++++ src/uml/class_diagram_visitor.h | 3 +++ 4 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 src/cx/util.cc create mode 100644 src/cx/util.h diff --git a/src/cx/type.h b/src/cx/type.h index 67882b2a..4ff39f2f 100644 --- a/src/cx/type.h +++ b/src/cx/type.h @@ -21,22 +21,14 @@ #include #include +#include "cx/util.h" #include "uml/class_diagram_model.h" #include "util/util.h" namespace clanguml { namespace cx { -namespace detail { -std::string to_string(CXString &&cxs) -{ - std::string r{clang_getCString(cxs)}; - clang_disposeString(cxs); - return r; -} -} - -using detail::to_string; +using util::to_string; class type { public: @@ -159,7 +151,9 @@ public: bool is_relationship() const { return is_pointer() || is_record() || is_reference() || !is_pod() || - is_array() || (spelling().find("std::array") == 0); + is_array() || + (spelling().find("std::array") == + 0 /* There must be a better way... */); } type element_type() const { return clang_getElementType(m_type); } @@ -205,6 +199,11 @@ public: return clang_Type_getCXXRefQualifier(m_type); } + /** + * @brief Remove all qualifiers from field declaration. + * + * @return Unqualified identifier. + */ std::string unqualified() const { auto toks = clanguml::util::split(spelling(), " "); diff --git a/src/cx/util.cc b/src/cx/util.cc new file mode 100644 index 00000000..5cb3f1f5 --- /dev/null +++ b/src/cx/util.cc @@ -0,0 +1,35 @@ +/** + * src/cx/util.cc + * + * Copyright (c) 2021 Bartek Kryza + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cx/util.h" + +#include + +namespace clanguml { +namespace cx { +namespace util { + +std::string to_string(CXString &&cxs) +{ + std::string r{clang_getCString(cxs)}; + clang_disposeString(cxs); + return r; +} +} // namespace util +} // namespace cx +} // namespace clanguml diff --git a/src/cx/util.h b/src/cx/util.h new file mode 100644 index 00000000..0bee03cf --- /dev/null +++ b/src/cx/util.h @@ -0,0 +1,43 @@ +/** + * src/cx/util.h + * + * Copyright (c) 2021 Bartek Kryza + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#pragma once + +#include +#include + +#include + +namespace clanguml { +namespace cx { +namespace util { + +/** + * @brief Convert CXString to std::string + * + * This function creates a new std::string from a CXString + * and releases the CXString. + * + * @param cxs libclang string instance + * + * @return std::string instance + */ +std::string to_string(CXString &&cxs); + +} // namespace util +} // namespace cx +} // namespace clanguml diff --git a/src/uml/class_diagram_visitor.h b/src/uml/class_diagram_visitor.h index fe47904b..07f89a25 100644 --- a/src/uml/class_diagram_visitor.h +++ b/src/uml/class_diagram_visitor.h @@ -140,6 +140,9 @@ cx::type get_underlying_type(cx::type t) if (name.find("std::map") == 0) { return get_underlying_type(template_arguments[1]); } + if (name.find("std::pair") == 0) { + return get_underlying_type(template_arguments[1]); + } return t; }