1c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//===--- ClangCommentHTMLTagsEmitter.cpp - Generate HTML tag list for Clang -=//
2c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//
3c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//                     The LLVM Compiler Infrastructure
4c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//
5c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko// This file is distributed under the University of Illinois Open Source
6c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko// License. See LICENSE.TXT for details.
7c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//
8c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//===----------------------------------------------------------------------===//
9c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//
10c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko// This tablegen backend emits efficient matchers for HTML tags that are used
11c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko// in documentation comments.
12c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//
13c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko//===----------------------------------------------------------------------===//
14c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
15c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko#include "llvm/TableGen/Record.h"
16c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko#include "llvm/TableGen/StringMatcher.h"
178f1fa25a9e9f3fa4f2d7ecc0a08ebb08c0c4e642Dmitri Gribenko#include "llvm/TableGen/TableGenBackend.h"
18c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko#include <vector>
19c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
20c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenkousing namespace llvm;
21c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
22c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenkonamespace clang {
23c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenkovoid EmitClangCommentHTMLTags(RecordKeeper &Records, raw_ostream &OS) {
24c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag");
25c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<StringMatcher::StringPair> Matches;
26c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  for (std::vector<Record *>::iterator I = Tags.begin(), E = Tags.end();
27c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko       I != E; ++I) {
28c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    Record &Tag = **I;
29c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    std::string Spelling = Tag.getValueAsString("Spelling");
30c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    Matches.push_back(StringMatcher::StringPair(Spelling, "return true;"));
31c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  }
32c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
338f1fa25a9e9f3fa4f2d7ecc0a08ebb08c0c4e642Dmitri Gribenko  emitSourceFileHeader("HTML tag name matcher", OS);
34c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
35c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "bool isHTMLTagName(StringRef Name) {\n";
36c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  StringMatcher("Name", Matches, OS).Emit();
37c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "  return false;\n"
38c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko     << "}\n\n";
39c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko}
40c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
41c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenkovoid EmitClangCommentHTMLTagsProperties(RecordKeeper &Records,
42c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko                                        raw_ostream &OS) {
43c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag");
44c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<StringMatcher::StringPair> MatchesEndTagOptional;
45c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<StringMatcher::StringPair> MatchesEndTagForbidden;
46c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  for (std::vector<Record *>::iterator I = Tags.begin(), E = Tags.end();
47c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko       I != E; ++I) {
48c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    Record &Tag = **I;
49c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    std::string Spelling = Tag.getValueAsString("Spelling");
50c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    StringMatcher::StringPair Match(Spelling, "return true;");
51c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    if (Tag.getValueAsBit("EndTagOptional"))
52c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko      MatchesEndTagOptional.push_back(Match);
53c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    if (Tag.getValueAsBit("EndTagForbidden"))
54c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko      MatchesEndTagForbidden.push_back(Match);
55c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  }
56c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
578f1fa25a9e9f3fa4f2d7ecc0a08ebb08c0c4e642Dmitri Gribenko  emitSourceFileHeader("HTML tag properties", OS);
58c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
59c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "bool isHTMLEndTagOptional(StringRef Name) {\n";
60c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  StringMatcher("Name", MatchesEndTagOptional, OS).Emit();
61c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "  return false;\n"
62c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko     << "}\n\n";
63c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
64c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "bool isHTMLEndTagForbidden(StringRef Name) {\n";
65c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  StringMatcher("Name", MatchesEndTagForbidden, OS).Emit();
66c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "  return false;\n"
67c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko     << "}\n\n";
68c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko}
69c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko} // end namespace clang
70c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
71