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