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