From 47703e06005493b8aa6720519464b174488a107d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucie=20G=C3=A9rard?= Date: Thu, 17 Oct 2019 15:10:01 +0200 Subject: Add functionalities to store macro information at PP level Change-Id: I702953b30045f9f0af4533aa1dea06b7b3c24c4c Reviewed-by: Karsten Heimrich --- src/linguist/lupdate/clangtoolastreader.cpp | 85 ++++++++++++++++++++++++++++- src/linguist/lupdate/clangtoolastreader.h | 3 + 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/linguist/lupdate/clangtoolastreader.cpp b/src/linguist/lupdate/clangtoolastreader.cpp index a6860b928..f9e23284b 100644 --- a/src/linguist/lupdate/clangtoolastreader.cpp +++ b/src/linguist/lupdate/clangtoolastreader.cpp @@ -29,6 +29,9 @@ #include +#include +#include + QT_BEGIN_NAMESPACE namespace LupdatePrivate @@ -540,9 +543,89 @@ void LupdatePPCallbacks::MacroExpands(const clang::Token ¯oNameTok, const clang::MacroDefinition ¯oDefinition, clang::SourceRange range, const clang::MacroArgs *args) { - llvm::StringRef fileName = m_preprocessor.getSourceManager().getFilename(range.getBegin()); + if (!args) + return; + const auto &sm = m_preprocessor.getSourceManager(); + llvm::StringRef fileName = sm.getFilename(range.getBegin()); if (fileName != m_inputFile) return; + + const QString funcName = QString::fromStdString(m_preprocessor.getSpelling(macroNameTok)); + qCDebug(lcClang) << "func Name " << funcName; + if (!funcName.contains(QStringLiteral("NOOP")) + && !funcName.contains(QStringLiteral("Q_DECLARE_TR_FUNCTIONS"))) { + return; + } + + TranslationRelatedStore store; + store.callType = QStringLiteral("MacroExpands"); + store.funcName = funcName; + store.lupdateLocationFile = QString::fromStdString(fileName); + store.lupdateLocationLine = sm.getExpansionLineNumber(range.getBegin()); + store.locationCol = sm.getExpansionColumnNumber(range.getBegin()); + store.callLocation = range.getBegin(); + + std::vector arguments(args->getNumMacroArguments()); + for (unsigned i = 0; i < args->getNumMacroArguments(); i++) { + auto preExpArguments = const_cast(args)->getPreExpArgument(i, + m_preprocessor); + QString temp; + for (const auto &preExpArgument : preExpArguments) { + const auto kind = preExpArgument.getKind(); + if (kind == clang::tok::TokenKind::identifier) + temp = QString::fromStdString(m_preprocessor.getSpelling(preExpArgument)); + else if (clang::tok::isStringLiteral(kind)) + temp += LupdatePrivate::cleanQuote(m_preprocessor.getSpelling(preExpArgument)); + } + arguments[i] = temp; + } + storeMacroArguments(arguments, &store); + if (store.isValid()) + m_translationStores.push_back(store); +} + +void LupdatePPCallbacks::storeMacroArguments(const std::vector &args, + TranslationRelatedStore *store) +{ + switch (trFunctionAliasManager.trFunctionByName(store->funcName)) { + // only one argument: the context with no " + case TrFunctionAliasManager::Function_Q_DECLARE_TR_FUNCTIONS: + if (args.size() != 1) + break; + store->contextArg = args[0]; + break; + // only one argument: the source + case TrFunctionAliasManager::Function_QT_TR_N_NOOP: + Q_FALLTHROUGH(); + case TrFunctionAliasManager::Function_QT_TR_NOOP: + case TrFunctionAliasManager::Function_QT_TR_NOOP_UTF8: + if (args.size() != 1) + break; + store->lupdateSource = args[0]; + break; + // two arguments: the context and the source + case TrFunctionAliasManager::Function_QT_TRANSLATE_N_NOOP: + case TrFunctionAliasManager::Function_QT_TRANSLATE_N_NOOP3: + Q_FALLTHROUGH(); + case TrFunctionAliasManager::Function_QT_TRANSLATE_NOOP: + case TrFunctionAliasManager::Function_QT_TRANSLATE_NOOP_UTF8: + case TrFunctionAliasManager::Function_QT_TRANSLATE_NOOP3: + case TrFunctionAliasManager::Function_QT_TRANSLATE_NOOP3_UTF8: + if (args.size() != 2) + break; + store->contextArg = args[0]; + store->lupdateSource = args[1]; + break; + // only one argument (?) the message Id + case TrFunctionAliasManager::Function_QT_TRID_N_NOOP: + Q_FALLTHROUGH(); + case TrFunctionAliasManager::Function_qtTrId: + case TrFunctionAliasManager::Function_QT_TRID_NOOP: + if (args.size() != 1) + break; + store->lupdateId = args[0]; + break; + } } QT_END_NAMESPACE diff --git a/src/linguist/lupdate/clangtoolastreader.h b/src/linguist/lupdate/clangtoolastreader.h index d2eeda69e..40a5c2f47 100644 --- a/src/linguist/lupdate/clangtoolastreader.h +++ b/src/linguist/lupdate/clangtoolastreader.h @@ -96,6 +96,7 @@ struct TranslationRelatedStore QString lupdateComment; QString lupdateExtraComment; QString lupdatePlural; + clang::SourceLocation callLocation; bool isValid() const { @@ -147,6 +148,8 @@ public: const clang::MacroArgs *args) override; private: + void storeMacroArguments(const std::vector &args, TranslationRelatedStore *store); + TranslationStores &m_translationStores; clang::Preprocessor &m_preprocessor; std::string m_inputFile; -- cgit v1.2.3