1 //===--- CommentCommandTraits.cpp - Comment command properties --*- 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 "clang/AST/CommentCommandTraits.h" 11 #include "llvm/ADT/StringSwitch.h" 12 13 namespace clang { 14 namespace comments { 15 16 // TODO: tablegen 17 18 bool CommandTraits::isVerbatimBlockCommand(StringRef StartName, 19 StringRef &EndName) const { 20 const char *Result = llvm::StringSwitch<const char *>(StartName) 21 .Case("code", "endcode") 22 .Case("verbatim", "endverbatim") 23 .Case("htmlonly", "endhtmlonly") 24 .Case("latexonly", "endlatexonly") 25 .Case("xmlonly", "endxmlonly") 26 .Case("manonly", "endmanonly") 27 .Case("rtfonly", "endrtfonly") 28 29 .Case("dot", "enddot") 30 .Case("msc", "endmsc") 31 32 .Case("f$", "f$") // Inline LaTeX formula 33 .Case("f[", "f]") // Displayed LaTeX formula 34 .Case("f{", "f}") // LaTeX environment 35 36 .Default(NULL); 37 38 if (Result) { 39 EndName = Result; 40 return true; 41 } 42 43 for (VerbatimBlockCommandVector::const_iterator 44 I = VerbatimBlockCommands.begin(), 45 E = VerbatimBlockCommands.end(); 46 I != E; ++I) 47 if (I->StartName == StartName) { 48 EndName = I->EndName; 49 return true; 50 } 51 52 return false; 53 } 54 55 bool CommandTraits::isVerbatimLineCommand(StringRef Name) const { 56 bool Result = isDeclarationCommand(Name) || llvm::StringSwitch<bool>(Name) 57 .Case("defgroup", true) 58 .Case("ingroup", true) 59 .Case("addtogroup", true) 60 .Case("weakgroup", true) 61 .Case("name", true) 62 63 .Case("section", true) 64 .Case("subsection", true) 65 .Case("subsubsection", true) 66 .Case("paragraph", true) 67 68 .Case("mainpage", true) 69 .Case("subpage", true) 70 .Case("ref", true) 71 72 .Default(false); 73 74 if (Result) 75 return true; 76 77 for (VerbatimLineCommandVector::const_iterator 78 I = VerbatimLineCommands.begin(), 79 E = VerbatimLineCommands.end(); 80 I != E; ++I) 81 if (I->Name == Name) 82 return true; 83 84 return false; 85 } 86 87 bool CommandTraits::isDeclarationCommand(StringRef Name) const { 88 return llvm::StringSwitch<bool>(Name) 89 // Doxygen commands. 90 .Case("fn", true) 91 .Case("var", true) 92 .Case("property", true) 93 .Case("typedef", true) 94 95 .Case("overload", true) 96 97 // HeaderDoc commands. 98 .Case("class", true) 99 .Case("interface", true) 100 .Case("protocol", true) 101 .Case("category", true) 102 .Case("template", true) 103 .Case("function", true) 104 .Case("method", true) 105 .Case("callback", true) 106 .Case("var", true) 107 .Case("const", true) 108 .Case("constant", true) 109 .Case("property", true) 110 .Case("struct", true) 111 .Case("union", true) 112 .Case("typedef", true) 113 .Case("enum", true) 114 115 .Default(false); 116 } 117 118 void CommandTraits::addVerbatimBlockCommand(StringRef StartName, 119 StringRef EndName) { 120 VerbatimBlockCommand VBC; 121 VBC.StartName = StartName; 122 VBC.EndName = EndName; 123 VerbatimBlockCommands.push_back(VBC); 124 } 125 126 void CommandTraits::addVerbatimLineCommand(StringRef Name) { 127 VerbatimLineCommand VLC; 128 VLC.Name = Name; 129 VerbatimLineCommands.push_back(VLC); 130 } 131 132 } // end namespace comments 133 } // end namespace clang 134 135