CommentCommandTraits.h revision f6785e3117c0ce447e4d70065e069a9dc031f14c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- CommentCommandTraits.h - Comment command properties ----*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//===----------------------------------------------------------------------===// 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// This file defines the class that provides information about comment 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// commands. 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//===----------------------------------------------------------------------===// 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_CLANG_AST_COMMENT_COMMAND_TRAITS_H 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define LLVM_CLANG_AST_COMMENT_COMMAND_TRAITS_H 18558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "clang/Basic/CommentOptions.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/Basic/LLVM.h" 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "llvm/ADT/SmallVector.h" 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "llvm/ADT/StringRef.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "llvm/Support/Allocator.h" 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/Support/ErrorHandling.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace comments { 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/// \brief Information about a single command. 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch/// 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// When reordering, adding or removing members please update the corresponding 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/// TableGen backend. 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct CommandInfo { 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned getID() const { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ID; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const char *Name; 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// Name of the command that ends the verbatim block. 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const char *EndCommandName; 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned ID : 8; 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// Number of word-like arguments for a given block command, except for 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \\param and \\tparam commands -- these have special argument parsers. 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned NumArgs : 4; 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is a inline command (of any kind). 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsInlineCommand : 1; 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is a block command (of any kind). 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsBlockCommand : 1; 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is introducing a brief documentation 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// paragraph (\\brief or an alias). 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsBriefCommand : 1; 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is \\returns or an alias. 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsReturnsCommand : 1; 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is introducing documentation for a function 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// parameter (\\param or an alias). 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsParamCommand : 1; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is introducing documentation for 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /// a template parameter (\\tparam or an alias). 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch unsigned IsTParamCommand : 1; 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// True if this command is \\throws or an alias. 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsThrowsCommand : 1; 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if this command is \\deprecated or an alias. 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsDeprecatedCommand : 1; 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \brief True if this is a \\headerfile-like command. 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsHeaderfileCommand : 1; 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// True if we don't want to warn about this command being passed an empty 803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// paragraph. Meaningful only for block commands. 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsEmptyParagraphAllowed : 1; 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \brief True if this command is a verbatim-like block command. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// A verbatim-like block command eats every character (except line starting 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// decorations) until matching end command is seen or comment end is hit. 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned IsVerbatimBlockCommand : 1; 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /// \brief True if this command is an end command for a verbatim-like block. 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned IsVerbatimBlockEndCommand : 1; 918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \brief True if this command is a verbatim line command. 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /// 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /// A verbatim-like line command eats everything until a newline is seen or 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// comment end is hit. 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch unsigned IsVerbatimLineCommand : 1; 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /// \brief True if this command contains a declaration for the entity being 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /// documented. 100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch /// 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /// For example: 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /// \code 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /// \fn void f(int a); 1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /// \endcode 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned IsDeclarationCommand : 1; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// \brief True if verbatim-like line command is a function declaration. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned IsFunctionDeclarationCommand : 1; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \brief True if block command is further describing a container API; such 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// as \@coclass, \@classdesign, etc. 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsRecordLikeDetailCommand : 1; 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \brief True if block command is a container API; such as \@interface. 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsRecordLikeDeclarationCommand : 1; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /// \brief True if this command is unknown. This \c CommandInfo object was 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// created during parsing. 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned IsUnknownCommand : 1; 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)/// This class provides information about commands that can be used 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/// in comments. 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class CommandTraits { 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)public: 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) enum KnownCommandIDs { 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define COMMENT_COMMAND(NAME) KCI_##NAME, 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "clang/AST/CommentCommandList.inc" 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#undef COMMENT_COMMAND 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) KCI_Last 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CommandTraits(llvm::BumpPtrAllocator &Allocator, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CommentOptions &CommentOptions); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void registerCommentOptions(const CommentOptions &CommentOptions); 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /// \returns a CommandInfo object for a given command name or 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// NULL if no CommandInfo object exists for this command. 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *getCommandInfoOrNULL(StringRef Name) const; 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *getCommandInfo(StringRef Name) const { 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (const CommandInfo *Info = getCommandInfoOrNULL(Name)) 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return Info; 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) llvm_unreachable("the command should be known"); 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *getTypoCorrectCommandInfo(StringRef Typo) const; 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *getCommandInfo(unsigned CommandID) const; 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *registerUnknownCommand(StringRef CommandName); 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *registerBlockCommand(StringRef CommandName); 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \returns a CommandInfo object for a given command name or 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /// NULL if \c Name is not a builtin command. 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const CommandInfo *getBuiltinCommandInfo(StringRef Name); 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// \returns a CommandInfo object for a given command ID or 1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// NULL if \c CommandID is not a builtin command. 1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static const CommandInfo *getBuiltinCommandInfo(unsigned CommandID); 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)private: 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CommandTraits(const CommandTraits &) LLVM_DELETED_FUNCTION; 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void operator=(const CommandTraits &) LLVM_DELETED_FUNCTION; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *getRegisteredCommandInfo(StringRef Name) const; 1693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const CommandInfo *getRegisteredCommandInfo(unsigned CommandID) const; 1703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CommandInfo *createCommandInfoWithName(StringRef CommandName); 1723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned NextID; 1743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /// Allocator for CommandInfo objects. 1763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) llvm::BumpPtrAllocator &Allocator; 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SmallVector<CommandInfo *, 4> RegisteredCommands; 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 1803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // end namespace comments 1823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // end namespace clang 1833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)