summaryrefslogtreecommitdiffstats
path: root/compilerplugins/clang/pluginhandler.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/pluginhandler.hxx')
-rw-r--r--compilerplugins/clang/pluginhandler.hxx110
1 files changed, 110 insertions, 0 deletions
diff --git a/compilerplugins/clang/pluginhandler.hxx b/compilerplugins/clang/pluginhandler.hxx
new file mode 100644
index 000000000..54ab613b3
--- /dev/null
+++ b/compilerplugins/clang/pluginhandler.hxx
@@ -0,0 +1,110 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * Based on LLVM/Clang.
+ *
+ * This file is distributed under the University of Illinois Open Source
+ * License. See LICENSE.TXT for details.
+ *
+ */
+
+#ifndef PLUGINHANDLER_H
+#define PLUGINHANDLER_H
+
+#include <cstddef>
+#include <functional>
+#include <memory>
+#include <set>
+#include <unordered_map>
+
+#include <clang/AST/ASTConsumer.h>
+#include <clang/Frontend/CompilerInstance.h>
+#include <clang/Frontend/FrontendAction.h>
+#include <clang/Rewrite/Core/Rewriter.h>
+
+using namespace clang;
+
+namespace std {
+
+template<> struct hash<::clang::SourceLocation> {
+ size_t operator ()(::clang::SourceLocation loc) const
+ { return loc.getRawEncoding(); }
+};
+
+}
+
+namespace loplugin
+{
+
+class Plugin;
+struct InstantiationData;
+
+// Used internally by PluginHandler::isAllRelevantCodeDefined and its (free) helper functions:
+typedef llvm::DenseMap<const CXXRecordDecl*, bool> RecordCompleteMap;
+
+/**
+ Class that manages all LO modules.
+*/
+class PluginHandler
+ : public ASTConsumer
+{
+public:
+ PluginHandler( CompilerInstance& compiler, const std::vector< std::string >& args );
+ virtual ~PluginHandler();
+ virtual void HandleTranslationUnit( ASTContext& context ) override;
+ static void registerPlugin( Plugin* (*create)( const InstantiationData& ), const char* optionName,
+ bool isPPCallback, bool isSharedPlugin, bool byDefault );
+ DiagnosticBuilder report( DiagnosticsEngine::Level level, const char * plugin, StringRef message,
+ CompilerInstance& compiler, SourceLocation loc = SourceLocation());
+ bool ignoreLocation(SourceLocation loc);
+ bool isDebugMode() const { return debugMode; }
+ static bool isUnitTestMode();
+ // If we overlap with a previous area we modified, we cannot perform this change
+ // without corrupting the source
+ bool checkOverlap(SourceRange range);
+ void addSourceModification(SourceRange range);
+ StringRef const& getMainFileName() const { return mainFileName; }
+
+ // Is all code that could see `decl` defined in this TU?
+ bool isAllRelevantCodeDefined(NamedDecl const * decl);
+
+private:
+ void handleOption( const std::string& option );
+ void createPlugins( std::set< std::string > rewriters );
+ DiagnosticBuilder report( DiagnosticsEngine::Level level, StringRef message, SourceLocation loc = SourceLocation());
+ bool checkIgnoreLocation(SourceLocation loc);
+ CompilerInstance& compiler;
+ StringRef const mainFileName;
+ std::unordered_map<SourceLocation, bool> ignored_;
+ Rewriter rewriter;
+ std::string scope;
+ std::string warningsOnly;
+ bool warningsAsErrors;
+ bool debugMode = false;
+ std::vector<std::pair<char const*, char const*>> mvModifiedRanges;
+
+ // Used internally by isAllRelevantCodeDefined:
+ RecordCompleteMap RecordsComplete_;
+ RecordCompleteMap MNCComplete_;
+};
+
+/**
+ The Clang plugin class, just forwards to PluginHandler.
+*/
+class LibreOfficeAction
+ : public PluginASTAction
+{
+public:
+ virtual std::unique_ptr<ASTConsumer> CreateASTConsumer( CompilerInstance& Compiler, StringRef InFile );
+
+ virtual bool ParseArgs( const CompilerInstance& CI, const std::vector< std::string >& args );
+private:
+ std::vector< std::string > _args;
+};
+
+}
+
+#endif // COMPILEPLUGIN_H
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */