summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucie GĂ©rard <lucie.gerard@qt.io>2019-10-16 12:14:01 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2019-10-18 15:09:11 +0200
commit2eea2525ef7394e57648b553dd8ac9ad57128878 (patch)
tree74de4eca11bb845d755d776c8be9004773adf597
parentffc6fc294a07c6f88e9803381abfb1a9f91577ee (diff)
Add empty preprocessor reading machinery
Change-Id: I4a0ed8f9bf6bdddcdf5e9ae313cf3b1988a66238 Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r--src/linguist/lupdate/clangtoolastreader.cpp10
-rw-r--r--src/linguist/lupdate/clangtoolastreader.h42
2 files changed, 51 insertions, 1 deletions
diff --git a/src/linguist/lupdate/clangtoolastreader.cpp b/src/linguist/lupdate/clangtoolastreader.cpp
index 8b0e57378..7c4861f95 100644
--- a/src/linguist/lupdate/clangtoolastreader.cpp
+++ b/src/linguist/lupdate/clangtoolastreader.cpp
@@ -532,4 +532,14 @@ void LupdateVisitor::handleTrId(const TranslationRelatedStore &store, bool force
m_tor->append(msg);
}
+void LupdateVisitor::processPreprocessorCalls()
+{
+}
+
+void LupdatePPCallbacks::MacroExpands(const clang::Token &macroNameTok,
+ const clang::MacroDefinition &macroDefinition, clang::SourceRange range,
+ const clang::MacroArgs *args)
+{
+}
+
QT_END_NAMESPACE
diff --git a/src/linguist/lupdate/clangtoolastreader.h b/src/linguist/lupdate/clangtoolastreader.h
index 4170c3254..051b94452 100644
--- a/src/linguist/lupdate/clangtoolastreader.h
+++ b/src/linguist/lupdate/clangtoolastreader.h
@@ -47,6 +47,8 @@
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/FrontendActions.h>
#include <clang/Tooling/Tooling.h>
+#include <clang/Lex/PPCallbacks.h>
+#include <clang/Lex/Preprocessor.h>
#if defined(Q_CC_MSVC)
# pragma warning(default: 4100)
@@ -123,8 +125,33 @@ struct TranslationRelatedStore
}
};
+using TranslationStores = std::vector<TranslationRelatedStore>;
+
+class LupdatePPCallbacks : public clang::PPCallbacks
+{
+public:
+ LupdatePPCallbacks(TranslationStores &translationStores, clang::Preprocessor &preprocessor)
+ : m_translationStores(translationStores),
+ m_preprocessor(preprocessor)
+ {}
+
+ ~LupdatePPCallbacks() override
+ {}
+
+ // Overridden callback functions.
+ void MacroExpands(const clang::Token &macroNameTok,
+ const clang::MacroDefinition &macroDefinition, clang::SourceRange range,
+ const clang::MacroArgs *args) override;
+
+private:
+ TranslationStores &m_translationStores;
+ clang::Preprocessor &m_preprocessor;
+};
+
class LupdateVisitor : public clang::RecursiveASTVisitor<LupdateVisitor>
{
+ friend class LupdateASTConsumer;
+
public:
explicit LupdateVisitor(clang::ASTContext *context, Translator *tor)
: m_context(context),
@@ -136,6 +163,7 @@ public:
bool VisitCallExpr(clang::CallExpr *callExpression);
void fillTranslator();
+ void processPreprocessorCalls();
private:
std::vector<QString> rawCommentsForCallExpr(const clang::CallExpr *callExpr) const;
@@ -154,7 +182,8 @@ private:
Translator *m_tor { nullptr };
std::string m_inputFile;
- std::vector<TranslationRelatedStore> m_translationStoresFromAST;
+ TranslationStores m_translationStoresFromAST;
+ TranslationStores m_translationStoresFromPP;
};
class LupdateASTConsumer : public clang::ASTConsumer
@@ -168,11 +197,17 @@ public:
// parsed.
void HandleTranslationUnit(clang::ASTContext &context) override
{
+ m_visitor.processPreprocessorCalls();
bool traverse = m_visitor.TraverseAST(context);
qCDebug(lcClang) << "TraverseAST: " << traverse;
m_visitor.fillTranslator();
}
+ TranslationStores &preprocessorStores()
+ {
+ return m_visitor.m_translationStoresFromPP;
+ }
+
private:
LupdateVisitor m_visitor;
};
@@ -188,6 +223,11 @@ public:
clang::CompilerInstance &compiler, llvm::StringRef /* inFile */) override
{
LupdateASTConsumer *consumer = new LupdateASTConsumer(&compiler.getASTContext(), m_tor);
+ clang::Preprocessor &preprocessor = compiler.getPreprocessor();
+ LupdatePPCallbacks *callbacks = new LupdatePPCallbacks(consumer->preprocessorStores(),
+ preprocessor);
+ preprocessor.addPPCallbacks(std::unique_ptr<clang::PPCallbacks>(callbacks));
+
return std::unique_ptr<clang::ASTConsumer>(consumer);
}