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 BlockCommandComment *parseBlockCommand(); 104 InlineCommandComment *parseInlineCommand(); 105 106 HTMLStartTagComment *parseHTMLStartTag(); 107 HTMLEndTagComment *parseHTMLEndTag(); 108 109 BlockContentComment *parseParagraphOrBlockCommand(); 110 111 VerbatimBlockComment *parseVerbatimBlock(); 112 VerbatimLineComment *parseVerbatimLine(); 113 BlockContentComment *parseBlockContent(); 114 FullComment *parseFullComment(); 115 }; 116 117 } // end namespace comments 118 } // end namespace clang 119 120 #endif 121 122