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