[clang-tidy] Fix ParentVirtualCallCheck for old MSVS compilers
[lldb.git] / clang-tools-extra / clang-doc / Mapper.cpp
1 //===-- Mapper.cpp - ClangDoc Mapper ----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "Mapper.h"
11 #include "BitcodeWriter.h"
12 #include "Serialize.h"
13 #include "clang/AST/Comment.h"
14 #include "clang/Index/USRGeneration.h"
15 #include "llvm/ADT/StringExtras.h"
16
17 using clang::comments::FullComment;
18
19 namespace clang {
20 namespace doc {
21
22 void MapASTVisitor::HandleTranslationUnit(ASTContext &Context) {
23   TraverseDecl(Context.getTranslationUnitDecl());
24 }
25
26 template <typename T> bool MapASTVisitor::mapDecl(const T *D) {
27   // If we're looking a decl not in user files, skip this decl.
28   if (D->getASTContext().getSourceManager().isInSystemHeader(D->getLocation()))
29     return true;
30
31   llvm::SmallString<128> USR;
32   // If there is an error generating a USR for the decl, skip this decl.
33   if (index::generateUSRForDecl(D, USR))
34     return true;
35
36   ECtx->reportResult(llvm::toHex(llvm::toStringRef(serialize::hashUSR(USR))),
37                      serialize::emitInfo(D, getComment(D, D->getASTContext()),
38                                          getLine(D, D->getASTContext()),
39                                          getFile(D, D->getASTContext())));
40   return true;
41 }
42
43 bool MapASTVisitor::VisitNamespaceDecl(const NamespaceDecl *D) {
44   return mapDecl(D);
45 }
46
47 bool MapASTVisitor::VisitRecordDecl(const RecordDecl *D) { return mapDecl(D); }
48
49 bool MapASTVisitor::VisitEnumDecl(const EnumDecl *D) { return mapDecl(D); }
50
51 bool MapASTVisitor::VisitCXXMethodDecl(const CXXMethodDecl *D) {
52   return mapDecl(D);
53 }
54
55 bool MapASTVisitor::VisitFunctionDecl(const FunctionDecl *D) {
56   // Don't visit CXXMethodDecls twice
57   if (dyn_cast<CXXMethodDecl>(D))
58     return true;
59   return mapDecl(D);
60 }
61
62 comments::FullComment *
63 MapASTVisitor::getComment(const NamedDecl *D, const ASTContext &Context) const {
64   RawComment *Comment = Context.getRawCommentForDeclNoCache(D);
65   // FIXME: Move setAttached to the initial comment parsing.
66   if (Comment) {
67     Comment->setAttached();
68     return Comment->parse(Context, nullptr, D);
69   }
70   return nullptr;
71 }
72
73 int MapASTVisitor::getLine(const NamedDecl *D,
74                            const ASTContext &Context) const {
75   return Context.getSourceManager().getPresumedLoc(D->getLocStart()).getLine();
76 }
77
78 llvm::StringRef MapASTVisitor::getFile(const NamedDecl *D,
79                                        const ASTContext &Context) const {
80   return Context.getSourceManager()
81       .getPresumedLoc(D->getLocStart())
82       .getFilename();
83 }
84
85 } // namespace doc
86 } // namespace clang