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)