Snap for 6511878 from 119cb5132725c50b45c3d855c7d0e74a48dd8bfe to rvc-release

Change-Id: I6a54d30e868a0aa904ed888902ad70d8cf1398d2
diff --git a/busytown.gradle b/busytown.gradle
index b6fb936..f16d853 100644
--- a/busytown.gradle
+++ b/busytown.gradle
@@ -15,6 +15,7 @@
                 zipTask.from(report.destination)
             }
         }
+        task.ignoreFailures = true
     }
     if (project.rootProject == project) {
         def zipMaven = project.tasks.create("zipMaven", Zip) {
diff --git a/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlFormatOutputBuilder.kt b/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlFormatOutputBuilder.kt
index b62e51a..7fbdb18 100644
--- a/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlFormatOutputBuilder.kt
+++ b/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlFormatOutputBuilder.kt
@@ -456,7 +456,7 @@
             return
         }
 
-        val targetLink = node.links.singleOrNull()
+        val targetLink = node.links.firstOrNull()
 
         if (targetLink?.kind == NodeKind.TypeParameter) {
             +node.name
@@ -1106,8 +1106,8 @@
                 filter { it.getClassExtensionReceiver() != null }
                     .groupBy {
                         val receiverType = it.getClassExtensionReceiver()!!
-                        receiverType.links(NodeKind.ExternalLink).firstOrNull()
-                                ?: receiverType.links.first { it.kind in NodeKind.classLike}
+                        receiverType.links.filter { it.kind != NodeKind.ExternalLink}.firstOrNull() ?:
+                            receiverType.links(NodeKind.ExternalLink).first()
                     }
 
             private fun List<DocumentationNode>.externalExtensions(kind: NodeKind) =
diff --git a/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlGenerator.kt b/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlGenerator.kt
index 115e3f7..dc0df2a 100644
--- a/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlGenerator.kt
+++ b/core/src/main/kotlin/Formats/JavaLayoutHtml/JavaLayoutHtmlGenerator.kt
@@ -133,6 +133,7 @@
             val normalized = uri.normalize()
             uriToWriter[normalized]?.let { return it }
             val file = root.resolve(normalized.path.removePrefix("/"))
+            file.parentFile.mkdirsOrFail()
             val writer = file.bufferedWriter()
             uriToWriter[normalized] = writer
             return writer
diff --git a/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt b/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt
index cc9c2c2..8776da4 100644
--- a/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt
+++ b/core/src/main/kotlin/Java/JavaPsiDocumentationBuilder.kt
@@ -206,13 +206,26 @@
             else -> NodeKind.Class
         }
         val node = nodeForElement(this, kind)
-        superTypes.filter { !ignoreSupertype(it) }.forEach {
-            node.appendType(it, NodeKind.Supertype)
-            val superClass = it.resolve()
-            if (superClass != null) {
+        superTypes.filter { !ignoreSupertype(it) }.forEach { superType ->
+            node.appendType(superType, NodeKind.Supertype)
+            val superClass = superType.resolve()
+            // parentNode is the actual DocumentationNode of this class's supertype
+            // It is necessary to create documentation links back to the superclass from inherited methods
+            val parentNode = refGraph.lookup(superType.typeSignature())
+            if (superClass != null && parentNode != null) {
                 link(superClass, node, RefKind.Inheritor)
+                // Explicitly add the methods of the superclass (which are not overridden) as nodes to this class
+                val overriddenMethods = methods.toList().flatMap { it.findSuperMethods().toList() }
+                val inheritedMethods = superClass.methods.filter { it !in overriddenMethods }.toTypedArray()
+
+                node.appendChildren(inheritedMethods, RefKind.InheritedMember) {
+                    val child = build()
+                    child.addReferenceTo(parentNode, RefKind.Owner)
+                    return@appendChildren child
+                }
             }
         }
+
         var methodsAndConstructors = methods
 
         if (constructors.isEmpty()) {
diff --git a/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt b/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt
index adb8fa4..0b5e743 100644
--- a/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt
+++ b/core/src/main/kotlin/Kotlin/DocumentationBuilder.kt
@@ -265,12 +265,11 @@
                     node.append(targetNode, RefKind.ExternalType)
                     node.append(DocumentationNode(externalLink, Content.Empty, NodeKind.ExternalLink), RefKind.Link)
                 }
-            } else {
-                link(
-                    node, classifierDescriptor,
-                    if (classifierDescriptor.isBoringBuiltinClass()) RefKind.HiddenLink else RefKind.Link
-                )
             }
+            link(
+                node, classifierDescriptor,
+                if (classifierDescriptor.isBoringBuiltinClass()) RefKind.HiddenLink else RefKind.Link
+            )
             if (classifierDescriptor !is TypeParameterDescriptor) {
                 node.append(
                     DocumentationNode(
diff --git a/core/testdata/format/dac/inheritedMethods/dac-as-java/Child.html b/core/testdata/format/dac/inheritedMethods/dac-as-java/Child.html
index a66d0bf..65e2add 100644
--- a/core/testdata/format/dac/inheritedMethods/dac-as-java/Child.html
+++ b/core/testdata/format/dac/inheritedMethods/dac-as-java/Child.html
@@ -60,6 +60,35 @@
         </tr>
       </tbody>
     </table>
+    <table class="responsive" id="inhmethods">
+      <tbody>
+        <tr>
+          <th colSpan="2">
+            <devsite-heading ds-is="heading" text="Inherited functions" id="inherited-functions" level="h3" toc="" class="">
+              <h3 is-upgraded="">Inherited functions</h3>
+            </devsite-heading>
+          </th>
+        </tr>
+        <tr class="api apilevel-">
+          <td colSpan="2">
+            <div class="expandable jd-inherited-apis"><span class="expand-control exw-expanded">From class <code><a href="Parent.html#">Parent</a></code></span>
+              <table class="responsive exw-expanded-content">
+                <tbody>
+                  <tr class="api apilevel-" data-version-added="ApiLevel:">
+                    <td><code><span class="identifier">void</span></code></td>
+                    <td width="100%"><code><a href="Parent.html#foo()">foo</a>()</code>
+                      <p>
+                        <p>Do a superclass foo</p>
+                      </p>
+                    </td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
     <h2>Public constructors</h2>
 <a name="Child()"></a>
     <div class="api apilevel-" data-version-added="">
diff --git a/gradle.properties b/gradle.properties
index 1152e80..4c10991 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-dokka_version=0.9.17-g007
+dokka_version=0.9.17-g009
 dokka_publication_channel=dokka
 
 #Kotlin compiler and plugin
diff --git a/runners/cli/src/main/kotlin/cli/main.kt b/runners/cli/src/main/kotlin/cli/main.kt
index e7fb76f..37be6e2 100644
--- a/runners/cli/src/main/kotlin/cli/main.kt
+++ b/runners/cli/src/main/kotlin/cli/main.kt
@@ -72,12 +72,22 @@
     @set:Argument(value = "collectInheritedExtensionsFromLibraries", description = "Search for applicable extensions in libraries")
     var collectInheritedExtensionsFromLibraries: Boolean = false
 
-    @set:Argument(value = "generateClassIndexPage", description = "Generate classes.html index page.")
+    @set:Argument(value = "generateClassIndexPage", description = "Generate classes.html index page. [Deprecated]: use noGenerateClassIndexPage instead.")
+    @Deprecated("There is no way to set this to false.", replaceWith = ReplaceWith(
+        expression ="noGenerateClassIndexPage"))
     var generateClassIndexPage: Boolean = true
 
-    @set:Argument(value = "generatePackageIndexPage", description = "Generate packages.html index page.")
+    @set:Argument(value = "generatePackageIndexPage", description = "Generate packages.html index page. [Deprecated]: use noGeneratePackageIndexPage instead.")
+    @Deprecated("There is no way to set this to false.", replaceWith = ReplaceWith(
+        expression ="noGeneratePackageIndexPage"))
     var generatePackageIndexPage: Boolean = true
 
+    @set:Argument(value = "noGenerateClassIndexPage", description = "Disable classes.html index page.")
+    var noGenerateClassIndexPage: Boolean = false
+
+    @set:Argument(value = "noGeneratePackageIndexPage", description = "Disable packages.html index page.")
+    var noGeneratePackageIndexPage: Boolean = false
+
     @set:Argument(value = "outlineRoot", description = "Relative root directory the outline files. I.e. androidx/core/")
     var outlineRoot: String = ""
 
@@ -142,8 +152,8 @@
             languageVersion = arguments.languageVersion,
             apiVersion = arguments.apiVersion,
             collectInheritedExtensionsFromLibraries = arguments.collectInheritedExtensionsFromLibraries,
-            generateClassIndexPage = arguments.generateClassIndexPage,
-            generatePackageIndexPage = arguments.generatePackageIndexPage,
+            generateClassIndexPage = !arguments.noGenerateClassIndexPage,
+            generatePackageIndexPage = !arguments.noGeneratePackageIndexPage,
             outlineRoot = arguments.outlineRoot,
             dacRoot = arguments.dacRoot,
             noJdkLink = arguments.noJdkLink
diff --git a/runners/gradle-plugin/build.gradle b/runners/gradle-plugin/build.gradle
index a067080..4742dda 100644
--- a/runners/gradle-plugin/build.gradle
+++ b/runners/gradle-plugin/build.gradle
@@ -63,6 +63,27 @@
             }
 
             project.shadow.component(publication)
+            publication.pom { pom ->
+                // Add dokka-fatjar as a runtime dependency.
+                // This is a workaround until the Shadow jar can put project dependencies into the .pom: https://github.com/johnrengelman/shadow/commit/da82b37522b349aff414f571d2037682acd84f27
+                pom.withXml { xml ->
+                    def node = xml.asNode()
+                    def deps = null
+                    node.children().each { child ->
+                        if (child.name().toString() == "dependencies") {
+                            deps = child
+                        }
+                    }
+                    if (deps == null) {
+                        deps = node.appendNode("dependencies")
+                    }
+                    def dep = deps.appendNode("dependency")
+                    dep.appendNode("groupId", "org.jetbrains.dokka")
+                    dep.appendNode("artifactId", "dokka-fatjar")
+                    dep.appendNode("version", dokka_version)
+                    dep.appendNode("scope", "runtime")
+                }
+            }
         }
     }
 }