xref: /openbsd-src/gnu/llvm/clang/include/clang/AST/ASTImporterSharedState.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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