From b802eaee3d578dd1012d4c76d03ee75beec715ee Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sun, 22 Jan 2023 15:49:12 +0100 Subject: [PATCH] Fixed relative lambda names in MSVC --- .../visitor/translation_unit_visitor.cc | 15 ++++++++++---- src/config/config.h | 12 ++++++++++- src/config/yaml_emitters.cc | 18 +++++++++++++++++ src/decorators/decorators.cc | 2 +- src/main.cc | 5 +++-- tests/test_util.cc | 20 +++++++++++++------ 6 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/class_diagram/visitor/translation_unit_visitor.cc b/src/class_diagram/visitor/translation_unit_visitor.cc index 129cbd44..0fb23d60 100644 --- a/src/class_diagram/visitor/translation_unit_visitor.cc +++ b/src/class_diagram/visitor/translation_unit_visitor.cc @@ -1143,20 +1143,27 @@ void translation_unit_visitor::process_function_parameter( void translation_unit_visitor::ensure_lambda_type_is_relative( std::string ¶meter_type) const { - std::string lambda_prefix{"(lambda at /"}; +#ifdef _MSC_VER + auto root_name = fmt::format( + "{}\\", std::filesystem::current_path().root_name().string()); +#else + auto root_name = "/"; +#endif + std::string lambda_prefix{fmt::format("(lambda at {}", root_name)}; while (parameter_type.find(lambda_prefix) != std::string::npos) { auto lambda_begin = parameter_type.find(lambda_prefix); - auto absolute_lambda_path_end = parameter_type.find(':', lambda_begin); + auto absolute_lambda_path_end = + parameter_type.find(':', lambda_begin + lambda_prefix.size()); auto absolute_lambda_path = parameter_type.substr(lambda_begin + lambda_prefix.size() - 1, absolute_lambda_path_end - (lambda_begin + lambda_prefix.size() - 1)); - auto relative_lambda_path = std::filesystem::relative( + auto relative_lambda_path = util::path_to_url(std::filesystem::relative( absolute_lambda_path, config().relative_to()) - .string(); + .string()); parameter_type = fmt::format("{}(lambda at {}{}", parameter_type.substr(0, lambda_begin), relative_lambda_path, diff --git a/src/config/config.h b/src/config/config.h index 893f511c..79868b2e 100644 --- a/src/config/config.h +++ b/src/config/config.h @@ -255,6 +255,13 @@ YAML::Emitter &operator<<(YAML::Emitter &out, const package_diagram &c); YAML::Emitter &operator<<(YAML::Emitter &out, const layout_hint &c); +#ifdef _MSC_VER +YAML::Emitter &operator<<(YAML::Emitter &out, const std::filesystem::path &p); + +YAML::Emitter &operator<<( + YAML::Emitter &out, const std::vector &p); +#endif + YAML::Emitter &operator<<(YAML::Emitter &out, const source_location &sc); template @@ -262,7 +269,10 @@ YAML::Emitter &operator<<(YAML::Emitter &out, const option &o) { if (o.has_value) { out << YAML::Key << o.name; - out << YAML::Value << o.value; + if constexpr (std::is_same_v) + out << YAML::Value << o.value.string(); + else + out << YAML::Value << o.value; } return out; } diff --git a/src/config/yaml_emitters.cc b/src/config/yaml_emitters.cc index 8737a6ee..e1147bc7 100644 --- a/src/config/yaml_emitters.cc +++ b/src/config/yaml_emitters.cc @@ -138,6 +138,24 @@ YAML::Emitter &operator<<(YAML::Emitter &out, const comment_parser_t &cp) return out; } +#ifdef _MSC_VER +YAML::Emitter &operator<<(YAML::Emitter &out, const std::filesystem::path &p) +{ + out << p.string(); + return out; +} + +YAML::Emitter &operator<<( + YAML::Emitter &out, const std::vector &paths) +{ + out << YAML::BeginSeq; + for (const auto &p : paths) + out << p; + out << YAML::EndSeq; + return out; +} +#endif + YAML::Emitter &operator<<(YAML::Emitter &out, const layout_hint &c) { out << YAML::BeginMap; diff --git a/src/decorators/decorators.cc b/src/decorators/decorators.cc index 8e062353..d113b67e 100644 --- a/src/decorators/decorators.cc +++ b/src/decorators/decorators.cc @@ -62,7 +62,7 @@ decorator_toks decorator::tokenize(const std::string &label, std::string_view c) decorator_toks res; res.label = label; size_t pos{}; - const auto *it = c.begin(); + std::string_view::const_iterator it = c.begin(); std::advance(it, label.size()); if (*it == ':') { diff --git a/src/main.cc b/src/main.cc index 4fc101ce..a8e130be 100644 --- a/src/main.cc +++ b/src/main.cc @@ -264,11 +264,12 @@ int main(int argc, const char *argv[]) // if (compilation_database_dir) { config.compilation_database_dir.set( - util::ensure_path_is_absolute(compilation_database_dir.value())); + util::ensure_path_is_absolute(compilation_database_dir.value()) + .string()); } if (output_directory) { config.output_directory.set( - util::ensure_path_is_absolute(output_directory.value())); + util::ensure_path_is_absolute(output_directory.value()).string()); } LOG_INFO("Loading compilation database from {} directory", diff --git a/tests/test_util.cc b/tests/test_util.cc index be4bb2cd..b4860c9f 100644 --- a/tests/test_util.cc +++ b/tests/test_util.cc @@ -232,12 +232,20 @@ TEST_CASE("Test ensure_path_is_absolute", "[unit-test]") { using namespace clanguml::util; - CHECK(ensure_path_is_absolute("a/b/c", "/tmp").string() == "/tmp/a/b/c"); - CHECK(ensure_path_is_absolute("/a/b/c", "/tmp").string() == "/a/b/c"); - CHECK(ensure_path_is_absolute("", "/tmp").string() == "/tmp/"); - CHECK(ensure_path_is_absolute(".", "/tmp").string() == "/tmp/"); - CHECK(ensure_path_is_absolute("..", "/tmp").string() == "/"); - CHECK(ensure_path_is_absolute("/", "/tmp").string() == "/"); + using std::filesystem::path; + + CHECK(ensure_path_is_absolute("a/b/c", "/tmp").string() == + path{"/tmp/a/b/c"}.make_preferred()); + CHECK(ensure_path_is_absolute("/a/b/c", "/tmp").string() == + path{"/a/b/c"}.make_preferred()); + CHECK(ensure_path_is_absolute("", "/tmp").string() == + path{"/tmp/"}.make_preferred()); + CHECK(ensure_path_is_absolute(".", "/tmp").string() == + path{"/tmp/"}.make_preferred()); + CHECK(ensure_path_is_absolute("..", "/tmp").string() == + path{"/"}.make_preferred()); + CHECK(ensure_path_is_absolute("/", "/tmp").string() == + path{"/"}.make_preferred()); } TEST_CASE("Test hash_seed", "[unit-test]")