1e5dd7070Spatrick //===- ASTImporterSharedState.h - ASTImporter specific state --*- C++ -*---===// 2e5dd7070Spatrick // 3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information. 5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick // 9e5dd7070Spatrick // This file defines the ASTImporter specific state, which may be shared 10e5dd7070Spatrick // amongst several ASTImporter objects. 11e5dd7070Spatrick // 12e5dd7070Spatrick //===----------------------------------------------------------------------===// 13e5dd7070Spatrick 14e5dd7070Spatrick #ifndef LLVM_CLANG_AST_ASTIMPORTERSHAREDSTATE_H 15e5dd7070Spatrick #define LLVM_CLANG_AST_ASTIMPORTERSHAREDSTATE_H 16e5dd7070Spatrick 17*12c85518Srobert #include "clang/AST/ASTImportError.h" 18e5dd7070Spatrick #include "clang/AST/ASTImporterLookupTable.h" 19e5dd7070Spatrick #include "clang/AST/Decl.h" 20e5dd7070Spatrick #include "llvm/ADT/DenseMap.h" 21*12c85518Srobert #include <optional> 22e5dd7070Spatrick 23e5dd7070Spatrick namespace clang { 24e5dd7070Spatrick 25e5dd7070Spatrick class TranslationUnitDecl; 26e5dd7070Spatrick 27e5dd7070Spatrick /// Importer specific state, which may be shared amongst several ASTImporter 28e5dd7070Spatrick /// objects. 29e5dd7070Spatrick class ASTImporterSharedState { 30e5dd7070Spatrick 31e5dd7070Spatrick /// Pointer to the import specific lookup table. 32e5dd7070Spatrick std::unique_ptr<ASTImporterLookupTable> LookupTable; 33e5dd7070Spatrick 34e5dd7070Spatrick /// Mapping from the already-imported declarations in the "to" 35e5dd7070Spatrick /// context to the error status of the import of that declaration. 36e5dd7070Spatrick /// This map contains only the declarations that were not correctly 37e5dd7070Spatrick /// imported. The same declaration may or may not be included in 38e5dd7070Spatrick /// ImportedFromDecls. This map is updated continuously during imports and 39e5dd7070Spatrick /// never cleared (like ImportedFromDecls). 40*12c85518Srobert llvm::DenseMap<Decl *, ASTImportError> ImportErrors; 41*12c85518Srobert 42*12c85518Srobert /// Set of the newly created declarations. 43*12c85518Srobert llvm::DenseSet<Decl *> NewDecls; 44e5dd7070Spatrick 45e5dd7070Spatrick // FIXME put ImportedFromDecls here! 46e5dd7070Spatrick // And from that point we can better encapsulate the lookup table. 47e5dd7070Spatrick 48e5dd7070Spatrick public: 49e5dd7070Spatrick ASTImporterSharedState() = default; 50e5dd7070Spatrick ASTImporterSharedState(TranslationUnitDecl & ToTU)51e5dd7070Spatrick ASTImporterSharedState(TranslationUnitDecl &ToTU) { 52e5dd7070Spatrick LookupTable = std::make_unique<ASTImporterLookupTable>(ToTU); 53e5dd7070Spatrick } 54e5dd7070Spatrick getLookupTable()55e5dd7070Spatrick ASTImporterLookupTable *getLookupTable() { return LookupTable.get(); } 56e5dd7070Spatrick addDeclToLookup(Decl * D)57e5dd7070Spatrick void addDeclToLookup(Decl *D) { 58e5dd7070Spatrick if (LookupTable) 59e5dd7070Spatrick if (auto *ND = dyn_cast<NamedDecl>(D)) 60e5dd7070Spatrick LookupTable->add(ND); 61e5dd7070Spatrick } 62e5dd7070Spatrick removeDeclFromLookup(Decl * D)63e5dd7070Spatrick void removeDeclFromLookup(Decl *D) { 64e5dd7070Spatrick if (LookupTable) 65e5dd7070Spatrick if (auto *ND = dyn_cast<NamedDecl>(D)) 66e5dd7070Spatrick LookupTable->remove(ND); 67e5dd7070Spatrick } 68e5dd7070Spatrick getImportDeclErrorIfAny(Decl * ToD)69*12c85518Srobert std::optional<ASTImportError> getImportDeclErrorIfAny(Decl *ToD) const { 70e5dd7070Spatrick auto Pos = ImportErrors.find(ToD); 71e5dd7070Spatrick if (Pos != ImportErrors.end()) 72e5dd7070Spatrick return Pos->second; 73e5dd7070Spatrick else 74*12c85518Srobert return std::nullopt; 75e5dd7070Spatrick } 76e5dd7070Spatrick setImportDeclError(Decl * To,ASTImportError Error)77*12c85518Srobert void setImportDeclError(Decl *To, ASTImportError Error) { 78e5dd7070Spatrick ImportErrors[To] = Error; 79e5dd7070Spatrick } 80*12c85518Srobert isNewDecl(const Decl * ToD)81*12c85518Srobert bool isNewDecl(const Decl *ToD) const { return NewDecls.count(ToD); } 82*12c85518Srobert markAsNewDecl(Decl * ToD)83*12c85518Srobert void markAsNewDecl(Decl *ToD) { NewDecls.insert(ToD); } 84e5dd7070Spatrick }; 85e5dd7070Spatrick 86e5dd7070Spatrick } // namespace clang 87e5dd7070Spatrick #endif // LLVM_CLANG_AST_ASTIMPORTERSHAREDSTATE_H 88