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

Hubert Tong via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 16 18:11:59 PDT 2019


On Fri, Aug 16, 2019 at 8:14 PM Julie Hockett <juliehockett at google.com>
wrote:

> 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.
>
I don't have the cmake invocation handy, but I got the compile command.
Also, my description was not entirely accurate. It's a GCC 5.4.0 library,
but the compiler is a build of Clang. I'm having trouble accessing the
machine, and I'm trying to get a build tree going on another machine.

clang++  --gcc-toolchain=/usr  -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE
-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
-Itools/clang/tools/extra/clang-doc
-I/tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang-tools-extra/clang-doc
-I/tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang/include
-Itools/clang/include -Iinclude
-I/tmp/worker/LLVM-Master-Ubuntu-Release/llvm/llvm/include -fPIC
-fvisibility-inlines-hidden -Werror -Werror=date-time
-Werror=unguarded-availability-new -std=c++14 -Wall -Wextra
-Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -pedantic -Wno-long-long
-Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion
-fdiagnostics-color -ffunction-sections -fdata-sections -fno-common
-Woverloaded-virtual -Wno-nested-anon-types -O3    -UNDEBUG
 -fno-exceptions -fno-rtti -MMD -MT
tools/clang/tools/extra/clang-doc/CMakeFiles/obj.clangDoc.dir/HTMLGenerator.cpp.o
-MF
tools/clang/tools/extra/clang-doc/CMakeFiles/obj.clangDoc.dir/HTMLGenerator.cpp.o.d
-o
tools/clang/tools/extra/clang-doc/CMakeFiles/obj.clangDoc.dir/HTMLGenerator.cpp.o
-c
/tmp/worker/LLVM-Master-Ubuntu-Release/llvm/clang-tools-extra/clang-doc/HTMLGenerator.cpp


>
> 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/e1ef4563/attachment-0001.html>


More information about the cfe-commits mailing list