123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- ASTImporterLookupTable.h - ASTImporter specific lookup--*- 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
- //
- //===----------------------------------------------------------------------===//
- //
- // This file defines the ASTImporterLookupTable class which implements a
- // lookup procedure for the import mechanism.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_AST_ASTIMPORTERLOOKUPTABLE_H
- #define LLVM_CLANG_AST_ASTIMPORTERLOOKUPTABLE_H
- #include "clang/AST/DeclBase.h" // lookup_result
- #include "clang/AST/DeclarationName.h"
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/ADT/SetVector.h"
- namespace clang {
- class NamedDecl;
- class DeclContext;
- // There are certain cases when normal C/C++ lookup (localUncachedLookup)
- // does not find AST nodes. E.g.:
- // Example 1:
- // template <class T>
- // struct X {
- // friend void foo(); // this is never found in the DC of the TU.
- // };
- // Example 2:
- // // The fwd decl to Foo is not found in the lookupPtr of the DC of the
- // // translation unit decl.
- // // Here we could find the node by doing a traverse throught the list of
- // // the Decls in the DC, but that would not scale.
- // struct A { struct Foo *p; };
- // This is a severe problem because the importer decides if it has to create a
- // new Decl or not based on the lookup results.
- // To overcome these cases we need an importer specific lookup table which
- // holds every node and we are not interested in any C/C++ specific visibility
- // considerations. Simply, we must know if there is an existing Decl in a
- // given DC. Once we found it then we can handle any visibility related tasks.
- class ASTImporterLookupTable {
- // We store a list of declarations for each name.
- // And we collect these lists for each DeclContext.
- // We could have a flat map with (DeclContext, Name) tuple as key, but a two
- // level map seems easier to handle.
- using DeclList = llvm::SmallSetVector<NamedDecl *, 2>;
- using NameMap = llvm::SmallDenseMap<DeclarationName, DeclList, 4>;
- using DCMap = llvm::DenseMap<DeclContext *, NameMap>;
- void add(DeclContext *DC, NamedDecl *ND);
- void remove(DeclContext *DC, NamedDecl *ND);
- DCMap LookupTable;
- public:
- ASTImporterLookupTable(TranslationUnitDecl &TU);
- void add(NamedDecl *ND);
- void remove(NamedDecl *ND);
- // Sometimes a declaration is created first with a temporarily value of decl
- // context (often the translation unit) and later moved to the final context.
- // This happens for declarations that are created before the final declaration
- // context. In such cases the lookup table needs to be updated.
- // (The declaration is in these cases not added to the temporary decl context,
- // only its parent is set.)
- // FIXME: It would be better to not add the declaration to the temporary
- // context at all in the lookup table, but this requires big change in
- // ASTImporter.
- // The function should be called when the old context is definitely different
- // from the new.
- void update(NamedDecl *ND, DeclContext *OldDC);
- // Same as 'update' but allow if 'ND' is not in the table or the old context
- // is the same as the new.
- // FIXME: The old redeclaration context is not handled.
- void updateForced(NamedDecl *ND, DeclContext *OldDC);
- using LookupResult = DeclList;
- LookupResult lookup(DeclContext *DC, DeclarationName Name) const;
- // Check if the `ND` is within the lookup table (with its current name) in
- // context `DC`. This is intended for debug purposes when the DeclContext of a
- // NamedDecl is changed.
- bool contains(DeclContext *DC, NamedDecl *ND) const;
- void dump(DeclContext *DC) const;
- void dump() const;
- };
- } // namespace clang
- #endif // LLVM_CLANG_AST_ASTIMPORTERLOOKUPTABLE_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|