1 //===--- ASTSignals.cpp ------------------------------------------*- 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 #include "ASTSignals.h"
10 #include "AST.h"
11 #include "FindTarget.h"
12 
13 namespace clang {
14 namespace clangd {
15 ASTSignals ASTSignals::derive(const ParsedAST &AST) {
16   ASTSignals Signals;
17   const SourceManager &SM = AST.getSourceManager();
18   findExplicitReferences(
19       AST.getASTContext(),
20       [&](ReferenceLoc Ref) {
21         for (const NamedDecl *ND : Ref.Targets) {
22           if (!isInsideMainFile(Ref.NameLoc, SM))
23             continue;
24           SymbolID ID = getSymbolID(ND);
25           if (!ID)
26             continue;
27           unsigned &SymbolCount = Signals.ReferencedSymbols[ID];
28           SymbolCount++;
29           // Process namespace only when we see the symbol for the first time.
30           if (SymbolCount != 1)
31             continue;
32           if (const auto *NSD = dyn_cast<NamespaceDecl>(ND->getDeclContext())) {
33             if (NSD->isAnonymousNamespace())
34               continue;
35             std::string NS = printNamespaceScope(*NSD);
36             if (!NS.empty())
37               Signals.RelatedNamespaces[NS]++;
38           }
39         }
40       },
41       AST.getHeuristicResolver());
42   return Signals;
43 }
44 } // namespace clangd
45 } // namespace clang
46