1 //===--- FindTarget.cpp - What does an AST node refer to? -----------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "FindTarget.h"
11 #include "HeuristicResolver.h"
12 #include "support/Logger.h"
13 #include "clang/AST/ASTConcept.h"
14 #include "clang/AST/ASTTypeTraits.h"
15 #include "clang/AST/Decl.h"
16 #include "clang/AST/DeclBase.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclTemplate.h"
19 #include "clang/AST/DeclVisitor.h"
20 #include "clang/AST/DeclarationName.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprCXX.h"
23 #include "clang/AST/ExprConcepts.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/NestedNameSpecifier.h"
26 #include "clang/AST/PrettyPrinter.h"
27 #include "clang/AST/RecursiveASTVisitor.h"
28 #include "clang/AST/StmtVisitor.h"
29 #include "clang/AST/TemplateBase.h"
30 #include "clang/AST/Type.h"
31 #include "clang/AST/TypeLoc.h"
32 #include "clang/AST/TypeLocVisitor.h"
33 #include "clang/AST/TypeVisitor.h"
34 #include "clang/Basic/LangOptions.h"
35 #include "clang/Basic/SourceLocation.h"
36 #include "clang/Basic/SourceManager.h"
37 #include "clang/Basic/Specifiers.h"
38 #include "llvm/ADT/STLExtras.h"
39 #include "llvm/ADT/SmallVector.h"
40 #include "llvm/ADT/StringExtras.h"
41 #include "llvm/Support/Casting.h"
42 #include "llvm/Support/Compiler.h"
43 #include "llvm/Support/raw_ostream.h"
53 LLVM_ATTRIBUTE_UNUSED
std::string
nodeToString(const DynTypedNode
&N
) {
54 std::string S
= std::string(N
.getNodeKind().asStringRef());
56 llvm::raw_string_ostream
OS(S
);
58 N
.print(OS
, PrintingPolicy(LangOptions()));
60 std::replace(S
.begin(), S
.end(), '\n', ' ');
64 const NamedDecl
*getTemplatePattern(const NamedDecl
*D
) {
65 if (const CXXRecordDecl
*CRD
= dyn_cast
<CXXRecordDecl
>(D
)) {
66 if (const auto *Result
= CRD
->getTemplateInstantiationPattern())
68 // getTemplateInstantiationPattern returns null if the Specialization is
69 // incomplete (e.g. the type didn't need to be complete), fall back to the
71 if (CRD
->getTemplateSpecializationKind() == TSK_Undeclared
)
72 if (const auto *Spec
= dyn_cast
<ClassTemplateSpecializationDecl
>(CRD
))
73 return Spec
->getSpecializedTemplate()->getTemplatedDecl();
74 } else if (const FunctionDecl
*FD
= dyn_cast
<FunctionDecl
>(D
)) {
75 return FD
->getTemplateInstantiationPattern();
76 } else if (auto *VD
= dyn_cast
<VarDecl
>(D
)) {
77 // Hmm: getTIP returns its arg if it's not an instantiation?!
78 VarDecl
*T
= VD
->getTemplateInstantiationPattern();
79 return (T
== D
) ? nullptr : T
;
80 } else if (const auto *ED
= dyn_cast
<EnumDecl
>(D
)) {
81 return ED
->getInstantiatedFromMemberEnum();
82 } else if (isa
<FieldDecl
>(D
) || isa
<TypedefNameDecl
>(D
)) {
83 if (const auto *Parent
= llvm::dyn_cast
<NamedDecl
>(D
->getDeclContext()))
84 if (const DeclContext
*ParentPat
=
85 dyn_cast_or_null
<DeclContext
>(getTemplatePattern(Parent
)))
86 for (const NamedDecl
*BaseND
: ParentPat
->lookup(D
->getDeclName()))
87 if (!BaseND
->isImplicit() && BaseND
->getKind() == D
->getKind())
89 } else if (const auto *ECD
= dyn_cast
<EnumConstantDecl
>(D
)) {
90 if (const auto *ED
= dyn_cast
<EnumDecl
>(ECD
->getDeclContext())) {
91 if (const EnumDecl
*Pattern
= ED
->getInstantiatedFromMemberEnum()) {
92 for (const NamedDecl
*BaseECD
: Pattern
->lookup(ECD
->getDeclName()))
100 // Returns true if the `TypedefNameDecl` should not be reported.
101 bool shouldSkipTypedef(const TypedefNameDecl
*TD
) {
102 // These should be treated as keywords rather than decls - the typedef is an
103 // odd implementation detail.
104 if (TD
== TD
->getASTContext().getObjCInstanceTypeDecl() ||
105 TD
== TD
->getASTContext().getObjCIdDecl())
110 // TargetFinder locates the entities that an AST node refers to.
112 // Typically this is (possibly) one declaration and (possibly) one type, but
114 // - for ambiguous nodes like OverloadExpr
115 // - if we want to include e.g. both typedefs and the underlying type
117 // This is organized as a set of mutually recursive helpers for particular node
118 // types, but for most nodes this is a short walk rather than a deep traversal.
120 // It's tempting to do e.g. typedef resolution as a second normalization step,
121 // after finding the 'primary' decl etc. But we do this monolithically instead
123 // - normalization may require these traversals again (e.g. unwrapping a
124 // typedef reveals a decltype which must be traversed)
125 // - it doesn't simplify that much, e.g. the first stage must still be able
126 // to yield multiple decls to handle OverloadExpr
127 // - there are cases where it's required for correctness. e.g:
128 // template<class X> using pvec = vector<x*>; pvec<int> x;
129 // There's no Decl `pvec<int>`, we must choose `pvec<X>` or `vector<int*>`
130 // and both are lossy. We must know upfront what the caller ultimately wants.
131 struct TargetFinder
{
132 using RelSet
= DeclRelationSet
;
133 using Rel
= DeclRelation
;
136 const HeuristicResolver
*Resolver
;
137 llvm::SmallDenseMap
<const NamedDecl
*,
138 std::pair
<RelSet
, /*InsertionOrder*/ size_t>>
140 llvm::SmallDenseMap
<const Decl
*, RelSet
> Seen
;
143 template <typename T
> void debug(T
&Node
, RelSet Flags
) {
144 dlog("visit [{0}] {1}", Flags
, nodeToString(DynTypedNode::create(Node
)));
147 void report(const NamedDecl
*D
, RelSet Flags
) {
148 dlog("--> [{0}] {1}", Flags
, nodeToString(DynTypedNode::create(*D
)));
149 auto It
= Decls
.try_emplace(D
, std::make_pair(Flags
, Decls
.size()));
150 // If already exists, update the flags.
152 It
.first
->second
.first
|= Flags
;
156 TargetFinder(const HeuristicResolver
*Resolver
) : Resolver(Resolver
) {}
158 llvm::SmallVector
<std::pair
<const NamedDecl
*, RelSet
>, 1> takeDecls() const {
159 using ValTy
= std::pair
<const NamedDecl
*, RelSet
>;
160 llvm::SmallVector
<ValTy
, 1> Result
;
161 Result
.resize(Decls
.size());
162 for (const auto &Elem
: Decls
)
163 Result
[Elem
.second
.second
] = {Elem
.first
, Elem
.second
.first
};
167 void add(const Decl
*Dcl
, RelSet Flags
) {
168 const NamedDecl
*D
= llvm::dyn_cast_or_null
<NamedDecl
>(Dcl
);
173 // Avoid recursion (which can arise in the presence of heuristic
174 // resolution of dependent names) by exiting early if we have
175 // already seen this decl with all flags in Flags.
176 auto Res
= Seen
.try_emplace(D
);
177 if (!Res
.second
&& Res
.first
->second
.contains(Flags
))
179 Res
.first
->second
|= Flags
;
181 if (const UsingDirectiveDecl
*UDD
= llvm::dyn_cast
<UsingDirectiveDecl
>(D
))
182 D
= UDD
->getNominatedNamespaceAsWritten();
184 if (const TypedefNameDecl
*TND
= dyn_cast
<TypedefNameDecl
>(D
)) {
185 add(TND
->getUnderlyingType(), Flags
| Rel::Underlying
);
186 Flags
|= Rel::Alias
; // continue with the alias.
187 } else if (const UsingDecl
*UD
= dyn_cast
<UsingDecl
>(D
)) {
188 // no Underlying as this is a non-renaming alias.
189 for (const UsingShadowDecl
*S
: UD
->shadows())
190 add(S
->getUnderlyingDecl(), Flags
);
191 Flags
|= Rel::Alias
; // continue with the alias.
192 } else if (const UsingEnumDecl
*UED
= dyn_cast
<UsingEnumDecl
>(D
)) {
193 // UsingEnumDecl is not an alias at all, just a reference.
194 D
= UED
->getEnumDecl();
195 } else if (const auto *NAD
= dyn_cast
<NamespaceAliasDecl
>(D
)) {
196 add(NAD
->getUnderlyingDecl(), Flags
| Rel::Underlying
);
197 Flags
|= Rel::Alias
; // continue with the alias
198 } else if (const UnresolvedUsingValueDecl
*UUVD
=
199 dyn_cast
<UnresolvedUsingValueDecl
>(D
)) {
201 for (const NamedDecl
*Target
: Resolver
->resolveUsingValueDecl(UUVD
)) {
202 add(Target
, Flags
); // no Underlying as this is a non-renaming alias
205 Flags
|= Rel::Alias
; // continue with the alias
206 } else if (isa
<UnresolvedUsingTypenameDecl
>(D
)) {
207 // FIXME: improve common dependent scope using name lookup in primary
210 } else if (const UsingShadowDecl
*USD
= dyn_cast
<UsingShadowDecl
>(D
)) {
211 // Include the introducing UsingDecl, but don't traverse it. This may end
212 // up including *all* shadows, which we don't want.
213 // Don't apply this logic to UsingEnumDecl, which can't easily be
214 // conflated with the aliases it introduces.
215 if (llvm::isa
<UsingDecl
>(USD
->getIntroducer()))
216 report(USD
->getIntroducer(), Flags
| Rel::Alias
);
217 // Shadow decls are synthetic and not themselves interesting.
218 // Record the underlying decl instead, if allowed.
219 D
= USD
->getTargetDecl();
220 } else if (const auto *DG
= dyn_cast
<CXXDeductionGuideDecl
>(D
)) {
221 D
= DG
->getDeducedTemplate();
222 } else if (const ObjCImplementationDecl
*IID
=
223 dyn_cast
<ObjCImplementationDecl
>(D
)) {
224 // Treat ObjC{Interface,Implementation}Decl as if they were a decl/def
225 // pair as long as the interface isn't implicit.
226 if (const auto *CID
= IID
->getClassInterface())
227 if (const auto *DD
= CID
->getDefinition())
228 if (!DD
->isImplicitInterfaceDecl())
230 } else if (const ObjCCategoryImplDecl
*CID
=
231 dyn_cast
<ObjCCategoryImplDecl
>(D
)) {
232 // Treat ObjC{Category,CategoryImpl}Decl as if they were a decl/def pair.
233 D
= CID
->getCategoryDecl();
238 if (const Decl
*Pat
= getTemplatePattern(D
)) {
240 add(Pat
, Flags
| Rel::TemplatePattern
);
241 // Now continue with the instantiation.
242 Flags
|= Rel::TemplateInstantiation
;
248 void add(const Stmt
*S
, RelSet Flags
) {
252 struct Visitor
: public ConstStmtVisitor
<Visitor
> {
255 Visitor(TargetFinder
&Outer
, RelSet Flags
) : Outer(Outer
), Flags(Flags
) {}
257 void VisitCallExpr(const CallExpr
*CE
) {
258 Outer
.add(CE
->getCalleeDecl(), Flags
);
260 void VisitConceptSpecializationExpr(const ConceptSpecializationExpr
*E
) {
261 Outer
.add(E
->getConceptReference(), Flags
);
263 void VisitDeclRefExpr(const DeclRefExpr
*DRE
) {
264 const Decl
*D
= DRE
->getDecl();
265 // UsingShadowDecl allows us to record the UsingDecl.
266 // getFoundDecl() returns the wrong thing in other cases (templates).
267 if (auto *USD
= llvm::dyn_cast
<UsingShadowDecl
>(DRE
->getFoundDecl()))
271 void VisitMemberExpr(const MemberExpr
*ME
) {
272 const Decl
*D
= ME
->getMemberDecl();
274 llvm::dyn_cast
<UsingShadowDecl
>(ME
->getFoundDecl().getDecl()))
278 void VisitOverloadExpr(const OverloadExpr
*OE
) {
279 for (auto *D
: OE
->decls())
282 void VisitSizeOfPackExpr(const SizeOfPackExpr
*SE
) {
283 Outer
.add(SE
->getPack(), Flags
);
285 void VisitCXXConstructExpr(const CXXConstructExpr
*CCE
) {
286 Outer
.add(CCE
->getConstructor(), Flags
);
288 void VisitDesignatedInitExpr(const DesignatedInitExpr
*DIE
) {
289 for (const DesignatedInitExpr::Designator
&D
:
290 llvm::reverse(DIE
->designators()))
291 if (D
.isFieldDesignator()) {
292 Outer
.add(D
.getFieldDecl(), Flags
);
293 // We don't know which designator was intended, we assume the outer.
297 void VisitGotoStmt(const GotoStmt
*Goto
) {
298 if (auto *LabelDecl
= Goto
->getLabel())
299 Outer
.add(LabelDecl
, Flags
);
301 void VisitLabelStmt(const LabelStmt
*Label
) {
302 if (auto *LabelDecl
= Label
->getDecl())
303 Outer
.add(LabelDecl
, Flags
);
306 VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr
*E
) {
307 if (Outer
.Resolver
) {
308 for (const NamedDecl
*D
: Outer
.Resolver
->resolveMemberExpr(E
)) {
313 void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr
*E
) {
314 if (Outer
.Resolver
) {
315 for (const NamedDecl
*D
: Outer
.Resolver
->resolveDeclRefExpr(E
)) {
320 void VisitObjCIvarRefExpr(const ObjCIvarRefExpr
*OIRE
) {
321 Outer
.add(OIRE
->getDecl(), Flags
);
323 void VisitObjCMessageExpr(const ObjCMessageExpr
*OME
) {
324 Outer
.add(OME
->getMethodDecl(), Flags
);
326 void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr
*OPRE
) {
327 if (OPRE
->isExplicitProperty())
328 Outer
.add(OPRE
->getExplicitProperty(), Flags
);
330 if (OPRE
->isMessagingGetter())
331 Outer
.add(OPRE
->getImplicitPropertyGetter(), Flags
);
332 if (OPRE
->isMessagingSetter())
333 Outer
.add(OPRE
->getImplicitPropertySetter(), Flags
);
336 void VisitObjCProtocolExpr(const ObjCProtocolExpr
*OPE
) {
337 Outer
.add(OPE
->getProtocol(), Flags
);
339 void VisitOpaqueValueExpr(const OpaqueValueExpr
*OVE
) {
340 Outer
.add(OVE
->getSourceExpr(), Flags
);
342 void VisitPseudoObjectExpr(const PseudoObjectExpr
*POE
) {
343 Outer
.add(POE
->getSyntacticForm(), Flags
);
345 void VisitCXXNewExpr(const CXXNewExpr
*CNE
) {
346 Outer
.add(CNE
->getOperatorNew(), Flags
);
348 void VisitCXXDeleteExpr(const CXXDeleteExpr
*CDE
) {
349 Outer
.add(CDE
->getOperatorDelete(), Flags
);
352 VisitCXXRewrittenBinaryOperator(const CXXRewrittenBinaryOperator
*RBO
) {
353 Outer
.add(RBO
->getDecomposedForm().InnerBinOp
, Flags
);
356 Visitor(*this, Flags
).Visit(S
);
359 void add(QualType T
, RelSet Flags
) {
363 struct Visitor
: public TypeVisitor
<Visitor
> {
366 Visitor(TargetFinder
&Outer
, RelSet Flags
) : Outer(Outer
), Flags(Flags
) {}
368 void VisitTagType(const TagType
*TT
) {
369 Outer
.add(TT
->getAsTagDecl(), Flags
);
372 void VisitElaboratedType(const ElaboratedType
*ET
) {
373 Outer
.add(ET
->desugar(), Flags
);
376 void VisitUsingType(const UsingType
*ET
) {
377 Outer
.add(ET
->getFoundDecl(), Flags
);
380 void VisitInjectedClassNameType(const InjectedClassNameType
*ICNT
) {
381 Outer
.add(ICNT
->getDecl(), Flags
);
384 void VisitDecltypeType(const DecltypeType
*DTT
) {
385 Outer
.add(DTT
->getUnderlyingType(), Flags
| Rel::Underlying
);
387 void VisitDeducedType(const DeducedType
*DT
) {
388 // FIXME: In practice this doesn't work: the AutoType you find inside
389 // TypeLoc never has a deduced type. https://llvm.org/PR42914
390 Outer
.add(DT
->getDeducedType(), Flags
);
392 void VisitUnresolvedUsingType(const UnresolvedUsingType
*UUT
) {
393 Outer
.add(UUT
->getDecl(), Flags
);
395 void VisitDeducedTemplateSpecializationType(
396 const DeducedTemplateSpecializationType
*DTST
) {
397 if (const auto *USD
= DTST
->getTemplateName().getAsUsingShadowDecl())
398 Outer
.add(USD
, Flags
);
400 // FIXME: This is a workaround for https://llvm.org/PR42914,
401 // which is causing DTST->getDeducedType() to be empty. We
402 // fall back to the template pattern and miss the instantiation
403 // even when it's known in principle. Once that bug is fixed,
404 // the following code can be removed (the existing handling in
405 // VisitDeducedType() is sufficient).
406 if (auto *TD
= DTST
->getTemplateName().getAsTemplateDecl())
407 Outer
.add(TD
->getTemplatedDecl(), Flags
| Rel::TemplatePattern
);
409 void VisitDependentNameType(const DependentNameType
*DNT
) {
410 if (Outer
.Resolver
) {
411 for (const NamedDecl
*ND
:
412 Outer
.Resolver
->resolveDependentNameType(DNT
)) {
413 Outer
.add(ND
, Flags
);
417 void VisitDependentTemplateSpecializationType(
418 const DependentTemplateSpecializationType
*DTST
) {
419 if (Outer
.Resolver
) {
420 for (const NamedDecl
*ND
:
421 Outer
.Resolver
->resolveTemplateSpecializationType(DTST
)) {
422 Outer
.add(ND
, Flags
);
426 void VisitTypedefType(const TypedefType
*TT
) {
427 if (shouldSkipTypedef(TT
->getDecl()))
429 Outer
.add(TT
->getDecl(), Flags
);
432 VisitTemplateSpecializationType(const TemplateSpecializationType
*TST
) {
433 // Have to handle these case-by-case.
435 if (const auto *UTN
= TST
->getTemplateName().getAsUsingShadowDecl())
436 Outer
.add(UTN
, Flags
);
438 // templated type aliases: there's no specialized/instantiated using
439 // decl to point to. So try to find a decl for the underlying type
440 // (after substitution), and failing that point to the (templated) using
442 if (TST
->isTypeAlias()) {
443 Outer
.add(TST
->getAliasedType(), Flags
| Rel::Underlying
);
444 // Don't *traverse* the alias, which would result in traversing the
445 // template of the underlying type.
447 TemplateDecl
*TD
= TST
->getTemplateName().getAsTemplateDecl();
448 // Builtin templates e.g. __make_integer_seq, __type_pack_element
449 // are such that they don't have alias *decls*. Even then, we still
450 // traverse their desugared *types* so that instantiated decls are
452 if (llvm::isa
<BuiltinTemplateDecl
>(TD
))
454 Outer
.report(TD
->getTemplatedDecl(),
455 Flags
| Rel::Alias
| Rel::TemplatePattern
);
457 // specializations of template template parameters aren't instantiated
458 // into decls, so they must refer to the parameter itself.
459 else if (const auto *Parm
=
460 llvm::dyn_cast_or_null
<TemplateTemplateParmDecl
>(
461 TST
->getTemplateName().getAsTemplateDecl()))
462 Outer
.add(Parm
, Flags
);
463 // class template specializations have a (specialized) CXXRecordDecl.
464 else if (const CXXRecordDecl
*RD
= TST
->getAsCXXRecordDecl())
465 Outer
.add(RD
, Flags
); // add(Decl) will despecialize if needed.
467 // fallback: the (un-specialized) declaration from primary template.
468 if (auto *TD
= TST
->getTemplateName().getAsTemplateDecl())
469 Outer
.add(TD
->getTemplatedDecl(), Flags
| Rel::TemplatePattern
);
473 VisitSubstTemplateTypeParmType(const SubstTemplateTypeParmType
*STTPT
) {
474 Outer
.add(STTPT
->getReplacementType(), Flags
);
476 void VisitTemplateTypeParmType(const TemplateTypeParmType
*TTPT
) {
477 Outer
.add(TTPT
->getDecl(), Flags
);
479 void VisitObjCInterfaceType(const ObjCInterfaceType
*OIT
) {
480 Outer
.add(OIT
->getDecl(), Flags
);
483 Visitor(*this, Flags
).Visit(T
.getTypePtr());
486 void add(const NestedNameSpecifier
*NNS
, RelSet Flags
) {
490 switch (NNS
->getKind()) {
491 case NestedNameSpecifier::Namespace
:
492 add(NNS
->getAsNamespace(), Flags
);
494 case NestedNameSpecifier::NamespaceAlias
:
495 add(NNS
->getAsNamespaceAlias(), Flags
);
497 case NestedNameSpecifier::Identifier
:
499 add(QualType(Resolver
->resolveNestedNameSpecifierToType(NNS
), 0),
503 case NestedNameSpecifier::TypeSpec
:
504 case NestedNameSpecifier::TypeSpecWithTemplate
:
505 add(QualType(NNS
->getAsType(), 0), Flags
);
507 case NestedNameSpecifier::Global
:
508 // This should be TUDecl, but we can't get a pointer to it!
510 case NestedNameSpecifier::Super
:
511 add(NNS
->getAsRecordDecl(), Flags
);
514 llvm_unreachable("unhandled NestedNameSpecifier::SpecifierKind");
517 void add(const CXXCtorInitializer
*CCI
, RelSet Flags
) {
522 if (CCI
->isAnyMemberInitializer())
523 add(CCI
->getAnyMember(), Flags
);
524 // Constructor calls contain a TypeLoc node, so we don't handle them here.
527 void add(const TemplateArgument
&Arg
, RelSet Flags
) {
528 // Only used for template template arguments.
529 // For type and non-type template arguments, SelectionTree
530 // will hit a more specific node (e.g. a TypeLoc or a
532 if (Arg
.getKind() == TemplateArgument::Template
||
533 Arg
.getKind() == TemplateArgument::TemplateExpansion
) {
534 if (TemplateDecl
*TD
=
535 Arg
.getAsTemplateOrTemplatePattern().getAsTemplateDecl()) {
538 if (const auto *USD
=
539 Arg
.getAsTemplateOrTemplatePattern().getAsUsingShadowDecl())
544 void add(const ConceptReference
*CR
, RelSet Flags
) {
545 add(CR
->getNamedConcept(), Flags
);
551 llvm::SmallVector
<std::pair
<const NamedDecl
*, DeclRelationSet
>, 1>
552 allTargetDecls(const DynTypedNode
&N
, const HeuristicResolver
*Resolver
) {
553 dlog("allTargetDecls({0})", nodeToString(N
));
554 TargetFinder
Finder(Resolver
);
555 DeclRelationSet Flags
;
556 if (const Decl
*D
= N
.get
<Decl
>())
557 Finder
.add(D
, Flags
);
558 else if (const Stmt
*S
= N
.get
<Stmt
>())
559 Finder
.add(S
, Flags
);
560 else if (const NestedNameSpecifierLoc
*NNSL
= N
.get
<NestedNameSpecifierLoc
>())
561 Finder
.add(NNSL
->getNestedNameSpecifier(), Flags
);
562 else if (const NestedNameSpecifier
*NNS
= N
.get
<NestedNameSpecifier
>())
563 Finder
.add(NNS
, Flags
);
564 else if (const TypeLoc
*TL
= N
.get
<TypeLoc
>())
565 Finder
.add(TL
->getType(), Flags
);
566 else if (const QualType
*QT
= N
.get
<QualType
>())
567 Finder
.add(*QT
, Flags
);
568 else if (const CXXCtorInitializer
*CCI
= N
.get
<CXXCtorInitializer
>())
569 Finder
.add(CCI
, Flags
);
570 else if (const TemplateArgumentLoc
*TAL
= N
.get
<TemplateArgumentLoc
>())
571 Finder
.add(TAL
->getArgument(), Flags
);
572 else if (const CXXBaseSpecifier
*CBS
= N
.get
<CXXBaseSpecifier
>())
573 Finder
.add(CBS
->getTypeSourceInfo()->getType(), Flags
);
574 else if (const ObjCProtocolLoc
*PL
= N
.get
<ObjCProtocolLoc
>())
575 Finder
.add(PL
->getProtocol(), Flags
);
576 else if (const ConceptReference
*CR
= N
.get
<ConceptReference
>())
577 Finder
.add(CR
, Flags
);
578 return Finder
.takeDecls();
581 llvm::SmallVector
<const NamedDecl
*, 1>
582 targetDecl(const DynTypedNode
&N
, DeclRelationSet Mask
,
583 const HeuristicResolver
*Resolver
) {
584 llvm::SmallVector
<const NamedDecl
*, 1> Result
;
585 for (const auto &Entry
: allTargetDecls(N
, Resolver
)) {
586 if (!(Entry
.second
& ~Mask
))
587 Result
.push_back(Entry
.first
);
592 llvm::SmallVector
<const NamedDecl
*, 1>
593 explicitReferenceTargets(DynTypedNode N
, DeclRelationSet Mask
,
594 const HeuristicResolver
*Resolver
) {
595 assert(!(Mask
& (DeclRelation::TemplatePattern
|
596 DeclRelation::TemplateInstantiation
)) &&
597 "explicitReferenceTargets handles templates on its own");
598 auto Decls
= allTargetDecls(N
, Resolver
);
600 // We prefer to return template instantiation, but fallback to template
601 // pattern if instantiation is not available.
602 Mask
|= DeclRelation::TemplatePattern
| DeclRelation::TemplateInstantiation
;
604 llvm::SmallVector
<const NamedDecl
*, 1> TemplatePatterns
;
605 llvm::SmallVector
<const NamedDecl
*, 1> Targets
;
606 bool SeenTemplateInstantiations
= false;
607 for (auto &D
: Decls
) {
608 if (D
.second
& ~Mask
)
610 if (D
.second
& DeclRelation::TemplatePattern
) {
611 TemplatePatterns
.push_back(D
.first
);
614 if (D
.second
& DeclRelation::TemplateInstantiation
)
615 SeenTemplateInstantiations
= true;
616 Targets
.push_back(D
.first
);
618 if (!SeenTemplateInstantiations
)
619 Targets
.insert(Targets
.end(), TemplatePatterns
.begin(),
620 TemplatePatterns
.end());
625 llvm::SmallVector
<ReferenceLoc
> refInDecl(const Decl
*D
,
626 const HeuristicResolver
*Resolver
) {
627 struct Visitor
: ConstDeclVisitor
<Visitor
> {
628 Visitor(const HeuristicResolver
*Resolver
) : Resolver(Resolver
) {}
630 const HeuristicResolver
*Resolver
;
631 llvm::SmallVector
<ReferenceLoc
> Refs
;
633 void VisitUsingDirectiveDecl(const UsingDirectiveDecl
*D
) {
634 // We want to keep it as non-declaration references, as the
635 // "using namespace" declaration doesn't have a name.
636 Refs
.push_back(ReferenceLoc
{D
->getQualifierLoc(),
637 D
->getIdentLocation(),
639 {D
->getNominatedNamespaceAsWritten()}});
642 void VisitUsingDecl(const UsingDecl
*D
) {
643 // "using ns::identifier;" is a non-declaration reference.
644 Refs
.push_back(ReferenceLoc
{
645 D
->getQualifierLoc(), D
->getLocation(), /*IsDecl=*/false,
646 explicitReferenceTargets(DynTypedNode::create(*D
),
647 DeclRelation::Underlying
, Resolver
)});
650 void VisitUsingEnumDecl(const UsingEnumDecl
*D
) {
651 // "using enum ns::E" is a non-declaration reference.
652 // The reference is covered by the embedded typeloc.
653 // Don't use the default VisitNamedDecl, which would report a declaration.
656 void VisitNamespaceAliasDecl(const NamespaceAliasDecl
*D
) {
657 // For namespace alias, "namespace Foo = Target;", we add two references.
658 // Add a declaration reference for Foo.
660 // Add a non-declaration reference for Target.
661 Refs
.push_back(ReferenceLoc
{D
->getQualifierLoc(),
662 D
->getTargetNameLoc(),
664 {D
->getAliasedNamespace()}});
667 void VisitNamedDecl(const NamedDecl
*ND
) {
668 // We choose to ignore {Class, Function, Var, TypeAlias}TemplateDecls. As
669 // as their underlying decls, covering the same range, will be visited.
670 if (llvm::isa
<ClassTemplateDecl
>(ND
) ||
671 llvm::isa
<FunctionTemplateDecl
>(ND
) ||
672 llvm::isa
<VarTemplateDecl
>(ND
) ||
673 llvm::isa
<TypeAliasTemplateDecl
>(ND
))
675 // FIXME: decide on how to surface destructors when we need them.
676 if (llvm::isa
<CXXDestructorDecl
>(ND
))
678 // Filter anonymous decls, name location will point outside the name token
679 // and the clients are not prepared to handle that.
680 if (ND
->getDeclName().isIdentifier() &&
681 !ND
->getDeclName().getAsIdentifierInfo())
683 Refs
.push_back(ReferenceLoc
{getQualifierLoc(*ND
),
689 void VisitCXXDeductionGuideDecl(const CXXDeductionGuideDecl
*DG
) {
690 // The class template name in a deduction guide targets the class
692 Refs
.push_back(ReferenceLoc
{DG
->getQualifierLoc(),
693 DG
->getNameInfo().getLoc(),
695 {DG
->getDeducedTemplate()}});
698 void VisitObjCMethodDecl(const ObjCMethodDecl
*OMD
) {
699 // The name may have several tokens, we can only report the first.
700 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
701 OMD
->getSelectorStartLoc(),
706 void VisitObjCCategoryDecl(const ObjCCategoryDecl
*OCD
) {
707 // getLocation is the extended class's location, not the category's.
708 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
711 {OCD
->getClassInterface()}});
712 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
713 OCD
->getCategoryNameLoc(),
718 void VisitObjCCategoryImplDecl(const ObjCCategoryImplDecl
*OCID
) {
719 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
722 {OCID
->getClassInterface()}});
723 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
724 OCID
->getCategoryNameLoc(),
726 {OCID
->getCategoryDecl()}});
727 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
728 OCID
->getCategoryNameLoc(),
733 void VisitObjCImplementationDecl(const ObjCImplementationDecl
*OIMD
) {
734 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
737 {OIMD
->getClassInterface()}});
738 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
750 llvm::SmallVector
<ReferenceLoc
> refInStmt(const Stmt
*S
,
751 const HeuristicResolver
*Resolver
) {
752 struct Visitor
: ConstStmtVisitor
<Visitor
> {
753 Visitor(const HeuristicResolver
*Resolver
) : Resolver(Resolver
) {}
755 const HeuristicResolver
*Resolver
;
756 // FIXME: handle more complicated cases: more ObjC, designated initializers.
757 llvm::SmallVector
<ReferenceLoc
> Refs
;
759 void VisitDeclRefExpr(const DeclRefExpr
*E
) {
760 Refs
.push_back(ReferenceLoc
{E
->getQualifierLoc(),
761 E
->getNameInfo().getLoc(),
763 {E
->getFoundDecl()}});
766 void VisitDependentScopeDeclRefExpr(const DependentScopeDeclRefExpr
*E
) {
767 Refs
.push_back(ReferenceLoc
{
768 E
->getQualifierLoc(), E
->getNameInfo().getLoc(), /*IsDecl=*/false,
769 explicitReferenceTargets(DynTypedNode::create(*E
), {}, Resolver
)});
772 void VisitMemberExpr(const MemberExpr
*E
) {
773 // Skip destructor calls to avoid duplication: TypeLoc within will be
774 // visited separately.
775 if (llvm::isa
<CXXDestructorDecl
>(E
->getFoundDecl().getDecl()))
777 Refs
.push_back(ReferenceLoc
{E
->getQualifierLoc(),
778 E
->getMemberNameInfo().getLoc(),
780 {E
->getFoundDecl()}});
784 VisitCXXDependentScopeMemberExpr(const CXXDependentScopeMemberExpr
*E
) {
785 Refs
.push_back(ReferenceLoc
{
786 E
->getQualifierLoc(), E
->getMemberNameInfo().getLoc(),
788 explicitReferenceTargets(DynTypedNode::create(*E
), {}, Resolver
)});
791 void VisitOverloadExpr(const OverloadExpr
*E
) {
792 Refs
.push_back(ReferenceLoc
{E
->getQualifierLoc(),
793 E
->getNameInfo().getLoc(),
795 llvm::SmallVector
<const NamedDecl
*, 1>(
796 E
->decls().begin(), E
->decls().end())});
799 void VisitSizeOfPackExpr(const SizeOfPackExpr
*E
) {
800 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
806 void VisitObjCPropertyRefExpr(const ObjCPropertyRefExpr
*E
) {
807 Refs
.push_back(ReferenceLoc
{
808 NestedNameSpecifierLoc(), E
->getLocation(),
810 // Select the getter, setter, or @property depending on the call.
811 explicitReferenceTargets(DynTypedNode::create(*E
), {}, Resolver
)});
814 void VisitObjCIvarRefExpr(const ObjCIvarRefExpr
*OIRE
) {
815 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
821 void VisitObjCMessageExpr(const ObjCMessageExpr
*E
) {
822 // The name may have several tokens, we can only report the first.
823 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
824 E
->getSelectorStartLoc(),
826 {E
->getMethodDecl()}});
829 void VisitDesignatedInitExpr(const DesignatedInitExpr
*DIE
) {
830 for (const DesignatedInitExpr::Designator
&D
: DIE
->designators()) {
831 if (!D
.isFieldDesignator())
834 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
837 {D
.getFieldDecl()}});
841 void VisitGotoStmt(const GotoStmt
*GS
) {
842 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
848 void VisitLabelStmt(const LabelStmt
*LS
) {
849 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
861 llvm::SmallVector
<ReferenceLoc
>
862 refInTypeLoc(TypeLoc L
, const HeuristicResolver
*Resolver
) {
863 struct Visitor
: TypeLocVisitor
<Visitor
> {
864 Visitor(const HeuristicResolver
*Resolver
) : Resolver(Resolver
) {}
866 const HeuristicResolver
*Resolver
;
867 llvm::SmallVector
<ReferenceLoc
> Refs
;
869 void VisitElaboratedTypeLoc(ElaboratedTypeLoc L
) {
870 // We only know about qualifier, rest if filled by inner locations.
871 size_t InitialSize
= Refs
.size();
872 Visit(L
.getNamedTypeLoc().getUnqualifiedLoc());
873 size_t NewSize
= Refs
.size();
874 // Add qualifier for the newly-added refs.
875 for (unsigned I
= InitialSize
; I
< NewSize
; ++I
) {
876 ReferenceLoc
*Ref
= &Refs
[I
];
877 // Fill in the qualifier.
878 assert(!Ref
->Qualifier
.hasQualifier() && "qualifier already set");
879 Ref
->Qualifier
= L
.getQualifierLoc();
883 void VisitUsingTypeLoc(UsingTypeLoc L
) {
884 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
885 L
.getLocalSourceRange().getBegin(),
887 {L
.getFoundDecl()}});
890 void VisitTagTypeLoc(TagTypeLoc L
) {
891 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
897 void VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc L
) {
898 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
904 void VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc L
) {
905 // We must ensure template type aliases are included in results if they
906 // were written in the source code, e.g. in
907 // template <class T> using valias = vector<T>;
909 // 'explicitReferenceTargets' will return:
910 // 1. valias with mask 'Alias'.
911 // 2. 'vector<int>' with mask 'Underlying'.
912 // we want to return only #1 in this case.
913 Refs
.push_back(ReferenceLoc
{
914 NestedNameSpecifierLoc(), L
.getTemplateNameLoc(), /*IsDecl=*/false,
915 explicitReferenceTargets(DynTypedNode::create(L
.getType()),
916 DeclRelation::Alias
, Resolver
)});
918 void VisitDeducedTemplateSpecializationTypeLoc(
919 DeducedTemplateSpecializationTypeLoc L
) {
920 Refs
.push_back(ReferenceLoc
{
921 NestedNameSpecifierLoc(), L
.getNameLoc(), /*IsDecl=*/false,
922 explicitReferenceTargets(DynTypedNode::create(L
.getType()),
923 DeclRelation::Alias
, Resolver
)});
926 void VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL
) {
927 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
933 void VisitDependentTemplateSpecializationTypeLoc(
934 DependentTemplateSpecializationTypeLoc L
) {
936 ReferenceLoc
{L
.getQualifierLoc(), L
.getTemplateNameLoc(),
938 explicitReferenceTargets(
939 DynTypedNode::create(L
.getType()), {}, Resolver
)});
942 void VisitDependentNameTypeLoc(DependentNameTypeLoc L
) {
944 ReferenceLoc
{L
.getQualifierLoc(), L
.getNameLoc(),
946 explicitReferenceTargets(
947 DynTypedNode::create(L
.getType()), {}, Resolver
)});
950 void VisitTypedefTypeLoc(TypedefTypeLoc L
) {
951 if (shouldSkipTypedef(L
.getTypedefNameDecl()))
953 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
956 {L
.getTypedefNameDecl()}});
959 void VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc L
) {
960 Refs
.push_back(ReferenceLoc
{NestedNameSpecifierLoc(),
963 {L
.getIFaceDecl()}});
968 V
.Visit(L
.getUnqualifiedLoc());
972 class ExplicitReferenceCollector
973 : public RecursiveASTVisitor
<ExplicitReferenceCollector
> {
975 ExplicitReferenceCollector(llvm::function_ref
<void(ReferenceLoc
)> Out
,
976 const HeuristicResolver
*Resolver
)
977 : Out(Out
), Resolver(Resolver
) {
981 bool VisitTypeLoc(TypeLoc TTL
) {
982 if (TypeLocsToSkip
.count(TTL
.getBeginLoc()))
984 visitNode(DynTypedNode::create(TTL
));
988 bool TraverseElaboratedTypeLoc(ElaboratedTypeLoc L
) {
989 // ElaboratedTypeLoc will reports information for its inner type loc.
990 // Otherwise we loose information about inner types loc's qualifier.
991 TypeLoc Inner
= L
.getNamedTypeLoc().getUnqualifiedLoc();
992 if (L
.getBeginLoc() == Inner
.getBeginLoc())
993 return RecursiveASTVisitor::TraverseTypeLoc(Inner
);
995 TypeLocsToSkip
.insert(Inner
.getBeginLoc());
996 return RecursiveASTVisitor::TraverseElaboratedTypeLoc(L
);
999 bool VisitStmt(Stmt
*S
) {
1000 visitNode(DynTypedNode::create(*S
));
1004 bool TraverseOpaqueValueExpr(OpaqueValueExpr
*OVE
) {
1005 visitNode(DynTypedNode::create(*OVE
));
1006 // Not clear why the source expression is skipped by default...
1007 // FIXME: can we just make RecursiveASTVisitor do this?
1008 return RecursiveASTVisitor::TraverseStmt(OVE
->getSourceExpr());
1011 bool TraversePseudoObjectExpr(PseudoObjectExpr
*POE
) {
1012 visitNode(DynTypedNode::create(*POE
));
1013 // Traverse only the syntactic form to find the *written* references.
1014 // (The semantic form also contains lots of duplication)
1015 return RecursiveASTVisitor::TraverseStmt(POE
->getSyntacticForm());
1018 // We re-define Traverse*, since there's no corresponding Visit*.
1019 // TemplateArgumentLoc is the only way to get locations for references to
1020 // template template parameters.
1021 bool TraverseTemplateArgumentLoc(TemplateArgumentLoc A
) {
1022 switch (A
.getArgument().getKind()) {
1023 case TemplateArgument::Template
:
1024 case TemplateArgument::TemplateExpansion
:
1025 reportReference(ReferenceLoc
{A
.getTemplateQualifierLoc(),
1026 A
.getTemplateNameLoc(),
1029 .getAsTemplateOrTemplatePattern()
1030 .getAsTemplateDecl()}},
1031 DynTypedNode::create(A
.getArgument()));
1033 case TemplateArgument::Declaration
:
1034 break; // FIXME: can this actually happen in TemplateArgumentLoc?
1035 case TemplateArgument::Integral
:
1036 case TemplateArgument::Null
:
1037 case TemplateArgument::NullPtr
:
1038 break; // no references.
1039 case TemplateArgument::Pack
:
1040 case TemplateArgument::Type
:
1041 case TemplateArgument::Expression
:
1042 case TemplateArgument::StructuralValue
:
1043 break; // Handled by VisitType and VisitExpression.
1045 return RecursiveASTVisitor::TraverseTemplateArgumentLoc(A
);
1048 bool VisitDecl(Decl
*D
) {
1049 visitNode(DynTypedNode::create(*D
));
1053 // We have to use Traverse* because there is no corresponding Visit*.
1054 bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc L
) {
1055 if (!L
.getNestedNameSpecifier())
1057 visitNode(DynTypedNode::create(L
));
1058 // Inner type is missing information about its qualifier, skip it.
1059 if (auto TL
= L
.getTypeLoc())
1060 TypeLocsToSkip
.insert(TL
.getBeginLoc());
1061 return RecursiveASTVisitor::TraverseNestedNameSpecifierLoc(L
);
1064 bool TraverseObjCProtocolLoc(ObjCProtocolLoc ProtocolLoc
) {
1065 visitNode(DynTypedNode::create(ProtocolLoc
));
1069 bool TraverseConstructorInitializer(CXXCtorInitializer
*Init
) {
1070 visitNode(DynTypedNode::create(*Init
));
1071 return RecursiveASTVisitor::TraverseConstructorInitializer(Init
);
1074 bool VisitConceptReference(const ConceptReference
*CR
) {
1075 visitNode(DynTypedNode::create(*CR
));
1080 /// Obtain information about a reference directly defined in \p N. Does not
1081 /// recurse into child nodes, e.g. do not expect references for constructor
1084 /// Any of the fields in the returned structure can be empty, but not all of
1086 /// - for implicitly generated nodes (e.g. MemberExpr from range-based-for),
1087 /// source location information may be missing,
1088 /// - for dependent code, targets may be empty.
1090 /// (!) For the purposes of this function declarations are not considered to
1091 /// be references. However, declarations can have references inside them,
1092 /// e.g. 'namespace foo = std' references namespace 'std' and this
1093 /// function will return the corresponding reference.
1094 llvm::SmallVector
<ReferenceLoc
> explicitReference(DynTypedNode N
) {
1095 if (auto *D
= N
.get
<Decl
>())
1096 return refInDecl(D
, Resolver
);
1097 if (auto *S
= N
.get
<Stmt
>())
1098 return refInStmt(S
, Resolver
);
1099 if (auto *NNSL
= N
.get
<NestedNameSpecifierLoc
>()) {
1100 // (!) 'DeclRelation::Alias' ensures we do not loose namespace aliases.
1101 return {ReferenceLoc
{
1102 NNSL
->getPrefix(), NNSL
->getLocalBeginLoc(), false,
1103 explicitReferenceTargets(
1104 DynTypedNode::create(*NNSL
->getNestedNameSpecifier()),
1105 DeclRelation::Alias
, Resolver
)}};
1107 if (const TypeLoc
*TL
= N
.get
<TypeLoc
>())
1108 return refInTypeLoc(*TL
, Resolver
);
1109 if (const CXXCtorInitializer
*CCI
= N
.get
<CXXCtorInitializer
>()) {
1110 // Other type initializers (e.g. base initializer) are handled by visiting
1112 if (CCI
->isAnyMemberInitializer()) {
1113 return {ReferenceLoc
{NestedNameSpecifierLoc(),
1114 CCI
->getMemberLocation(),
1116 {CCI
->getAnyMember()}}};
1119 if (const ObjCProtocolLoc
*PL
= N
.get
<ObjCProtocolLoc
>())
1120 return {ReferenceLoc
{NestedNameSpecifierLoc(),
1123 {PL
->getProtocol()}}};
1124 if (const ConceptReference
*CR
= N
.get
<ConceptReference
>())
1125 return {ReferenceLoc
{CR
->getNestedNameSpecifierLoc(),
1126 CR
->getConceptNameLoc(),
1128 {CR
->getNamedConcept()}}};
1130 // We do not have location information for other nodes (QualType, etc)
1134 void visitNode(DynTypedNode N
) {
1135 for (auto &R
: explicitReference(N
))
1136 reportReference(std::move(R
), N
);
1139 void reportReference(ReferenceLoc
&&Ref
, DynTypedNode N
) {
1140 // Strip null targets that can arise from invalid code.
1141 // (This avoids having to check for null everywhere we insert)
1142 llvm::erase(Ref
.Targets
, nullptr);
1143 // Our promise is to return only references from the source code. If we lack
1144 // location information, skip these nodes.
1145 // Normally this should not happen in practice, unless there are bugs in the
1146 // traversals or users started the traversal at an implicit node.
1147 if (Ref
.NameLoc
.isInvalid()) {
1148 dlog("invalid location at node {0}", nodeToString(N
));
1154 llvm::function_ref
<void(ReferenceLoc
)> Out
;
1155 const HeuristicResolver
*Resolver
;
1156 /// TypeLocs starting at these locations must be skipped, see
1157 /// TraverseElaboratedTypeSpecifierLoc for details.
1158 llvm::DenseSet
<SourceLocation
> TypeLocsToSkip
;
1162 void findExplicitReferences(const Stmt
*S
,
1163 llvm::function_ref
<void(ReferenceLoc
)> Out
,
1164 const HeuristicResolver
*Resolver
) {
1166 ExplicitReferenceCollector(Out
, Resolver
).TraverseStmt(const_cast<Stmt
*>(S
));
1168 void findExplicitReferences(const Decl
*D
,
1169 llvm::function_ref
<void(ReferenceLoc
)> Out
,
1170 const HeuristicResolver
*Resolver
) {
1172 ExplicitReferenceCollector(Out
, Resolver
).TraverseDecl(const_cast<Decl
*>(D
));
1174 void findExplicitReferences(const ASTContext
&AST
,
1175 llvm::function_ref
<void(ReferenceLoc
)> Out
,
1176 const HeuristicResolver
*Resolver
) {
1177 ExplicitReferenceCollector(Out
, Resolver
)
1178 .TraverseAST(const_cast<ASTContext
&>(AST
));
1181 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, DeclRelation R
) {
1183 #define REL_CASE(X) \
1184 case DeclRelation::X: \
1187 REL_CASE(Underlying
);
1188 REL_CASE(TemplateInstantiation
);
1189 REL_CASE(TemplatePattern
);
1192 llvm_unreachable("Unhandled DeclRelation enum");
1194 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, DeclRelationSet RS
) {
1195 const char *Sep
= "";
1196 for (unsigned I
= 0; I
< RS
.S
.size(); ++I
) {
1198 OS
<< Sep
<< static_cast<DeclRelation
>(I
);
1205 llvm::raw_ostream
&operator<<(llvm::raw_ostream
&OS
, ReferenceLoc R
) {
1206 // note we cannot print R.NameLoc without a source manager.
1207 OS
<< "targets = {";
1208 llvm::SmallVector
<std::string
> Targets
;
1209 for (const NamedDecl
*T
: R
.Targets
) {
1210 llvm::raw_string_ostream
Target(Targets
.emplace_back());
1211 Target
<< printQualifiedName(*T
) << printTemplateSpecializationArgs(*T
);
1213 llvm::sort(Targets
);
1214 OS
<< llvm::join(Targets
, ", ");
1217 OS
<< ", qualifier = '";
1218 R
.Qualifier
.getNestedNameSpecifier()->print(OS
,
1219 PrintingPolicy(LangOptions()));
1227 } // namespace clangd
1228 } // namespace clang