14 #include "clang/AST/Decl.h"
20 const Path &OriginalFile,
21 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS) {
22 llvm::StringRef SourceExtensions[] = {
".cpp",
".c",
".cc",
".cxx",
24 llvm::StringRef HeaderExtensions[] = {
".h",
".hh",
".hpp",
".hxx",
".inc"};
26 llvm::StringRef PathExt = llvm::sys::path::extension(OriginalFile);
30 llvm::find_if(SourceExtensions, [&PathExt](
PathRef SourceExt) {
31 return SourceExt.equals_lower(PathExt);
33 bool IsSource = SourceIter != std::end(SourceExtensions);
36 llvm::find_if(HeaderExtensions, [&PathExt](
PathRef HeaderExt) {
37 return HeaderExt.equals_lower(PathExt);
39 bool IsHeader = HeaderIter != std::end(HeaderExtensions);
42 if (!IsSource && !IsHeader)
47 llvm::ArrayRef<llvm::StringRef> NewExts;
49 NewExts = HeaderExtensions;
51 NewExts = SourceExtensions;
54 llvm::SmallString<128> NewPath = llvm::StringRef(OriginalFile);
57 for (llvm::StringRef NewExt : NewExts) {
58 llvm::sys::path::replace_extension(NewPath, NewExt);
59 if (VFS->exists(NewPath))
60 return NewPath.str().str();
65 llvm::sys::path::replace_extension(NewPath, NewExt.upper());
66 if (VFS->exists(NewPath))
67 return NewPath.str().str();
83 Request.
IDs.insert(*ID);
85 llvm::StringMap<int> Candidates;
86 auto AwardTarget = [&](
const char *TargetURI) {
87 if (
auto TargetPath =
URI::resolve(TargetURI, OriginalFile)) {
88 if (*TargetPath != OriginalFile)
89 ++Candidates[*TargetPath];
91 elog(
"Failed to resolve URI {0}: {1}", TargetURI, TargetPath.takeError());
110 if (Candidates.empty())
115 auto Best = Candidates.begin();
116 for (
auto It = Candidates.begin(); It != Candidates.end(); ++It) {
117 if (It->second > Best->second)
119 else if (It->second == Best->second && It->first() < Best->first())
124 return Path(std::string(Best->first()));
128 std::vector<const Decl *>
Results;
129 std::function<void(
Decl *)> TraverseDecl = [&](
Decl *D) {
130 auto *ND = llvm::dyn_cast<NamedDecl>(D);
131 if (!ND || ND->isImplicit())
136 if (!llvm::isa<FunctionDecl>(ND)) {
139 if (
auto *Scope = llvm::dyn_cast<DeclContext>(ND)) {
140 for (
auto *D : Scope->decls())
144 if (llvm::isa<NamespaceDecl>(D))
151 TraverseDecl(TopLevel);