1243791Sdim//===--- ClangCommentHTMLTagsEmitter.cpp - Generate HTML tag list for Clang -=//
2243791Sdim//
3243791Sdim//                     The LLVM Compiler Infrastructure
4243791Sdim//
5243791Sdim// This file is distributed under the University of Illinois Open Source
6243791Sdim// License. See LICENSE.TXT for details.
7243791Sdim//
8243791Sdim//===----------------------------------------------------------------------===//
9243791Sdim//
10243791Sdim// This tablegen backend emits efficient matchers for HTML tags that are used
11243791Sdim// in documentation comments.
12243791Sdim//
13243791Sdim//===----------------------------------------------------------------------===//
14243791Sdim
15243791Sdim#include "llvm/TableGen/Record.h"
16243791Sdim#include "llvm/TableGen/StringMatcher.h"
17252723Sdim#include "llvm/TableGen/TableGenBackend.h"
18243791Sdim#include <vector>
19243791Sdim
20243791Sdimusing namespace llvm;
21243791Sdim
22243791Sdimnamespace clang {
23243791Sdimvoid EmitClangCommentHTMLTags(RecordKeeper &Records, raw_ostream &OS) {
24243791Sdim  std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag");
25243791Sdim  std::vector<StringMatcher::StringPair> Matches;
26243791Sdim  for (std::vector<Record *>::iterator I = Tags.begin(), E = Tags.end();
27243791Sdim       I != E; ++I) {
28243791Sdim    Record &Tag = **I;
29243791Sdim    std::string Spelling = Tag.getValueAsString("Spelling");
30243791Sdim    Matches.push_back(StringMatcher::StringPair(Spelling, "return true;"));
31243791Sdim  }
32243791Sdim
33252723Sdim  emitSourceFileHeader("HTML tag name matcher", OS);
34243791Sdim
35243791Sdim  OS << "bool isHTMLTagName(StringRef Name) {\n";
36243791Sdim  StringMatcher("Name", Matches, OS).Emit();
37243791Sdim  OS << "  return false;\n"
38243791Sdim     << "}\n\n";
39243791Sdim}
40243791Sdim
41243791Sdimvoid EmitClangCommentHTMLTagsProperties(RecordKeeper &Records,
42243791Sdim                                        raw_ostream &OS) {
43243791Sdim  std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag");
44243791Sdim  std::vector<StringMatcher::StringPair> MatchesEndTagOptional;
45243791Sdim  std::vector<StringMatcher::StringPair> MatchesEndTagForbidden;
46243791Sdim  for (std::vector<Record *>::iterator I = Tags.begin(), E = Tags.end();
47243791Sdim       I != E; ++I) {
48243791Sdim    Record &Tag = **I;
49243791Sdim    std::string Spelling = Tag.getValueAsString("Spelling");
50243791Sdim    StringMatcher::StringPair Match(Spelling, "return true;");
51243791Sdim    if (Tag.getValueAsBit("EndTagOptional"))
52243791Sdim      MatchesEndTagOptional.push_back(Match);
53243791Sdim    if (Tag.getValueAsBit("EndTagForbidden"))
54243791Sdim      MatchesEndTagForbidden.push_back(Match);
55243791Sdim  }
56243791Sdim
57252723Sdim  emitSourceFileHeader("HTML tag properties", OS);
58243791Sdim
59243791Sdim  OS << "bool isHTMLEndTagOptional(StringRef Name) {\n";
60243791Sdim  StringMatcher("Name", MatchesEndTagOptional, OS).Emit();
61243791Sdim  OS << "  return false;\n"
62243791Sdim     << "}\n\n";
63243791Sdim
64243791Sdim  OS << "bool isHTMLEndTagForbidden(StringRef Name) {\n";
65243791Sdim  StringMatcher("Name", MatchesEndTagForbidden, OS).Emit();
66243791Sdim  OS << "  return false;\n"
67243791Sdim     << "}\n\n";
68243791Sdim}
69243791Sdim} // end namespace clang
70243791Sdim
71