brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · cffadb0 Raw
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