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 15276479Sdim#include "TableGenBackends.h" 16243791Sdim#include "llvm/TableGen/Record.h" 17243791Sdim#include "llvm/TableGen/StringMatcher.h" 18249423Sdim#include "llvm/TableGen/TableGenBackend.h" 19243791Sdim#include <vector> 20243791Sdim 21243791Sdimusing namespace llvm; 22243791Sdim 23276479Sdimvoid clang::EmitClangCommentHTMLTags(RecordKeeper &Records, raw_ostream &OS) { 24243791Sdim std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag"); 25243791Sdim std::vector<StringMatcher::StringPair> Matches; 26276479Sdim for (Record *Tag : Tags) { 27288943Sdim Matches.emplace_back(Tag->getValueAsString("Spelling"), "return true;"); 28243791Sdim } 29243791Sdim 30249423Sdim emitSourceFileHeader("HTML tag name matcher", OS); 31243791Sdim 32243791Sdim OS << "bool isHTMLTagName(StringRef Name) {\n"; 33243791Sdim StringMatcher("Name", Matches, OS).Emit(); 34243791Sdim OS << " return false;\n" 35243791Sdim << "}\n\n"; 36243791Sdim} 37243791Sdim 38276479Sdimvoid clang::EmitClangCommentHTMLTagsProperties(RecordKeeper &Records, 39276479Sdim raw_ostream &OS) { 40243791Sdim std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag"); 41243791Sdim std::vector<StringMatcher::StringPair> MatchesEndTagOptional; 42243791Sdim std::vector<StringMatcher::StringPair> MatchesEndTagForbidden; 43276479Sdim for (Record *Tag : Tags) { 44276479Sdim std::string Spelling = Tag->getValueAsString("Spelling"); 45243791Sdim StringMatcher::StringPair Match(Spelling, "return true;"); 46276479Sdim if (Tag->getValueAsBit("EndTagOptional")) 47243791Sdim MatchesEndTagOptional.push_back(Match); 48276479Sdim if (Tag->getValueAsBit("EndTagForbidden")) 49243791Sdim MatchesEndTagForbidden.push_back(Match); 50243791Sdim } 51243791Sdim 52249423Sdim emitSourceFileHeader("HTML tag properties", OS); 53243791Sdim 54243791Sdim OS << "bool isHTMLEndTagOptional(StringRef Name) {\n"; 55243791Sdim StringMatcher("Name", MatchesEndTagOptional, OS).Emit(); 56243791Sdim OS << " return false;\n" 57243791Sdim << "}\n\n"; 58243791Sdim 59243791Sdim OS << "bool isHTMLEndTagForbidden(StringRef Name) {\n"; 60243791Sdim StringMatcher("Name", MatchesEndTagForbidden, OS).Emit(); 61243791Sdim OS << " return false;\n" 62243791Sdim << "}\n\n"; 63243791Sdim} 64243791Sdim 65