clang 19.0.0git
ASTCommon.h
Go to the documentation of this file.
1//===- ASTCommon.h - Common stuff for ASTReader/ASTWriter -*- C++ -*-=========//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines common functions that both ASTReader and ASTWriter use.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_LIB_SERIALIZATION_ASTCOMMON_H
14#define LLVM_CLANG_LIB_SERIALIZATION_ASTCOMMON_H
15
19
20namespace clang {
21
22namespace serialization {
23
45};
46
47TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT);
48
49unsigned ComputeHash(Selector Sel);
50
51/// Retrieve the "definitive" declaration that provides all of the
52/// visible entries for the given declaration context, if there is one.
53///
54/// The "definitive" declaration is the only place where we need to look to
55/// find information about the declarations within the given declaration
56/// context. For example, C++ and Objective-C classes, C structs/unions, and
57/// Objective-C protocols, categories, and extensions are all defined in a
58/// single place in the source code, so they have definitive declarations
59/// associated with them. C++ namespaces, on the other hand, can have
60/// multiple definitions.
62
63/// Determine whether the given declaration kind is redeclarable.
64bool isRedeclarableDeclKind(unsigned Kind);
65
66/// Determine whether the given declaration needs an anonymous
67/// declaration number.
69
70/// Visit each declaration within \c DC that needs an anonymous
71/// declaration number and call \p Visit with the declaration and its number.
72template<typename Fn> void numberAnonymousDeclsWithin(const DeclContext *DC,
73 Fn Visit) {
74 unsigned Index = 0;
75 for (Decl *LexicalD : DC->decls()) {
76 // For a friend decl, we care about the declaration within it, if any.
77 if (auto *FD = dyn_cast<FriendDecl>(LexicalD))
78 LexicalD = FD->getFriendDecl();
79
80 auto *ND = dyn_cast_or_null<NamedDecl>(LexicalD);
81 if (!ND || !needsAnonymousDeclarationNumber(ND))
82 continue;
83
84 Visit(ND, Index++);
85 }
86}
87
88/// Determine whether the given declaration will be included in the per-module
89/// initializer if it needs to be eagerly handed to the AST consumer. If so, we
90/// should not hand it to the consumer when deserializing it, nor include it in
91/// the list of eagerly deserialized declarations.
92inline bool isPartOfPerModuleInitializer(const Decl *D) {
93 if (isa<ImportDecl>(D))
94 return true;
95 // Template instantiations are notionally in an "instantiation unit" rather
96 // than in any particular translation unit, so they need not be part of any
97 // particular (sub)module's per-module initializer.
98 if (auto *VD = dyn_cast<VarDecl>(D))
99 return !isTemplateInstantiation(VD->getTemplateSpecializationKind());
100 return false;
101}
102
103} // namespace serialization
104
105} // namespace clang
106
107#endif
Defines the clang::ASTContext interface.
This class is used for builtin types like 'int'.
Definition: Type.h:2981
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition: DeclBase.h:2322
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
This represents a decl that may have a name.
Definition: Decl.h:249
Smart pointer class that efficiently represents Objective-C method names.
bool isRedeclarableDeclKind(unsigned Kind)
Determine whether the given declaration kind is redeclarable.
Definition: ASTCommon.cpp:355
TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT)
Definition: ASTCommon.cpp:26
bool needsAnonymousDeclarationNumber(const NamedDecl *D)
Determine whether the given declaration needs an anonymous declaration number.
Definition: ASTCommon.cpp:459
void numberAnonymousDeclsWithin(const DeclContext *DC, Fn Visit)
Visit each declaration within DC that needs an anonymous declaration number and call Visit with the d...
Definition: ASTCommon.h:72
const DeclContext * getDefinitiveDeclContext(const DeclContext *DC)
Retrieve the "definitive" declaration that provides all of the visible entries for the given declarat...
Definition: ASTCommon.cpp:296
unsigned ComputeHash(Selector Sel)
Definition: ASTCommon.cpp:284
bool isPartOfPerModuleInitializer(const Decl *D)
Determine whether the given declaration will be included in the per-module initializer if it needs to...
Definition: ASTCommon.h:92
@ UPD_CXX_INSTANTIATED_DEFAULT_MEMBER_INITIALIZER
Definition: ASTCommon.h:33
@ UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION
Definition: ASTCommon.h:26
@ UPD_DECL_MARKED_OPENMP_DECLARETARGET
Definition: ASTCommon.h:42
@ UPD_CXX_POINT_OF_INSTANTIATION
Definition: ASTCommon.h:30
@ UPD_CXX_RESOLVED_EXCEPTION_SPEC
Definition: ASTCommon.h:35
@ UPD_CXX_ADDED_FUNCTION_DEFINITION
Definition: ASTCommon.h:28
@ UPD_DECL_MARKED_OPENMP_THREADPRIVATE
Definition: ASTCommon.h:40
@ UPD_CXX_INSTANTIATED_DEFAULT_ARGUMENT
Definition: ASTCommon.h:32
@ UPD_DECL_MARKED_OPENMP_ALLOCATE
Definition: ASTCommon.h:41
@ UPD_CXX_ADDED_ANONYMOUS_NAMESPACE
Definition: ASTCommon.h:27
@ UPD_CXX_INSTANTIATED_CLASS_DEFINITION
Definition: ASTCommon.h:31
The JSON file list parser is used to communicate input to InstallAPI.
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition: Specifiers.h:209