xref: /freebsd/contrib/llvm-project/clang/include/clang/AST/CommentParser.h (revision 7fdf597e96a02165cfe22ff357b857d5fa15ed8a)
1 //===--- CommentParser.h - Doxygen comment parser ---------------*- 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 //  This file defines the Doxygen comment parser.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_AST_COMMENTPARSER_H
14 #define LLVM_CLANG_AST_COMMENTPARSER_H
15 
16 #include "clang/AST/Comment.h"
17 #include "clang/AST/CommentLexer.h"
18 #include "clang/AST/CommentSema.h"
19 #include "clang/Basic/Diagnostic.h"
20 #include "llvm/Support/Allocator.h"
21 
22 namespace clang {
23 class SourceManager;
24 
25 namespace comments {
26 class CommandTraits;
27 
28 /// Doxygen comment parser.
29 class Parser {
30   Parser(const Parser &) = delete;
31   void operator=(const Parser &) = delete;
32 
33   friend class TextTokenRetokenizer;
34 
35   Lexer &L;
36 
37   Sema &S;
38 
39   /// Allocator for anything that goes into AST nodes.
40   llvm::BumpPtrAllocator &Allocator;
41 
42   /// Source manager for the comment being parsed.
43   const SourceManager &SourceMgr;
44 
45   DiagnosticsEngine &Diags;
46 
47   DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID) {
48     return Diags.Report(Loc, DiagID);
49   }
50 
51   const CommandTraits &Traits;
52 
53   /// Current lookahead token.  We can safely assume that all tokens are from
54   /// a single source file.
55   Token Tok;
56 
57   /// A stack of additional lookahead tokens.
58   SmallVector<Token, 8> MoreLATokens;
59 
60   void consumeToken() {
61     if (MoreLATokens.empty())
62       L.lex(Tok);
63     else
64       Tok = MoreLATokens.pop_back_val();
65   }
66 
67   void putBack(const Token &OldTok) {
68     MoreLATokens.push_back(Tok);
69     Tok = OldTok;
70   }
71 
72   void putBack(ArrayRef<Token> Toks) {
73     if (Toks.empty())
74       return;
75 
76     MoreLATokens.push_back(Tok);
77     MoreLATokens.append(Toks.rbegin(), std::prev(Toks.rend()));
78 
79     Tok = Toks[0];
80   }
81 
82   bool isTokBlockCommand() {
83     return (Tok.is(tok::backslash_command) || Tok.is(tok::at_command)) &&
84            Traits.getCommandInfo(Tok.getCommandID())->IsBlockCommand;
85   }
86 
87 public:
88   Parser(Lexer &L, Sema &S, llvm::BumpPtrAllocator &Allocator,
89          const SourceManager &SourceMgr, DiagnosticsEngine &Diags,
90          const CommandTraits &Traits);
91 
92   /// Parse arguments for \\param command.
93   void parseParamCommandArgs(ParamCommandComment *PC,
94                              TextTokenRetokenizer &Retokenizer);
95 
96   /// Parse arguments for \\tparam command.
97   void parseTParamCommandArgs(TParamCommandComment *TPC,
98                               TextTokenRetokenizer &Retokenizer);
99 
100   ArrayRef<Comment::Argument>
101   parseCommandArgs(TextTokenRetokenizer &Retokenizer, unsigned NumArgs);
102 
103   /// Parse arguments for \throws command supported args are in form of class
104   /// or template.
105   ArrayRef<Comment::Argument>
106   parseThrowCommandArgs(TextTokenRetokenizer &Retokenizer, unsigned NumArgs);
107 
108   ArrayRef<Comment::Argument>
109   parseParCommandArgs(TextTokenRetokenizer &Retokenizer, unsigned NumArgs);
110 
111   BlockCommandComment *parseBlockCommand();
112   InlineCommandComment *parseInlineCommand();
113 
114   HTMLStartTagComment *parseHTMLStartTag();
115   HTMLEndTagComment *parseHTMLEndTag();
116 
117   BlockContentComment *parseParagraphOrBlockCommand();
118 
119   VerbatimBlockComment *parseVerbatimBlock();
120   VerbatimLineComment *parseVerbatimLine();
121   BlockContentComment *parseBlockContent();
122   FullComment *parseFullComment();
123 };
124 
125 } // end namespace comments
126 } // end namespace clang
127 
128 #endif
129