[clang-tools-extra] r369139 - [clang-doc] Redesign of generated HTML files

Julie Hockett via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 16 17:14:24 PDT 2019


Hi,

Would you have the cmake invocation? I think it's a fairly easy fix, but I
can't reproduce it locally so I don't know if I've actually solved it.

Thanks!
Julie

On Fri, Aug 16, 2019 at 4:43 PM Diego Astiazarán <diegoast at google.com>
wrote:

>
>
> ---------- Forwarded message ---------
> From: Diego Astiazarán <diegoaat97 at gmail.com>
> Date: Fri, Aug 16, 2019 at 4:37 PM
> Subject: Fwd: [clang-tools-extra] r369139 - [clang-doc] Redesign of
> generated HTML files
> To: <diegoast at google.com>
>
>
>
> ---------- Forwarded message ---------
> From: Hubert Tong <hubert.reinterpretcast at gmail.com>
> Date: Fri, Aug 16, 2019, 4:34 PM
> Subject: Re: [clang-tools-extra] r369139 - [clang-doc] Redesign of
> generated HTML files
> To: Diego Astiazaran <diegoaat97 at gmail.com>
> Cc: cfe-commits <cfe-commits at lists.llvm.org>
>
>
> This patch broke our GCC 5.4.0 builder:
> ```
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang-tools-extra/clang-doc/HTMLGenerator.cpp:9:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang-tools-extra/clang-doc/Generators.h:15:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang-tools-extra/clang-doc/Representation.h:17:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang/include/clang/AST/Type.h:20:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang/include/clang/AST/NestedNameSpecifier.h:17:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang/include/clang/Basic/Diagnostic.h:17:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang/include/clang/Basic/DiagnosticIDs.h:17:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang/include/clang/Basic/LLVM.h:21:
> In file included from
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/llvm/include/llvm/Support/Casting.h:20:
> In file included from
> /usr/lib/gcc/powerpc64le-linux-gnu/5.4.0/../../../../include/c++/5.4.0/memory:63:
> In file included from
> /usr/lib/gcc/powerpc64le-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/allocator.h:46:
> In file included from
> /usr/lib/gcc/powerpc64le-linux-gnu/5.4.0/../../../../include/powerpc64le-linux-gnu/c++/5.4.0/bits/c++allocator.h:33:
> /usr/lib/gcc/powerpc64le-linux-gnu/5.4.0/../../../../include/c++/5.4.0/ext/new_allocator.h:120:23:
> error: no matching constructor for initialization of
> 'std::pair<llvm::SmallString<16>, llvm::SmallString<16> >'
>         { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
>                              ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
> /usr/lib/gcc/powerpc64le-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/alloc_traits.h:530:8:
> note: in instantiation of function template specialization
> '__gnu_cxx::new_allocator<std::pair<llvm::SmallString<16>,
> llvm::SmallString<16> > >::construct<std::pair<llvm::SmallString<16>,
> llvm::SmallString<16> >, char const (&)[3],
> std::__cxx11::basic_string<char> >' requested here
>         { __a.construct(__p, std::forward<_Args>(__args)...); }
>               ^
> /usr/lib/gcc/powerpc64le-linux-gnu/5.4.0/../../../../include/c++/5.4.0/bits/vector.tcc:96:21:
> note: in instantiation of function template specialization
> 'std::allocator_traits<std::allocator<std::pair<llvm::SmallString<16>,
> llvm::SmallString<16> > > >::construct<std::pair<llvm::SmallString<16>,
> llvm::SmallString<16> >, char const (&)[3],
> std::__cxx11::basic_string<char> >' requested here
>             _Alloc_traits::construct(this->_M_impl,
> this->_M_impl._M_finish,
>                            ^
> /tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang-tools-extra/clang-doc/HTMLGenerator.cpp:647:26:
> note: in instantiation of function template specialization
> 'std::vector<std::pair<llvm::SmallString<16>, llvm::SmallString<16> >,
> std::allocator<std::pair<llvm::SmallString<16>, llvm::SmallString<16> > >
> >::emplace_back<char const (&)[3], std::__cxx11::basic_string<char> >'
> requested here
>   Out.back()->Attributes.emplace_back("id",
>                          ^
> ```
>
> -- HT
>
> On Fri, Aug 16, 2019 at 2:37 PM Diego Astiazaran via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: diegoastiazaran
>> Date: Fri Aug 16 11:38:11 2019
>> New Revision: 369139
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=369139&view=rev
>> Log:
>> [clang-doc] Redesign of generated HTML files
>>
>> The new design includes a header (contains the project name), a main
>> section, and a footer.
>> The main section is divided into three subsections. Left, middle, right.
>> The left section contains the general index, the middle contains the info's
>> data, and the right contains the index for the info's content.
>> The CSS has been updated.
>> A flag --project-name is added.
>> The Attributes attribute of the TagNode struct is now a vector of pairs
>> because these attributes should be rendered in the insertion order.
>> The functions (cpp and js) that converts an Index tree structure into
>> HTML were slightly modified; the first ul tag created is now a ol tag. The
>> inner lists are still ul.
>>
>> Differential Revision: https://reviews.llvm.org/D66353
>>
>> Modified:
>>     clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp
>>     clang-tools-extra/trunk/clang-doc/Representation.cpp
>>     clang-tools-extra/trunk/clang-doc/Representation.h
>>
>> clang-tools-extra/trunk/clang-doc/assets/clang-doc-default-stylesheet.css
>>     clang-tools-extra/trunk/clang-doc/assets/index.js
>>     clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp
>>     clang-tools-extra/trunk/docs/clang-doc.rst
>>     clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp
>>
>> Modified: clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp (original)
>> +++ clang-tools-extra/trunk/clang-doc/HTMLGenerator.cpp Fri Aug 16
>> 11:38:11 2019
>> @@ -8,6 +8,7 @@
>>
>>  #include "Generators.h"
>>  #include "Representation.h"
>> +#include "clang/Basic/Version.h"
>>  #include "llvm/ADT/StringExtras.h"
>>  #include "llvm/ADT/StringRef.h"
>>  #include "llvm/Support/FileSystem.h"
>> @@ -29,12 +30,16 @@ public:
>>    enum TagType {
>>      TAG_A,
>>      TAG_DIV,
>> +    TAG_FOOTER,
>>      TAG_H1,
>>      TAG_H2,
>>      TAG_H3,
>> +    TAG_HEADER,
>>      TAG_LI,
>>      TAG_LINK,
>> +    TAG_MAIN,
>>      TAG_META,
>> +    TAG_OL,
>>      TAG_P,
>>      TAG_SCRIPT,
>>      TAG_SPAN,
>> @@ -84,7 +89,7 @@ struct TagNode : public HTMLNode {
>>
>>    HTMLTag Tag; // Name of HTML Tag (p, div, h1)
>>    std::vector<std::unique_ptr<HTMLNode>> Children; // List of child nodes
>> -  llvm::StringMap<llvm::SmallString<16>>
>> +  std::vector<std::pair<llvm::SmallString<16>, llvm::SmallString<16>>>
>>        Attributes; // List of key-value attributes for tag
>>
>>    void Render(llvm::raw_ostream &OS, int IndentationLevel) override;
>> @@ -112,10 +117,14 @@ bool HTMLTag::IsSelfClosing() const {
>>      return true;
>>    case HTMLTag::TAG_A:
>>    case HTMLTag::TAG_DIV:
>> +  case HTMLTag::TAG_FOOTER:
>>    case HTMLTag::TAG_H1:
>>    case HTMLTag::TAG_H2:
>>    case HTMLTag::TAG_H3:
>> +  case HTMLTag::TAG_HEADER:
>>    case HTMLTag::TAG_LI:
>> +  case HTMLTag::TAG_MAIN:
>> +  case HTMLTag::TAG_OL:
>>    case HTMLTag::TAG_P:
>>    case HTMLTag::TAG_SCRIPT:
>>    case HTMLTag::TAG_SPAN:
>> @@ -132,18 +141,26 @@ llvm::SmallString<16> HTMLTag::ToString(
>>      return llvm::SmallString<16>("a");
>>    case HTMLTag::TAG_DIV:
>>      return llvm::SmallString<16>("div");
>> +  case HTMLTag::TAG_FOOTER:
>> +    return llvm::SmallString<16>("footer");
>>    case HTMLTag::TAG_H1:
>>      return llvm::SmallString<16>("h1");
>>    case HTMLTag::TAG_H2:
>>      return llvm::SmallString<16>("h2");
>>    case HTMLTag::TAG_H3:
>>      return llvm::SmallString<16>("h3");
>> +  case HTMLTag::TAG_HEADER:
>> +    return llvm::SmallString<16>("header");
>>    case HTMLTag::TAG_LI:
>>      return llvm::SmallString<16>("li");
>>    case HTMLTag::TAG_LINK:
>>      return llvm::SmallString<16>("link");
>> +  case HTMLTag::TAG_MAIN:
>> +    return llvm::SmallString<16>("main");
>>    case HTMLTag::TAG_META:
>>      return llvm::SmallString<16>("meta");
>> +  case HTMLTag::TAG_OL:
>> +    return llvm::SmallString<16>("ol");
>>    case HTMLTag::TAG_P:
>>      return llvm::SmallString<16>("p");
>>    case HTMLTag::TAG_SCRIPT:
>> @@ -174,7 +191,7 @@ void TagNode::Render(llvm::raw_ostream &
>>    OS.indent(IndentationLevel * 2);
>>    OS << "<" << Tag.ToString();
>>    for (const auto &A : Attributes)
>> -    OS << " " << A.getKey() << "=\"" << A.getValue() << "\"";
>> +    OS << " " << A.first << "=\"" << A.second << "\"";
>>    if (Tag.IsSelfClosing()) {
>>      OS << "/>";
>>      return;
>> @@ -255,13 +272,13 @@ genStylesheetsHTML(StringRef InfoPath, c
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    for (const auto &FilePath : CDCtx.UserStylesheets) {
>>      auto LinkNode = std::make_unique<TagNode>(HTMLTag::TAG_LINK);
>> -    LinkNode->Attributes.try_emplace("rel", "stylesheet");
>> +    LinkNode->Attributes.emplace_back("rel", "stylesheet");
>>      SmallString<128> StylesheetPath = computeRelativePath("", InfoPath);
>>      llvm::sys::path::append(StylesheetPath,
>>                              llvm::sys::path::filename(FilePath));
>>      // Paths in HTML must be in posix-style
>>      llvm::sys::path::native(StylesheetPath,
>> llvm::sys::path::Style::posix);
>> -    LinkNode->Attributes.try_emplace("href", StylesheetPath);
>> +    LinkNode->Attributes.emplace_back("href", StylesheetPath);
>>      Out.emplace_back(std::move(LinkNode));
>>    }
>>    return Out;
>> @@ -276,7 +293,7 @@ genJsScriptsHTML(StringRef InfoPath, con
>>      llvm::sys::path::append(ScriptPath,
>> llvm::sys::path::filename(FilePath));
>>      // Paths in HTML must be in posix-style
>>      llvm::sys::path::native(ScriptPath, llvm::sys::path::Style::posix);
>> -    ScriptNode->Attributes.try_emplace("src", ScriptPath);
>> +    ScriptNode->Attributes.emplace_back("src", ScriptPath);
>>      Out.emplace_back(std::move(ScriptNode));
>>    }
>>    return Out;
>> @@ -284,7 +301,7 @@ genJsScriptsHTML(StringRef InfoPath, con
>>
>>  static std::unique_ptr<TagNode> genLink(const Twine &Text, const Twine
>> &Link) {
>>    auto LinkNode = std::make_unique<TagNode>(HTMLTag::TAG_A, Text);
>> -  LinkNode->Attributes.try_emplace("href", Link.str());
>> +  LinkNode->Attributes.emplace_back("href", Link.str());
>>    return LinkNode;
>>  }
>>
>> @@ -333,7 +350,7 @@ genEnumsBlock(const std::vector<EnumInfo
>>
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_H2, "Enums"));
>> -  Out.back()->Attributes.try_emplace("id", "Enums");
>> +  Out.back()->Attributes.emplace_back("id", "Enums");
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_DIV));
>>    auto &DivBody = Out.back();
>>    for (const auto &E : Enums) {
>> @@ -362,7 +379,7 @@ genFunctionsBlock(const std::vector<Func
>>
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_H2,
>> "Functions"));
>> -  Out.back()->Attributes.try_emplace("id", "Functions");
>> +  Out.back()->Attributes.emplace_back("id", "Functions");
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_DIV));
>>    auto &DivBody = Out.back();
>>    for (const auto &F : Functions) {
>> @@ -381,7 +398,7 @@ genRecordMembersBlock(const llvm::SmallV
>>
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_H2,
>> "Members"));
>> -  Out.back()->Attributes.try_emplace("id", "Members");
>> +  Out.back()->Attributes.emplace_back("id", "Members");
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_UL));
>>    auto &ULBody = Out.back();
>>    for (const auto &M : Members) {
>> @@ -405,7 +422,7 @@ genReferencesBlock(const std::vector<Ref
>>
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_H2, Title));
>> -  Out.back()->Attributes.try_emplace("id", Title);
>> +  Out.back()->Attributes.emplace_back("id", Title);
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_UL));
>>    auto &ULBody = Out.back();
>>    for (const auto &R : References) {
>> @@ -431,23 +448,29 @@ writeFileDefinition(const Location &L,
>>        std::make_unique<TagNode>(HTMLTag::TAG_A,
>> std::to_string(L.LineNumber));
>>    // The links to a specific line in the source code use the github /
>>    // googlesource notation so it won't work for all hosting pages.
>> -  LocNumberNode->Attributes.try_emplace(
>> +  LocNumberNode->Attributes.emplace_back(
>>        "href", (FileURL + "#" + std::to_string(L.LineNumber)).str());
>>    Node->Children.emplace_back(std::move(LocNumberNode));
>>    Node->Children.emplace_back(std::make_unique<TextNode>(" of file "));
>>    auto LocFileNode = std::make_unique<TagNode>(
>>        HTMLTag::TAG_A, llvm::sys::path::filename(FileURL));
>> -  LocFileNode->Attributes.try_emplace("href", FileURL);
>> +  LocFileNode->Attributes.emplace_back("href", FileURL);
>>    Node->Children.emplace_back(std::move(LocFileNode));
>>    return Node;
>>  }
>>
>>  static std::vector<std::unique_ptr<TagNode>>
>> -genCommonFileNodes(StringRef Title, StringRef InfoPath,
>> -                   const ClangDocContext &CDCtx) {
>> +genHTML(const Index &Index, StringRef InfoPath, bool IsOutermostList);
>> +
>> +// Generates a list of child nodes for the HTML head tag
>> +// It contains a meta node, link nodes to import CSS files, and script
>> nodes to
>> +// import JS files
>> +static std::vector<std::unique_ptr<TagNode>>
>> +genFileHeadNodes(StringRef Title, StringRef InfoPath,
>> +                 const ClangDocContext &CDCtx) {
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    auto MetaNode = std::make_unique<TagNode>(HTMLTag::TAG_META);
>> -  MetaNode->Attributes.try_emplace("charset", "utf-8");
>> +  MetaNode->Attributes.emplace_back("charset", "utf-8");
>>    Out.emplace_back(std::move(MetaNode));
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_TITLE, Title));
>>    std::vector<std::unique_ptr<TagNode>> StylesheetsNodes =
>> @@ -456,14 +479,87 @@ genCommonFileNodes(StringRef Title, Stri
>>    std::vector<std::unique_ptr<TagNode>> JsNodes =
>>        genJsScriptsHTML(InfoPath, CDCtx);
>>    AppendVector(std::move(JsNodes), Out);
>> -  // An empty <div> is generated but the index will be then rendered here
>> -  auto IndexNode = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
>> -  IndexNode->Attributes.try_emplace("id", "index");
>> -  IndexNode->Attributes.try_emplace("path", InfoPath);
>> -  Out.emplace_back(std::move(IndexNode));
>>    return Out;
>>  }
>>
>> +// Generates a header HTML node that can be used for any file
>> +// It contains the project name
>> +static std::unique_ptr<TagNode> genFileHeaderNode(StringRef ProjectName)
>> {
>> +  auto HeaderNode = std::make_unique<TagNode>(HTMLTag::TAG_HEADER,
>> ProjectName);
>> +  HeaderNode->Attributes.emplace_back("id", "project-title");
>> +  return HeaderNode;
>> +}
>> +
>> +// Generates a main HTML node that has all the main content of an info
>> file
>> +// It contains both indexes and the info's documented information
>> +// This function should only be used for the info files (not for the
>> file that
>> +// only has the general index)
>> +static std::unique_ptr<TagNode> genInfoFileMainNode(
>> +    StringRef InfoPath,
>> +    std::vector<std::unique_ptr<TagNode>> &MainContentInnerNodes,
>> +    const Index &InfoIndex) {
>> +  auto MainNode = std::make_unique<TagNode>(HTMLTag::TAG_MAIN);
>> +
>> +  auto LeftSidebarNode = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
>> +  LeftSidebarNode->Attributes.emplace_back("id", "sidebar-left");
>> +  LeftSidebarNode->Attributes.emplace_back("path", InfoPath);
>> +  LeftSidebarNode->Attributes.emplace_back(
>> +      "class", "col-xs-6 col-sm-3 col-md-2 sidebar
>> sidebar-offcanvas-left");
>> +
>> +  auto MainContentNode = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
>> +  MainContentNode->Attributes.emplace_back("id", "main-content");
>> +  MainContentNode->Attributes.emplace_back(
>> +      "class", "col-xs-12 col-sm-9 col-md-8 main-content");
>> +  AppendVector(std::move(MainContentInnerNodes),
>> MainContentNode->Children);
>> +
>> +  auto RightSidebarNode = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
>> +  RightSidebarNode->Attributes.emplace_back("id", "sidebar-right");
>> +  RightSidebarNode->Attributes.emplace_back(
>> +      "class", "col-xs-6 col-sm-6 col-md-2 sidebar
>> sidebar-offcanvas-right");
>> +  std::vector<std::unique_ptr<TagNode>> InfoIndexHTML =
>> +      genHTML(InfoIndex, InfoPath, true);
>> +  AppendVector(std::move(InfoIndexHTML), RightSidebarNode->Children);
>> +
>> +  MainNode->Children.emplace_back(std::move(LeftSidebarNode));
>> +  MainNode->Children.emplace_back(std::move(MainContentNode));
>> +  MainNode->Children.emplace_back(std::move(RightSidebarNode));
>> +
>> +  return MainNode;
>> +}
>> +
>> +// Generates a footer HTML node that can be used for any file
>> +// It contains clang-doc's version
>> +static std::unique_ptr<TagNode> genFileFooterNode() {
>> +  auto FooterNode = std::make_unique<TagNode>(HTMLTag::TAG_FOOTER);
>> +  auto SpanNode = std::make_unique<TagNode>(
>> +      HTMLTag::TAG_SPAN, clang::getClangToolFullVersion("clang-doc"));
>> +  SpanNode->Attributes.emplace_back("class", "no-break");
>> +  FooterNode->Children.emplace_back(std::move(SpanNode));
>> +  return FooterNode;
>> +}
>> +
>> +// Generates a complete HTMLFile for an Info
>> +static HTMLFile
>> +genInfoFile(StringRef Title, StringRef InfoPath,
>> +            std::vector<std::unique_ptr<TagNode>> &MainContentNodes,
>> +            const Index &InfoIndex, const ClangDocContext &CDCtx) {
>> +  HTMLFile F;
>> +
>> +  std::vector<std::unique_ptr<TagNode>> HeadNodes =
>> +      genFileHeadNodes(Title, InfoPath, CDCtx);
>> +  std::unique_ptr<TagNode> HeaderNode =
>> genFileHeaderNode(CDCtx.ProjectName);
>> +  std::unique_ptr<TagNode> MainNode =
>> +      genInfoFileMainNode(InfoPath, MainContentNodes, InfoIndex);
>> +  std::unique_ptr<TagNode> FooterNode = genFileFooterNode();
>> +
>> +  AppendVector(std::move(HeadNodes), F.Children);
>> +  F.Children.emplace_back(std::move(HeaderNode));
>> +  F.Children.emplace_back(std::move(MainNode));
>> +  F.Children.emplace_back(std::move(FooterNode));
>> +
>> +  return F;
>> +}
>> +
>>  template <typename T,
>>            typename = std::enable_if<std::is_base_of<T, Info>::value>>
>>  static Index genInfoIndexItem(const std::vector<T> &Infos, StringRef
>> Title) {
>> @@ -474,8 +570,8 @@ static Index genInfoIndexItem(const std:
>>    return Idx;
>>  }
>>
>> -static std::vector<std::unique_ptr<TagNode>> genHTML(const Index &Index,
>> -                                                     StringRef InfoPath)
>> {
>> +static std::vector<std::unique_ptr<TagNode>>
>> +genHTML(const Index &Index, StringRef InfoPath, bool IsOutermostList) {
>>    std::vector<std::unique_ptr<TagNode>> Out;
>>    if (!Index.Name.empty()) {
>>      Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_SPAN));
>> @@ -488,11 +584,13 @@ static std::vector<std::unique_ptr<TagNo
>>    }
>>    if (Index.Children.empty())
>>      return Out;
>> -  Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_UL));
>> +  // Only the outermost list should use ol, the others should use ul
>> +  HTMLTag ListHTMLTag = IsOutermostList ? HTMLTag::TAG_OL :
>> HTMLTag::TAG_UL;
>> +  Out.emplace_back(std::make_unique<TagNode>(ListHTMLTag));
>>    const auto &UlBody = Out.back();
>>    for (const auto &C : Index.Children) {
>>      auto LiBody = std::make_unique<TagNode>(HTMLTag::TAG_LI);
>> -    std::vector<std::unique_ptr<TagNode>> Nodes = genHTML(C, InfoPath);
>> +    std::vector<std::unique_ptr<TagNode>> Nodes = genHTML(C, InfoPath,
>> false);
>>      AppendVector(std::move(Nodes), LiBody->Children);
>>      UlBody->Children.emplace_back(std::move(LiBody));
>>    }
>> @@ -546,8 +644,8 @@ genHTML(const EnumInfo &I, const ClangDo
>>
>>    Out.emplace_back(
>>        std::make_unique<TagNode>(HTMLTag::TAG_H3, EnumType + I.Name));
>> -  Out.back()->Attributes.try_emplace("id",
>> -
>>  llvm::toHex(llvm::toStringRef(I.USR)));
>> +  Out.back()->Attributes.emplace_back("id",
>> +
>> llvm::toHex(llvm::toStringRef(I.USR)));
>>
>>    std::unique_ptr<TagNode> Node = genEnumMembersBlock(I.Members);
>>    if (Node)
>> @@ -575,8 +673,8 @@ genHTML(const FunctionInfo &I, const Cla
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_H3, I.Name));
>>    // USR is used as id for functions instead of name to disambiguate
>> function
>>    // overloads.
>> -  Out.back()->Attributes.try_emplace("id",
>> -
>>  llvm::toHex(llvm::toStringRef(I.USR)));
>> +  Out.back()->Attributes.emplace_back("id",
>> +
>> llvm::toHex(llvm::toStringRef(I.USR)));
>>
>>    Out.emplace_back(std::make_unique<TagNode>(HTMLTag::TAG_P));
>>    auto &FunctionHeader = Out.back();
>> @@ -738,48 +836,32 @@ const char *HTMLGenerator::Format = "htm
>>
>>  llvm::Error HTMLGenerator::generateDocForInfo(Info *I, llvm::raw_ostream
>> &OS,
>>                                                const ClangDocContext
>> &CDCtx) {
>> -  HTMLFile F;
>>    std::string InfoTitle;
>> -  auto MainContentNode = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
>> +  std::vector<std::unique_ptr<TagNode>> MainContentNodes;
>>    Index InfoIndex;
>>    switch (I->IT) {
>> -  case InfoType::IT_namespace: {
>> -    std::vector<std::unique_ptr<TagNode>> Nodes =
>> -        genHTML(*static_cast<clang::doc::NamespaceInfo *>(I), InfoIndex,
>> CDCtx,
>> -                InfoTitle);
>> -    AppendVector(std::move(Nodes), MainContentNode->Children);
>> +  case InfoType::IT_namespace:
>> +    MainContentNodes = genHTML(*static_cast<clang::doc::NamespaceInfo
>> *>(I),
>> +                               InfoIndex, CDCtx, InfoTitle);
>>      break;
>> -  }
>> -  case InfoType::IT_record: {
>> -    std::vector<std::unique_ptr<TagNode>> Nodes = genHTML(
>> -        *static_cast<clang::doc::RecordInfo *>(I), InfoIndex, CDCtx,
>> InfoTitle);
>> -    AppendVector(std::move(Nodes), MainContentNode->Children);
>> +  case InfoType::IT_record:
>> +    MainContentNodes = genHTML(*static_cast<clang::doc::RecordInfo *>(I),
>> +                               InfoIndex, CDCtx, InfoTitle);
>>      break;
>> -  }
>> -  case InfoType::IT_enum: {
>> -    std::vector<std::unique_ptr<TagNode>> Nodes =
>> -        genHTML(*static_cast<clang::doc::EnumInfo *>(I), CDCtx);
>> -    AppendVector(std::move(Nodes), MainContentNode->Children);
>> +  case InfoType::IT_enum:
>> +    MainContentNodes = genHTML(*static_cast<clang::doc::EnumInfo *>(I),
>> CDCtx);
>>      break;
>> -  }
>> -  case InfoType::IT_function: {
>> -    std::vector<std::unique_ptr<TagNode>> Nodes =
>> +  case InfoType::IT_function:
>> +    MainContentNodes =
>>          genHTML(*static_cast<clang::doc::FunctionInfo *>(I), CDCtx, "");
>> -    AppendVector(std::move(Nodes), MainContentNode->Children);
>>      break;
>> -  }
>>    case InfoType::IT_default:
>>      return llvm::make_error<llvm::StringError>("Unexpected info type.\n",
>>
>> llvm::inconvertibleErrorCode());
>>    }
>>
>> -  std::vector<std::unique_ptr<TagNode>> BasicNodes =
>> -      genCommonFileNodes(InfoTitle, I->Path, CDCtx);
>> -  AppendVector(std::move(BasicNodes), F.Children);
>> -  std::vector<std::unique_ptr<TagNode>> InfoIndexHTML =
>> -      genHTML(InfoIndex, I->Path);
>> -  AppendVector(std::move(InfoIndexHTML), F.Children);
>> -  F.Children.emplace_back(std::move(MainContentNode));
>> +  HTMLFile F =
>> +      genInfoFile(InfoTitle, I->Path, MainContentNodes, InfoIndex,
>> CDCtx);
>>    F.Render(OS);
>>
>>    return llvm::Error::success();
>> @@ -832,6 +914,24 @@ static bool SerializeIndex(ClangDocConte
>>    return true;
>>  }
>>
>> +// Generates a main HTML node that has the main content of the file that
>> shows
>> +// only the general index
>> +// It contains the general index with links to all the generated files
>> +static std::unique_ptr<TagNode> genIndexFileMainNode() {
>> +  auto MainNode = std::make_unique<TagNode>(HTMLTag::TAG_MAIN);
>> +
>> +  auto LeftSidebarNode = std::make_unique<TagNode>(HTMLTag::TAG_DIV);
>> +  LeftSidebarNode->Attributes.emplace_back("id", "sidebar-left");
>> +  LeftSidebarNode->Attributes.emplace_back("path", "");
>> +  LeftSidebarNode->Attributes.emplace_back(
>> +      "class", "col-xs-6 col-sm-3 col-md-2 sidebar
>> sidebar-offcanvas-left");
>> +  LeftSidebarNode->Attributes.emplace_back("style", "flex: 0 100%;");
>> +
>> +  MainNode->Children.emplace_back(std::move(LeftSidebarNode));
>> +
>> +  return MainNode;
>> +}
>> +
>>  static bool GenIndex(const ClangDocContext &CDCtx) {
>>    std::error_code FileErr, OK;
>>    llvm::SmallString<128> IndexPath;
>> @@ -842,11 +942,22 @@ static bool GenIndex(const ClangDocConte
>>      llvm::errs() << "Error creating main index: " << FileErr.message()
>> << "\n";
>>      return false;
>>    }
>> +
>>    HTMLFile F;
>> -  std::vector<std::unique_ptr<TagNode>> BasicNodes =
>> -      genCommonFileNodes("Index", "", CDCtx);
>> -  AppendVector(std::move(BasicNodes), F.Children);
>> +
>> +  std::vector<std::unique_ptr<TagNode>> HeadNodes =
>> +      genFileHeadNodes("Index", "", CDCtx);
>> +  std::unique_ptr<TagNode> HeaderNode =
>> genFileHeaderNode(CDCtx.ProjectName);
>> +  std::unique_ptr<TagNode> MainNode = genIndexFileMainNode();
>> +  std::unique_ptr<TagNode> FooterNode = genFileFooterNode();
>> +
>> +  AppendVector(std::move(HeadNodes), F.Children);
>> +  F.Children.emplace_back(std::move(HeaderNode));
>> +  F.Children.emplace_back(std::move(MainNode));
>> +  F.Children.emplace_back(std::move(FooterNode));
>> +
>>    F.Render(IndexOS);
>> +
>>    return true;
>>  }
>>
>>
>> Modified: clang-tools-extra/trunk/clang-doc/Representation.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/Representation.cpp?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/clang-doc/Representation.cpp (original)
>> +++ clang-tools-extra/trunk/clang-doc/Representation.cpp Fri Aug 16
>> 11:38:11 2019
>> @@ -274,12 +274,14 @@ void Index::sort() {
>>  }
>>
>>  ClangDocContext::ClangDocContext(tooling::ExecutionContext *ECtx,
>> -                                 bool PublicOnly, StringRef OutDirectory,
>> -                                 StringRef SourceRoot, StringRef
>> RepositoryUrl,
>> +                                 StringRef ProjectName, bool PublicOnly,
>> +                                 StringRef OutDirectory, StringRef
>> SourceRoot,
>> +                                 StringRef RepositoryUrl,
>>                                   std::vector<std::string>
>> UserStylesheets,
>>                                   std::vector<std::string> JsScripts)
>> -    : ECtx(ECtx), PublicOnly(PublicOnly), OutDirectory(OutDirectory),
>> -      UserStylesheets(UserStylesheets), JsScripts(JsScripts) {
>> +    : ECtx(ECtx), ProjectName(ProjectName), PublicOnly(PublicOnly),
>> +      OutDirectory(OutDirectory), UserStylesheets(UserStylesheets),
>> +      JsScripts(JsScripts) {
>>    llvm::SmallString<128> SourceRootDir(SourceRoot);
>>    if (SourceRoot.empty())
>>      // If no SourceRoot was provided the current path is used as the
>> default
>>
>> Modified: clang-tools-extra/trunk/clang-doc/Representation.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/Representation.h?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/clang-doc/Representation.h (original)
>> +++ clang-tools-extra/trunk/clang-doc/Representation.h Fri Aug 16
>> 11:38:11 2019
>> @@ -413,12 +413,13 @@ mergeInfos(std::vector<std::unique_ptr<I
>>
>>  struct ClangDocContext {
>>    ClangDocContext() = default;
>> -  ClangDocContext(tooling::ExecutionContext *ECtx, bool PublicOnly,
>> -                  StringRef OutDirectory, StringRef SourceRoot,
>> +  ClangDocContext(tooling::ExecutionContext *ECtx, StringRef ProjectName,
>> +                  bool PublicOnly, StringRef OutDirectory, StringRef
>> SourceRoot,
>>                    StringRef RepositoryUrl,
>>                    std::vector<std::string> UserStylesheets,
>>                    std::vector<std::string> JsScripts);
>>    tooling::ExecutionContext *ECtx;
>> +  std::string ProjectName; // Name of project clang-doc is documenting.
>>    bool PublicOnly; // Indicates if only public declarations are
>> documented.
>>    std::string OutDirectory; // Directory for outputting generated files.
>>    std::string SourceRoot;   // Directory where processed files are
>> stored. Links
>>
>> Modified:
>> clang-tools-extra/trunk/clang-doc/assets/clang-doc-default-stylesheet.css
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/assets/clang-doc-default-stylesheet.css?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> ---
>> clang-tools-extra/trunk/clang-doc/assets/clang-doc-default-stylesheet.css
>> (original)
>> +++
>> clang-tools-extra/trunk/clang-doc/assets/clang-doc-default-stylesheet.css
>> Fri Aug 16 11:38:11 2019
>> @@ -1,205 +1,969 @@
>> -body,div {
>> +.dark-primary-color    { background: #1976D2; }
>> +.default-primary-color { background: #2196F3; }
>> +.light-primary-color   { background: #BBDEFB; }
>> +.text-primary-color    { color: #FFFFFF; }
>> +.accent-color          { background: #00BCD4; }
>> +.primary-text-color    { color: #212121; }
>> +.secondary-text-color  { color: #727272; }
>> +.divider-color         { border-color: #B6B6B6; }
>> +
>> +/* for layout */
>> +html,
>> +body {
>>    margin: 0;
>>    padding: 0;
>> +  height: 100%;
>> +  width: 100%;
>> +  overflow: hidden;
>> +  box-sizing: border-box;
>>  }
>>
>> -body[no-overflow] {
>> -  overflow: hidden;
>> +*, *:before, *:after {
>> +  box-sizing: inherit;
>>  }
>>
>> -li>p:first-child {
>> -  margin-top: 0;
>> +body {
>> +  display: flex;
>> +  flex-direction: column;
>> +  min-height: 100vh;
>> +}
>> +
>> +header {
>> +  flex: 0 0 50px;
>> +  display: flex;
>> +  flex-direction: row;
>> +  align-items: center;
>> +  padding-left: 30px;
>>  }
>>
>> -li>p:last-child {
>> -  margin-bottom: 0;
>> +header ol {
>> +  list-style: none;
>> +  margin: 0;
>> +  padding: 0;
>>  }
>>
>> -html {
>> -  -webkit-box-sizing: border-box;
>> -  box-sizing: border-box;
>> +header ol li {
>> +  display: inline;
>>  }
>>
>> -*,*::before,*::after {
>> -  -webkit-box-sizing: inherit;
>> -  box-sizing: inherit;
>> +header form {
>> +  display: flex;
>> +  flex: 1;
>> +  justify-content: flex-end;
>> +  padding-right: 30px;
>>  }
>>
>> -body,html {
>> -  color: #202124;
>> -  font: 400 16px/24px Roboto,sans-serif;
>> -  -moz-osx-font-smoothing: grayscale;
>> -  -webkit-font-smoothing: antialiased;
>> -  height: 100%;
>> -  margin: 36px;
>> -  -webkit-text-size-adjust: 100%;
>> -  -moz-text-size-adjust: 100%;
>> -  -ms-text-size-adjust: 100%;
>> -  text-size-adjust: 100%;
>> +header#header-search-sidebar {
>> +  height: 50px;
>> +  margin-bottom: 25px;
>>  }
>>
>> -body[devsite-framebox] {
>> -  overflow: hidden;
>> +footer {
>> +  flex: 0 0 16px;
>> +  text-align: center;
>> +  padding: 16px 20px;
>> +}
>> +
>> +main {
>> +  flex: 1;
>> +  display: flex;
>> +  flex-direction: row;
>>    padding: 20px;
>> +  min-height: 0;
>>  }
>>
>> -body[sitemask--active] {
>> -  overflow: hidden;
>> +.sidebar-offcanvas-left {
>> +  flex: 0 1 230px;
>> +  overflow-y: scroll;
>> +  padding: 20px 0 15px 30px;
>> +  margin: 5px 20px 0 0;
>> +  visibility: visible; /* shown by Javascript after scroll position
>> restore */
>>  }
>>
>> -p {
>> -  margin: 16px 0;
>> +::-webkit-scrollbar-button{ display: none; height: 13px; border-radius:
>> 0px; background-color: #AAA; }
>> +::-webkit-scrollbar-button:hover{ background-color: #AAA; }
>> +::-webkit-scrollbar-thumb{ background-color: #CCC; }
>> +::-webkit-scrollbar-thumb:hover{ background-color: #CCC; }
>> +::-webkit-scrollbar{ width: 4px; }
>> +/* ::-webkit-overflow-scrolling: touch; */
>> +
>> +.main-content::-webkit-scrollbar{ width: 8px; }
>> +
>> +.main-content {
>> +  flex: 1;
>> +  overflow-y: scroll;
>> +  padding: 10px 20px 0 20px;
>> +  visibility: visible; /* shown by Javascript after scroll position
>> restore */
>> +}
>> +
>> +.sidebar-offcanvas-right {
>> +  flex: 0 1 12em;
>> +  overflow-y: scroll;
>> +  padding: 20px 15px 15px 15px;
>> +  margin-top: 5px;
>> +  margin-right: 20px;
>> +  visibility: visible; /* shown by Javascript after scroll position
>> restore */
>> +}
>> +/* end for layout */
>> +
>> +body {
>> +  -webkit-text-size-adjust: 100%;
>> +  overflow-x: hidden;
>> +  font-family: Roboto, sans-serif;
>> +  font-size: 16px;
>> +  line-height: 1.42857143;
>> +  color: #111111;
>> +  background-color: #fff;
>> +}
>> +
>> +/* some of this is to reset bootstrap */
>> +nav.navbar {
>> +  background-color: inherit;
>> +  min-height: 50px;
>> +  border: 0;
>> +}
>> +
>> + at media (max-width: 768px) {
>> +  .hidden-xs {
>> +    display: none !important;
>> +  }
>> +}
>> +
>> + at media (min-width: 769px) {
>> +  .hidden-l {
>> +    display: none !important;
>> +  }
>> +}
>> +
>> +nav.navbar .row {
>> +  padding-top: 8px;
>> +}
>> +
>> +nav .container {
>> +  white-space: nowrap;
>> +}
>> +
>> +header {
>> +  background-color: #eeeeee;
>> +  box-shadow: 0 3px 5px rgba(0,0,0,0.1);
>> +}
>> +
>> +header#project-title {
>> +  background-color: #fff;
>> +  font-size: 200%;
>> +  padding-top: 0.25em;
>> +  padding-bottom: 0.25em;
>> +  /* padding: 0em; */
>> +}
>> +
>> +header.header-fixed nav.navbar-fixed-top {
>> +  box-shadow: 0 3px 5px rgba(0,0,0,0.1);
>> +}
>> +
>> +header.container-fluid {
>>    padding: 0;
>>  }
>>
>> -:link,:visited {
>> -  color: #039be5;
>> -  outline: 0;
>> +header .masthead {
>> +  padding-top: 64px;
>> +}
>> +
>> +header .contents {
>> +  padding: 0;
>> +}
>> +
>> + at media screen and (max-width:768px) {
>> +  header .contents {
>> +    padding-left: 15px;
>> +    padding-right: 15px;
>> +  }
>> +}
>> +
>> +a {
>>    text-decoration: none;
>>  }
>>
>> -ul {
>> +.body {
>> +  margin-top: 90px;
>> +}
>> +
>> +section {
>> +  margin-bottom: 36px;
>> +}
>> +
>> +dl {
>>    margin: 0;
>> -  padding-left: 40px;
>>  }
>>
>> -ul {
>> -  list-style: disc outside;
>> +h1,
>> +h2,
>> +h3,
>> +h4,
>> +h5,
>> +h6 {
>> +  font-family: Roboto, sans-serif;
>> +  font-weight: 400;
>> +  margin-top: 1.5em;
>> +  color: #111111;
>>  }
>>
>> -li,li p {
>> -  margin: 12px 0;
>> -  padding: 0;
>> +h1.title {
>> +  overflow: hidden;
>> +  text-overflow: ellipsis;
>>  }
>>
>> -*[visually-hidden] {
>> -  opacity: 0 !important;
>> -  pointer-events: none !important;
>> -  visibility: hidden !important;
>> +h1 {
>> +  font-size: 37px;
>> +  margin-top: 0;
>> +  margin-bottom: 0.67em;
>>  }
>>
>> -*[hidden] {
>> -  display: none !important;
>> +h2 {
>> +  font-size: 28px;
>>  }
>>
>> -[render-hidden] {
>> -  display: inline !important;
>> -  position: absolute !important;
>> -  visibility: hidden !important;
>> +h5 {
>> +  font-size: 16px;
>>  }
>>
>> -*[no-scroll] {
>> -  overflow: hidden;
>> +.subtitle {
>> +  font-size: 17px;
>> +  min-height: 1.4em;
>> +}
>> +
>> +.title-description .subtitle {
>> +  white-space: nowrap;
>> +  overflow-x: hidden;
>> +  text-overflow: ellipsis;
>> +}
>> +
>> +p {
>> +  margin-bottom: 1em;
>> +  margin-top: 0;
>> +}
>> +
>> +a {
>> +  color: #0175C2;
>> +}
>> +
>> +a:hover {
>> +  color: #13B9FD;
>> +}
>> +
>> +pre.prettyprint {
>> +  font-family: 'Source Code Pro', Menlo, monospace;
>> +  color: black;
>> +  border-radius: 0;
>> +  font-size: 15px;
>> +  word-wrap: normal;
>> +  line-height: 1.4;
>> +  border: 0;
>> +  margin: 16px 0 16px 0;
>> +  padding: 8px;
>> +}
>> +
>> +pre code {
>> +  white-space: pre;
>> +  word-wrap: initial;
>> +  font-size: 100%
>> +}
>> +
>> +.fixed {
>> +  white-space: pre;
>> +}
>> +
>> +pre {
>> +  border: 1px solid #ddd;
>> +  background-color: #eee;
>> +  font-size: 14px;
>> +}
>> +
>> +code {
>> +  font-family: 'Source Code Pro', Menlo, monospace;
>> +  /* overriding bootstrap */
>> +  color: inherit;
>> +  padding: 0.2em 0.4em;
>> +  font-size: 85%;
>> +  background-color: rgba(27,31,35,0.05);
>> +  border-radius: 3px;
>>  }
>>
>> - at supports (display: flex) {
>> -  body[ready] .devsite-wrapper {
>> -    display: -webkit-box;
>> -    display: -ms-flexbox;
>> -    display: flex;
>> -    -webkit-box-orient: vertical;
>> -    -webkit-box-direction: normal;
>> -    -ms-flex-direction: column;
>> -    flex-direction: column;
>> + at media(max-width: 768px) {
>> +  nav .container {
>> +    width: 100%
>> +  }
>> +
>> +  h1 {
>> +    font-size: 24px;
>> +  }
>> +
>> +  pre {
>> +    margin: 16px 0;
>>    }
>>  }
>>
>> - at media screen and (max-width: 840px) {
>> -  body[devsite-book-nav--open] {
>> -    overflow: hidden;
>> + at media (min-width: 768px) {
>> +  ul.subnav li {
>> +    font-size: 17px;
>>    }
>>  }
>>
>> -h1,h2,h3,h4,h5,h6 {
>> -  overflow: hidden;
>> -  padding: 0;
>> +header h1 {
>> +  font-weight: 400;
>> +  margin-bottom: 16px;
>> +}
>> +
>> +header a,
>> +header p,
>> +header li {
>> +  color: #111111;
>> +}
>> +
>> +header a:hover {
>> +  color: #0175C2;
>> +}
>> +
>> +header h1 .kind {
>> +  color: #555;
>> +}
>> +
>> +dt {
>> +  font-weight: normal;
>> +}
>> +
>> +dd {
>> +  color: #212121;
>> +  margin-bottom: 1em;
>> +  margin-left: 0;
>> +}
>> +
>> +dd.callable, dd.constant, dd.property {
>> +  margin-bottom: 24px;
>> +}
>> +
>> +dd p {
>> +  overflow-x: hidden;
>>    text-overflow: ellipsis;
>> +  margin-bottom: 0;
>>  }
>>
>> -h1 {
>> -  color: #80868b;
>> -  font: 300 34px/40px Roboto,sans-serif;
>> -  letter-spacing: -0.01em;
>> -  margin: 40px 0 20px;
>> +/* indents wrapped lines */
>> +section.summary dt {
>> +  margin-left: 24px;
>> +  text-indent: -24px;
>>  }
>>
>> -[layout=docs] h2 {
>> -  border-bottom: 1px solid #e8eaed;
>> -  padding-bottom: 3px;
>> +.dl-horizontal dd {
>> +  margin-left: initial;
>>  }
>>
>> -h2 {
>> -  font: 300 24px/32px Roboto,sans-serif;
>> -  letter-spacing: -0.01em;
>> -  margin: 40px 0 20px;
>> +dl.dl-horizontal dt {
>> +  font-style: normal;
>> +  text-align: left;
>> +  color: #727272;
>> +  margin-right: 20px;
>> +  width: initial;
>>  }
>>
>> -h3 {
>> -  font: 400 20px/32px Roboto,sans-serif;
>> -  margin: 32px 0 16px;
>> +dt .name {
>> +  font-weight: 500;
>>  }
>>
>> -h4,h5,h6 {
>> -  margin: 32px 0 16px;
>> +dl dt.callable .name {
>> +  float: none;
>> +  width: auto;
>>  }
>>
>> -h4 {
>> -  font: 500 16px/24px Roboto,sans-serif;
>> +.parameter {
>> +  white-space: nowrap;
>>  }
>>
>> -h5 {
>> -  font: 700 14px/24px Roboto,sans-serif;
>> +.type-parameter {
>> +  white-space: nowrap;
>>  }
>>
>> -h6 {
>> -  font: 500 14px/24px Roboto,sans-serif;
>> +.multi-line-signature .type-parameter .parameter {
>> +  margin-left: 0px;
>> +  display: unset;
>>  }
>>
>> -h1+h1,h1+h2,h1+h3,h1+h4,h1+h5,h1+h6,h2+h1,h2+h2,h2+h3,h2+h4,h2+h5,h2+h6,h3+h1,h3+h2,h3+h3,h3+h4,h3+h5,h3+h6,h4+h1,h4+h2,h4+h3,h4+h4,h4+h5,h4+h6,h5+h1,h5+h2,h5+h3,h5+h4,h5+h5,h5+h6,h6+h1,h6+h2,h6+h3,h6+h4,h6+h5,h6+h6
>> {
>> -  margin-top: 0;
>> +.signature {
>> +  color: #727272;
>>  }
>>
>> - at media screen and (max-width: 600px) {
>> -  h1 {
>> -    font: 300 24px/32px Roboto,sans-serif;
>> +.signature a {
>> +  /* 50% mix of default-primary-color and primary-text-color. */
>> +  color: #4674a2;
>> +}
>> +
>> +.optional {
>> +  font-style: italic;
>> +}
>> +
>> +.undocumented {
>> +  font-style: italic;
>> +}
>> +
>> +.is-const {
>> +  font-style: italic;
>> +}
>> +
>> +.deprecated {
>> +  text-decoration: line-through;
>> +}
>> +
>> +.category.linked {
>> +  font-weight: bold;
>> +  opacity: 1;
>> +}
>> +
>> +/* Colors for category based on categoryOrder in dartdoc_options.config.
>> */
>> +.category.cp-0 {
>> +  background-color: #54b7c4
>> +}
>> +
>> +.category.cp-1 {
>> +  background-color: #54c47f
>> +}
>> +
>> +.category.cp-2 {
>> +  background-color: #c4c254
>> +}
>> +
>> +.category.cp-3 {
>> +  background-color: #c49f54
>> +}
>> +
>> +.category.cp-4 {
>> +  background-color: #c45465
>> +}
>> +
>> +.category.cp-5 {
>> +  background-color: #c454c4
>> +}
>> +
>> +.category a {
>> +  color: white;
>> +}
>> +
>> +.category {
>> +  padding: 2px 4px;
>> +  font-size: 12px;
>> +  border-radius: 4px;
>> +  background-color: #999;
>> +  text-transform: uppercase;
>> +  color: white;
>> +  opacity: .5;
>> +}
>> +
>> +h1 .category {
>> +  vertical-align: middle;
>> +}
>> +
>> +.source-link {
>> +  padding: 18px 4px;
>> +  vertical-align: middle;
>> +}
>> +
>> +.source-link .material-icons {
>> +  font-size: 18px;
>> +}
>> +
>> + at media (max-width: 768px) {
>> +  .source-link {
>> +    padding: 7px 2px;
>> +    font-size: 10px;
>>    }
>>  }
>>
>> -[scrollbars]::-webkit-scrollbar {
>> -  height: 8px;
>> -  width: 8px;
>> +#external-links {
>> +  float: right;
>>  }
>>
>> -[scrollbars]::-webkit-scrollbar-thumb {
>> -  background: rgba(128,134,139,.26);
>> -  border-radius: 8px;
>> +.btn-group {
>> +  position: relative;
>> +  display: inline-flex;
>> +  vertical-align: middle;
>>  }
>>
>> -[no-horizontal-scrollbars]::-webkit-scrollbar {
>> -  height: 0;
>> -  width: 0;
>> +p.firstline {
>> +  font-weight: bold;
>>  }
>>
>> -[scrollbars]::-webkit-scrollbar-corner {
>> -  background: 0;
>> +footer {
>> +  color: #fff;
>> +  background-color: #111111;
>> +  width: 100%;
>>  }
>>
>> -[background] h2 {
>> +footer p {
>> +  margin: 0;
>> +}
>> +
>> +footer .no-break {
>> +  white-space: nowrap;
>> +}
>> +
>> +footer .container,
>> +footer .container-fluid {
>> +  padding-left: 0;
>> +  padding-right: 0;
>> +}
>> +
>> +footer a, footer a:hover {
>>    color: #fff;
>>  }
>>
>> - at media print {
>> -  body,  html,  :link,  :visited,  h1,  h2,  h3,  h4,  h5,  h6 {
>> -    color: #000 !important;
>> -    padding-left: 0 !important;
>> -    padding-right: 0 !important;
>> +.markdown.desc {
>> +  max-width: 700px;
>> +}
>> +
>> +.markdown h1 {
>> +  font-size: 24px;
>> +  margin-bottom: 8px;
>> +}
>> +
>> +.markdown h2 {
>> +  font-size: 20px;
>> +  margin-top: 24px;
>> +  margin-bottom: 8px;
>> +}
>> +
>> +.markdown h3 {
>> +  font-size: 18px;
>> +  margin-bottom: 8px;
>> +}
>> +
>> +.markdown h4 {
>> +  font-size: 16px;
>> +  margin-bottom: 0;
>> +}
>> +
>> +.markdown li p {
>> +  margin: 0;
>> +}
>> +
>> +.gt-separated {
>> +  list-style: none;
>> +  padding: 0;
>> +  margin: 0;
>> +}
>> +
>> +.gt-separated li {
>> +  display: inline-block;
>> +}
>> +
>> +.gt-separated li:before {
>> +  background-image: url("data:image/svg+xml;utf8,<svg xmlns='
>> http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16
>> 16'><path fill='%23DDDDDD'
>> d='M6.7,4L5.7,4.9L8.8,8l-3.1,3.1L6.7,12l4-4L6.7,4z'/></svg>");
>> +  background-position: center;
>> +  content: "\00a0";
>> +  margin: 0 6px 0 4px;
>> +  padding: 0 3px 0 0;
>> +}
>> +
>> +.gt-separated.dark li:before {
>> +  background-image: url("data:image/svg+xml;utf8,<svg xmlns='
>> http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16
>> 16'><path fill='%23727272'
>> d='M6.7,4L5.7,4.9L8.8,8l-3.1,3.1L6.7,12l4-4L6.7,4z'/></svg>");
>> +}
>> +
>> +.gt-separated li:first-child:before {
>> +  background-image: none;
>> +  content: "";
>> +  margin: 0;
>> +}
>> +
>> +/* The slug line under a declaration for things like "const",
>> "read-only", etc. */
>> +.features {
>> +  font-style: italic;
>> +  color: #727272;
>> +}
>> +
>> +.multi-line-signature {
>> +  font-size: 17px;
>> +  color: #727272;
>> +}
>> +
>> +.multi-line-signature .parameter {
>> +  margin-left: 24px;
>> +  display: block;
>> +}
>> +
>> +.breadcrumbs {
>> +  padding: 0;
>> +  margin: 8px 0 8px 0;
>> +  white-space: nowrap;
>> +  line-height: 1;
>> +}
>> +
>> + at media screen and (min-width: 768px) {
>> +  nav ol.breadcrumbs {
>> +    float: left;
>>    }
>> +}
>>
>> -  :link,  :visited {
>> -    text-decoration: underline;
>> + at media screen and (max-width: 768px) {
>> +  .breadcrumbs {
>> +    margin: 0 0 24px 0;
>> +    overflow-x: hidden;
>>    }
>>  }
>>
>> - at page {
>> -  margin: .75in;
>> +.self-crumb {
>> +  color: #555;
>> +}
>> +
>> +.self-name {
>> +  color: #555;
>> +  display: none;
>>  }
>> +
>> +.annotation-list {
>> +  list-style: none;
>> +  padding: 0;
>> +  display: inline;
>> +}
>> +
>> +.comma-separated {
>> +  list-style: none;
>> +  padding: 0;
>> +  display: inline;
>> +}
>> +
>> +.comma-separated li {
>> +  display: inline;
>> +}
>> +
>> +.comma-separated li:after {
>> +  content: ", ";
>> +}
>> +
>> +.comma-separated li:last-child:after {
>> +  content: "";
>> +}
>> +
>> +.end-with-period li:last-child:after {
>> +  content: ".";
>> +}
>> +
>> +.container > section:first-child {
>> +  border: 0;
>> +}
>> +
>> +.constructor-modifier {
>> +  font-style: italic;
>> +}
>> +
>> +section.multi-line-signature div.parameters {
>> +  margin-left: 24px;
>> +}
>> +
>> +/* subnav styles */
>> +
>> +ul.subnav {
>> +  overflow: auto;
>> +  white-space: nowrap;
>> +  padding-left: 0;
>> +  min-height: 25px;
>> +}
>> +
>> +ul.subnav::-webkit-scrollbar {
>> +  display: none;
>> +}
>> +
>> +ul.subnav li {
>> +  display: inline-block;
>> +  text-transform: uppercase;
>> +}
>> +
>> +ul.subnav li a {
>> +  color: #111;
>> +}
>> +
>> +ul.subnav li {
>> +  margin-right: 24px;
>> +}
>> +
>> +ul.subnav li:last-of-type {
>> +  margin-right: 0;
>> +}
>> +
>> + at media(max-width: 768px) {
>> +  ul.subnav li {
>> +    margin-right: 16px;
>> +  }
>> +}
>> +
>> +/* sidebar styles */
>> +
>> +.sidebar ol {
>> +  list-style: none;
>> +  line-height: 22px;
>> +  margin-top: 0;
>> +  margin-bottom: 0;
>> +  padding: 0 0 15px 0;
>> +}
>> +
>> +.sidebar h5 a,
>> +.sidebar h5 a:hover {
>> +  color: #727272;
>> +}
>> +
>> +.sidebar h5,
>> +.sidebar ol li {
>> +  text-overflow: ellipsis;
>> +  overflow: hidden;
>> +  padding: 3px 0;
>> +}
>> +
>> +.sidebar h5 {
>> +  color: #727272;
>> +  font-size: 18px;
>> +  margin: 0 0 25px 0;
>> +  padding-top: 0;
>> +}
>> +
>> +.sidebar ol li.section-title {
>> +  font-size: 18px;
>> +  font-weight: normal;
>> +  text-transform: uppercase;
>> +  padding-top: 25px;
>> +}
>> +
>> +.sidebar ol li.section-subtitle a {
>> +  color: inherit;
>> +}
>> +
>> +.sidebar ol li.section-subtitle {
>> +  font-weight: 400;
>> +  text-transform: uppercase;
>> +}
>> +
>> +.sidebar ol li.section-subitem {
>> +  margin-left: 12px;
>> +}
>> +
>> +.sidebar ol li:first-child {
>> +  padding-top: 0;
>> +  margin-top: 0;
>> +}
>> +
>> +button {
>> +  padding: 0;
>> +}
>> +
>> +#sidenav-left-toggle {
>> +  display: none;
>> +  vertical-align: text-bottom;
>> +  padding: 0;
>> +}
>> +
>> +/* left-nav disappears, and can transition in from the left */
>> + at media screen and (max-width:768px) {
>> +  #sidenav-left-toggle {
>> +    display: inline;
>> +    background: no-repeat url("data:image/svg+xml;utf8,<svg xmlns='
>> http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24
>> 24'><path fill='%23111' d='M3
>> 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z'/></svg>");
>> +    background-position: center;
>> +    width: 24px;
>> +    height: 24px;
>> +    border: none;
>> +    margin-right: 24px;
>> +  }
>> +
>> +  #overlay-under-drawer.active {
>> +    opacity: 0.4;
>> +    height: 100%;
>> +    z-index: 1999;
>> +    position: fixed;
>> +    top: 0;
>> +    left: 0;
>> +    right: 0;
>> +    bottom: 0;
>> +    background-color: black;
>> +    display: block;
>> +  }
>> +
>> +  .sidebar-offcanvas-left {
>> +    left: -100%;
>> +    position: fixed;
>> +    -webkit-transition:all .25s ease-out;
>> +    -o-transition:all .25s ease-out;
>> +    transition:all .25s ease-out;
>> +    z-index: 2000;
>> +    top: 0;
>> +    width: 280px; /* works all the way down to an iphone 4 */
>> +    height: 90%;
>> +    background-color: white;
>> +    overflow-y: scroll; /* TODO: how to hide scroll bars? */
>> +    padding: 10px;
>> +    margin: 10px 10px;
>> +    box-shadow: 5px 5px 5px 5px #444444;
>> +    visibility: hidden; /* shown by Javascript after scroll position
>> restore */
>> +  }
>> +
>> +  ol#sidebar-nav {
>> +    font-size: 18px;
>> +    white-space: pre-line;
>> +  }
>> +
>> +  .sidebar-offcanvas-left.active {
>> +    left: 0; /* this animates our drawer into the page */
>> +  }
>> +
>> +  .self-name {
>> +    display: inline-block;
>> +  }
>> +}
>> +
>> +.sidebar-offcanvas-left h5 {
>> +  margin-bottom: 10px;
>> +}
>> +
>> +.sidebar-offcanvas-left h5:last-of-type {
>> +  border: 0;
>> +  margin-bottom: 25px;
>> +}
>> +
>> +/* the right nav disappears out of view when the window shrinks */
>> + at media screen and (max-width: 992px) {
>> +  .sidebar-offcanvas-right {
>> +     display: none;
>> +   }
>> +}
>> +
>> +#overlay-under-drawer {
>> +  display: none;
>> +}
>> +
>> +/* find-as-you-type search box */
>> +
>> +/* override bootstrap defaults */
>> +.form-control {
>> +  border-radius: 0;
>> +  border: 0;
>> +}
>> +
>> + at media screen and (max-width: 768px) {
>> +  form.search {
>> +    display: none;
>> +  }
>> +}
>> +
>> +.typeahead,
>> +.tt-query,
>> +.tt-hint {
>> +  width: 200px;
>> +  height: 20px;
>> +  padding: 2px 7px 1px 7px;
>> +  line-height: 20px;
>> +  outline: none;
>> +}
>> +
>> +.typeahead {
>> +  background-color: #fff;
>> +  border-radius: 2px;
>> +}
>> +
>> +.tt-query {
>> +  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
>> +     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
>> +          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
>> +}
>> +
>> +.tt-hint {
>> +  color: #999
>> +}
>> +
>> +.navbar-right .tt-menu {
>> +  right:0;
>> +  left: inherit !important;
>> +  width: 422px;
>> +  max-height: 250px;
>> +  overflow-y: scroll;
>> +}
>> +
>> +.tt-menu {
>> +  font-size: 14px;
>> +  margin: 0;
>> +  padding: 8px 0;
>> +  background-color: #fff;
>> +  border: 1px solid #ccc;
>> +  border: 1px solid rgba(0, 0, 0, 0.2);
>> +  -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
>> +     -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
>> +          box-shadow: 0 5px 10px rgba(0,0,0,.2);
>> +}
>> +
>> +.tt-suggestion {
>> +  padding: 3px 20px;
>> +  color: #212121;
>> +}
>> +
>> +.tt-suggestion:hover {
>> +  cursor: pointer;
>> +  color: #fff;
>> +  background-color: #0097cf;
>> +}
>> +
>> +.tt-suggestion:hover .search-from-lib {
>> +  color: #ddd;
>> +}
>> +
>> +.tt-suggestion.tt-cursor {
>> +  color: #fff;
>> +  background-color: #0097cf;
>> +}
>> +
>> +.tt-suggestion.tt-cursor .search-from-lib {
>> +  color: #ddd;
>> +}
>> +
>> +.tt-suggestion p {
>> +  margin: 0;
>> +}
>> +
>> +.search-from-lib {
>> +  font-style: italic;
>> +  color: gray;
>> +}
>> +
>> +#search-box {
>> +  background-color: #ffffff;
>> +}
>> +
>> +.search-body {
>> +  border: 1px solid #7f7f7f;
>> +  max-width: 400px;
>> +  box-shadow: 3px 3px 5px rgba(0,0,0,0.1);
>> +}
>> +
>> +section#setter {
>> +  border-top: 1px solid #ddd;
>> +  padding-top: 36px;
>> +}
>> +
>> +li.inherited a {
>> +  opacity: 0.65;
>> +  font-style: italic;
>> +}
>> +
>> +#instance-methods dt.inherited .name,
>> +#instance-properties dt.inherited .name,
>> +#operators dt.inherited .name {
>> +  font-weight: 300;
>> +  font-style: italic;
>> +}
>> +
>> +#instance-methods dt.inherited .signature,
>> +#instance-properties dt.inherited .signature,
>> +#operators dt.inherited .signature {
>> +  font-weight: 300;
>> +}
>> +
>> + at media print {
>> +  .subnav, .sidebar {
>> +    display:none;
>> +  }
>> +
>> +  a[href]:after {
>> +   content:"" !important;
>> +  }
>> +}
>> \ No newline at end of file
>>
>> Modified: clang-tools-extra/trunk/clang-doc/assets/index.js
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/assets/index.js?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/clang-doc/assets/index.js (original)
>> +++ clang-tools-extra/trunk/clang-doc/assets/index.js Fri Aug 16 11:38:11
>> 2019
>> @@ -39,7 +39,7 @@ function genLink(Ref, CurrentDirectory)
>>    return ANode;
>>  }
>>
>> -function genHTMLOfIndex(Index, CurrentDirectory) {
>> +function genHTMLOfIndex(Index, CurrentDirectory, IsOutermostList) {
>>    // Out will store the HTML elements that Index requires to be generated
>>    var Out = [];
>>    if (Index.Name) {
>> @@ -50,24 +50,26 @@ function genHTMLOfIndex(Index, CurrentDi
>>    }
>>    if (Index.Children.length == 0)
>>      return Out;
>> -  var UlNode = document.createElement("ul");
>> +  // Only the outermost list should use ol, the others should use ul
>> +  var ListNodeName = IsOutermostList ? "ol" : "ul";
>> +  var ListNode = document.createElement(ListNodeName);
>>    for (Child of Index.Children) {
>>      var LiNode = document.createElement("li");
>> -    ChildNodes = genHTMLOfIndex(Child, CurrentDirectory);
>> +    ChildNodes = genHTMLOfIndex(Child, CurrentDirectory, false);
>>      for (Node of ChildNodes)
>>        LiNode.appendChild(Node);
>> -    UlNode.appendChild(LiNode);
>> +    ListNode.appendChild(LiNode);
>>    }
>> -  Out.push(UlNode);
>> +  Out.push(ListNode);
>>    return Out;
>>  }
>>
>>  function createIndex(Index) {
>>    // Get the DOM element where the index will be created
>> -  var IndexDiv = document.getElementById("index");
>> +  var IndexDiv = document.getElementById("sidebar-left");
>>    // Get the relative path of this file
>>    CurrentDirectory = IndexDiv.getAttribute("path");
>> -  var IndexNodes = genHTMLOfIndex(Index, CurrentDirectory);
>> +  var IndexNodes = genHTMLOfIndex(Index, CurrentDirectory, true);
>>    for (Node of IndexNodes)
>>      IndexDiv.appendChild(Node);
>>  }
>>
>> Modified: clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp (original)
>> +++ clang-tools-extra/trunk/clang-doc/tool/ClangDocMain.cpp Fri Aug 16
>> 11:38:11 2019
>> @@ -52,6 +52,10 @@ using namespace clang;
>>  static llvm::cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
>>  static llvm::cl::OptionCategory ClangDocCategory("clang-doc options");
>>
>> +static llvm::cl::opt<std::string>
>> +    ProjectName("project-name", llvm::cl::desc("Name of project."),
>> +                llvm::cl::cat(ClangDocCategory));
>> +
>>  static llvm::cl::opt<bool> IgnoreMappingFailures(
>>      "ignore-map-errors",
>>      llvm::cl::desc("Continue if files are not mapped correctly."),
>> @@ -205,6 +209,7 @@ int main(int argc, const char **argv) {
>>
>>    clang::doc::ClangDocContext CDCtx = {
>>        Exec->get()->getExecutionContext(),
>> +      ProjectName,
>>        PublicOnly,
>>        OutDirectory,
>>        SourceRoot,
>>
>> Modified: clang-tools-extra/trunk/docs/clang-doc.rst
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-doc.rst?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/docs/clang-doc.rst (original)
>> +++ clang-tools-extra/trunk/docs/clang-doc.rst Fri Aug 16 11:38:11 2019
>> @@ -89,6 +89,7 @@ Options
>>      --ignore-map-errors         - Continue if files are not mapped
>> correctly.
>>      --output=<string>           - Directory for outputting generated
>> files.
>>      -p=<string>                 - Build path
>> +    --project-name=<string>     - Name of project.
>>      --public                    - Document only public declarations.
>>      --repository=<string>       -
>>                                    URL of repository that hosts code.
>>
>> Modified:
>> clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp?rev=369139&r1=369138&r2=369139&view=diff
>>
>> ==============================================================================
>> --- clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp
>> (original)
>> +++ clang-tools-extra/trunk/unittests/clang-doc/HTMLGeneratorTest.cpp Fri
>> Aug 16 11:38:11 2019
>> @@ -10,11 +10,15 @@
>>  #include "Generators.h"
>>  #include "Representation.h"
>>  #include "Serialize.h"
>> +#include "clang/Basic/Version.h"
>>  #include "gtest/gtest.h"
>>
>>  namespace clang {
>>  namespace doc {
>>
>> +static const std::string ClangDocVersion =
>> +    clang::getClangToolFullVersion("clang-doc");
>> +
>>  std::unique_ptr<Generator> getHTMLGenerator() {
>>    auto G = doc::findGeneratorByName("html");
>>    if (!G)
>> @@ -25,7 +29,8 @@ std::unique_ptr<Generator> getHTMLGenera
>>  ClangDocContext
>>  getClangDocContext(std::vector<std::string> UserStylesheets = {},
>>                     StringRef RepositoryUrl = "") {
>> -  ClangDocContext CDCtx{{}, {}, {}, {}, RepositoryUrl, UserStylesheets,
>> {}};
>> +  ClangDocContext CDCtx{
>> +      {}, "test-project", {}, {}, {}, RepositoryUrl, UserStylesheets,
>> {}};
>>    CDCtx.UserStylesheets.insert(
>>        CDCtx.UserStylesheets.begin(),
>>        "../share/clang/clang-doc-default-stylesheet.css");
>> @@ -61,67 +66,76 @@ TEST(HTMLGeneratorTest, emitNamespaceHTM
>>  <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
>>  <link rel="stylesheet" href="user-provided-stylesheet.css"/>
>>  <script src="index.js"></script>
>> -<div id="index" path=""></div>
>> -<ul>
>> -  <li>
>> -    <span>
>> -      <a href="#Namespaces">Namespaces</a>
>> -    </span>
>> -  </li>
>> -  <li>
>> -    <span>
>> -      <a href="#Records">Records</a>
>> -    </span>
>> -  </li>
>> -  <li>
>> -    <span>
>> -      <a href="#Functions">Functions</a>
>> -    </span>
>> +<header id="project-title">test-project</header>
>> +<main>
>> +  <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2
>> sidebar sidebar-offcanvas-left"></div>
>> +  <div id="main-content" class="col-xs-12 col-sm-9 col-md-8
>> main-content">
>> +    <h1>namespace Namespace</h1>
>> +    <h2 id="Namespaces">Namespaces</h2>
>>      <ul>
>>        <li>
>> -        <span>
>> -          <a
>> href="#0000000000000000000000000000000000000000">OneFunction</a>
>> -        </span>
>> +        <a href="Namespace/ChildNamespace.html">ChildNamespace</a>
>>        </li>
>>      </ul>
>> -  </li>
>> -  <li>
>> -    <span>
>> -      <a href="#Enums">Enums</a>
>> -    </span>
>> +    <h2 id="Records">Records</h2>
>>      <ul>
>>        <li>
>> -        <span>
>> -          <a href="#0000000000000000000000000000000000000000">OneEnum</a>
>> -        </span>
>> +        <a href="Namespace/ChildStruct.html">ChildStruct</a>
>>        </li>
>>      </ul>
>> -  </li>
>> -</ul>
>> -<div>
>> -  <h1>namespace Namespace</h1>
>> -  <h2 id="Namespaces">Namespaces</h2>
>> -  <ul>
>> -    <li>
>> -      <a href="Namespace/ChildNamespace.html">ChildNamespace</a>
>> -    </li>
>> -  </ul>
>> -  <h2 id="Records">Records</h2>
>> -  <ul>
>> -    <li>
>> -      <a href="Namespace/ChildStruct.html">ChildStruct</a>
>> -    </li>
>> -  </ul>
>> -  <h2 id="Functions">Functions</h2>
>> -  <div>
>> -    <h3 id="0000000000000000000000000000000000000000">OneFunction</h3>
>> -    <p>OneFunction()</p>
>> +    <h2 id="Functions">Functions</h2>
>> +    <div>
>> +      <h3 id="0000000000000000000000000000000000000000">OneFunction</h3>
>> +      <p>OneFunction()</p>
>> +    </div>
>> +    <h2 id="Enums">Enums</h2>
>> +    <div>
>> +      <h3 id="0000000000000000000000000000000000000000">enum OneEnum</h3>
>> +    </div>
>>    </div>
>> -  <h2 id="Enums">Enums</h2>
>> -  <div>
>> -    <h3 id="0000000000000000000000000000000000000000">enum OneEnum</h3>
>> +  <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar
>> sidebar-offcanvas-right">
>> +    <ol>
>> +      <li>
>> +        <span>
>> +          <a href="#Namespaces">Namespaces</a>
>> +        </span>
>> +      </li>
>> +      <li>
>> +        <span>
>> +          <a href="#Records">Records</a>
>> +        </span>
>> +      </li>
>> +      <li>
>> +        <span>
>> +          <a href="#Functions">Functions</a>
>> +        </span>
>> +        <ul>
>> +          <li>
>> +            <span>
>> +              <a
>> href="#0000000000000000000000000000000000000000">OneFunction</a>
>> +            </span>
>> +          </li>
>> +        </ul>
>> +      </li>
>> +      <li>
>> +        <span>
>> +          <a href="#Enums">Enums</a>
>> +        </span>
>> +        <ul>
>> +          <li>
>> +            <span>
>> +              <a
>> href="#0000000000000000000000000000000000000000">OneEnum</a>
>> +            </span>
>> +          </li>
>> +        </ul>
>> +      </li>
>> +    </ol>
>>    </div>
>> -</div>
>> +</main>
>> +<footer>
>> +  <span class="no-break">)raw" +
>> +                         ClangDocVersion + R"raw(</span>
>> +</footer>
>>  )raw";
>>
>>    EXPECT_EQ(Expected, Actual.str());
>> @@ -162,80 +176,89 @@ TEST(HTMLGeneratorTest, emitRecordHTML)
>>  <title>class r</title>
>>  <link rel="stylesheet" href="../../../clang-doc-default-stylesheet.css"/>
>>  <script src="../../../index.js"></script>
>> -<div id="index" path="X/Y/Z"></div>
>> -<ul>
>> -  <li>
>> -    <span>
>> -      <a href="#Members">Members</a>
>> -    </span>
>> -  </li>
>> -  <li>
>> -    <span>
>> -      <a href="#Records">Records</a>
>> -    </span>
>> -  </li>
>> -  <li>
>> -    <span>
>> -      <a href="#Functions">Functions</a>
>> -    </span>
>> +<header id="project-title">test-project</header>
>> +<main>
>> +  <div id="sidebar-left" path="X/Y/Z" class="col-xs-6 col-sm-3 col-md-2
>> sidebar sidebar-offcanvas-left"></div>
>> +  <div id="main-content" class="col-xs-12 col-sm-9 col-md-8
>> main-content">
>> +    <h1>class r</h1>
>> +    <p>
>> +      Defined at line
>> +      <a href="http://www.repository.com/dir/test.cpp#10">10</a>
>> +       of file
>> +      <a href="http://www.repository.com/dir/test.cpp">test.cpp</a>
>> +    </p>
>> +    <p>
>> +      Inherits from
>> +      <a href="../../../path/to/F.html">F</a>
>> +      , G
>> +    </p>
>> +    <h2 id="Members">Members</h2>
>>      <ul>
>>        <li>
>> -        <span>
>> -          <a
>> href="#0000000000000000000000000000000000000000">OneFunction</a>
>> -        </span>
>> +        private
>> +        <a href="../int.html">int</a>
>> +         X
>>        </li>
>>      </ul>
>> -  </li>
>> -  <li>
>> -    <span>
>> -      <a href="#Enums">Enums</a>
>> -    </span>
>> +    <h2 id="Records">Records</h2>
>>      <ul>
>>        <li>
>> -        <span>
>> -          <a href="#0000000000000000000000000000000000000000">OneEnum</a>
>> -        </span>
>> +        <a href="r/ChildStruct.html">ChildStruct</a>
>>        </li>
>>      </ul>
>> -  </li>
>> -</ul>
>> -<div>
>> -  <h1>class r</h1>
>> -  <p>
>> -    Defined at line
>> -    <a href="http://www.repository.com/dir/test.cpp#10">10</a>
>> -     of file
>> -    <a href="http://www.repository.com/dir/test.cpp">test.cpp</a>
>> -  </p>
>> -  <p>
>> -    Inherits from
>> -    <a href="../../../path/to/F.html">F</a>
>> -    , G
>> -  </p>
>> -  <h2 id="Members">Members</h2>
>> -  <ul>
>> -    <li>
>> -      private
>> -      <a href="../int.html">int</a>
>> -       X
>> -    </li>
>> -  </ul>
>> -  <h2 id="Records">Records</h2>
>> -  <ul>
>> -    <li>
>> -      <a href="r/ChildStruct.html">ChildStruct</a>
>> -    </li>
>> -  </ul>
>> -  <h2 id="Functions">Functions</h2>
>> -  <div>
>> -    <h3 id="0000000000000000000000000000000000000000">OneFunction</h3>
>> -    <p>public OneFunction()</p>
>> +    <h2 id="Functions">Functions</h2>
>> +    <div>
>> +      <h3 id="0000000000000000000000000000000000000000">OneFunction</h3>
>> +      <p>public OneFunction()</p>
>> +    </div>
>> +    <h2 id="Enums">Enums</h2>
>> +    <div>
>> +      <h3 id="0000000000000000000000000000000000000000">enum OneEnum</h3>
>> +    </div>
>>    </div>
>> -  <h2 id="Enums">Enums</h2>
>> -  <div>
>> -    <h3 id="0000000000000000000000000000000000000000">enum OneEnum</h3>
>> +  <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar
>> sidebar-offcanvas-right">
>> +    <ol>
>> +      <li>
>> +        <span>
>> +          <a href="#Members">Members</a>
>> +        </span>
>> +      </li>
>> +      <li>
>> +        <span>
>> +          <a href="#Records">Records</a>
>> +        </span>
>> +      </li>
>> +      <li>
>> +        <span>
>> +          <a href="#Functions">Functions</a>
>> +        </span>
>> +        <ul>
>> +          <li>
>> +            <span>
>> +              <a
>> href="#0000000000000000000000000000000000000000">OneFunction</a>
>> +            </span>
>> +          </li>
>> +        </ul>
>> +      </li>
>> +      <li>
>> +        <span>
>> +          <a href="#Enums">Enums</a>
>> +        </span>
>> +        <ul>
>> +          <li>
>> +            <span>
>> +              <a
>> href="#0000000000000000000000000000000000000000">OneEnum</a>
>> +            </span>
>> +          </li>
>> +        </ul>
>> +      </li>
>> +    </ol>
>>    </div>
>> -</div>
>> +</main>
>> +<footer>
>> +  <span class="no-break">)raw" +
>> +                         ClangDocVersion + R"raw(</span>
>> +</footer>
>>  )raw";
>>
>>    EXPECT_EQ(Expected, Actual.str());
>> @@ -270,17 +293,25 @@ TEST(HTMLGeneratorTest, emitFunctionHTML
>>  <title></title>
>>  <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
>>  <script src="index.js"></script>
>> -<div id="index" path=""></div>
>> -<div>
>> -  <h3 id="0000000000000000000000000000000000000000">f</h3>
>> -  <p>
>> -    <a href="path/to/float.html">float</a>
>> -     f(
>> -    <a href="path/to/int.html">int</a>
>> -     P)
>> -  </p>
>> -  <p>Defined at line 10 of file dir/test.cpp</p>
>> -</div>
>> +<header id="project-title">test-project</header>
>> +<main>
>> +  <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2
>> sidebar sidebar-offcanvas-left"></div>
>> +  <div id="main-content" class="col-xs-12 col-sm-9 col-md-8
>> main-content">
>> +    <h3 id="0000000000000000000000000000000000000000">f</h3>
>> +    <p>
>> +      <a href="path/to/float.html">float</a>
>> +       f(
>> +      <a href="path/to/int.html">int</a>
>> +       P)
>> +    </p>
>> +    <p>Defined at line 10 of file dir/test.cpp</p>
>> +  </div>
>> +  <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar
>> sidebar-offcanvas-right"></div>
>> +</main>
>> +<footer>
>> +  <span class="no-break">)raw" +
>> +                         ClangDocVersion + R"raw(</span>
>> +</footer>
>>  )raw";
>>
>>    EXPECT_EQ(Expected, Actual.str());
>> @@ -309,19 +340,27 @@ TEST(HTMLGeneratorTest, emitEnumHTML) {
>>  <title></title>
>>  <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
>>  <script src="index.js"></script>
>> -<div id="index" path=""></div>
>> -<div>
>> -  <h3 id="0000000000000000000000000000000000000000">enum class e</h3>
>> -  <ul>
>> -    <li>X</li>
>> -  </ul>
>> -  <p>
>> -    Defined at line
>> -    <a href="https://www.repository.com/test.cpp#10">10</a>
>> -     of file
>> -    <a href="https://www.repository.com/test.cpp">test.cpp</a>
>> -  </p>
>> -</div>
>> +<header id="project-title">test-project</header>
>> +<main>
>> +  <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2
>> sidebar sidebar-offcanvas-left"></div>
>> +  <div id="main-content" class="col-xs-12 col-sm-9 col-md-8
>> main-content">
>> +    <h3 id="0000000000000000000000000000000000000000">enum class e</h3>
>> +    <ul>
>> +      <li>X</li>
>> +    </ul>
>> +    <p>
>> +      Defined at line
>> +      <a href="https://www.repository.com/test.cpp#10">10</a>
>> +       of file
>> +      <a href="https://www.repository.com/test.cpp">test.cpp</a>
>> +    </p>
>> +  </div>
>> +  <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar
>> sidebar-offcanvas-right"></div>
>> +</main>
>> +<footer>
>> +  <span class="no-break">)raw" +
>> +                         ClangDocVersion + R"raw(</span>
>> +</footer>
>>  )raw";
>>
>>    EXPECT_EQ(Expected, Actual.str());
>> @@ -386,19 +425,27 @@ TEST(HTMLGeneratorTest, emitCommentHTML)
>>  <title></title>
>>  <link rel="stylesheet" href="clang-doc-default-stylesheet.css"/>
>>  <script src="index.js"></script>
>> -<div id="index" path=""></div>
>> -<div>
>> -  <h3 id="0000000000000000000000000000000000000000">f</h3>
>> -  <p>void f(int I, int J)</p>
>> -  <p>Defined at line 10 of file test.cpp</p>
>> -  <div>
>> +<header id="project-title">test-project</header>
>> +<main>
>> +  <div id="sidebar-left" path="" class="col-xs-6 col-sm-3 col-md-2
>> sidebar sidebar-offcanvas-left"></div>
>> +  <div id="main-content" class="col-xs-12 col-sm-9 col-md-8
>> main-content">
>> +    <h3 id="0000000000000000000000000000000000000000">f</h3>
>> +    <p>void f(int I, int J)</p>
>> +    <p>Defined at line 10 of file test.cpp</p>
>>      <div>
>> -      <p> Brief description.</p>
>> -      <p> Extended description that continues onto the next line.</p>
>> -      <p> Comment with html entities: &, <, >, ",
>> '.</p>
>> +      <div>
>> +        <p> Brief description.</p>
>> +        <p> Extended description that continues onto the next line.</p>
>> +        <p> Comment with html entities: &, <, >, ",
>> '.</p>
>> +      </div>
>>      </div>
>>    </div>
>> -</div>
>> +  <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar
>> sidebar-offcanvas-right"></div>
>> +</main>
>> +<footer>
>> +  <span class="no-break">)raw" +
>> +                         ClangDocVersion + R"raw(</span>
>> +</footer>
>>  )raw";
>>
>>    EXPECT_EQ(Expected, Actual.str());
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
> --
>
> *  •  **Diego Astiazar**á**n*
>
> *  •  **Software Engineer Intern*
> *  •  *Google, Inc.
> *  •  *diegoast at google.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190816/6ebf8fdb/attachment-0001.html>


More information about the cfe-commits mailing list