[clang-tools-extra] [clang-doc] Add basic e2e test (PR #93928)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 12 20:59:20 PDT 2024


https://github.com/PeterChou1 updated https://github.com/llvm/llvm-project/pull/93928

>From 219df1820de43696dd51268f1aa22c397846c0a6 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Fri, 7 Jun 2024 01:47:15 -0400
Subject: [PATCH 1/5] [clang-doc] add basic e2e test

---
 .../Inputs/clang-doc-default-stylesheet.css   | 969 ++++++++++++++++++
 .../Inputs/clang-doc-project1/Calculator.cpp  |  21 +
 .../Inputs/clang-doc-project1/Calculator.h    |  46 +
 .../Inputs/clang-doc-project1/Circle.cpp      |  11 +
 .../Inputs/clang-doc-project1/Circle.h        |  35 +
 .../Inputs/clang-doc-project1/Rectangle.cpp   |  12 +
 .../Inputs/clang-doc-project1/Rectangle.h     |  37 +
 .../Inputs/clang-doc-project1/Shape.h         |  30 +
 .../clang-doc-project1/database_template.json |  17 +
 .../test/clang-doc/Inputs/index.js            |  87 ++
 .../test/clang-doc/clang-doc-project1.cpp     | 361 +++++++
 11 files changed, 1626 insertions(+)
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
 create mode 100644 clang-tools-extra/test/clang-doc/Inputs/index.js
 create mode 100644 clang-tools-extra/test/clang-doc/clang-doc-project1.cpp

diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css
new file mode 100644
index 0000000000000..8b335232b8048
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css
@@ -0,0 +1,969 @@
+.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;
+}
+
+*, *:before, *:after {
+  box-sizing: inherit;
+}
+
+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;
+}
+
+header ol {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+header ol li {
+  display: inline;
+}
+
+header form {
+  display: flex;
+  flex: 1;
+  justify-content: flex-end;
+  padding-right: 30px;
+}
+
+header#header-search-sidebar {
+  height: 50px;
+  margin-bottom: 25px;
+}
+
+footer {
+  flex: 0 0 16px;
+  text-align: center;
+  padding: 16px 20px;
+}
+
+main {
+  flex: 1;
+  display: flex;
+  flex-direction: row;
+  padding: 20px;
+  min-height: 0;
+}
+
+.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 */
+}
+
+::-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;
+}
+
+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;
+}
+
+.body {
+  margin-top: 90px;
+}
+
+section {
+  margin-bottom: 36px;
+}
+
+dl {
+  margin: 0;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-family: Roboto, sans-serif;
+  font-weight: 400;
+  margin-top: 1.5em;
+  color: #111111;
+}
+
+h1.title {
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+h1 {
+  font-size: 37px;
+  margin-top: 0;
+  margin-bottom: 0.67em;
+}
+
+h2 {
+  font-size: 28px;
+}
+
+h5 {
+  font-size: 16px;
+}
+
+.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 media(max-width: 768px) {
+  nav .container {
+    width: 100%
+  }
+
+  h1 {
+    font-size: 24px;
+  }
+
+  pre {
+    margin: 16px 0;
+  }
+}
+
+ at media (min-width: 768px) {
+  ul.subnav li {
+    font-size: 17px;
+  }
+}
+
+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;
+}
+
+/* indents wrapped lines */
+section.summary dt {
+  margin-left: 24px;
+  text-indent: -24px;
+}
+
+.dl-horizontal dd {
+  margin-left: initial;
+}
+
+dl.dl-horizontal dt {
+  font-style: normal;
+  text-align: left;
+  color: #727272;
+  margin-right: 20px;
+  width: initial;
+}
+
+dt .name {
+  font-weight: 500;
+}
+
+dl dt.callable .name {
+  float: none;
+  width: auto;
+}
+
+.parameter {
+  white-space: nowrap;
+}
+
+.type-parameter {
+  white-space: nowrap;
+}
+
+.multi-line-signature .type-parameter .parameter {
+  margin-left: 0px;
+  display: unset;
+}
+
+.signature {
+  color: #727272;
+}
+
+.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;
+  }
+}
+
+#external-links {
+  float: right;
+}
+
+.btn-group {
+  position: relative;
+  display: inline-flex;
+  vertical-align: middle;
+}
+
+p.firstline {
+  font-weight: bold;
+}
+
+footer {
+  color: #fff;
+  background-color: #111111;
+  width: 100%;
+}
+
+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;
+}
+
+.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;
+  }
+}
+
+ at media screen and (max-width: 768px) {
+  .breadcrumbs {
+    margin: 0 0 24px 0;
+    overflow-x: hidden;
+  }
+}
+
+.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
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
new file mode 100644
index 0000000000000..df1778c3b9d55
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
@@ -0,0 +1,21 @@
+#include "Calculator.h"
+#include <stdexcept>
+
+int Calculator::add(int a, int b) {
+    return a + b;
+}
+
+int Calculator::subtract(int a, int b) {
+    return a - b;
+}
+
+int Calculator::multiply(int a, int b) {
+    return a * b;
+}
+
+double Calculator::divide(int a, int b) {
+    if (b == 0) {
+        throw std::invalid_argument("Division by zero");
+    }
+    return static_cast<double>(a) / b;
+}
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
new file mode 100644
index 0000000000000..6811834bc0159
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
@@ -0,0 +1,46 @@
+#pragma once
+
+/**
+ * @brief A simple calculator class.
+ *
+ * Provides basic arithmetic operations.
+ */
+class Calculator {
+public:
+    /**
+     * @brief Adds two integers.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return int The sum of a and b.
+     */
+    int add(int a, int b);
+
+    /**
+     * @brief Subtracts the second integer from the first.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return int The result of a - b.
+     */
+    int subtract(int a, int b);
+
+    /**
+     * @brief Multiplies two integers.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return int The product of a and b.
+     */
+    int multiply(int a, int b);
+
+    /**
+     * @brief Divides the first integer by the second.
+     *
+     * @param a First integer.
+     * @param b Second integer.
+     * @return double The result of a / b.
+     * @throw std::invalid_argument if b is zero.
+     */
+    double divide(int a, int b);
+};
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
new file mode 100644
index 0000000000000..823384a4d97e8
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
@@ -0,0 +1,11 @@
+#include "Circle.h"
+
+Circle::Circle(double radius) : radius_(radius) {}
+
+double Circle::area() const {
+    return 3.141 * radius_ * radius_;
+}
+
+double Circle::perimeter() const {
+    return 3.141 * radius_;
+}
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
new file mode 100644
index 0000000000000..7bee3ffa92539
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "Shape.h"
+
+/**
+ * @brief Circle class derived from Shape.
+ *
+ * Represents a circle with a given radius.
+ */
+class Circle : public Shape {
+public:
+    /**
+     * @brief Constructs a new Circle object.
+     *
+     * @param radius Radius of the circle.
+     */
+    Circle(double radius);
+
+    /**
+     * @brief Calculates the area of the circle.
+     *
+     * @return double The area of the circle.
+     */
+    double area() const override;
+
+    /**
+     * @brief Calculates the perimeter of the circle.
+     *
+     * @return double The perimeter of the circle.
+     */
+    double perimeter() const override;
+
+private:
+    double radius_; ///< Radius of the circle.
+};
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
new file mode 100644
index 0000000000000..7ffc769157ebc
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
@@ -0,0 +1,12 @@
+#include "Rectangle.h"
+
+Rectangle::Rectangle(double width, double height)
+        : width_(width), height_(height) {}
+
+double Rectangle::area() const {
+    return width_ * height_;
+}
+
+double Rectangle::perimeter() const {
+    return 2 * (width_ + height_);
+}
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
new file mode 100644
index 0000000000000..8c6223a4f6180
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "Shape.h"
+
+/**
+ * @brief Rectangle class derived from Shape.
+ *
+ * Represents a rectangle with a given width and height.
+ */
+class Rectangle : public Shape {
+public:
+    /**
+     * @brief Constructs a new Rectangle object.
+     *
+     * @param width Width of the rectangle.
+     * @param height Height of the rectangle.
+     */
+    Rectangle(double width, double height);
+
+    /**
+     * @brief Calculates the area of the rectangle.
+     *
+     * @return double The area of the rectangle.
+     */
+    double area() const override;
+
+    /**
+     * @brief Calculates the perimeter of the rectangle.
+     *
+     * @return double The perimeter of the rectangle.
+     */
+    double perimeter() const override;
+
+private:
+    double width_; ///< Width of the rectangle.
+    double height_; ///< Height of the rectangle.
+};
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
new file mode 100644
index 0000000000000..e5c5d4c9e4412
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
@@ -0,0 +1,30 @@
+#pragma once
+
+/**
+ * @brief Abstract base class for shapes.
+ *
+ * Provides a common interface for different types of shapes.
+ */
+class Shape {
+public:
+    /**
+     * @brief Virtual destructor.
+     */
+    virtual ~Shape() {}
+
+    /**
+     * @brief Calculates the area of the shape.
+     *
+     * @return double The area of the shape.
+     */
+    virtual double area() const = 0;
+
+    /**
+     * @brief Calculates the perimeter of the shape.
+     *
+     * @return double The perimeter of the shape.
+     */
+    virtual double perimeter() const = 0;
+};
+
+
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
new file mode 100644
index 0000000000000..ae1bc6f128677
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
@@ -0,0 +1,17 @@
+[
+  {
+    "directory": "$test_dir/build",
+    "command": "clang++ -o Calculator.o -I../include $test_dir/src/Calculator.cpp",
+    "file": "$test_dir/src/Calculator.cpp"
+  },
+  {
+    "directory": "$test_dir/build",
+    "command": "clang++ -o Circle.o -I../include $test_dir/src/Circle.cpp",
+    "file": "$test_dir/src/Circle.cpp"
+  },
+  {
+    "directory": "$test_dir/build",
+    "command": "clang++ -o Rectangle.o -I../include $test_dir/src/Rectangle.cpp",
+    "file": "$test_dir/src/Rectangle.cpp"
+  }
+]
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/index.js b/clang-tools-extra/test/clang-doc/Inputs/index.js
new file mode 100644
index 0000000000000..a5ac90f2e06e7
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/Inputs/index.js
@@ -0,0 +1,87 @@
+// Append using posix-style a file name or directory to Base
+function append(Base, New) {
+  if (!New)
+    return Base;
+  if (Base)
+    Base += "/";
+  Base += New;
+  return Base;
+}
+
+// Get relative path to access FilePath from CurrentDirectory
+function computeRelativePath(FilePath, CurrentDirectory) {
+  var Path = FilePath;
+  while (Path) {
+    if (CurrentDirectory == Path)
+      return FilePath.substring(Path.length + 1);
+    Path = Path.substring(0, Path.lastIndexOf("/"));
+  }
+
+  var Dir = CurrentDirectory;
+  var Result = "";
+  while (Dir) {
+    if (Dir == FilePath)
+      break;
+    Dir = Dir.substring(0, Dir.lastIndexOf("/"));
+    Result = append(Result, "..")
+  }
+  Result = append(Result, FilePath.substring(Dir.length))
+  return Result;
+}
+
+function genLink(Ref, CurrentDirectory) {
+  var Path = computeRelativePath(Ref.Path, CurrentDirectory);
+  if (Ref.RefType == "namespace")
+    Path = append(Path, "index.html");
+  else
+    Path = append(Path, Ref.Name + ".html")
+
+    ANode = document.createElement("a");
+  ANode.setAttribute("href", Path);
+  var TextNode = document.createTextNode(Ref.Name);
+  ANode.appendChild(TextNode);
+  return ANode;
+}
+
+function genHTMLOfIndex(Index, CurrentDirectory, IsOutermostList) {
+  // Out will store the HTML elements that Index requires to be generated
+  var Out = [];
+  if (Index.Name) {
+    var SpanNode = document.createElement("span");
+    var TextNode = document.createTextNode(Index.Name);
+    SpanNode.appendChild(genLink(Index, CurrentDirectory));
+    Out.push(SpanNode);
+  }
+  if (Index.Children.length == 0)
+    return Out;
+  // 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, false);
+    for (Node of ChildNodes)
+      LiNode.appendChild(Node);
+    ListNode.appendChild(LiNode);
+  }
+  Out.push(ListNode);
+  return Out;
+}
+
+function createIndex(Index) {
+  // Get the DOM element where the index will be created
+  var IndexDiv = document.getElementById("sidebar-left");
+  // Get the relative path of this file
+  CurrentDirectory = IndexDiv.getAttribute("path");
+  var IndexNodes = genHTMLOfIndex(Index, CurrentDirectory, true);
+  for (Node of IndexNodes)
+    IndexDiv.appendChild(Node);
+}
+
+// Runs after DOM loads
+document.addEventListener("DOMContentLoaded", function() {
+  // JsonIndex is a variable from another file that contains the index
+  // in JSON format
+  var Index = JSON.parse(JsonIndex);
+  createIndex(Index);
+});
diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
new file mode 100644
index 0000000000000..59bf781385b40
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
@@ -0,0 +1,361 @@
+// RUN: rm -rf %t && mkdir -p %t/build %t/include %t/src %t/docs
+// RUN: sed 's|$test_dir|%/t|g' %S/Inputs/clang-doc-project1/database_template.json > %t/build/compile_commands.json
+// RUN: cp %S/Inputs/clang-doc-project1/*.h  %t/include
+// RUN: cp %S/Inputs/clang-doc-project1/*.cpp %t/src
+// RUN: cd %t
+// RUN: clang-doc --format=html --executor=all-TUs --asset=%S/Inputs ./build/compile_commands.json
+// RUN: FileCheck %s -input-file=%t/docs/index_json.js -check-prefix=CHECK-JSON-INDEX
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Shape.html -check-prefix=CHECK-HTML-SHAPE
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Calculator.html -check-prefix=CHECK-HTML-CALC
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Rectangle.html -check-prefix=CHECK-HTML-RECTANGLE
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Circle.html -check-prefix=CHECK-HTML-CIRCLE
+
+// CHECK-JSON-INDEX: var JsonIndex = `
+// CHECK-JSON-INDEX-NEXT: {
+// CHECK-JSON-INDEX-NEXT:   "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX-NEXT:   "Name": "",
+// CHECK-JSON-INDEX-NEXT:   "RefType": "default",
+// CHECK-JSON-INDEX-NEXT:   "Path": "",
+// CHECK-JSON-INDEX-NEXT:   "Children": [
+// CHECK-JSON-INDEX-NEXT:     {
+// CHECK-JSON-INDEX-NEXT:       "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX-NEXT:       "Name": "GlobalNamespace",
+// CHECK-JSON-INDEX-NEXT:       "RefType": "namespace",
+// CHECK-JSON-INDEX-NEXT:       "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX-NEXT:       "Children": [
+// CHECK-JSON-INDEX-NEXT:         {
+// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX-NEXT:           "Name": "Calculator",
+// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
+// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX-NEXT:           "Children": []
+// CHECK-JSON-INDEX-NEXT:         },
+// CHECK-JSON-INDEX-NEXT:         {
+// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX-NEXT:           "Name": "Circle",
+// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
+// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX-NEXT:           "Children": []
+// CHECK-JSON-INDEX-NEXT:         },
+// CHECK-JSON-INDEX-NEXT:         {
+// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX-NEXT:           "Name": "Rectangle",
+// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
+// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX-NEXT:           "Children": []
+// CHECK-JSON-INDEX-NEXT:         },
+// CHECK-JSON-INDEX-NEXT:         {
+// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// CHECK-JSON-INDEX-NEXT:           "Name": "Shape",
+// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
+// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// CHECK-JSON-INDEX-NEXT:           "Children": []
+// CHECK-JSON-INDEX-NEXT:         }
+// CHECK-JSON-INDEX-NEXT:       ]
+// CHECK-JSON-INDEX-NEXT:     }
+// CHECK-JSON-INDEX-NEXT:   ]
+// CHECK-JSON-INDEX-NEXT: }`;
+
+// CHECK-HTML-SHAPE: <!DOCTYPE html>
+// CHECK-HTML-SHAPE-NEXT: <meta charset="utf-8"/>
+// CHECK-HTML-SHAPE-NEXT: <title>class Shape</title>
+// CHECK-HTML-SHAPE-NEXT: <link rel="stylesheet" href="../clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-SHAPE-NEXT: <script src="../index.js"></script>
+// CHECK-HTML-SHAPE-NEXT: <script src="../index_json.js"></script>
+// CHECK-HTML-SHAPE-NEXT: <header id="project-title"></header>
+// CHECK-HTML-SHAPE-NEXT: <main>
+// CHECK-HTML-SHAPE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-SHAPE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-SHAPE-NEXT:     <h1>class Shape</h1>
+// CHECK-HTML-SHAPE-NEXT:     <p>Defined at line 8 of file {{.*}}Shape.h</p>
+// CHECK-HTML-SHAPE-NEXT:     <div>
+// CHECK-HTML-SHAPE-NEXT:       <div>
+// CHECK-HTML-SHAPE-NEXT:         <p> Provides a common interface for different types of shapes.</p>
+// CHECK-HTML-SHAPE-NEXT:       </div>
+// CHECK-HTML-SHAPE-NEXT:     </div>
+// CHECK-HTML-SHAPE-NEXT:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-SHAPE-NEXT:     <div>
+// CHECK-HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">~Shape</h3>
+// CHECK-HTML-SHAPE-NEXT:       <p>public void ~Shape()</p>
+// CHECK-HTML-SHAPE-NEXT:       <p>Defined at line 13 of file {{.*}}Shape.h</p>
+// CHECK-HTML-SHAPE-NEXT:       <div>
+// CHECK-HTML-SHAPE-NEXT:         <div></div>
+// CHECK-HTML-SHAPE-NEXT:       </div>
+// CHECK-HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// CHECK-HTML-SHAPE-NEXT:       <p>public double area()</p>
+// CHECK-HTML-SHAPE-NEXT:       <div>
+// CHECK-HTML-SHAPE-NEXT:         <div></div>
+// CHECK-HTML-SHAPE-NEXT:       </div>
+// CHECK-HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// CHECK-HTML-SHAPE-NEXT:       <p>public double perimeter()</p>
+// CHECK-HTML-SHAPE-NEXT:       <div>
+// CHECK-HTML-SHAPE-NEXT:         <div></div>
+// CHECK-HTML-SHAPE-NEXT:       </div>
+// CHECK-HTML-SHAPE-NEXT:     </div>
+// CHECK-HTML-SHAPE-NEXT:   </div>
+// CHECK-HTML-SHAPE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-SHAPE-NEXT:     <ol>
+// CHECK-HTML-SHAPE-NEXT:       <li>
+// CHECK-HTML-SHAPE-NEXT:         <span>
+// CHECK-HTML-SHAPE-NEXT:           <a href="#Functions">Functions</a>
+// CHECK-HTML-SHAPE-NEXT:         </span>
+// CHECK-HTML-SHAPE-NEXT:         <ul>
+// CHECK-HTML-SHAPE-NEXT:           <li>
+// CHECK-HTML-SHAPE-NEXT:             <span>
+// CHECK-HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">~Shape</a>
+// CHECK-HTML-SHAPE-NEXT:             </span>
+// CHECK-HTML-SHAPE-NEXT:           </li>
+// CHECK-HTML-SHAPE-NEXT:           <li>
+// CHECK-HTML-SHAPE-NEXT:             <span>
+// CHECK-HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// CHECK-HTML-SHAPE-NEXT:             </span>
+// CHECK-HTML-SHAPE-NEXT:           </li>
+// CHECK-HTML-SHAPE-NEXT:           <li>
+// CHECK-HTML-SHAPE-NEXT:             <span>
+// CHECK-HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// CHECK-HTML-SHAPE-NEXT:             </span>
+// CHECK-HTML-SHAPE-NEXT:           </li>
+// CHECK-HTML-SHAPE-NEXT:         </ul>
+// CHECK-HTML-SHAPE-NEXT:       </li>
+// CHECK-HTML-SHAPE-NEXT:     </ol>
+// CHECK-HTML-SHAPE-NEXT:   </div>
+// CHECK-HTML-SHAPE-NEXT: </main>
+
+// CHECK-HTML-CALC: <!DOCTYPE html>
+// CHECK-HTML-CALC-NEXT: <meta charset="utf-8"/>
+// CHECK-HTML-CALC-NEXT: <title>class Calculator</title>
+// CHECK-HTML-CALC-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-CALC-NEXT: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-CALC-NEXT: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-CALC-NEXT: <header id="project-title"></header>
+// CHECK-HTML-CALC-NEXT: <main>
+// CHECK-HTML-CALC-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-CALC-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-CALC-NEXT:     <h1>class Calculator</h1>
+// CHECK-HTML-CALC-NEXT:     <p>Defined at line 8 of file {{.*}}Calculator.h</p>
+// CHECK-HTML-CALC-NEXT:     <div>
+// CHECK-HTML-CALC-NEXT:       <div>
+// CHECK-HTML-CALC-NEXT:         <p> Provides basic arithmetic operations.</p>
+// CHECK-HTML-CALC-NEXT:       </div>
+// CHECK-HTML-CALC-NEXT:     </div>
+// CHECK-HTML-CALC-NEXT:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-CALC-NEXT:     <div>
+// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">add</h3>
+// CHECK-HTML-CALC-NEXT:       <p>public int add(int a, int b)</p>
+// CHECK-HTML-CALC-NEXT:       <p>Defined at line 4 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC-NEXT:       <div>
+// CHECK-HTML-CALC-NEXT:         <div></div>
+// CHECK-HTML-CALC-NEXT:       </div>
+// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">subtract</h3>
+// CHECK-HTML-CALC-NEXT:       <p>public int subtract(int a, int b)</p>
+// CHECK-HTML-CALC-NEXT:       <p>Defined at line 8 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC-NEXT:       <div>
+// CHECK-HTML-CALC-NEXT:         <div></div>
+// CHECK-HTML-CALC-NEXT:       </div>
+// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">multiply</h3>
+// CHECK-HTML-CALC-NEXT:       <p>public int multiply(int a, int b)</p>
+// CHECK-HTML-CALC-NEXT:       <p>Defined at line 12 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC-NEXT:       <div>
+// CHECK-HTML-CALC-NEXT:         <div></div>
+// CHECK-HTML-CALC-NEXT:       </div>
+// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">divide</h3>
+// CHECK-HTML-CALC-NEXT:       <p>public double divide(int a, int b)</p>
+// CHECK-HTML-CALC-NEXT:       <p>Defined at line 16 of file {{.*}}Calculator.cpp</p>
+// CHECK-HTML-CALC-NEXT:       <div>
+// CHECK-HTML-CALC-NEXT:         <div></div>
+// CHECK-HTML-CALC-NEXT:       </div>
+// CHECK-HTML-CALC-NEXT:     </div>
+// CHECK-HTML-CALC-NEXT:   </div>
+// CHECK-HTML-CALC-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-CALC-NEXT:     <ol>
+// CHECK-HTML-CALC-NEXT:       <li>
+// CHECK-HTML-CALC-NEXT:         <span>
+// CHECK-HTML-CALC-NEXT:           <a href="#Functions">Functions</a>
+// CHECK-HTML-CALC-NEXT:         </span>
+// CHECK-HTML-CALC-NEXT:         <ul>
+// CHECK-HTML-CALC-NEXT:           <li>
+// CHECK-HTML-CALC-NEXT:             <span>
+// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">add</a>
+// CHECK-HTML-CALC-NEXT:             </span>
+// CHECK-HTML-CALC-NEXT:           </li>
+// CHECK-HTML-CALC-NEXT:           <li>
+// CHECK-HTML-CALC-NEXT:             <span>
+// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">subtract</a>
+// CHECK-HTML-CALC-NEXT:             </span>
+// CHECK-HTML-CALC-NEXT:           </li>
+// CHECK-HTML-CALC-NEXT:           <li>
+// CHECK-HTML-CALC-NEXT:             <span>
+// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">multiply</a>
+// CHECK-HTML-CALC-NEXT:             </span>
+// CHECK-HTML-CALC-NEXT:           </li>
+// CHECK-HTML-CALC-NEXT:           <li>
+// CHECK-HTML-CALC-NEXT:             <span>
+// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">divide</a>
+// CHECK-HTML-CALC-NEXT:             </span>
+// CHECK-HTML-CALC-NEXT:           </li>
+// CHECK-HTML-CALC-NEXT:         </ul>
+// CHECK-HTML-CALC-NEXT:       </li>
+// CHECK-HTML-CALC-NEXT:     </ol>
+// CHECK-HTML-CALC-NEXT:   </div>
+// CHECK-HTML-CALC-NEXT: </main>
+
+// CHECK-HTML-RECTANGLE: <!DOCTYPE html>
+// CHECK-HTML-RECTANGLE-NEXT: <meta charset="utf-8"/>
+// CHECK-HTML-RECTANGLE-NEXT: <title>class Rectangle</title>
+// CHECK-HTML-RECTANGLE-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-RECTANGLE-NEXT: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-RECTANGLE-NEXT: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-RECTANGLE-NEXT: <header id="project-title"></header>
+// CHECK-HTML-RECTANGLE-NEXT: <main>
+// CHECK-HTML-RECTANGLE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-RECTANGLE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-RECTANGLE-NEXT:     <h1>class Rectangle</h1>
+// CHECK-HTML-RECTANGLE-NEXT:     <p>Defined at line 10 of file {{.*}}Rectangle.h</p>
+// CHECK-HTML-RECTANGLE-NEXT:     <div>
+// CHECK-HTML-RECTANGLE-NEXT:       <div>
+// CHECK-HTML-RECTANGLE-NEXT:         <p> Represents a rectangle with a given width and height.</p>
+// CHECK-HTML-RECTANGLE-NEXT:       </div>
+// CHECK-HTML-RECTANGLE-NEXT:     </div>
+// CHECK-HTML-RECTANGLE-NEXT:     <p>
+// CHECK-HTML-RECTANGLE-NEXT:       Inherits from
+// CHECK-HTML-RECTANGLE-NEXT:       <a href="Shape.html">Shape</a>
+// CHECK-HTML-RECTANGLE-NEXT:     </p>
+// CHECK-HTML-RECTANGLE-NEXT:     <h2 id="Members">Members</h2>
+// CHECK-HTML-RECTANGLE-NEXT:     <ul>
+// CHECK-HTML-RECTANGLE-NEXT:       <li>private double width_</li>
+// CHECK-HTML-RECTANGLE-NEXT:       <li>private double height_</li>
+// CHECK-HTML-RECTANGLE-NEXT:     </ul>
+// CHECK-HTML-RECTANGLE-NEXT:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-RECTANGLE-NEXT:     <div>
+// CHECK-HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">Rectangle</h3>
+// CHECK-HTML-RECTANGLE-NEXT:       <p>public void Rectangle(double width, double height)</p>
+// CHECK-HTML-RECTANGLE-NEXT:       <p>Defined at line 3 of file {{.*}}Rectangle.cpp</p>
+// CHECK-HTML-RECTANGLE-NEXT:       <div>
+// CHECK-HTML-RECTANGLE-NEXT:         <div></div>
+// CHECK-HTML-RECTANGLE-NEXT:       </div>
+// CHECK-HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// CHECK-HTML-RECTANGLE-NEXT:       <p>public double area()</p>
+// CHECK-HTML-RECTANGLE-NEXT:       <p>Defined at line 6 of file {{.*}}Rectangle.cpp</p>
+// CHECK-HTML-RECTANGLE-NEXT:       <div>
+// CHECK-HTML-RECTANGLE-NEXT:         <div></div>
+// CHECK-HTML-RECTANGLE-NEXT:       </div>
+// CHECK-HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// CHECK-HTML-RECTANGLE-NEXT:       <p>public double perimeter()</p>
+// CHECK-HTML-RECTANGLE-NEXT:       <p>Defined at line 10 of file {{.*}}Rectangle.cpp</p>
+// CHECK-HTML-RECTANGLE-NEXT:       <div>
+// CHECK-HTML-RECTANGLE-NEXT:         <div></div>
+// CHECK-HTML-RECTANGLE-NEXT:       </div>
+// CHECK-HTML-RECTANGLE-NEXT:     </div>
+// CHECK-HTML-RECTANGLE-NEXT:   </div>
+// CHECK-HTML-RECTANGLE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-RECTANGLE-NEXT:     <ol>
+// CHECK-HTML-RECTANGLE-NEXT:       <li>
+// CHECK-HTML-RECTANGLE-NEXT:         <span>
+// CHECK-HTML-RECTANGLE-NEXT:           <a href="#Members">Members</a>
+// CHECK-HTML-RECTANGLE-NEXT:         </span>
+// CHECK-HTML-RECTANGLE-NEXT:       </li>
+// CHECK-HTML-RECTANGLE-NEXT:       <li>
+// CHECK-HTML-RECTANGLE-NEXT:         <span>
+// CHECK-HTML-RECTANGLE-NEXT:           <a href="#Functions">Functions</a>
+// CHECK-HTML-RECTANGLE-NEXT:         </span>
+// CHECK-HTML-RECTANGLE-NEXT:         <ul>
+// CHECK-HTML-RECTANGLE-NEXT:           <li>
+// CHECK-HTML-RECTANGLE-NEXT:             <span>
+// CHECK-HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">Rectangle</a>
+// CHECK-HTML-RECTANGLE-NEXT:             </span>
+// CHECK-HTML-RECTANGLE-NEXT:           </li>
+// CHECK-HTML-RECTANGLE-NEXT:           <li>
+// CHECK-HTML-RECTANGLE-NEXT:             <span>
+// CHECK-HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// CHECK-HTML-RECTANGLE-NEXT:             </span>
+// CHECK-HTML-RECTANGLE-NEXT:           </li>
+// CHECK-HTML-RECTANGLE-NEXT:           <li>
+// CHECK-HTML-RECTANGLE-NEXT:             <span>
+// CHECK-HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// CHECK-HTML-RECTANGLE-NEXT:             </span>
+// CHECK-HTML-RECTANGLE-NEXT:           </li>
+// CHECK-HTML-RECTANGLE-NEXT:         </ul>
+// CHECK-HTML-RECTANGLE-NEXT:       </li>
+// CHECK-HTML-RECTANGLE-NEXT:     </ol>
+// CHECK-HTML-RECTANGLE-NEXT:   </div>
+// CHECK-HTML-RECTANGLE-NEXT: </main>
+
+// CHECK-HTML-CIRCLE: <!DOCTYPE html>
+// CHECK-HTML-CIRCLE-NEXT: <meta charset="utf-8"/>
+// CHECK-HTML-CIRCLE-NEXT: <title>class Circle</title>
+// CHECK-HTML-CIRCLE-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// CHECK-HTML-CIRCLE-NEXT: <script src="{{.*}}index.js"></script>
+// CHECK-HTML-CIRCLE-NEXT: <script src="{{.*}}index_json.js"></script>
+// CHECK-HTML-CIRCLE-NEXT: <header id="project-title"></header>
+// CHECK-HTML-CIRCLE-NEXT: <main>
+// CHECK-HTML-CIRCLE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// CHECK-HTML-CIRCLE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// CHECK-HTML-CIRCLE-NEXT:     <h1>class Circle</h1>
+// CHECK-HTML-CIRCLE-NEXT:     <p>Defined at line 10 of file {{.*}}Circle.h</p>
+// CHECK-HTML-CIRCLE-NEXT:     <div>
+// CHECK-HTML-CIRCLE-NEXT:       <div>
+// CHECK-HTML-CIRCLE-NEXT:         <p> Represents a circle with a given radius.</p>
+// CHECK-HTML-CIRCLE-NEXT:       </div>
+// CHECK-HTML-CIRCLE-NEXT:     </div>
+// CHECK-HTML-CIRCLE-NEXT:     <p>
+// CHECK-HTML-CIRCLE-NEXT:       Inherits from
+// CHECK-HTML-CIRCLE-NEXT:       <a href="Shape.html">Shape</a>
+// CHECK-HTML-CIRCLE-NEXT:     </p>
+// CHECK-HTML-CIRCLE-NEXT:     <h2 id="Members">Members</h2>
+// CHECK-HTML-CIRCLE-NEXT:     <ul>
+// CHECK-HTML-CIRCLE-NEXT:       <li>private double radius_</li>
+// CHECK-HTML-CIRCLE-NEXT:     </ul>
+// CHECK-HTML-CIRCLE-NEXT:     <h2 id="Functions">Functions</h2>
+// CHECK-HTML-CIRCLE-NEXT:     <div>
+// CHECK-HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">Circle</h3>
+// CHECK-HTML-CIRCLE-NEXT:       <p>public void Circle(double radius)</p>
+// CHECK-HTML-CIRCLE-NEXT:       <p>Defined at line 3 of file {{.*}}Circle.cpp</p>
+// CHECK-HTML-CIRCLE-NEXT:       <div>
+// CHECK-HTML-CIRCLE-NEXT:         <div></div>
+// CHECK-HTML-CIRCLE-NEXT:       </div>
+// CHECK-HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// CHECK-HTML-CIRCLE-NEXT:       <p>public double area()</p>
+// CHECK-HTML-CIRCLE-NEXT:       <p>Defined at line 5 of file {{.*}}Circle.cpp</p>
+// CHECK-HTML-CIRCLE-NEXT:       <div>
+// CHECK-HTML-CIRCLE-NEXT:         <div></div>
+// CHECK-HTML-CIRCLE-NEXT:       </div>
+// CHECK-HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// CHECK-HTML-CIRCLE-NEXT:       <p>public double perimeter()</p>
+// CHECK-HTML-CIRCLE-NEXT:       <p>Defined at line 9 of file {{.*}}Circle.cpp</p>
+// CHECK-HTML-CIRCLE-NEXT:       <div>
+// CHECK-HTML-CIRCLE-NEXT:         <div></div>
+// CHECK-HTML-CIRCLE-NEXT:       </div>
+// CHECK-HTML-CIRCLE-NEXT:     </div>
+// CHECK-HTML-CIRCLE-NEXT:   </div>
+// CHECK-HTML-CIRCLE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// CHECK-HTML-CIRCLE-NEXT:     <ol>
+// CHECK-HTML-CIRCLE-NEXT:       <li>
+// CHECK-HTML-CIRCLE-NEXT:         <span>
+// CHECK-HTML-CIRCLE-NEXT:           <a href="#Members">Members</a>
+// CHECK-HTML-CIRCLE-NEXT:         </span>
+// CHECK-HTML-CIRCLE-NEXT:       </li>
+// CHECK-HTML-CIRCLE-NEXT:       <li>
+// CHECK-HTML-CIRCLE-NEXT:         <span>
+// CHECK-HTML-CIRCLE-NEXT:           <a href="#Functions">Functions</a>
+// CHECK-HTML-CIRCLE-NEXT:         </span>
+// CHECK-HTML-CIRCLE-NEXT:         <ul>
+// CHECK-HTML-CIRCLE-NEXT:           <li>
+// CHECK-HTML-CIRCLE-NEXT:             <span>
+// CHECK-HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">Circle</a>
+// CHECK-HTML-CIRCLE-NEXT:             </span>
+// CHECK-HTML-CIRCLE-NEXT:           </li>
+// CHECK-HTML-CIRCLE-NEXT:           <li>
+// CHECK-HTML-CIRCLE-NEXT:             <span>
+// CHECK-HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// CHECK-HTML-CIRCLE-NEXT:             </span>
+// CHECK-HTML-CIRCLE-NEXT:           </li>
+// CHECK-HTML-CIRCLE-NEXT:           <li>
+// CHECK-HTML-CIRCLE-NEXT:             <span>
+// CHECK-HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// CHECK-HTML-CIRCLE-NEXT:             </span>
+// CHECK-HTML-CIRCLE-NEXT:           </li>
+// CHECK-HTML-CIRCLE-NEXT:         </ul>
+// CHECK-HTML-CIRCLE-NEXT:       </li>
+// CHECK-HTML-CIRCLE-NEXT:     </ol>
+// CHECK-HTML-CIRCLE-NEXT:   </div>
+// CHECK-HTML-CIRCLE-NEXT: </main>
\ No newline at end of file

>From ccd44f6300216c9a628759efdf2b722bab21d030 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Sat, 8 Jun 2024 02:03:27 -0400
Subject: [PATCH 2/5] [clang][clang-doc] simplify e2e test commands

---
 .../clang-doc-project1/database_template.json |  18 +-
 .../{ => include}/Calculator.h                |   0
 .../clang-doc-project1/{ => include}/Circle.h |   0
 .../{ => include}/Rectangle.h                 |   0
 .../clang-doc-project1/{ => include}/Shape.h  |   0
 .../{ => src}/Calculator.cpp                  |   0
 .../clang-doc-project1/{ => src}/Circle.cpp   |   0
 .../{ => src}/Rectangle.cpp                   |   0
 .../test/clang-doc/basic-project.test         | 358 +++++++++++++++++
 .../test/clang-doc/clang-doc-project1.cpp     | 361 ------------------
 10 files changed, 367 insertions(+), 370 deletions(-)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => include}/Calculator.h (100%)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => include}/Circle.h (100%)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => include}/Rectangle.h (100%)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => include}/Shape.h (100%)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => src}/Calculator.cpp (100%)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => src}/Circle.cpp (100%)
 rename clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/{ => src}/Rectangle.cpp (100%)
 create mode 100644 clang-tools-extra/test/clang-doc/basic-project.test
 delete mode 100644 clang-tools-extra/test/clang-doc/clang-doc-project1.cpp

diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
index ae1bc6f128677..b6816fe503735 100644
--- a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/database_template.json
@@ -1,17 +1,17 @@
 [
   {
-    "directory": "$test_dir/build",
-    "command": "clang++ -o Calculator.o -I../include $test_dir/src/Calculator.cpp",
-    "file": "$test_dir/src/Calculator.cpp"
+    "directory": "$test_dir/Inputs/clang-doc-project1",
+    "command": "clang++ -o Calculator.o -I./include ./src/Calculator.cpp",
+    "file": "./src/Calculator.cpp"
   },
   {
-    "directory": "$test_dir/build",
-    "command": "clang++ -o Circle.o -I../include $test_dir/src/Circle.cpp",
-    "file": "$test_dir/src/Circle.cpp"
+    "directory": "$test_dir/Inputs/clang-doc-project1",
+    "command": "clang++ -o Circle.o -I./include ./src/Circle.cpp",
+    "file": "./src/Circle.cpp"
   },
   {
-    "directory": "$test_dir/build",
-    "command": "clang++ -o Rectangle.o -I../include $test_dir/src/Rectangle.cpp",
-    "file": "$test_dir/src/Rectangle.cpp"
+    "directory": "$test_dir/Inputs/clang-doc-project1",
+    "command": "clang++ -o Rectangle.o -I./include ./src/Rectangle.cpp",
+    "file": "./src/Rectangle.cpp"
   }
 ]
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Calculator.h
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.h
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Calculator.h
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Circle.h
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.h
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Circle.h
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Rectangle.h
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.h
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Rectangle.h
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Shape.h
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Shape.h
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/include/Shape.h
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/src/Calculator.cpp
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Calculator.cpp
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/src/Calculator.cpp
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/src/Circle.cpp
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Circle.cpp
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/src/Circle.cpp
diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/src/Rectangle.cpp
similarity index 100%
rename from clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/Rectangle.cpp
rename to clang-tools-extra/test/clang-doc/Inputs/clang-doc-project1/src/Rectangle.cpp
diff --git a/clang-tools-extra/test/clang-doc/basic-project.test b/clang-tools-extra/test/clang-doc/basic-project.test
new file mode 100644
index 0000000000000..4e7d9801c4d37
--- /dev/null
+++ b/clang-tools-extra/test/clang-doc/basic-project.test
@@ -0,0 +1,358 @@
+// RUN: rm -rf %t && mkdir -p %t/docs && mkdir -p %t/build
+// RUN: sed 's|$test_dir|%/S|g' %S/Inputs/clang-doc-project1/database_template.json > %t/build/compile_commands.json
+// RUN: clang-doc --format=html --output=%t/docs --executor=all-TUs --asset=%S/Inputs %t/build/compile_commands.json
+// RUN: FileCheck %s -input-file=%t/docs/index_json.js -check-prefix=JSON-INDEX
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Shape.html -check-prefix=HTML-SHAPE
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Calculator.html -check-prefix=HTML-CALC
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Rectangle.html -check-prefix=HTML-RECTANGLE
+// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Circle.html -check-prefix=HTML-CIRCLE
+
+// JSON-INDEX: var JsonIndex = `
+// JSON-INDEX-NEXT: {
+// JSON-INDEX-NEXT:   "USR": "{{([0-9A-F]{40})}}",
+// JSON-INDEX-NEXT:   "Name": "",
+// JSON-INDEX-NEXT:   "RefType": "default",
+// JSON-INDEX-NEXT:   "Path": "",
+// JSON-INDEX-NEXT:   "Children": [
+// JSON-INDEX-NEXT:     {
+// JSON-INDEX-NEXT:       "USR": "{{([0-9A-F]{40})}}",
+// JSON-INDEX-NEXT:       "Name": "GlobalNamespace",
+// JSON-INDEX-NEXT:       "RefType": "namespace",
+// JSON-INDEX-NEXT:       "Path": "GlobalNamespace",
+// JSON-INDEX-NEXT:       "Children": [
+// JSON-INDEX-NEXT:         {
+// JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// JSON-INDEX-NEXT:           "Name": "Calculator",
+// JSON-INDEX-NEXT:           "RefType": "record",
+// JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// JSON-INDEX-NEXT:           "Children": []
+// JSON-INDEX-NEXT:         },
+// JSON-INDEX-NEXT:         {
+// JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// JSON-INDEX-NEXT:           "Name": "Circle",
+// JSON-INDEX-NEXT:           "RefType": "record",
+// JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// JSON-INDEX-NEXT:           "Children": []
+// JSON-INDEX-NEXT:         },
+// JSON-INDEX-NEXT:         {
+// JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// JSON-INDEX-NEXT:           "Name": "Rectangle",
+// JSON-INDEX-NEXT:           "RefType": "record",
+// JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// JSON-INDEX-NEXT:           "Children": []
+// JSON-INDEX-NEXT:         },
+// JSON-INDEX-NEXT:         {
+// JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
+// JSON-INDEX-NEXT:           "Name": "Shape",
+// JSON-INDEX-NEXT:           "RefType": "record",
+// JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
+// JSON-INDEX-NEXT:           "Children": []
+// JSON-INDEX-NEXT:         }
+// JSON-INDEX-NEXT:       ]
+// JSON-INDEX-NEXT:     }
+// JSON-INDEX-NEXT:   ]
+// JSON-INDEX-NEXT: }`;
+
+// HTML-SHAPE: <!DOCTYPE html>
+// HTML-SHAPE-NEXT: <meta charset="utf-8"/>
+// HTML-SHAPE-NEXT: <title>class Shape</title>
+// HTML-SHAPE-NEXT: <link rel="stylesheet" href="../clang-doc-default-stylesheet.css"/>
+// HTML-SHAPE-NEXT: <script src="../index.js"></script>
+// HTML-SHAPE-NEXT: <script src="../index_json.js"></script>
+// HTML-SHAPE-NEXT: <header id="project-title"></header>
+// HTML-SHAPE-NEXT: <main>
+// HTML-SHAPE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// HTML-SHAPE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// HTML-SHAPE-NEXT:     <h1>class Shape</h1>
+// HTML-SHAPE-NEXT:     <p>Defined at line 8 of file {{.*}}Shape.h</p>
+// HTML-SHAPE-NEXT:     <div>
+// HTML-SHAPE-NEXT:       <div>
+// HTML-SHAPE-NEXT:         <p> Provides a common interface for different types of shapes.</p>
+// HTML-SHAPE-NEXT:       </div>
+// HTML-SHAPE-NEXT:     </div>
+// HTML-SHAPE-NEXT:     <h2 id="Functions">Functions</h2>
+// HTML-SHAPE-NEXT:     <div>
+// HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">~Shape</h3>
+// HTML-SHAPE-NEXT:       <p>public void ~Shape()</p>
+// HTML-SHAPE-NEXT:       <p>Defined at line 13 of file {{.*}}Shape.h</p>
+// HTML-SHAPE-NEXT:       <div>
+// HTML-SHAPE-NEXT:         <div></div>
+// HTML-SHAPE-NEXT:       </div>
+// HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// HTML-SHAPE-NEXT:       <p>public double area()</p>
+// HTML-SHAPE-NEXT:       <div>
+// HTML-SHAPE-NEXT:         <div></div>
+// HTML-SHAPE-NEXT:       </div>
+// HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// HTML-SHAPE-NEXT:       <p>public double perimeter()</p>
+// HTML-SHAPE-NEXT:       <div>
+// HTML-SHAPE-NEXT:         <div></div>
+// HTML-SHAPE-NEXT:       </div>
+// HTML-SHAPE-NEXT:     </div>
+// HTML-SHAPE-NEXT:   </div>
+// HTML-SHAPE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// HTML-SHAPE-NEXT:     <ol>
+// HTML-SHAPE-NEXT:       <li>
+// HTML-SHAPE-NEXT:         <span>
+// HTML-SHAPE-NEXT:           <a href="#Functions">Functions</a>
+// HTML-SHAPE-NEXT:         </span>
+// HTML-SHAPE-NEXT:         <ul>
+// HTML-SHAPE-NEXT:           <li>
+// HTML-SHAPE-NEXT:             <span>
+// HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">~Shape</a>
+// HTML-SHAPE-NEXT:             </span>
+// HTML-SHAPE-NEXT:           </li>
+// HTML-SHAPE-NEXT:           <li>
+// HTML-SHAPE-NEXT:             <span>
+// HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// HTML-SHAPE-NEXT:             </span>
+// HTML-SHAPE-NEXT:           </li>
+// HTML-SHAPE-NEXT:           <li>
+// HTML-SHAPE-NEXT:             <span>
+// HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// HTML-SHAPE-NEXT:             </span>
+// HTML-SHAPE-NEXT:           </li>
+// HTML-SHAPE-NEXT:         </ul>
+// HTML-SHAPE-NEXT:       </li>
+// HTML-SHAPE-NEXT:     </ol>
+// HTML-SHAPE-NEXT:   </div>
+// HTML-SHAPE-NEXT: </main>
+
+// HTML-CALC: <!DOCTYPE html>
+// HTML-CALC-NEXT: <meta charset="utf-8"/>
+// HTML-CALC-NEXT: <title>class Calculator</title>
+// HTML-CALC-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// HTML-CALC-NEXT: <script src="{{.*}}index.js"></script>
+// HTML-CALC-NEXT: <script src="{{.*}}index_json.js"></script>
+// HTML-CALC-NEXT: <header id="project-title"></header>
+// HTML-CALC-NEXT: <main>
+// HTML-CALC-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// HTML-CALC-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// HTML-CALC-NEXT:     <h1>class Calculator</h1>
+// HTML-CALC-NEXT:     <p>Defined at line 8 of file {{.*}}Calculator.h</p>
+// HTML-CALC-NEXT:     <div>
+// HTML-CALC-NEXT:       <div>
+// HTML-CALC-NEXT:         <p> Provides basic arithmetic operations.</p>
+// HTML-CALC-NEXT:       </div>
+// HTML-CALC-NEXT:     </div>
+// HTML-CALC-NEXT:     <h2 id="Functions">Functions</h2>
+// HTML-CALC-NEXT:     <div>
+// HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">add</h3>
+// HTML-CALC-NEXT:       <p>public int add(int a, int b)</p>
+// HTML-CALC-NEXT:       <p>Defined at line 4 of file {{.*}}Calculator.cpp</p>
+// HTML-CALC-NEXT:       <div>
+// HTML-CALC-NEXT:         <div></div>
+// HTML-CALC-NEXT:       </div>
+// HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">subtract</h3>
+// HTML-CALC-NEXT:       <p>public int subtract(int a, int b)</p>
+// HTML-CALC-NEXT:       <p>Defined at line 8 of file {{.*}}Calculator.cpp</p>
+// HTML-CALC-NEXT:       <div>
+// HTML-CALC-NEXT:         <div></div>
+// HTML-CALC-NEXT:       </div>
+// HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">multiply</h3>
+// HTML-CALC-NEXT:       <p>public int multiply(int a, int b)</p>
+// HTML-CALC-NEXT:       <p>Defined at line 12 of file {{.*}}Calculator.cpp</p>
+// HTML-CALC-NEXT:       <div>
+// HTML-CALC-NEXT:         <div></div>
+// HTML-CALC-NEXT:       </div>
+// HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">divide</h3>
+// HTML-CALC-NEXT:       <p>public double divide(int a, int b)</p>
+// HTML-CALC-NEXT:       <p>Defined at line 16 of file {{.*}}Calculator.cpp</p>
+// HTML-CALC-NEXT:       <div>
+// HTML-CALC-NEXT:         <div></div>
+// HTML-CALC-NEXT:       </div>
+// HTML-CALC-NEXT:     </div>
+// HTML-CALC-NEXT:   </div>
+// HTML-CALC-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// HTML-CALC-NEXT:     <ol>
+// HTML-CALC-NEXT:       <li>
+// HTML-CALC-NEXT:         <span>
+// HTML-CALC-NEXT:           <a href="#Functions">Functions</a>
+// HTML-CALC-NEXT:         </span>
+// HTML-CALC-NEXT:         <ul>
+// HTML-CALC-NEXT:           <li>
+// HTML-CALC-NEXT:             <span>
+// HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">add</a>
+// HTML-CALC-NEXT:             </span>
+// HTML-CALC-NEXT:           </li>
+// HTML-CALC-NEXT:           <li>
+// HTML-CALC-NEXT:             <span>
+// HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">subtract</a>
+// HTML-CALC-NEXT:             </span>
+// HTML-CALC-NEXT:           </li>
+// HTML-CALC-NEXT:           <li>
+// HTML-CALC-NEXT:             <span>
+// HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">multiply</a>
+// HTML-CALC-NEXT:             </span>
+// HTML-CALC-NEXT:           </li>
+// HTML-CALC-NEXT:           <li>
+// HTML-CALC-NEXT:             <span>
+// HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">divide</a>
+// HTML-CALC-NEXT:             </span>
+// HTML-CALC-NEXT:           </li>
+// HTML-CALC-NEXT:         </ul>
+// HTML-CALC-NEXT:       </li>
+// HTML-CALC-NEXT:     </ol>
+// HTML-CALC-NEXT:   </div>
+// HTML-CALC-NEXT: </main>
+
+// HTML-RECTANGLE: <!DOCTYPE html>
+// HTML-RECTANGLE-NEXT: <meta charset="utf-8"/>
+// HTML-RECTANGLE-NEXT: <title>class Rectangle</title>
+// HTML-RECTANGLE-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// HTML-RECTANGLE-NEXT: <script src="{{.*}}index.js"></script>
+// HTML-RECTANGLE-NEXT: <script src="{{.*}}index_json.js"></script>
+// HTML-RECTANGLE-NEXT: <header id="project-title"></header>
+// HTML-RECTANGLE-NEXT: <main>
+// HTML-RECTANGLE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// HTML-RECTANGLE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// HTML-RECTANGLE-NEXT:     <h1>class Rectangle</h1>
+// HTML-RECTANGLE-NEXT:     <p>Defined at line 10 of file {{.*}}Rectangle.h</p>
+// HTML-RECTANGLE-NEXT:     <div>
+// HTML-RECTANGLE-NEXT:       <div>
+// HTML-RECTANGLE-NEXT:         <p> Represents a rectangle with a given width and height.</p>
+// HTML-RECTANGLE-NEXT:       </div>
+// HTML-RECTANGLE-NEXT:     </div>
+// HTML-RECTANGLE-NEXT:     <p>
+// HTML-RECTANGLE-NEXT:       Inherits from
+// HTML-RECTANGLE-NEXT:       <a href="Shape.html">Shape</a>
+// HTML-RECTANGLE-NEXT:     </p>
+// HTML-RECTANGLE-NEXT:     <h2 id="Members">Members</h2>
+// HTML-RECTANGLE-NEXT:     <ul>
+// HTML-RECTANGLE-NEXT:       <li>private double width_</li>
+// HTML-RECTANGLE-NEXT:       <li>private double height_</li>
+// HTML-RECTANGLE-NEXT:     </ul>
+// HTML-RECTANGLE-NEXT:     <h2 id="Functions">Functions</h2>
+// HTML-RECTANGLE-NEXT:     <div>
+// HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">Rectangle</h3>
+// HTML-RECTANGLE-NEXT:       <p>public void Rectangle(double width, double height)</p>
+// HTML-RECTANGLE-NEXT:       <p>Defined at line 3 of file {{.*}}Rectangle.cpp</p>
+// HTML-RECTANGLE-NEXT:       <div>
+// HTML-RECTANGLE-NEXT:         <div></div>
+// HTML-RECTANGLE-NEXT:       </div>
+// HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// HTML-RECTANGLE-NEXT:       <p>public double area()</p>
+// HTML-RECTANGLE-NEXT:       <p>Defined at line 6 of file {{.*}}Rectangle.cpp</p>
+// HTML-RECTANGLE-NEXT:       <div>
+// HTML-RECTANGLE-NEXT:         <div></div>
+// HTML-RECTANGLE-NEXT:       </div>
+// HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// HTML-RECTANGLE-NEXT:       <p>public double perimeter()</p>
+// HTML-RECTANGLE-NEXT:       <p>Defined at line 10 of file {{.*}}Rectangle.cpp</p>
+// HTML-RECTANGLE-NEXT:       <div>
+// HTML-RECTANGLE-NEXT:         <div></div>
+// HTML-RECTANGLE-NEXT:       </div>
+// HTML-RECTANGLE-NEXT:     </div>
+// HTML-RECTANGLE-NEXT:   </div>
+// HTML-RECTANGLE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// HTML-RECTANGLE-NEXT:     <ol>
+// HTML-RECTANGLE-NEXT:       <li>
+// HTML-RECTANGLE-NEXT:         <span>
+// HTML-RECTANGLE-NEXT:           <a href="#Members">Members</a>
+// HTML-RECTANGLE-NEXT:         </span>
+// HTML-RECTANGLE-NEXT:       </li>
+// HTML-RECTANGLE-NEXT:       <li>
+// HTML-RECTANGLE-NEXT:         <span>
+// HTML-RECTANGLE-NEXT:           <a href="#Functions">Functions</a>
+// HTML-RECTANGLE-NEXT:         </span>
+// HTML-RECTANGLE-NEXT:         <ul>
+// HTML-RECTANGLE-NEXT:           <li>
+// HTML-RECTANGLE-NEXT:             <span>
+// HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">Rectangle</a>
+// HTML-RECTANGLE-NEXT:             </span>
+// HTML-RECTANGLE-NEXT:           </li>
+// HTML-RECTANGLE-NEXT:           <li>
+// HTML-RECTANGLE-NEXT:             <span>
+// HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// HTML-RECTANGLE-NEXT:             </span>
+// HTML-RECTANGLE-NEXT:           </li>
+// HTML-RECTANGLE-NEXT:           <li>
+// HTML-RECTANGLE-NEXT:             <span>
+// HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// HTML-RECTANGLE-NEXT:             </span>
+// HTML-RECTANGLE-NEXT:           </li>
+// HTML-RECTANGLE-NEXT:         </ul>
+// HTML-RECTANGLE-NEXT:       </li>
+// HTML-RECTANGLE-NEXT:     </ol>
+// HTML-RECTANGLE-NEXT:   </div>
+// HTML-RECTANGLE-NEXT: </main>
+
+// HTML-CIRCLE: <!DOCTYPE html>
+// HTML-CIRCLE-NEXT: <meta charset="utf-8"/>
+// HTML-CIRCLE-NEXT: <title>class Circle</title>
+// HTML-CIRCLE-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
+// HTML-CIRCLE-NEXT: <script src="{{.*}}index.js"></script>
+// HTML-CIRCLE-NEXT: <script src="{{.*}}index_json.js"></script>
+// HTML-CIRCLE-NEXT: <header id="project-title"></header>
+// HTML-CIRCLE-NEXT: <main>
+// HTML-CIRCLE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
+// HTML-CIRCLE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
+// HTML-CIRCLE-NEXT:     <h1>class Circle</h1>
+// HTML-CIRCLE-NEXT:     <p>Defined at line 10 of file {{.*}}Circle.h</p>
+// HTML-CIRCLE-NEXT:     <div>
+// HTML-CIRCLE-NEXT:       <div>
+// HTML-CIRCLE-NEXT:         <p> Represents a circle with a given radius.</p>
+// HTML-CIRCLE-NEXT:       </div>
+// HTML-CIRCLE-NEXT:     </div>
+// HTML-CIRCLE-NEXT:     <p>
+// HTML-CIRCLE-NEXT:       Inherits from
+// HTML-CIRCLE-NEXT:       <a href="Shape.html">Shape</a>
+// HTML-CIRCLE-NEXT:     </p>
+// HTML-CIRCLE-NEXT:     <h2 id="Members">Members</h2>
+// HTML-CIRCLE-NEXT:     <ul>
+// HTML-CIRCLE-NEXT:       <li>private double radius_</li>
+// HTML-CIRCLE-NEXT:     </ul>
+// HTML-CIRCLE-NEXT:     <h2 id="Functions">Functions</h2>
+// HTML-CIRCLE-NEXT:     <div>
+// HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">Circle</h3>
+// HTML-CIRCLE-NEXT:       <p>public void Circle(double radius)</p>
+// HTML-CIRCLE-NEXT:       <p>Defined at line 3 of file {{.*}}Circle.cpp</p>
+// HTML-CIRCLE-NEXT:       <div>
+// HTML-CIRCLE-NEXT:         <div></div>
+// HTML-CIRCLE-NEXT:       </div>
+// HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
+// HTML-CIRCLE-NEXT:       <p>public double area()</p>
+// HTML-CIRCLE-NEXT:       <p>Defined at line 5 of file {{.*}}Circle.cpp</p>
+// HTML-CIRCLE-NEXT:       <div>
+// HTML-CIRCLE-NEXT:         <div></div>
+// HTML-CIRCLE-NEXT:       </div>
+// HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
+// HTML-CIRCLE-NEXT:       <p>public double perimeter()</p>
+// HTML-CIRCLE-NEXT:       <p>Defined at line 9 of file {{.*}}Circle.cpp</p>
+// HTML-CIRCLE-NEXT:       <div>
+// HTML-CIRCLE-NEXT:         <div></div>
+// HTML-CIRCLE-NEXT:       </div>
+// HTML-CIRCLE-NEXT:     </div>
+// HTML-CIRCLE-NEXT:   </div>
+// HTML-CIRCLE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
+// HTML-CIRCLE-NEXT:     <ol>
+// HTML-CIRCLE-NEXT:       <li>
+// HTML-CIRCLE-NEXT:         <span>
+// HTML-CIRCLE-NEXT:           <a href="#Members">Members</a>
+// HTML-CIRCLE-NEXT:         </span>
+// HTML-CIRCLE-NEXT:       </li>
+// HTML-CIRCLE-NEXT:       <li>
+// HTML-CIRCLE-NEXT:         <span>
+// HTML-CIRCLE-NEXT:           <a href="#Functions">Functions</a>
+// HTML-CIRCLE-NEXT:         </span>
+// HTML-CIRCLE-NEXT:         <ul>
+// HTML-CIRCLE-NEXT:           <li>
+// HTML-CIRCLE-NEXT:             <span>
+// HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">Circle</a>
+// HTML-CIRCLE-NEXT:             </span>
+// HTML-CIRCLE-NEXT:           </li>
+// HTML-CIRCLE-NEXT:           <li>
+// HTML-CIRCLE-NEXT:             <span>
+// HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
+// HTML-CIRCLE-NEXT:             </span>
+// HTML-CIRCLE-NEXT:           </li>
+// HTML-CIRCLE-NEXT:           <li>
+// HTML-CIRCLE-NEXT:             <span>
+// HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
+// HTML-CIRCLE-NEXT:             </span>
+// HTML-CIRCLE-NEXT:           </li>
+// HTML-CIRCLE-NEXT:         </ul>
+// HTML-CIRCLE-NEXT:       </li>
+// HTML-CIRCLE-NEXT:     </ol>
+// HTML-CIRCLE-NEXT:   </div>
+// HTML-CIRCLE-NEXT: </main>
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp b/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
deleted file mode 100644
index 59bf781385b40..0000000000000
--- a/clang-tools-extra/test/clang-doc/clang-doc-project1.cpp
+++ /dev/null
@@ -1,361 +0,0 @@
-// RUN: rm -rf %t && mkdir -p %t/build %t/include %t/src %t/docs
-// RUN: sed 's|$test_dir|%/t|g' %S/Inputs/clang-doc-project1/database_template.json > %t/build/compile_commands.json
-// RUN: cp %S/Inputs/clang-doc-project1/*.h  %t/include
-// RUN: cp %S/Inputs/clang-doc-project1/*.cpp %t/src
-// RUN: cd %t
-// RUN: clang-doc --format=html --executor=all-TUs --asset=%S/Inputs ./build/compile_commands.json
-// RUN: FileCheck %s -input-file=%t/docs/index_json.js -check-prefix=CHECK-JSON-INDEX
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Shape.html -check-prefix=CHECK-HTML-SHAPE
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Calculator.html -check-prefix=CHECK-HTML-CALC
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Rectangle.html -check-prefix=CHECK-HTML-RECTANGLE
-// RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Circle.html -check-prefix=CHECK-HTML-CIRCLE
-
-// CHECK-JSON-INDEX: var JsonIndex = `
-// CHECK-JSON-INDEX-NEXT: {
-// CHECK-JSON-INDEX-NEXT:   "USR": "{{([0-9A-F]{40})}}",
-// CHECK-JSON-INDEX-NEXT:   "Name": "",
-// CHECK-JSON-INDEX-NEXT:   "RefType": "default",
-// CHECK-JSON-INDEX-NEXT:   "Path": "",
-// CHECK-JSON-INDEX-NEXT:   "Children": [
-// CHECK-JSON-INDEX-NEXT:     {
-// CHECK-JSON-INDEX-NEXT:       "USR": "{{([0-9A-F]{40})}}",
-// CHECK-JSON-INDEX-NEXT:       "Name": "GlobalNamespace",
-// CHECK-JSON-INDEX-NEXT:       "RefType": "namespace",
-// CHECK-JSON-INDEX-NEXT:       "Path": "GlobalNamespace",
-// CHECK-JSON-INDEX-NEXT:       "Children": [
-// CHECK-JSON-INDEX-NEXT:         {
-// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
-// CHECK-JSON-INDEX-NEXT:           "Name": "Calculator",
-// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
-// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
-// CHECK-JSON-INDEX-NEXT:           "Children": []
-// CHECK-JSON-INDEX-NEXT:         },
-// CHECK-JSON-INDEX-NEXT:         {
-// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
-// CHECK-JSON-INDEX-NEXT:           "Name": "Circle",
-// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
-// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
-// CHECK-JSON-INDEX-NEXT:           "Children": []
-// CHECK-JSON-INDEX-NEXT:         },
-// CHECK-JSON-INDEX-NEXT:         {
-// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
-// CHECK-JSON-INDEX-NEXT:           "Name": "Rectangle",
-// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
-// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
-// CHECK-JSON-INDEX-NEXT:           "Children": []
-// CHECK-JSON-INDEX-NEXT:         },
-// CHECK-JSON-INDEX-NEXT:         {
-// CHECK-JSON-INDEX-NEXT:           "USR": "{{([0-9A-F]{40})}}",
-// CHECK-JSON-INDEX-NEXT:           "Name": "Shape",
-// CHECK-JSON-INDEX-NEXT:           "RefType": "record",
-// CHECK-JSON-INDEX-NEXT:           "Path": "GlobalNamespace",
-// CHECK-JSON-INDEX-NEXT:           "Children": []
-// CHECK-JSON-INDEX-NEXT:         }
-// CHECK-JSON-INDEX-NEXT:       ]
-// CHECK-JSON-INDEX-NEXT:     }
-// CHECK-JSON-INDEX-NEXT:   ]
-// CHECK-JSON-INDEX-NEXT: }`;
-
-// CHECK-HTML-SHAPE: <!DOCTYPE html>
-// CHECK-HTML-SHAPE-NEXT: <meta charset="utf-8"/>
-// CHECK-HTML-SHAPE-NEXT: <title>class Shape</title>
-// CHECK-HTML-SHAPE-NEXT: <link rel="stylesheet" href="../clang-doc-default-stylesheet.css"/>
-// CHECK-HTML-SHAPE-NEXT: <script src="../index.js"></script>
-// CHECK-HTML-SHAPE-NEXT: <script src="../index_json.js"></script>
-// CHECK-HTML-SHAPE-NEXT: <header id="project-title"></header>
-// CHECK-HTML-SHAPE-NEXT: <main>
-// CHECK-HTML-SHAPE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
-// CHECK-HTML-SHAPE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
-// CHECK-HTML-SHAPE-NEXT:     <h1>class Shape</h1>
-// CHECK-HTML-SHAPE-NEXT:     <p>Defined at line 8 of file {{.*}}Shape.h</p>
-// CHECK-HTML-SHAPE-NEXT:     <div>
-// CHECK-HTML-SHAPE-NEXT:       <div>
-// CHECK-HTML-SHAPE-NEXT:         <p> Provides a common interface for different types of shapes.</p>
-// CHECK-HTML-SHAPE-NEXT:       </div>
-// CHECK-HTML-SHAPE-NEXT:     </div>
-// CHECK-HTML-SHAPE-NEXT:     <h2 id="Functions">Functions</h2>
-// CHECK-HTML-SHAPE-NEXT:     <div>
-// CHECK-HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">~Shape</h3>
-// CHECK-HTML-SHAPE-NEXT:       <p>public void ~Shape()</p>
-// CHECK-HTML-SHAPE-NEXT:       <p>Defined at line 13 of file {{.*}}Shape.h</p>
-// CHECK-HTML-SHAPE-NEXT:       <div>
-// CHECK-HTML-SHAPE-NEXT:         <div></div>
-// CHECK-HTML-SHAPE-NEXT:       </div>
-// CHECK-HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
-// CHECK-HTML-SHAPE-NEXT:       <p>public double area()</p>
-// CHECK-HTML-SHAPE-NEXT:       <div>
-// CHECK-HTML-SHAPE-NEXT:         <div></div>
-// CHECK-HTML-SHAPE-NEXT:       </div>
-// CHECK-HTML-SHAPE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
-// CHECK-HTML-SHAPE-NEXT:       <p>public double perimeter()</p>
-// CHECK-HTML-SHAPE-NEXT:       <div>
-// CHECK-HTML-SHAPE-NEXT:         <div></div>
-// CHECK-HTML-SHAPE-NEXT:       </div>
-// CHECK-HTML-SHAPE-NEXT:     </div>
-// CHECK-HTML-SHAPE-NEXT:   </div>
-// CHECK-HTML-SHAPE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
-// CHECK-HTML-SHAPE-NEXT:     <ol>
-// CHECK-HTML-SHAPE-NEXT:       <li>
-// CHECK-HTML-SHAPE-NEXT:         <span>
-// CHECK-HTML-SHAPE-NEXT:           <a href="#Functions">Functions</a>
-// CHECK-HTML-SHAPE-NEXT:         </span>
-// CHECK-HTML-SHAPE-NEXT:         <ul>
-// CHECK-HTML-SHAPE-NEXT:           <li>
-// CHECK-HTML-SHAPE-NEXT:             <span>
-// CHECK-HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">~Shape</a>
-// CHECK-HTML-SHAPE-NEXT:             </span>
-// CHECK-HTML-SHAPE-NEXT:           </li>
-// CHECK-HTML-SHAPE-NEXT:           <li>
-// CHECK-HTML-SHAPE-NEXT:             <span>
-// CHECK-HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
-// CHECK-HTML-SHAPE-NEXT:             </span>
-// CHECK-HTML-SHAPE-NEXT:           </li>
-// CHECK-HTML-SHAPE-NEXT:           <li>
-// CHECK-HTML-SHAPE-NEXT:             <span>
-// CHECK-HTML-SHAPE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
-// CHECK-HTML-SHAPE-NEXT:             </span>
-// CHECK-HTML-SHAPE-NEXT:           </li>
-// CHECK-HTML-SHAPE-NEXT:         </ul>
-// CHECK-HTML-SHAPE-NEXT:       </li>
-// CHECK-HTML-SHAPE-NEXT:     </ol>
-// CHECK-HTML-SHAPE-NEXT:   </div>
-// CHECK-HTML-SHAPE-NEXT: </main>
-
-// CHECK-HTML-CALC: <!DOCTYPE html>
-// CHECK-HTML-CALC-NEXT: <meta charset="utf-8"/>
-// CHECK-HTML-CALC-NEXT: <title>class Calculator</title>
-// CHECK-HTML-CALC-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
-// CHECK-HTML-CALC-NEXT: <script src="{{.*}}index.js"></script>
-// CHECK-HTML-CALC-NEXT: <script src="{{.*}}index_json.js"></script>
-// CHECK-HTML-CALC-NEXT: <header id="project-title"></header>
-// CHECK-HTML-CALC-NEXT: <main>
-// CHECK-HTML-CALC-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
-// CHECK-HTML-CALC-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
-// CHECK-HTML-CALC-NEXT:     <h1>class Calculator</h1>
-// CHECK-HTML-CALC-NEXT:     <p>Defined at line 8 of file {{.*}}Calculator.h</p>
-// CHECK-HTML-CALC-NEXT:     <div>
-// CHECK-HTML-CALC-NEXT:       <div>
-// CHECK-HTML-CALC-NEXT:         <p> Provides basic arithmetic operations.</p>
-// CHECK-HTML-CALC-NEXT:       </div>
-// CHECK-HTML-CALC-NEXT:     </div>
-// CHECK-HTML-CALC-NEXT:     <h2 id="Functions">Functions</h2>
-// CHECK-HTML-CALC-NEXT:     <div>
-// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">add</h3>
-// CHECK-HTML-CALC-NEXT:       <p>public int add(int a, int b)</p>
-// CHECK-HTML-CALC-NEXT:       <p>Defined at line 4 of file {{.*}}Calculator.cpp</p>
-// CHECK-HTML-CALC-NEXT:       <div>
-// CHECK-HTML-CALC-NEXT:         <div></div>
-// CHECK-HTML-CALC-NEXT:       </div>
-// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">subtract</h3>
-// CHECK-HTML-CALC-NEXT:       <p>public int subtract(int a, int b)</p>
-// CHECK-HTML-CALC-NEXT:       <p>Defined at line 8 of file {{.*}}Calculator.cpp</p>
-// CHECK-HTML-CALC-NEXT:       <div>
-// CHECK-HTML-CALC-NEXT:         <div></div>
-// CHECK-HTML-CALC-NEXT:       </div>
-// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">multiply</h3>
-// CHECK-HTML-CALC-NEXT:       <p>public int multiply(int a, int b)</p>
-// CHECK-HTML-CALC-NEXT:       <p>Defined at line 12 of file {{.*}}Calculator.cpp</p>
-// CHECK-HTML-CALC-NEXT:       <div>
-// CHECK-HTML-CALC-NEXT:         <div></div>
-// CHECK-HTML-CALC-NEXT:       </div>
-// CHECK-HTML-CALC-NEXT:       <h3 id="{{([0-9A-F]{40})}}">divide</h3>
-// CHECK-HTML-CALC-NEXT:       <p>public double divide(int a, int b)</p>
-// CHECK-HTML-CALC-NEXT:       <p>Defined at line 16 of file {{.*}}Calculator.cpp</p>
-// CHECK-HTML-CALC-NEXT:       <div>
-// CHECK-HTML-CALC-NEXT:         <div></div>
-// CHECK-HTML-CALC-NEXT:       </div>
-// CHECK-HTML-CALC-NEXT:     </div>
-// CHECK-HTML-CALC-NEXT:   </div>
-// CHECK-HTML-CALC-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
-// CHECK-HTML-CALC-NEXT:     <ol>
-// CHECK-HTML-CALC-NEXT:       <li>
-// CHECK-HTML-CALC-NEXT:         <span>
-// CHECK-HTML-CALC-NEXT:           <a href="#Functions">Functions</a>
-// CHECK-HTML-CALC-NEXT:         </span>
-// CHECK-HTML-CALC-NEXT:         <ul>
-// CHECK-HTML-CALC-NEXT:           <li>
-// CHECK-HTML-CALC-NEXT:             <span>
-// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">add</a>
-// CHECK-HTML-CALC-NEXT:             </span>
-// CHECK-HTML-CALC-NEXT:           </li>
-// CHECK-HTML-CALC-NEXT:           <li>
-// CHECK-HTML-CALC-NEXT:             <span>
-// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">subtract</a>
-// CHECK-HTML-CALC-NEXT:             </span>
-// CHECK-HTML-CALC-NEXT:           </li>
-// CHECK-HTML-CALC-NEXT:           <li>
-// CHECK-HTML-CALC-NEXT:             <span>
-// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">multiply</a>
-// CHECK-HTML-CALC-NEXT:             </span>
-// CHECK-HTML-CALC-NEXT:           </li>
-// CHECK-HTML-CALC-NEXT:           <li>
-// CHECK-HTML-CALC-NEXT:             <span>
-// CHECK-HTML-CALC-NEXT:               <a href="#{{([0-9A-F]{40})}}">divide</a>
-// CHECK-HTML-CALC-NEXT:             </span>
-// CHECK-HTML-CALC-NEXT:           </li>
-// CHECK-HTML-CALC-NEXT:         </ul>
-// CHECK-HTML-CALC-NEXT:       </li>
-// CHECK-HTML-CALC-NEXT:     </ol>
-// CHECK-HTML-CALC-NEXT:   </div>
-// CHECK-HTML-CALC-NEXT: </main>
-
-// CHECK-HTML-RECTANGLE: <!DOCTYPE html>
-// CHECK-HTML-RECTANGLE-NEXT: <meta charset="utf-8"/>
-// CHECK-HTML-RECTANGLE-NEXT: <title>class Rectangle</title>
-// CHECK-HTML-RECTANGLE-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
-// CHECK-HTML-RECTANGLE-NEXT: <script src="{{.*}}index.js"></script>
-// CHECK-HTML-RECTANGLE-NEXT: <script src="{{.*}}index_json.js"></script>
-// CHECK-HTML-RECTANGLE-NEXT: <header id="project-title"></header>
-// CHECK-HTML-RECTANGLE-NEXT: <main>
-// CHECK-HTML-RECTANGLE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
-// CHECK-HTML-RECTANGLE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
-// CHECK-HTML-RECTANGLE-NEXT:     <h1>class Rectangle</h1>
-// CHECK-HTML-RECTANGLE-NEXT:     <p>Defined at line 10 of file {{.*}}Rectangle.h</p>
-// CHECK-HTML-RECTANGLE-NEXT:     <div>
-// CHECK-HTML-RECTANGLE-NEXT:       <div>
-// CHECK-HTML-RECTANGLE-NEXT:         <p> Represents a rectangle with a given width and height.</p>
-// CHECK-HTML-RECTANGLE-NEXT:       </div>
-// CHECK-HTML-RECTANGLE-NEXT:     </div>
-// CHECK-HTML-RECTANGLE-NEXT:     <p>
-// CHECK-HTML-RECTANGLE-NEXT:       Inherits from
-// CHECK-HTML-RECTANGLE-NEXT:       <a href="Shape.html">Shape</a>
-// CHECK-HTML-RECTANGLE-NEXT:     </p>
-// CHECK-HTML-RECTANGLE-NEXT:     <h2 id="Members">Members</h2>
-// CHECK-HTML-RECTANGLE-NEXT:     <ul>
-// CHECK-HTML-RECTANGLE-NEXT:       <li>private double width_</li>
-// CHECK-HTML-RECTANGLE-NEXT:       <li>private double height_</li>
-// CHECK-HTML-RECTANGLE-NEXT:     </ul>
-// CHECK-HTML-RECTANGLE-NEXT:     <h2 id="Functions">Functions</h2>
-// CHECK-HTML-RECTANGLE-NEXT:     <div>
-// CHECK-HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">Rectangle</h3>
-// CHECK-HTML-RECTANGLE-NEXT:       <p>public void Rectangle(double width, double height)</p>
-// CHECK-HTML-RECTANGLE-NEXT:       <p>Defined at line 3 of file {{.*}}Rectangle.cpp</p>
-// CHECK-HTML-RECTANGLE-NEXT:       <div>
-// CHECK-HTML-RECTANGLE-NEXT:         <div></div>
-// CHECK-HTML-RECTANGLE-NEXT:       </div>
-// CHECK-HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
-// CHECK-HTML-RECTANGLE-NEXT:       <p>public double area()</p>
-// CHECK-HTML-RECTANGLE-NEXT:       <p>Defined at line 6 of file {{.*}}Rectangle.cpp</p>
-// CHECK-HTML-RECTANGLE-NEXT:       <div>
-// CHECK-HTML-RECTANGLE-NEXT:         <div></div>
-// CHECK-HTML-RECTANGLE-NEXT:       </div>
-// CHECK-HTML-RECTANGLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
-// CHECK-HTML-RECTANGLE-NEXT:       <p>public double perimeter()</p>
-// CHECK-HTML-RECTANGLE-NEXT:       <p>Defined at line 10 of file {{.*}}Rectangle.cpp</p>
-// CHECK-HTML-RECTANGLE-NEXT:       <div>
-// CHECK-HTML-RECTANGLE-NEXT:         <div></div>
-// CHECK-HTML-RECTANGLE-NEXT:       </div>
-// CHECK-HTML-RECTANGLE-NEXT:     </div>
-// CHECK-HTML-RECTANGLE-NEXT:   </div>
-// CHECK-HTML-RECTANGLE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
-// CHECK-HTML-RECTANGLE-NEXT:     <ol>
-// CHECK-HTML-RECTANGLE-NEXT:       <li>
-// CHECK-HTML-RECTANGLE-NEXT:         <span>
-// CHECK-HTML-RECTANGLE-NEXT:           <a href="#Members">Members</a>
-// CHECK-HTML-RECTANGLE-NEXT:         </span>
-// CHECK-HTML-RECTANGLE-NEXT:       </li>
-// CHECK-HTML-RECTANGLE-NEXT:       <li>
-// CHECK-HTML-RECTANGLE-NEXT:         <span>
-// CHECK-HTML-RECTANGLE-NEXT:           <a href="#Functions">Functions</a>
-// CHECK-HTML-RECTANGLE-NEXT:         </span>
-// CHECK-HTML-RECTANGLE-NEXT:         <ul>
-// CHECK-HTML-RECTANGLE-NEXT:           <li>
-// CHECK-HTML-RECTANGLE-NEXT:             <span>
-// CHECK-HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">Rectangle</a>
-// CHECK-HTML-RECTANGLE-NEXT:             </span>
-// CHECK-HTML-RECTANGLE-NEXT:           </li>
-// CHECK-HTML-RECTANGLE-NEXT:           <li>
-// CHECK-HTML-RECTANGLE-NEXT:             <span>
-// CHECK-HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
-// CHECK-HTML-RECTANGLE-NEXT:             </span>
-// CHECK-HTML-RECTANGLE-NEXT:           </li>
-// CHECK-HTML-RECTANGLE-NEXT:           <li>
-// CHECK-HTML-RECTANGLE-NEXT:             <span>
-// CHECK-HTML-RECTANGLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
-// CHECK-HTML-RECTANGLE-NEXT:             </span>
-// CHECK-HTML-RECTANGLE-NEXT:           </li>
-// CHECK-HTML-RECTANGLE-NEXT:         </ul>
-// CHECK-HTML-RECTANGLE-NEXT:       </li>
-// CHECK-HTML-RECTANGLE-NEXT:     </ol>
-// CHECK-HTML-RECTANGLE-NEXT:   </div>
-// CHECK-HTML-RECTANGLE-NEXT: </main>
-
-// CHECK-HTML-CIRCLE: <!DOCTYPE html>
-// CHECK-HTML-CIRCLE-NEXT: <meta charset="utf-8"/>
-// CHECK-HTML-CIRCLE-NEXT: <title>class Circle</title>
-// CHECK-HTML-CIRCLE-NEXT: <link rel="stylesheet" href="{{.*}}clang-doc-default-stylesheet.css"/>
-// CHECK-HTML-CIRCLE-NEXT: <script src="{{.*}}index.js"></script>
-// CHECK-HTML-CIRCLE-NEXT: <script src="{{.*}}index_json.js"></script>
-// CHECK-HTML-CIRCLE-NEXT: <header id="project-title"></header>
-// CHECK-HTML-CIRCLE-NEXT: <main>
-// CHECK-HTML-CIRCLE-NEXT:   <div id="sidebar-left" path="GlobalNamespace" class="col-xs-6 col-sm-3 col-md-2 sidebar sidebar-offcanvas-left"></div>
-// CHECK-HTML-CIRCLE-NEXT:   <div id="main-content" class="col-xs-12 col-sm-9 col-md-8 main-content">
-// CHECK-HTML-CIRCLE-NEXT:     <h1>class Circle</h1>
-// CHECK-HTML-CIRCLE-NEXT:     <p>Defined at line 10 of file {{.*}}Circle.h</p>
-// CHECK-HTML-CIRCLE-NEXT:     <div>
-// CHECK-HTML-CIRCLE-NEXT:       <div>
-// CHECK-HTML-CIRCLE-NEXT:         <p> Represents a circle with a given radius.</p>
-// CHECK-HTML-CIRCLE-NEXT:       </div>
-// CHECK-HTML-CIRCLE-NEXT:     </div>
-// CHECK-HTML-CIRCLE-NEXT:     <p>
-// CHECK-HTML-CIRCLE-NEXT:       Inherits from
-// CHECK-HTML-CIRCLE-NEXT:       <a href="Shape.html">Shape</a>
-// CHECK-HTML-CIRCLE-NEXT:     </p>
-// CHECK-HTML-CIRCLE-NEXT:     <h2 id="Members">Members</h2>
-// CHECK-HTML-CIRCLE-NEXT:     <ul>
-// CHECK-HTML-CIRCLE-NEXT:       <li>private double radius_</li>
-// CHECK-HTML-CIRCLE-NEXT:     </ul>
-// CHECK-HTML-CIRCLE-NEXT:     <h2 id="Functions">Functions</h2>
-// CHECK-HTML-CIRCLE-NEXT:     <div>
-// CHECK-HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">Circle</h3>
-// CHECK-HTML-CIRCLE-NEXT:       <p>public void Circle(double radius)</p>
-// CHECK-HTML-CIRCLE-NEXT:       <p>Defined at line 3 of file {{.*}}Circle.cpp</p>
-// CHECK-HTML-CIRCLE-NEXT:       <div>
-// CHECK-HTML-CIRCLE-NEXT:         <div></div>
-// CHECK-HTML-CIRCLE-NEXT:       </div>
-// CHECK-HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">area</h3>
-// CHECK-HTML-CIRCLE-NEXT:       <p>public double area()</p>
-// CHECK-HTML-CIRCLE-NEXT:       <p>Defined at line 5 of file {{.*}}Circle.cpp</p>
-// CHECK-HTML-CIRCLE-NEXT:       <div>
-// CHECK-HTML-CIRCLE-NEXT:         <div></div>
-// CHECK-HTML-CIRCLE-NEXT:       </div>
-// CHECK-HTML-CIRCLE-NEXT:       <h3 id="{{([0-9A-F]{40})}}">perimeter</h3>
-// CHECK-HTML-CIRCLE-NEXT:       <p>public double perimeter()</p>
-// CHECK-HTML-CIRCLE-NEXT:       <p>Defined at line 9 of file {{.*}}Circle.cpp</p>
-// CHECK-HTML-CIRCLE-NEXT:       <div>
-// CHECK-HTML-CIRCLE-NEXT:         <div></div>
-// CHECK-HTML-CIRCLE-NEXT:       </div>
-// CHECK-HTML-CIRCLE-NEXT:     </div>
-// CHECK-HTML-CIRCLE-NEXT:   </div>
-// CHECK-HTML-CIRCLE-NEXT:   <div id="sidebar-right" class="col-xs-6 col-sm-6 col-md-2 sidebar sidebar-offcanvas-right">
-// CHECK-HTML-CIRCLE-NEXT:     <ol>
-// CHECK-HTML-CIRCLE-NEXT:       <li>
-// CHECK-HTML-CIRCLE-NEXT:         <span>
-// CHECK-HTML-CIRCLE-NEXT:           <a href="#Members">Members</a>
-// CHECK-HTML-CIRCLE-NEXT:         </span>
-// CHECK-HTML-CIRCLE-NEXT:       </li>
-// CHECK-HTML-CIRCLE-NEXT:       <li>
-// CHECK-HTML-CIRCLE-NEXT:         <span>
-// CHECK-HTML-CIRCLE-NEXT:           <a href="#Functions">Functions</a>
-// CHECK-HTML-CIRCLE-NEXT:         </span>
-// CHECK-HTML-CIRCLE-NEXT:         <ul>
-// CHECK-HTML-CIRCLE-NEXT:           <li>
-// CHECK-HTML-CIRCLE-NEXT:             <span>
-// CHECK-HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">Circle</a>
-// CHECK-HTML-CIRCLE-NEXT:             </span>
-// CHECK-HTML-CIRCLE-NEXT:           </li>
-// CHECK-HTML-CIRCLE-NEXT:           <li>
-// CHECK-HTML-CIRCLE-NEXT:             <span>
-// CHECK-HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">area</a>
-// CHECK-HTML-CIRCLE-NEXT:             </span>
-// CHECK-HTML-CIRCLE-NEXT:           </li>
-// CHECK-HTML-CIRCLE-NEXT:           <li>
-// CHECK-HTML-CIRCLE-NEXT:             <span>
-// CHECK-HTML-CIRCLE-NEXT:               <a href="#{{([0-9A-F]{40})}}">perimeter</a>
-// CHECK-HTML-CIRCLE-NEXT:             </span>
-// CHECK-HTML-CIRCLE-NEXT:           </li>
-// CHECK-HTML-CIRCLE-NEXT:         </ul>
-// CHECK-HTML-CIRCLE-NEXT:       </li>
-// CHECK-HTML-CIRCLE-NEXT:     </ol>
-// CHECK-HTML-CIRCLE-NEXT:   </div>
-// CHECK-HTML-CIRCLE-NEXT: </main>
\ No newline at end of file

>From d00c4bcdd9b81ec4f6486f1d9e3b8d6e7922a823 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Wed, 12 Jun 2024 12:40:40 -0400
Subject: [PATCH 3/5] [clang][clang-doc] remove contents in files

---
 .../Inputs/clang-doc-default-stylesheet.css   | 969 ------------------
 .../test/clang-doc/Inputs/index.js            |  87 --
 2 files changed, 1056 deletions(-)

diff --git a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css
index 8b335232b8048..e69de29bb2d1d 100644
--- a/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css
+++ b/clang-tools-extra/test/clang-doc/Inputs/clang-doc-default-stylesheet.css
@@ -1,969 +0,0 @@
-.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;
-}
-
-*, *:before, *:after {
-  box-sizing: inherit;
-}
-
-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;
-}
-
-header ol {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-
-header ol li {
-  display: inline;
-}
-
-header form {
-  display: flex;
-  flex: 1;
-  justify-content: flex-end;
-  padding-right: 30px;
-}
-
-header#header-search-sidebar {
-  height: 50px;
-  margin-bottom: 25px;
-}
-
-footer {
-  flex: 0 0 16px;
-  text-align: center;
-  padding: 16px 20px;
-}
-
-main {
-  flex: 1;
-  display: flex;
-  flex-direction: row;
-  padding: 20px;
-  min-height: 0;
-}
-
-.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 */
-}
-
-::-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;
-}
-
-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;
-}
-
-.body {
-  margin-top: 90px;
-}
-
-section {
-  margin-bottom: 36px;
-}
-
-dl {
-  margin: 0;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-  font-family: Roboto, sans-serif;
-  font-weight: 400;
-  margin-top: 1.5em;
-  color: #111111;
-}
-
-h1.title {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-h1 {
-  font-size: 37px;
-  margin-top: 0;
-  margin-bottom: 0.67em;
-}
-
-h2 {
-  font-size: 28px;
-}
-
-h5 {
-  font-size: 16px;
-}
-
-.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 media(max-width: 768px) {
-  nav .container {
-    width: 100%
-  }
-
-  h1 {
-    font-size: 24px;
-  }
-
-  pre {
-    margin: 16px 0;
-  }
-}
-
- at media (min-width: 768px) {
-  ul.subnav li {
-    font-size: 17px;
-  }
-}
-
-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;
-}
-
-/* indents wrapped lines */
-section.summary dt {
-  margin-left: 24px;
-  text-indent: -24px;
-}
-
-.dl-horizontal dd {
-  margin-left: initial;
-}
-
-dl.dl-horizontal dt {
-  font-style: normal;
-  text-align: left;
-  color: #727272;
-  margin-right: 20px;
-  width: initial;
-}
-
-dt .name {
-  font-weight: 500;
-}
-
-dl dt.callable .name {
-  float: none;
-  width: auto;
-}
-
-.parameter {
-  white-space: nowrap;
-}
-
-.type-parameter {
-  white-space: nowrap;
-}
-
-.multi-line-signature .type-parameter .parameter {
-  margin-left: 0px;
-  display: unset;
-}
-
-.signature {
-  color: #727272;
-}
-
-.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;
-  }
-}
-
-#external-links {
-  float: right;
-}
-
-.btn-group {
-  position: relative;
-  display: inline-flex;
-  vertical-align: middle;
-}
-
-p.firstline {
-  font-weight: bold;
-}
-
-footer {
-  color: #fff;
-  background-color: #111111;
-  width: 100%;
-}
-
-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;
-}
-
-.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;
-  }
-}
-
- at media screen and (max-width: 768px) {
-  .breadcrumbs {
-    margin: 0 0 24px 0;
-    overflow-x: hidden;
-  }
-}
-
-.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
diff --git a/clang-tools-extra/test/clang-doc/Inputs/index.js b/clang-tools-extra/test/clang-doc/Inputs/index.js
index a5ac90f2e06e7..e69de29bb2d1d 100644
--- a/clang-tools-extra/test/clang-doc/Inputs/index.js
+++ b/clang-tools-extra/test/clang-doc/Inputs/index.js
@@ -1,87 +0,0 @@
-// Append using posix-style a file name or directory to Base
-function append(Base, New) {
-  if (!New)
-    return Base;
-  if (Base)
-    Base += "/";
-  Base += New;
-  return Base;
-}
-
-// Get relative path to access FilePath from CurrentDirectory
-function computeRelativePath(FilePath, CurrentDirectory) {
-  var Path = FilePath;
-  while (Path) {
-    if (CurrentDirectory == Path)
-      return FilePath.substring(Path.length + 1);
-    Path = Path.substring(0, Path.lastIndexOf("/"));
-  }
-
-  var Dir = CurrentDirectory;
-  var Result = "";
-  while (Dir) {
-    if (Dir == FilePath)
-      break;
-    Dir = Dir.substring(0, Dir.lastIndexOf("/"));
-    Result = append(Result, "..")
-  }
-  Result = append(Result, FilePath.substring(Dir.length))
-  return Result;
-}
-
-function genLink(Ref, CurrentDirectory) {
-  var Path = computeRelativePath(Ref.Path, CurrentDirectory);
-  if (Ref.RefType == "namespace")
-    Path = append(Path, "index.html");
-  else
-    Path = append(Path, Ref.Name + ".html")
-
-    ANode = document.createElement("a");
-  ANode.setAttribute("href", Path);
-  var TextNode = document.createTextNode(Ref.Name);
-  ANode.appendChild(TextNode);
-  return ANode;
-}
-
-function genHTMLOfIndex(Index, CurrentDirectory, IsOutermostList) {
-  // Out will store the HTML elements that Index requires to be generated
-  var Out = [];
-  if (Index.Name) {
-    var SpanNode = document.createElement("span");
-    var TextNode = document.createTextNode(Index.Name);
-    SpanNode.appendChild(genLink(Index, CurrentDirectory));
-    Out.push(SpanNode);
-  }
-  if (Index.Children.length == 0)
-    return Out;
-  // 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, false);
-    for (Node of ChildNodes)
-      LiNode.appendChild(Node);
-    ListNode.appendChild(LiNode);
-  }
-  Out.push(ListNode);
-  return Out;
-}
-
-function createIndex(Index) {
-  // Get the DOM element where the index will be created
-  var IndexDiv = document.getElementById("sidebar-left");
-  // Get the relative path of this file
-  CurrentDirectory = IndexDiv.getAttribute("path");
-  var IndexNodes = genHTMLOfIndex(Index, CurrentDirectory, true);
-  for (Node of IndexNodes)
-    IndexDiv.appendChild(Node);
-}
-
-// Runs after DOM loads
-document.addEventListener("DOMContentLoaded", function() {
-  // JsonIndex is a variable from another file that contains the index
-  // in JSON format
-  var Index = JSON.parse(JsonIndex);
-  createIndex(Index);
-});

>From 923383cf1478ac730a909eb6b6f0bb5749bce577 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Wed, 12 Jun 2024 23:24:58 -0400
Subject: [PATCH 4/5] [clang][clang-doc] make cmake auto copy asset on build

---
 clang-tools-extra/clang-doc/tool/CMakeLists.txt     | 8 ++++++++
 clang-tools-extra/test/clang-doc/basic-project.test | 2 +-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/clang-tools-extra/clang-doc/tool/CMakeLists.txt b/clang-tools-extra/clang-doc/tool/CMakeLists.txt
index fb8317b272932..87c5a939dab40 100644
--- a/clang-tools-extra/clang-doc/tool/CMakeLists.txt
+++ b/clang-tools-extra/clang-doc/tool/CMakeLists.txt
@@ -25,3 +25,11 @@ install(FILES ../assets/clang-doc-default-stylesheet.css
 install(FILES ../assets/index.js
   DESTINATION "${CMAKE_INSTALL_DATADIR}/clang"
   COMPONENT clang-doc)
+
+add_custom_target(copy-clang-doc-assets
+        COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../assets" "${CMAKE_BINARY_DIR}/share/clang"
+        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../assets"
+        COMMENT "Copying Clang-Doc Assets"
+)
+set_target_properties(copy-clang-doc-assets PROPERTIES FOLDER "Clang-Doc/Assets")
+add_dependencies(clang-doc copy-clang-doc-assets)
\ No newline at end of file
diff --git a/clang-tools-extra/test/clang-doc/basic-project.test b/clang-tools-extra/test/clang-doc/basic-project.test
index 4e7d9801c4d37..3cf0abd3b2ae8 100644
--- a/clang-tools-extra/test/clang-doc/basic-project.test
+++ b/clang-tools-extra/test/clang-doc/basic-project.test
@@ -1,6 +1,6 @@
 // RUN: rm -rf %t && mkdir -p %t/docs && mkdir -p %t/build
 // RUN: sed 's|$test_dir|%/S|g' %S/Inputs/clang-doc-project1/database_template.json > %t/build/compile_commands.json
-// RUN: clang-doc --format=html --output=%t/docs --executor=all-TUs --asset=%S/Inputs %t/build/compile_commands.json
+// RUN: clang-doc --format=html --output=%t/docs --executor=all-TUs %t/build/compile_commands.json
 // RUN: FileCheck %s -input-file=%t/docs/index_json.js -check-prefix=JSON-INDEX
 // RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Shape.html -check-prefix=HTML-SHAPE
 // RUN: FileCheck %s -input-file=%t/docs/GlobalNamespace/Calculator.html -check-prefix=HTML-CALC

>From 86638fbc2220f125000c6f0438a33456e45dba22 Mon Sep 17 00:00:00 2001
From: PeterChou1 <peter.chou at mail.utoronto.ca>
Date: Wed, 12 Jun 2024 23:59:01 -0400
Subject: [PATCH 5/5] [clang][clang-doc] use copy_directory instead if
 different

---
 clang-tools-extra/clang-doc/tool/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/clang-doc/tool/CMakeLists.txt b/clang-tools-extra/clang-doc/tool/CMakeLists.txt
index 87c5a939dab40..db2119a984b14 100644
--- a/clang-tools-extra/clang-doc/tool/CMakeLists.txt
+++ b/clang-tools-extra/clang-doc/tool/CMakeLists.txt
@@ -27,7 +27,7 @@ install(FILES ../assets/index.js
   COMPONENT clang-doc)
 
 add_custom_target(copy-clang-doc-assets
-        COMMAND ${CMAKE_COMMAND} -E copy_directory_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../assets" "${CMAKE_BINARY_DIR}/share/clang"
+        COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}/../assets" "${CMAKE_BINARY_DIR}/share/clang"
         DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../assets"
         COMMENT "Copying Clang-Doc Assets"
 )



More information about the cfe-commits mailing list