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
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#include "TableGenBackends.h"
16c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko#include "llvm/TableGen/Record.h"
17c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko#include "llvm/TableGen/StringMatcher.h"
188f1fa25a9e9f3fa4f2d7ecc0a08ebb08c0c4e642Dmitri Gribenko#include "llvm/TableGen/TableGenBackend.h"
19c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko#include <vector>
20c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
21c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenkousing namespace llvm;
22c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid clang::EmitClangCommentHTMLTags(RecordKeeper &Records, raw_ostream &OS) {
24c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag");
25c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<StringMatcher::StringPair> Matches;
266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (Record *Tag : Tags) {
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    std::string Spelling = Tag->getValueAsString("Spelling");
28c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    Matches.push_back(StringMatcher::StringPair(Spelling, "return true;"));
29c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  }
30c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
318f1fa25a9e9f3fa4f2d7ecc0a08ebb08c0c4e642Dmitri Gribenko  emitSourceFileHeader("HTML tag name matcher", OS);
32c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
33c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "bool isHTMLTagName(StringRef Name) {\n";
34c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  StringMatcher("Name", Matches, OS).Emit();
35c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "  return false;\n"
36c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko     << "}\n\n";
37c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko}
38c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid clang::EmitClangCommentHTMLTagsProperties(RecordKeeper &Records,
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                               raw_ostream &OS) {
41c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag");
42c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<StringMatcher::StringPair> MatchesEndTagOptional;
43c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  std::vector<StringMatcher::StringPair> MatchesEndTagForbidden;
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (Record *Tag : Tags) {
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    std::string Spelling = Tag->getValueAsString("Spelling");
46c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko    StringMatcher::StringPair Match(Spelling, "return true;");
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Tag->getValueAsBit("EndTagOptional"))
48c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko      MatchesEndTagOptional.push_back(Match);
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Tag->getValueAsBit("EndTagForbidden"))
50c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko      MatchesEndTagForbidden.push_back(Match);
51c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  }
52c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
538f1fa25a9e9f3fa4f2d7ecc0a08ebb08c0c4e642Dmitri Gribenko  emitSourceFileHeader("HTML tag properties", OS);
54c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
55c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "bool isHTMLEndTagOptional(StringRef Name) {\n";
56c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  StringMatcher("Name", MatchesEndTagOptional, OS).Emit();
57c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "  return false;\n"
58c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko     << "}\n\n";
59c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
60c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "bool isHTMLEndTagForbidden(StringRef Name) {\n";
61c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  StringMatcher("Name", MatchesEndTagForbidden, OS).Emit();
62c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko  OS << "  return false;\n"
63c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko     << "}\n\n";
64c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko}
65c24a76e376a767edc14e60bed716396a84cb127aDmitri Gribenko
66