1243791Sdim//===--- ClangCommentHTMLTagsEmitter.cpp - Generate HTML tag list for Clang -=// 2243791Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6243791Sdim// 7243791Sdim//===----------------------------------------------------------------------===// 8243791Sdim// 9243791Sdim// This tablegen backend emits efficient matchers for HTML tags that are used 10243791Sdim// in documentation comments. 11243791Sdim// 12243791Sdim//===----------------------------------------------------------------------===// 13243791Sdim 14276479Sdim#include "TableGenBackends.h" 15243791Sdim#include "llvm/TableGen/Record.h" 16243791Sdim#include "llvm/TableGen/StringMatcher.h" 17249423Sdim#include "llvm/TableGen/TableGenBackend.h" 18243791Sdim#include <vector> 19243791Sdim 20243791Sdimusing namespace llvm; 21243791Sdim 22276479Sdimvoid clang::EmitClangCommentHTMLTags(RecordKeeper &Records, raw_ostream &OS) { 23243791Sdim std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag"); 24243791Sdim std::vector<StringMatcher::StringPair> Matches; 25276479Sdim for (Record *Tag : Tags) { 26288943Sdim Matches.emplace_back(Tag->getValueAsString("Spelling"), "return true;"); 27243791Sdim } 28243791Sdim 29249423Sdim emitSourceFileHeader("HTML tag name matcher", OS); 30243791Sdim 31243791Sdim OS << "bool isHTMLTagName(StringRef Name) {\n"; 32243791Sdim StringMatcher("Name", Matches, OS).Emit(); 33243791Sdim OS << " return false;\n" 34243791Sdim << "}\n\n"; 35243791Sdim} 36243791Sdim 37276479Sdimvoid clang::EmitClangCommentHTMLTagsProperties(RecordKeeper &Records, 38276479Sdim raw_ostream &OS) { 39243791Sdim std::vector<Record *> Tags = Records.getAllDerivedDefinitions("Tag"); 40243791Sdim std::vector<StringMatcher::StringPair> MatchesEndTagOptional; 41243791Sdim std::vector<StringMatcher::StringPair> MatchesEndTagForbidden; 42276479Sdim for (Record *Tag : Tags) { 43276479Sdim std::string Spelling = Tag->getValueAsString("Spelling"); 44243791Sdim StringMatcher::StringPair Match(Spelling, "return true;"); 45276479Sdim if (Tag->getValueAsBit("EndTagOptional")) 46243791Sdim MatchesEndTagOptional.push_back(Match); 47276479Sdim if (Tag->getValueAsBit("EndTagForbidden")) 48243791Sdim MatchesEndTagForbidden.push_back(Match); 49243791Sdim } 50243791Sdim 51249423Sdim emitSourceFileHeader("HTML tag properties", OS); 52243791Sdim 53243791Sdim OS << "bool isHTMLEndTagOptional(StringRef Name) {\n"; 54243791Sdim StringMatcher("Name", MatchesEndTagOptional, OS).Emit(); 55243791Sdim OS << " return false;\n" 56243791Sdim << "}\n\n"; 57243791Sdim 58243791Sdim OS << "bool isHTMLEndTagForbidden(StringRef Name) {\n"; 59243791Sdim StringMatcher("Name", MatchesEndTagForbidden, OS).Emit(); 60243791Sdim OS << " return false;\n" 61243791Sdim << "}\n\n"; 62243791Sdim} 63243791Sdim 64