| //===-- CxxModuleHandler.h --------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef liblldb_CxxModuleHandler_h_ |
| #define liblldb_CxxModuleHandler_h_ |
| |
| #include "clang/AST/ASTImporter.h" |
| #include "clang/Sema/Sema.h" |
| #include "llvm/ADT/StringSet.h" |
| |
| namespace lldb_private { |
| |
| /// Handles importing decls into an ASTContext with an attached C++ module. |
| /// |
| /// This class searches a C++ module (which must be attached to the target |
| /// ASTContext) for an equivalent decl to the one that should be imported. |
| /// If the decl that is found in the module is a suitable replacement |
| /// for the decl that should be imported, the module decl will be treated as |
| /// the result of the import process. |
| /// |
| /// If the Decl that should be imported is a template specialization |
| /// that doesn't exist yet in the target ASTContext (e.g. `std::vector<int>`), |
| /// then this class tries to create the template specialization in the target |
| /// ASTContext. This is only possible if the CxxModuleHandler can determine |
| /// that instantiating this template is safe to do, e.g. because the target |
| /// decl is a container class from the STL. |
| class CxxModuleHandler { |
| /// The ASTImporter that should be used to import any Decls which aren't |
| /// directly handled by this class itself. |
| clang::ASTImporter *m_importer = nullptr; |
| |
| /// The Sema instance of the target ASTContext. |
| clang::Sema *m_sema = nullptr; |
| |
| /// List of template names this class currently supports. These are the |
| /// template names inside the 'std' namespace such as 'vector' or 'list'. |
| llvm::StringSet<> m_supported_templates; |
| |
| /// Tries to manually instantiate the given foreign template in the target |
| /// context (designated by m_sema). |
| llvm::Optional<clang::Decl *> tryInstantiateStdTemplate(clang::Decl *d); |
| |
| public: |
| CxxModuleHandler() = default; |
| CxxModuleHandler(clang::ASTImporter &importer, clang::ASTContext *target); |
| |
| /// Attempts to import the given decl into the target ASTContext by |
| /// deserializing it from the 'std' module. This function returns a Decl if a |
| /// Decl has been deserialized from the 'std' module. Otherwise this function |
| /// returns nothing. |
| llvm::Optional<clang::Decl *> Import(clang::Decl *d); |
| |
| /// Returns true iff this instance is capable of importing any declarations |
| /// in the target ASTContext. |
| bool isValid() const { return m_sema != nullptr; } |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // liblldb_CxxModuleHandler_h_ |