CommentCommandTraits.cpp revision 62290ae569016345b79d4e11dd93abc300e5a681
1aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko//===--- CommentCommandTraits.cpp - 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#include "clang/AST/CommentCommandTraits.h"
11aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#include "llvm/ADT/StringSwitch.h"
12aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
13aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace clang {
14aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkonamespace comments {
15aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
16aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko// TODO: tablegen
17aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
18aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkobool CommandTraits::isVerbatimBlockCommand(StringRef BeginName,
19aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko                                           StringRef &EndName) const {
20aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  const char *Result = llvm::StringSwitch<const char *>(BeginName)
21aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("code", "endcode")
22aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("verbatim", "endverbatim")
23aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("htmlonly", "endhtmlonly")
24aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("latexonly", "endlatexonly")
25aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("xmlonly", "endxmlonly")
26aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("manonly", "endmanonly")
27aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("rtfonly", "endrtfonly")
28aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
29aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("dot", "enddot")
30aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("msc", "endmsc")
31aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
32aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("f$", "f$") // Inline LaTeX formula
33aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("f[", "f]") // Displayed LaTeX formula
34aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Case("f{", "f}") // LaTeX environment
35aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
36aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    .Default(NULL);
37aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
38aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  if (Result) {
39aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    EndName = Result;
40aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    return true;
41aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  }
42aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
43aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  for (VerbatimBlockCommandVector::const_iterator
44aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko           I = VerbatimBlockCommands.begin(),
45aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko           E = VerbatimBlockCommands.end();
46aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko       I != E; ++I)
47aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    if (I->BeginName == BeginName) {
48aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko      EndName = I->EndName;
49aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko      return true;
50aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    }
51aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
52aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  return false;
53aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko}
54aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
55aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkobool CommandTraits::isVerbatimLineCommand(StringRef Name) const {
5662290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko  bool Result = isDeclarationCommand(Name) || llvm::StringSwitch<bool>(Name)
57aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("defgroup", true)
58aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("ingroup", true)
59aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("addtogroup", true)
60aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("weakgroup", true)
61aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("name", true)
62aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
63aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("section", true)
64aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("subsection", true)
65aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("subsubsection", true)
66aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("paragraph", true)
67aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
68aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("mainpage", true)
69aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("subpage", true)
70aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Case("ref", true)
71aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
72aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  .Default(false);
73aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
74aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  if (Result)
75aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    return true;
76aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
77aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  for (VerbatimLineCommandVector::const_iterator
78aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko           I = VerbatimLineCommands.begin(),
79aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko           E = VerbatimLineCommands.end();
80aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko       I != E; ++I)
81aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko    if (I->Name == Name)
82aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko      return true;
83aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
84aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  return false;
85aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko}
86aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
8762290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenkobool CommandTraits::isDeclarationCommand(StringRef Name) const {
8862290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko  return llvm::StringSwitch<bool>(Name)
8962290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      // Doxygen commands.
9062290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("fn", true)
9162290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("var", true)
9262290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("property", true)
9362290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("typedef", true)
9462290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko
9562290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("overload", true)
9662290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko
9762290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      // HeaderDoc commands.
9862290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("class", true)
9962290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("interface", true)
10062290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("protocol", true)
10162290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("category", true)
10262290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("template", true)
10362290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("function", true)
10462290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("method", true)
10562290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("callback", true)
10662290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("var", true)
10762290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("const", true)
10862290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("constant", true)
10962290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("property", true)
11062290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("struct", true)
11162290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("union", true)
11262290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("typedef", true)
11362290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Case("enum", true)
11462290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko
11562290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko      .Default(false);
11662290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko}
11762290ae569016345b79d4e11dd93abc300e5a681Dmitri Gribenko
118aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkovoid CommandTraits::addVerbatimBlockCommand(StringRef BeginName,
119aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko                                            StringRef EndName) {
120aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VerbatimBlockCommand VBC;
121aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VBC.BeginName = BeginName;
122aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VBC.EndName = EndName;
123aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VerbatimBlockCommands.push_back(VBC);
124aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko}
125aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
126aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenkovoid CommandTraits::addVerbatimLineCommand(StringRef Name) {
127aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VerbatimLineCommand VLC;
128aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VLC.Name = Name;
129aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko  VerbatimLineCommands.push_back(VLC);
130aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko}
131aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
132aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace comments
133aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko} // end namespace clang
134aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko
135