From 6a6202c55549f703a16f4d500e07b682d5c31c6d Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Wed, 2 Jul 2025 16:02:13 -0700 Subject: [PATCH 1/3] Clang format --- src/lib/fcitx/addoninstance.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/fcitx/addoninstance.h b/src/lib/fcitx/addoninstance.h index 19b8779af..919c4eb0c 100644 --- a/src/lib/fcitx/addoninstance.h +++ b/src/lib/fcitx/addoninstance.h @@ -209,7 +209,7 @@ class FCITXCORE_EXPORT AddonInstance { #define FCITX_ADDON_FACTORY_V2(AddonName, ClassName) \ extern "C" { \ FCITX_ADDON_EXPORT ::fcitx::AddonFactory * \ - fcitx_addon_factory_instance_##AddonName() { \ + fcitx_addon_factory_instance_##AddonName() { \ static ClassName factory; \ return &factory; \ } \ From c47b8e0f4cc5b3d1cdd2b7f3dbf6681c9f0f002a Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Wed, 2 Jul 2025 16:02:21 -0700 Subject: [PATCH 2/3] Migrate log to std::osyncstream and use std::source_location --- src/lib/fcitx-utils/log.cpp | 9 ++-- src/lib/fcitx-utils/log.h | 75 ++++++++++++++++++-------------- src/lib/fcitx-utils/metastring.h | 9 ++++ 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/src/lib/fcitx-utils/log.cpp b/src/lib/fcitx-utils/log.cpp index 6e9d18abd..e36ab07e4 100644 --- a/src/lib/fcitx-utils/log.cpp +++ b/src/lib/fcitx-utils/log.cpp @@ -9,12 +9,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -51,7 +51,7 @@ class LogRegistry { void registerCategory(LogCategory &category) { std::lock_guard lock(mutex_); - if (!categories_.count(&category)) { + if (!categories_.contains(&category)) { categories_.insert(&category); applyRule(&category); } @@ -218,7 +218,7 @@ LogMessageBuilder::LogMessageBuilder(std::ostream &out, LogLevel l, auto now = std::chrono::time_point_cast( std::chrono::system_clock::now()); #if __cpp_lib_chrono >= 201907L - auto current_zone = std::chrono::current_zone(); + const auto *current_zone = std::chrono::current_zone(); std::chrono::zoned_time zoned_time{current_zone, now}; auto timeString = std::format("{:%F %T}", zoned_time); @@ -233,5 +233,6 @@ LogMessageBuilder::LogMessageBuilder(std::ostream &out, LogLevel l, out_ << filename << ":" << lineNumber << "] "; } -LogMessageBuilder::~LogMessageBuilder() { out_ << std::endl; } +LogMessageBuilder::~LogMessageBuilder() { out_ << '\n'; } + } // namespace fcitx diff --git a/src/lib/fcitx-utils/log.h b/src/lib/fcitx-utils/log.h index 41f0ffc9f..bf24db871 100644 --- a/src/lib/fcitx-utils/log.h +++ b/src/lib/fcitx-utils/log.h @@ -32,7 +32,9 @@ #include #include #include +#include // IWYU pragma: keep #include +#include namespace fcitx { @@ -110,12 +112,12 @@ class FCITXUTILS_EXPORT LogMessageBuilder { LogMessageBuilder &self() { return *this; } - inline LogMessageBuilder &operator<<(const std::string &s) { + LogMessageBuilder &operator<<(const std::string &s) { *this << s.c_str(); return *this; } - inline LogMessageBuilder &operator<<(const Key &key) { + LogMessageBuilder &operator<<(const Key &key) { out_ << "Key(" << key.toString() << " states=" << key.states().toInteger() << ")"; return *this; @@ -143,7 +145,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { FCITX_SIMPLE_LOG(T) template - inline LogMessageBuilder &operator<<(const std::optional &opt) { + LogMessageBuilder &operator<<(const std::optional &opt) { *this << "optional(has_value=" << opt.has_value() << " "; if (opt.has_value()) { *this << *opt; @@ -153,13 +155,13 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::unique_ptr &ptr) { + LogMessageBuilder &operator<<(const std::unique_ptr &ptr) { *this << "unique_ptr(" << ptr.get() << ")"; return *this; } template - inline LogMessageBuilder &operator<<(const std::vector &vec) { + LogMessageBuilder &operator<<(const std::vector &vec) { *this << "["; printRange(vec.begin(), vec.end()); *this << "]"; @@ -167,7 +169,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::span &vec) { + LogMessageBuilder &operator<<(const std::span &vec) { *this << "span["; printRange(vec.begin(), vec.end()); *this << "]"; @@ -175,7 +177,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::list &lst) { + LogMessageBuilder &operator<<(const std::list &lst) { *this << "list["; printRange(lst.begin(), lst.end()); *this << "]"; @@ -183,13 +185,13 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::pair &pair) { + LogMessageBuilder &operator<<(const std::pair &pair) { *this << "(" << pair.first << ", " << pair.second << ")"; return *this; } template - inline LogMessageBuilder &operator<<(const std::tuple &tuple) { + LogMessageBuilder &operator<<(const std::tuple &tuple) { typename MakeSequence::type a; *this << "("; printWithIndices(a, tuple); @@ -198,7 +200,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::unordered_map &vec) { + LogMessageBuilder &operator<<(const std::unordered_map &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -206,7 +208,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::unordered_set &vec) { + LogMessageBuilder &operator<<(const std::unordered_set &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -214,7 +216,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::map &vec) { + LogMessageBuilder &operator<<(const std::map &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -222,7 +224,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::set &vec) { + LogMessageBuilder &operator<<(const std::set &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -230,7 +232,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::multimap &vec) { + LogMessageBuilder &operator<<(const std::multimap &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -238,7 +240,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder &operator<<(const std::multiset &vec) { + LogMessageBuilder &operator<<(const std::multiset &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -246,8 +248,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder & - operator<<(const std::unordered_multimap &vec) { + LogMessageBuilder &operator<<(const std::unordered_multimap &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -255,8 +256,7 @@ class FCITXUTILS_EXPORT LogMessageBuilder { } template - inline LogMessageBuilder & - operator<<(const std::unordered_multiset &vec) { + LogMessageBuilder &operator<<(const std::unordered_multiset &vec) { *this << "{"; printRange(vec.begin(), vec.end()); *this << "}"; @@ -288,23 +288,33 @@ class FCITXUTILS_EXPORT LogMessageBuilder { std::ostream &out_; }; -} // namespace fcitx -#ifdef FCITX_USE_NO_METASTRING_FILENAME -#define FCITX_LOG_FILENAME_WRAP ::fcitx::fs::baseName(__FILE__).data() -#else -#define FCITX_LOG_FILENAME_WRAP \ - fcitx::MetaStringBasenameType::data() -#endif +template +class LogMessageBuilderWrapper { +public: + LogMessageBuilderWrapper(LogLevel l) + : out_(Log::logStream()), + builder_(out_, l, MetaStringFileName::data(), N) {} + + LogMessageBuilder &self() { return builder_; } + +private: + std::osyncstream out_; + LogMessageBuilder builder_; +}; + +} // namespace fcitx +// Use meta string for file name to avoid having full path in binary. #define FCITX_LOGC_IF(CATEGORY, LEVEL, CONDITION) \ for (bool fcitxLogEnabled = \ (CONDITION) && CATEGORY().fatalWrapper(::fcitx::LogLevel::LEVEL); \ fcitxLogEnabled; \ fcitxLogEnabled = CATEGORY().fatalWrapper2(::fcitx::LogLevel::LEVEL)) \ - ::fcitx::LogMessageBuilder(::fcitx::Log::logStream(), \ - ::fcitx::LogLevel::LEVEL, \ - FCITX_LOG_FILENAME_WRAP, __LINE__) \ + ::fcitx::LogMessageBuilderWrapper< \ + fcitx::MetaStringBasenameType, \ + std::source_location::current().line()>(::fcitx::LogLevel::LEVEL) \ .self() #define FCITX_LOGC(CATEGORY, LEVEL) \ @@ -312,9 +322,10 @@ class FCITXUTILS_EXPORT LogMessageBuilder { CATEGORY().fatalWrapper(::fcitx::LogLevel::LEVEL); \ fcitxLogEnabled; \ fcitxLogEnabled = CATEGORY().fatalWrapper2(::fcitx::LogLevel::LEVEL)) \ - ::fcitx::LogMessageBuilder(::fcitx::Log::logStream(), \ - ::fcitx::LogLevel::LEVEL, \ - FCITX_LOG_FILENAME_WRAP, __LINE__) \ + ::fcitx::LogMessageBuilderWrapper< \ + fcitx::MetaStringBasenameType, \ + std::source_location::current().line()>(::fcitx::LogLevel::LEVEL) \ .self() #define FCITX_LOG(LEVEL) FCITX_LOGC(::fcitx::Log::defaultCategory, LEVEL) diff --git a/src/lib/fcitx-utils/metastring.h b/src/lib/fcitx-utils/metastring.h index e13131b69..b6aa6a435 100644 --- a/src/lib/fcitx-utils/metastring.h +++ b/src/lib/fcitx-utils/metastring.h @@ -13,6 +13,7 @@ /// \brief Static string based on template argument. #include +#include namespace fcitx { @@ -40,6 +41,14 @@ constexpr char __getChar(char const (&str)[M]) noexcept { return '\0'; } +template +constexpr char __getChar(std::string_view str) noexcept { + if (N < str.size()) { + return str[N]; + } + return '\0'; +} + template struct MetaStringCombine; From 66ee610a6224032f16aab90f370774b362379509 Mon Sep 17 00:00:00 2001 From: Weng Xuetian Date: Thu, 3 Jul 2025 10:23:57 -0700 Subject: [PATCH 3/3] Enable -fexperimental-library on Windows CI --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index fc54cd03f..a48cb01dd 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -110,7 +110,7 @@ jobs: with: path: fcitx5 cmake-option: >- - -DENABLE_DBUS=Off -DENABLE_X11=Off -DENABLE_WAYLAND=Off -DENABLE_ENCHANT=Off -DENABLE_SERVER=Off -DENABLE_XDGAUTOSTART=Off -DENABLE_LIBUUID=Off -DENABLE_KEYBOARD=Off + -DENABLE_DBUS=Off -DENABLE_X11=Off -DENABLE_WAYLAND=Off -DENABLE_ENCHANT=Off -DENABLE_SERVER=Off -DENABLE_XDGAUTOSTART=Off -DENABLE_LIBUUID=Off -DENABLE_KEYBOARD=Off -DCMAKE_CXX_FLAGS=-fexperimental-library shell: pwsh - name: Test