| //===- PreprocessorTracker.h - Tracks preprocessor activities -*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===--------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// \brief Macro expansions and preprocessor conditional consistency checker. |
| /// |
| //===--------------------------------------------------------------------===// |
| |
| #ifndef MODULARIZE_PREPROCESSOR_TRACKER_H |
| #define MODULARIZE_PREPROCESSOR_TRACKER_H |
| |
| #include "clang/Lex/Preprocessor.h" |
| |
| namespace Modularize { |
| |
| /// \brief Preprocessor tracker for modularize. |
| /// |
| /// The PreprocessorTracker class defines an API for |
| /// checking macro expansions and preprocessor conditional expressions |
| /// in a header file for consistency among one or more compilations of |
| /// the header in a #include scenario. This is for helping a user |
| /// find which macro expansions or conditionals might be problematic with |
| /// respect to using the headers in the modules scenario, because they |
| /// evaluate to different values depending on how or where a header |
| /// is included. |
| /// |
| /// The handlePreprocessorEntry function implementation will register |
| /// a PPCallbacks object in the given Preprocessor object. The calls to |
| /// the callbacks will collect information about the macro expansions |
| /// and preprocessor conditionals encountered, for later analysis and |
| /// reporting of inconsistencies between runs performed by calls to |
| /// the reportInconsistentMacros and reportInconsistentConditionals |
| /// functions respectively. The handlePreprocessorExit informs the |
| /// implementation that a preprocessing session is complete, allowing |
| /// it to do any needed compilation completion activities in the checker. |
| class PreprocessorTracker { |
| public: |
| virtual ~PreprocessorTracker(); |
| |
| // Handle entering a preprocessing session. |
| // (Called after a Preprocessor object is created, but before preprocessing.) |
| virtual void handlePreprocessorEntry(clang::Preprocessor &PP, |
| llvm::StringRef RootHeaderFile) = 0; |
| // Handle exiting a preprocessing session. |
| // (Called after preprocessing is complete, but before the Preprocessor |
| // object is destroyed.) |
| virtual void handlePreprocessorExit() = 0; |
| |
| // Handle include directive. |
| // This function is called every time an include directive is seen by the |
| // preprocessor, for the purpose of later checking for 'extern "" {}' or |
| // "namespace {}" blocks containing #include directives. |
| virtual void handleIncludeDirective(llvm::StringRef DirectivePath, |
| int DirectiveLine, int DirectiveColumn, |
| llvm::StringRef TargetPath) = 0; |
| |
| // Check for include directives within the given source line range. |
| // Report errors if any found. Returns true if no include directives |
| // found in block. |
| virtual bool checkForIncludesInBlock(clang::Preprocessor &PP, |
| clang::SourceRange BlockSourceRange, |
| const char *BlockIdentifierMessage, |
| llvm::raw_ostream &OS) = 0; |
| |
| // Report on inconsistent macro instances. |
| // Returns true if any mismatches. |
| virtual bool reportInconsistentMacros(llvm::raw_ostream &OS) = 0; |
| |
| // Report on inconsistent conditional directive instances. |
| // Returns true if any mismatches. |
| virtual bool reportInconsistentConditionals(llvm::raw_ostream &OS) = 0; |
| |
| // Create instance of PreprocessorTracker. |
| static PreprocessorTracker *create( |
| llvm::SmallVector<std::string, 32> &Headers, |
| bool DoBlockCheckHeaderListOnly); |
| }; |
| |
| } // end namespace Modularize |
| |
| #endif |