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