1aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===--- CommentCommandTraits.h - Comment command properties ----*- C++ -*-===// 2aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 3aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// The LLVM Compiler Infrastructure 4aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 5aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// This file is distributed under the University of Illinois Open Source 6aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// License. See LICENSE.TXT for details. 7aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 8aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===----------------------------------------------------------------------===// 9aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 10aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// This file defines the class that provides information about comment 11aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// commands. 12aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// 13aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===----------------------------------------------------------------------===// 14aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 15aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 16aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#ifndef LLVM_CLANG_AST_COMMENT_COMMAND_TRAITS_H 17aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#define LLVM_CLANG_AST_COMMENT_COMMAND_TRAITS_H 18aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 19aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "clang/Basic/LLVM.h" 20aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "llvm/ADT/StringRef.h" 21aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "llvm/ADT/SmallVector.h" 22e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "llvm/Support/Allocator.h" 23e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko#include "llvm/Support/ErrorHandling.h" 24aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 25aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace clang { 26aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace comments { 27aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 28e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko/// \brief Information about a single command. 29e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko/// 30e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko/// When reordering, adding or removing members please update the corresponding 31e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko/// TableGen backend. 32e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkostruct CommandInfo { 33e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned getID() const { 34e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return ID; 35e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 36e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 37e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const char *Name; 38e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 39e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// Name of the command that ends the verbatim block. 40e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const char *EndCommandName; 41e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 42e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned ID : 8; 43e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 44e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// Number of word-like arguments for a given block command, except for 45e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \\param and \\tparam commands -- these have special argument parsers. 46e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned NumArgs : 4; 47e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 48e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// True if this command is a inline command (of any kind). 49e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsInlineCommand : 1; 50e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 51e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// True if this command is a block command (of any kind). 52e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsBlockCommand : 1; 53e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 54e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// True if this command is introducing a brief documentation 55e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// paragraph (\\brief or an alias). 56e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsBriefCommand : 1; 57e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 58e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// True if this command is \\returns or an alias. 59e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsReturnsCommand : 1; 60e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 61e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// True if this command is introducing documentation for a function 62e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// parameter (\\param or an alias). 63e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsParamCommand : 1; 64d1db12540e572d6e3d998a4b770a6b2c7267d7fcDmitri Gribenko 65e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// True if this command is introducing documentation for 66e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// a template parameter (\\tparam or an alias). 67e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsTParamCommand : 1; 68e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko 69e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \brief True if this command is a verbatim-like block command. 70aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko /// 71aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko /// A verbatim-like block command eats every character (except line starting 72aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko /// decorations) until matching end command is seen or comment end is hit. 73e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsVerbatimBlockCommand : 1; 74aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 75e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \brief True if this command is an end command for a verbatim-like block. 76e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsVerbatimBlockEndCommand : 1; 77aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 78e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \brief True if this command is a verbatim line command. 79aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko /// 80aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko /// A verbatim-like line command eats everything until a newline is seen or 81aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko /// comment end is hit. 82e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsVerbatimLineCommand : 1; 83aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 84e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \brief True if this command contains a declaration for the entity being 85e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// documented. 8662290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko /// 8762290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko /// For example: 8862290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko /// \code 8962290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko /// \fn void f(int a); 9062290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko /// \endcode 91e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsDeclarationCommand : 1; 9262290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko 93e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \brief True if this command is unknown. This \c CommandInfo object was 94e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// created during parsing. 95e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned IsUnknownCommand : 1; 96e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko}; 97aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 98e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko/// This class provides information about commands that can be used 99e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko/// in comments. 100e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkoclass CommandTraits { 101e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenkopublic: 102e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko CommandTraits(llvm::BumpPtrAllocator &Allocator); 103aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 104e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \returns a CommandInfo object for a given command name or 105e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// NULL if no CommandInfo object exists for this command. 106e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const CommandInfo *getCommandInfoOrNULL(StringRef Name) const; 107aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 108e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const CommandInfo *getCommandInfo(StringRef Name) const { 109e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko if (const CommandInfo *Info = getCommandInfoOrNULL(Name)) 110e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko return Info; 111e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko llvm_unreachable("the command should be known"); 112e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko } 113aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 114e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const CommandInfo *getCommandInfo(unsigned CommandID) const; 115aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 116e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const CommandInfo *registerUnknownCommand(StringRef CommandName); 117aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 118e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \returns a CommandInfo object for a given command name or 119e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// NULL if \c Name is not a builtin command. 120e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko static const CommandInfo *getBuiltinCommandInfo(StringRef Name); 121aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 122e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// \returns a CommandInfo object for a given command ID or 123e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// NULL if \c CommandID is not a builtin command. 124e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko static const CommandInfo *getBuiltinCommandInfo(unsigned CommandID); 125aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 126aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkoprivate: 127e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko CommandTraits(const CommandTraits &) LLVM_DELETED_FUNCTION; 128e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko void operator=(const CommandTraits &) LLVM_DELETED_FUNCTION; 129aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 130e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const CommandInfo *getRegisteredCommandInfo(StringRef Name) const; 131e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko const CommandInfo *getRegisteredCommandInfo(unsigned CommandID) const; 132aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 133e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko unsigned NextID; 134aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 135e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko /// Allocator for CommandInfo objects. 136e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko llvm::BumpPtrAllocator &Allocator; 137aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 138e4330a302ac20b41b9800267ebd4b5b01f8553f8Dmitri Gribenko SmallVector<CommandInfo *, 4> RegisteredCommands; 139aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko}; 140aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 141aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace comments 142aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace clang 143aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 144aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#endif 145aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko 146