Implement enum values

Test: new test in ClasslikeDocumentableConverterTest; old test in simple
Fixes: 170299346
Change-Id: I5a82263f0f26f38b69a15bb88c19926bfe486709
diff --git a/src/main/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverter.kt b/src/main/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverter.kt
index 945bf35..3cf5791 100644
--- a/src/main/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverter.kt
+++ b/src/main/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverter.kt
@@ -44,6 +44,8 @@
 import org.jetbrains.dokka.links.DRI
 import org.jetbrains.dokka.links.parent
 import org.jetbrains.dokka.model.DClasslike
+import org.jetbrains.dokka.model.DEnum
+import org.jetbrains.dokka.model.DEnumEntry
 import org.jetbrains.dokka.model.DFunction
 import org.jetbrains.dokka.model.DInterface
 import org.jetbrains.dokka.model.DProperty
@@ -65,6 +67,8 @@
         FunctionDocumentableConverter(displayLanguage, pathProvider, javadocConverter)
     private val propertyConverter =
         PropertyDocumentableConverter(displayLanguage, pathProvider, javadocConverter)
+    private val enumConverter =
+        EnumValueDocumentableConverter(displayLanguage, pathProvider, javadocConverter)
 
     /** @return the classlike component */
     suspend fun classlike(): DevsitePage = coroutineScope {
@@ -83,10 +87,15 @@
         declaredProperties = declaredProperties.sortedBy { it.name }
         inheritedFunctions = inheritedFunctions.sortedBy { it.name }
 
+        val enumValues = (classlike as? DEnum)?.entries.orEmpty().sortedBy { it.name }
+
         val declaredConstructors = (classlike as? WithConstructors)?.constructors.orEmpty()
             .sortedBy { it.parameters.size }
         val annotations = (classlike as? WithExtraProperties<*>)?.annotations().orEmpty()
 
+        val enumValuesSummary = async {
+            enumValuesToSummary(enumValuesTitle(), enumValues)
+        }
         val nestedTypesSummary = async {
             typesToSummary(docsHolder.classlikesFor(classlike))
         }
@@ -121,6 +130,8 @@
             functionsToSummary(protectedMethodsTitle(), declaredFunctions.filter(::isProtected))
         }
 
+        val enumDetails =
+            async { enumValuesToDetail(enumValues) }
         val constants =
             async { propertiesToDetail(declaredProperties.constants()) }
         val publicProperties =
@@ -143,6 +154,10 @@
 
         val allSymbols = listOf(
             nestedTypesSummary.await() to Classlike.SymbolType(nestedTypesTitle(), emptyList()),
+            enumValuesSummary.await() to Classlike.SymbolType(
+                enumValuesTitle(),
+                enumDetails.await()
+            ),
             constantsSummary.await() to Classlike.SymbolType(
                 constantsTitle(),
                 constants.await()
@@ -268,6 +283,22 @@
         }
     }
 
+    private fun enumValuesToSummary(title: String, enumVals: List<DEnumEntry>): SummaryList {
+        val modifierHints = ModifierHints(displayLanguage, isSummary = true, false)
+        val components = enumVals.map { enumConverter.summary(it, modifierHints) }
+        return DefaultSummaryList(
+            SummaryList.Params(
+                header = DefaultTableTitle(
+                    TableTitle.Params(
+                        title = title,
+                        big = true
+                    )
+                ),
+                items = components
+            )
+        )
+    }
+
     private fun propertiesToSummary(name: String, properties: List<DProperty>): SummaryList {
         val modifierHints = ModifierHints(displayLanguage, isSummary = true, isInterface())
         val components = properties.map {
@@ -294,6 +325,13 @@
         }
     }
 
+    private fun enumValuesToDetail(enumValues: List<DEnumEntry>): List<SymbolDetail> {
+        val modifierHints = ModifierHints(displayLanguage, isSummary = false, isInterface())
+        return enumValues.map {
+            enumConverter.detail(it, modifierHints)
+        }
+    }
+
     private suspend fun computeSignature(): ClassSignature {
         val modifiers = if (classlike is WithAbstraction && classlike is WithExtraProperties<*>) {
             classlike.modifiers().modifiersFor(ModifierHints(displayLanguage = displayLanguage))
@@ -488,4 +526,5 @@
     }
 
     private fun constantsTitle() = "Constants"
+    private fun enumValuesTitle() = "Enum Values"
 }
diff --git a/src/main/java/com/google/devsite/renderer/converters/EnumValueDocumentableConverter.kt b/src/main/java/com/google/devsite/renderer/converters/EnumValueDocumentableConverter.kt
new file mode 100644
index 0000000..16e7d87
--- /dev/null
+++ b/src/main/java/com/google/devsite/renderer/converters/EnumValueDocumentableConverter.kt
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.google.devsite.renderer.converters
+
+import com.google.devsite.components.Raw
+import com.google.devsite.components.impl.DefaultPropertySignature
+import com.google.devsite.components.impl.DefaultRaw
+import com.google.devsite.components.impl.DefaultSymbolDetail
+import com.google.devsite.components.impl.DefaultTwoPaneSummaryItem
+import com.google.devsite.components.symbols.PropertySignature
+import com.google.devsite.components.symbols.SymbolDetail
+import com.google.devsite.components.table.TwoPaneSummaryItem
+import com.google.devsite.renderer.Language
+import com.google.devsite.renderer.impl.paths.FilePathProvider
+import org.jetbrains.dokka.model.DEnumEntry
+
+/** Converts documentable DEnumEntrys into EnumValue components. */
+internal class EnumValueDocumentableConverter(
+    private val displayLanguage: Language,
+    private val pathProvider: FilePathProvider,
+    private val javadocConverter: DocTagConverter
+) {
+    private val paramConverter = ParameterDocumentableConverter(displayLanguage, pathProvider)
+
+    /** @return the enum value summary component */
+    fun summary(enumValue: DEnumEntry, modifierHints: ModifierHints): TwoPaneSummaryItem {
+        val annotations = enumValue.annotations()
+        return DefaultTwoPaneSummaryItem(
+            TwoPaneSummaryItem.Params(
+                title = DefaultRaw(Raw.Params(enumValue.name)),
+                description = javadocConverter.summaryDescription(enumValue, annotations)
+            )
+        )
+    }
+
+    /** @return the enum detail component */
+    fun detail(enumValue: DEnumEntry, hints: ModifierHints): SymbolDetail {
+        val annotations = enumValue.annotations()
+        val projection = paramConverter.componentForProjection(
+            // We need to get a projection representation of the class of the DEnumEmtry
+            // Unfortunately, this is not stored straightforwardly in Jetbrains' architecture
+            // So we know that compareTo is T.compareTo(T other), so we can get the classlike of the
+            // DEnumEntry by looking at the parameter type of its compareTo method
+            enumValue.functions.first { it.name == "compareTo" }.parameters.single().type
+        )
+        return DefaultSymbolDetail(
+            SymbolDetail.Params(
+                displayLanguage = displayLanguage,
+                name = enumValue.name,
+                anchors = enumValue.generateAnchors(),
+                annotations = annotations.annotationComponents(
+                    pathProvider,
+                    displayLanguage,
+                    false
+                ),
+                modifiers = enumValue.getExtraModifiers().modifiersFor(hints),
+                returnType = projection,
+                symbolType = SymbolDetail.SymbolType.PROPERTY,
+                signature = enumValue.signature(false),
+                metadata = javadocConverter.metadata(
+                    doc = enumValue,
+                    returnType = projection,
+                    paramNames = listOf(),
+                    annotations = annotations
+                )
+            )
+        )
+    }
+
+    internal fun DEnumEntry.signature(isSummary: Boolean): PropertySignature {
+        return DefaultPropertySignature(
+            PropertySignature.Params(
+                // TODO(b/168136770): figure out path for default anchors
+                name = pathProvider.linkForReference(dri),
+                receiver = null
+            )
+        )
+    }
+
+    /** Returns anchors for this enum value. */
+    private fun DEnumEntry.generateAnchors(): LinkedHashSet<String> {
+        return linkedSetOf(
+            name
+        )
+    }
+}
diff --git a/src/test/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverterTest.kt b/src/test/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverterTest.kt
index 80021f6..9c65ae0 100644
--- a/src/test/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverterTest.kt
+++ b/src/test/java/com/google/devsite/renderer/converters/ClasslikeDocumentableConverterTest.kt
@@ -17,6 +17,8 @@
 package com.google.devsite.renderer.converters
 
 import com.google.common.truth.Truth.assertThat
+import com.google.devsite.components.Description
+import com.google.devsite.components.Raw
 import com.google.devsite.components.pages.Classlike
 import com.google.devsite.components.pages.DevsitePage
 import com.google.devsite.components.symbols.SymbolSummary
@@ -34,6 +36,7 @@
 import com.google.devsite.testing.ConverterTestBase
 import kotlinx.coroutines.runBlocking
 import org.jetbrains.dokka.model.DModule
+import org.jetbrains.dokka.model.doc.Text
 import org.junit.Ignore
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -323,8 +326,58 @@
         assertThat(classlike.data.signature.data.implements.single().data.name).isEqualTo("A")
     }
 
-    private fun DModule.page(): DevsitePage {
-        val classlike = packages.single().classlikes.single { it.name() == "Foo" }
+    @Test
+    fun `Enum class is rendered and has enum values`() {
+        val page = """
+            |/**
+            | * class level docs
+            | */
+            |enum class AnEnumType {
+            |    /**
+            |     * content being refreshed, which can be a result of
+            |     * invalidation, refresh that may contain content updates, or the initial load.
+            |     */
+            |    REFRESH,
+            |    /**
+            |     * Load at the start
+            |     */
+            |    PREPEND,
+            |    /**
+            |     * Load at the end.
+            |     */
+            |    APPEND
+            |
+            |    fun foo()
+            |}
+        """.render().page(name = "AnEnumType")
+
+        val classlike = page.content<Classlike>()
+        val signature = classlike.data.signature.data
+        val description = (classlike.data.description.first() as Description)
+        val descriptionText = description.data.root.children.first().children.first() as Text
+
+        val enumTable = classlike.data.symbolTypes.first {
+            (it.first as? SummaryList)?.title() == "Enum Values" }.first.items(3) as List
+        val enumOne = enumTable[0].data
+        val enumTwo = enumTable[1].data
+        val enumThree = enumTable[2].data
+
+        assertThat(signature.type).isEqualTo("enum")
+        assertThat(descriptionText.body).isEqualTo("class level docs")
+
+        assertThat((enumOne.title as Raw).data.text).contains("APPEND")
+        assertThat((enumOne.description as Description).data.root.toString())
+            .contains("Load at the end.")
+        assertThat((enumTwo.title as Raw).data.text).contains("PREPEND")
+        assertThat((enumTwo.description as Description).data.root.toString())
+            .contains("Load at the start")
+        assertThat((enumThree.title as Raw).data.text).contains("REFRESH")
+        assertThat((enumThree.description as Description).data.root.toString())
+            .contains("result of invalidation")
+    }
+
+    private fun DModule.page(name: String = "Foo"): DevsitePage {
+        val classlike = packages.single().classlikes.single { it.name() == name }
         val holder = runBlocking { DocumentablesHolder(this@page, this) }
         val converter = ClasslikeDocumentableConverter(language, classlike, pathProvider(), holder)
         return runBlocking { converter.classlike() }
diff --git a/testData/innerClasses/docs/reference/dokkatest/inner/OuterClass.InnerEnum.html b/testData/innerClasses/docs/reference/dokkatest/inner/OuterClass.InnerEnum.html
index 236ea06..2372db4 100644
--- a/testData/innerClasses/docs/reference/dokkatest/inner/OuterClass.InnerEnum.html
+++ b/testData/innerClasses/docs/reference/dokkatest/inner/OuterClass.InnerEnum.html
@@ -19,6 +19,35 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>A</code></td>
+            <td width="100%">
+              <p>I'm first.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>B</code></td>
+            <td width="100%">
+              <p>Second!</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>C</code></td>
+            <td width="100%">
+              <p>Third</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public fields</h3></th>
           </tr>
         </thead>
@@ -38,6 +67,22 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="A">A</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/dokkatest/inner/OuterClass.InnerEnum.html">OuterClass.InnerEnum</a>&nbsp;<a href="/reference/dokkatest/inner/OuterClass.InnerEnum.A.html">OuterClass.InnerEnum.A</a></pre>
+      <p>I'm first.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="B">B</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/dokkatest/inner/OuterClass.InnerEnum.html">OuterClass.InnerEnum</a>&nbsp;<a href="/reference/dokkatest/inner/OuterClass.InnerEnum.B.html">OuterClass.InnerEnum.B</a></pre>
+      <p>Second!</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="C">C</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/dokkatest/inner/OuterClass.InnerEnum.html">OuterClass.InnerEnum</a>&nbsp;<a href="/reference/dokkatest/inner/OuterClass.InnerEnum.C.html">OuterClass.InnerEnum.C</a></pre>
+      <p>Third</p>
+    </div>
     <h2>Public fields</h2>
     <div><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
       <h3 class="api-name" id="name()">name</h3>
diff --git a/testData/innerClasses/docs/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html b/testData/innerClasses/docs/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html
index 2ba0047..9e06f24 100644
--- a/testData/innerClasses/docs/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html
+++ b/testData/innerClasses/docs/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html
@@ -19,6 +19,35 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>A</code></td>
+            <td width="100%">
+              <p>I'm first.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>B</code></td>
+            <td width="100%">
+              <p>Second!</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>C</code></td>
+            <td width="100%">
+              <p>Third</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public properties</h3></th>
           </tr>
         </thead>
@@ -38,6 +67,22 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="A">A</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.A.html">OuterClass.InnerEnum.A</a>:&nbsp;<a href="/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html">OuterClass.InnerEnum</a></pre>
+      <p>I'm first.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="B">B</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.B.html">OuterClass.InnerEnum.B</a>:&nbsp;<a href="/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html">OuterClass.InnerEnum</a></pre>
+      <p>Second!</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="C">C</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.C.html">OuterClass.InnerEnum.C</a>:&nbsp;<a href="/reference/kotlin/dokkatest/inner/OuterClass.InnerEnum.html">OuterClass.InnerEnum</a></pre>
+      <p>Third</p>
+    </div>
     <h2>Public properties</h2>
     <div><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
       <h3 class="api-name" id="name()">name</h3>
diff --git a/testData/paging/docs/reference/androidx/paging/LoadType.html b/testData/paging/docs/reference/androidx/paging/LoadType.html
index c83abaf..55ab278 100644
--- a/testData/paging/docs/reference/androidx/paging/LoadType.html
+++ b/testData/paging/docs/reference/androidx/paging/LoadType.html
@@ -35,6 +35,35 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>APPEND</code></td>
+            <td width="100%">
+              <p>Load at the end of a <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>PREPEND</code></td>
+            <td width="100%">
+              <p>Load at the start of a <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>REFRESH</code></td>
+            <td width="100%">
+              <p><code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code> content being refreshed, which can be a result of <code><a href="/reference/androidx/paging/PagingSource.html">PagingSource</a></code> invalidation, refresh that may contain content updates, or the initial load.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public fields</h3></th>
           </tr>
         </thead>
@@ -54,6 +83,22 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="APPEND">APPEND</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/androidx/paging/LoadType.html">LoadType</a>&nbsp;<a href="/reference/androidx/paging/LoadType.APPEND.html">LoadType.APPEND</a></pre>
+      <p>Load at the end of a <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="PREPEND">PREPEND</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/androidx/paging/LoadType.html">LoadType</a>&nbsp;<a href="/reference/androidx/paging/LoadType.PREPEND.html">LoadType.PREPEND</a></pre>
+      <p>Load at the start of a <code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="REFRESH">REFRESH</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/androidx/paging/LoadType.html">LoadType</a>&nbsp;<a href="/reference/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></pre>
+      <p><code><a href="/reference/androidx/paging/PagingData.html">PagingData</a></code> content being refreshed, which can be a result of <code><a href="/reference/androidx/paging/PagingSource.html">PagingSource</a></code> invalidation, refresh that may contain content updates, or the initial load.</p>
+    </div>
     <h2>Public fields</h2>
     <div><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
       <h3 class="api-name" id="name()">name</h3>
diff --git a/testData/paging/docs/reference/androidx/paging/RemoteMediator.InitializeAction.html b/testData/paging/docs/reference/androidx/paging/RemoteMediator.InitializeAction.html
index e24f51e..cf0b9e1 100644
--- a/testData/paging/docs/reference/androidx/paging/RemoteMediator.InitializeAction.html
+++ b/testData/paging/docs/reference/androidx/paging/RemoteMediator.InitializeAction.html
@@ -19,6 +19,29 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>LAUNCH_INITIAL_REFRESH</code></td>
+            <td width="100%">
+              <p>Immediately dispatch a <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> asynchronously with load type <code><a href="/reference/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>, to update paginated content when the stream is initialized.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>SKIP_INITIAL_REFRESH</code></td>
+            <td width="100%">
+              <p>Wait for a refresh request from the UI before dispatching <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> with load type <code><a href="/reference/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public fields</h3></th>
           </tr>
         </thead>
@@ -38,6 +61,17 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="LAUNCH_INITIAL_REFRESH">LAUNCH_INITIAL_REFRESH</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a>&nbsp;<a href="/reference/androidx/paging/RemoteMediator.InitializeAction.LAUNCH_INITIAL_REFRESH.html">RemoteMediator.InitializeAction.LAUNCH_INITIAL_REFRESH</a></pre>
+      <p>Immediately dispatch a <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> asynchronously with load type <code><a href="/reference/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>, to update paginated content when the stream is initialized.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="SKIP_INITIAL_REFRESH">SKIP_INITIAL_REFRESH</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a>&nbsp;<a href="/reference/androidx/paging/RemoteMediator.InitializeAction.SKIP_INITIAL_REFRESH.html">RemoteMediator.InitializeAction.SKIP_INITIAL_REFRESH</a></pre>
+      <p>Wait for a refresh request from the UI before dispatching <code><a href="/reference/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> with load type <code><a href="/reference/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>.</p>
+    </div>
     <h2>Public fields</h2>
     <div><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
       <h3 class="api-name" id="name()">name</h3>
diff --git a/testData/paging/docs/reference/kotlin/androidx/paging/LoadType.html b/testData/paging/docs/reference/kotlin/androidx/paging/LoadType.html
index 1cedafe..1942b43 100644
--- a/testData/paging/docs/reference/kotlin/androidx/paging/LoadType.html
+++ b/testData/paging/docs/reference/kotlin/androidx/paging/LoadType.html
@@ -35,6 +35,35 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>APPEND</code></td>
+            <td width="100%">
+              <p>Load at the end of a <code><a href="/reference/kotlin/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>PREPEND</code></td>
+            <td width="100%">
+              <p>Load at the start of a <code><a href="/reference/kotlin/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>REFRESH</code></td>
+            <td width="100%">
+              <p><code><a href="/reference/kotlin/androidx/paging/PagingData.html">PagingData</a></code> content being refreshed, which can be a result of <code><a href="/reference/kotlin/androidx/paging/PagingSource.html">PagingSource</a></code> invalidation, refresh that may contain content updates, or the initial load.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public properties</h3></th>
           </tr>
         </thead>
@@ -54,6 +83,22 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="APPEND">APPEND</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/androidx/paging/LoadType.APPEND.html">LoadType.APPEND</a>:&nbsp;<a href="/reference/kotlin/androidx/paging/LoadType.html">LoadType</a></pre>
+      <p>Load at the end of a <code><a href="/reference/kotlin/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="PREPEND">PREPEND</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/androidx/paging/LoadType.PREPEND.html">LoadType.PREPEND</a>:&nbsp;<a href="/reference/kotlin/androidx/paging/LoadType.html">LoadType</a></pre>
+      <p>Load at the start of a <code><a href="/reference/kotlin/androidx/paging/PagingData.html">PagingData</a></code>.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="REFRESH">REFRESH</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a>:&nbsp;<a href="/reference/kotlin/androidx/paging/LoadType.html">LoadType</a></pre>
+      <p><code><a href="/reference/kotlin/androidx/paging/PagingData.html">PagingData</a></code> content being refreshed, which can be a result of <code><a href="/reference/kotlin/androidx/paging/PagingSource.html">PagingSource</a></code> invalidation, refresh that may contain content updates, or the initial load.</p>
+    </div>
     <h2>Public properties</h2>
     <div><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
       <h3 class="api-name" id="name()">name</h3>
diff --git a/testData/paging/docs/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.html b/testData/paging/docs/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.html
index d51cffe..b4c6b0e 100644
--- a/testData/paging/docs/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.html
+++ b/testData/paging/docs/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.html
@@ -19,6 +19,29 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>LAUNCH_INITIAL_REFRESH</code></td>
+            <td width="100%">
+              <p>Immediately dispatch a <code><a href="/reference/kotlin/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> asynchronously with load type <code><a href="/reference/kotlin/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>, to update paginated content when the stream is initialized.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>SKIP_INITIAL_REFRESH</code></td>
+            <td width="100%">
+              <p>Wait for a refresh request from the UI before dispatching <code><a href="/reference/kotlin/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> with load type <code><a href="/reference/kotlin/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public properties</h3></th>
           </tr>
         </thead>
@@ -38,6 +61,17 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="LAUNCH_INITIAL_REFRESH">LAUNCH_INITIAL_REFRESH</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.LAUNCH_INITIAL_REFRESH.html">RemoteMediator.InitializeAction.LAUNCH_INITIAL_REFRESH</a>:&nbsp;<a href="/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a></pre>
+      <p>Immediately dispatch a <code><a href="/reference/kotlin/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> asynchronously with load type <code><a href="/reference/kotlin/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>, to update paginated content when the stream is initialized.</p>
+    </div>
+    <div>
+      <h3 class="api-name" id="SKIP_INITIAL_REFRESH">SKIP_INITIAL_REFRESH</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.SKIP_INITIAL_REFRESH.html">RemoteMediator.InitializeAction.SKIP_INITIAL_REFRESH</a>:&nbsp;<a href="/reference/kotlin/androidx/paging/RemoteMediator.InitializeAction.html">RemoteMediator.InitializeAction</a></pre>
+      <p>Wait for a refresh request from the UI before dispatching <code><a href="/reference/kotlin/androidx/paging/RemoteMediator.html#load(androidx.paging.LoadType,androidx.paging.PagingState)">load</a></code> with load type <code><a href="/reference/kotlin/androidx/paging/LoadType.REFRESH.html">LoadType.REFRESH</a></code>.</p>
+    </div>
     <h2>Public properties</h2>
     <div><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
       <h3 class="api-name" id="name()">name</h3>
diff --git a/testData/simple/docs/reference/dokkatest/simple/Three.html b/testData/simple/docs/reference/dokkatest/simple/Three.html
index 604a182..f80b5bf 100644
--- a/testData/simple/docs/reference/dokkatest/simple/Three.html
+++ b/testData/simple/docs/reference/dokkatest/simple/Three.html
@@ -18,6 +18,29 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>A</code></td>
+            <td width="100%"></td>
+          </tr>
+          <tr>
+            <td><code>B</code></td>
+            <td width="100%"></td>
+          </tr>
+          <tr>
+            <td><code>C</code></td>
+            <td width="100%"></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public fields</h3></th>
           </tr>
         </thead>
@@ -43,6 +66,19 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="A">A</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/dokkatest/simple/Three.html">Three</a>&nbsp;<a href="/reference/dokkatest/simple/Three.A.html">Three.A</a></pre>
+    </div>
+    <div>
+      <h3 class="api-name" id="B">B</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/dokkatest/simple/Three.html">Three</a>&nbsp;<a href="/reference/dokkatest/simple/Three.B.html">Three.B</a></pre>
+    </div>
+    <div>
+      <h3 class="api-name" id="C">C</h3>
+      <pre class="api-signature no-pretty-print"><a href="/reference/dokkatest/simple/Three.html">Three</a>&nbsp;<a href="/reference/dokkatest/simple/Three.C.html">Three.C</a></pre>
+    </div>
     <h2>Public fields</h2>
     <div><a name="getLetter()"></a><a name="setLetter()"></a><a name="getLetter--"></a><a name="setLetter--"></a>
       <h3 class="api-name" id="letter()">letter</h3>
diff --git a/testData/simple/docs/reference/kotlin/dokkatest/simple/Three.html b/testData/simple/docs/reference/kotlin/dokkatest/simple/Three.html
index d28bce9..3ac50a3 100644
--- a/testData/simple/docs/reference/kotlin/dokkatest/simple/Three.html
+++ b/testData/simple/docs/reference/kotlin/dokkatest/simple/Three.html
@@ -18,6 +18,29 @@
       <table class="responsive">
         <thead>
           <tr>
+            <th colspan="2"><h3>Enum Values</h3></th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><code>A</code></td>
+            <td width="100%"></td>
+          </tr>
+          <tr>
+            <td><code>B</code></td>
+            <td width="100%"></td>
+          </tr>
+          <tr>
+            <td><code>C</code></td>
+            <td width="100%"></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <thead>
+          <tr>
             <th colspan="2"><h3>Public properties</h3></th>
           </tr>
         </thead>
@@ -43,6 +66,19 @@
         </tbody>
       </table>
     </div>
+    <h2>Enum Values</h2>
+    <div>
+      <h3 class="api-name" id="A">A</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/dokkatest/simple/Three.A.html">Three.A</a>:&nbsp;<a href="/reference/kotlin/dokkatest/simple/Three.html">Three</a></pre>
+    </div>
+    <div>
+      <h3 class="api-name" id="B">B</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/dokkatest/simple/Three.B.html">Three.B</a>:&nbsp;<a href="/reference/kotlin/dokkatest/simple/Three.html">Three</a></pre>
+    </div>
+    <div>
+      <h3 class="api-name" id="C">C</h3>
+      <pre class="api-signature no-pretty-print">val&nbsp;<a href="/reference/kotlin/dokkatest/simple/Three.C.html">Three.C</a>:&nbsp;<a href="/reference/kotlin/dokkatest/simple/Three.html">Three</a></pre>
+    </div>
     <h2>Public properties</h2>
     <div><a name="getLetter()"></a><a name="setLetter()"></a><a name="getLetter--"></a><a name="setLetter--"></a>
       <h3 class="api-name" id="letter()">letter</h3>