diff --git a/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaGenerationTask.kt b/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaGenerationTask.kt index a6643c41ed6..13b76013813 100644 --- a/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaGenerationTask.kt +++ b/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaGenerationTask.kt @@ -127,7 +127,8 @@ abstract class GenerateDocumentationTask @Inject constructor( "android" to "https://developer.android.com/reference/kotlin/", "google" to "https://developers.google.com/android/reference/", "firebase" to "https://firebase.google.com/docs/reference/kotlin/", - "coroutines" to "https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/" + "coroutines" to "https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/", + "kotlin" to "https://kotlinlang.org/api/latest/jvm/stdlib/" ) return packageLists.get().map { diff --git a/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaPlugin.kt b/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaPlugin.kt index aaff78844d0..b274ca52b76 100644 --- a/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaPlugin.kt +++ b/buildSrc/src/main/java/com/google/firebase/gradle/plugins/DackkaPlugin.kt @@ -90,26 +90,23 @@ tasks above). While we do not currently offer any configuration for the Dackka plugin, this could change in the future as needed. Currently, the DackkaPlugin provides sensible defaults to output directories, package lists, and so forth. -The DackkaPlugin also provides two extra tasks: -[cleanDackkaDocumentation][registerCleanDackkaDocumentation] and -[deleteDackkaGeneratedJavaReferences][registerDeleteDackkaGeneratedJavaReferencesTask]. +The DackkaPlugin also provides three extra tasks: +[cleanDackkaDocumentation][registerCleanDackkaDocumentation], +[copyJavaDocToCommonDirectory][registerCopyJavaDocToCommonDirectoryTask] and +[copyKotlinDocToCommonDirectory][registerCopyKotlinDocToCommonDirectoryTask]. _cleanDackkaDocumentation_ is exactly what it sounds like, a task to clean up (delete) the output of Dackka. This is useful when testing Dackka outputs itself- and shouldn't be apart of the normal flow. The reasoning is that it would otherwise invalidate the gradle cache. -_deleteDackkaGeneratedJavaReferences_ is a temporary addition. Dackka generates -two separate styles of docs for every source set: Java & Kotlin. Regardless of -whether the source is in Java or Kotlin. The Java output is how the source looks -from Java, and the Kotlin output is how the source looks from Kotlin. We publish -these under two separate categories, which you can see here: -[Java](https://firebase.google.com/docs/reference/android/packages) -or -[Kotlin](https://firebase.google.com/docs/reference/kotlin/packages). -Although, we do not currently publish Java packages with Dackka- and will wait -until we are more comfortable with the output of Dackka to do so. So until then, -this task will remove all generate Java references from the Dackka output. +_copyJavaDocToCommonDirectory_ copies the JavaDoc variant of the Dackka output for each sdk, +and pastes it in a common directory under the root project's build directory. This makes it easier +to zip the doc files for staging. + +_copyKotlinDocToCommonDirectory_ copies the KotlinDoc variant of the Dackka output for each sdk, +and pastes it in a common directory under the root project's build directory. This makes it easier +to zip the doc files for staging. Currently, the DackkaPlugin builds Java sources separate from Kotlin Sources. There is an open bug for Dackka in which hidden parent classes and annotations do not hide themselves from children classes. @@ -125,16 +122,16 @@ abstract class DackkaPlugin : Plugin { val generateDocumentation = registerGenerateDackkaDocumentationTask(project) val outputDirectory = generateDocumentation.flatMap { it.outputDirectory } val firesiteTransform = registerFiresiteTransformTask(project, outputDirectory) - val deleteJavaReferences = registerDeleteDackkaGeneratedJavaReferencesTask(project, outputDirectory) - val copyOutputToCommonDirectory = registerCopyDackkaOutputToCommonDirectoryTask(project, outputDirectory) + val copyJavaDocToCommonDirectory = registerCopyJavaDocToCommonDirectoryTask(project, outputDirectory) + val copyKotlinDocToCommonDirectory = registerCopyKotlinDocToCommonDirectoryTask(project, outputDirectory) project.tasks.register("kotlindoc") { group = "documentation" dependsOn( generateDocumentation, firesiteTransform, - deleteJavaReferences, - copyOutputToCommonDirectory + copyJavaDocToCommonDirectory, + copyKotlinDocToCommonDirectory ) } } else { @@ -234,38 +231,44 @@ abstract class DackkaPlugin : Plugin { // TODO(b/243833009): Make task cacheable private fun registerFiresiteTransformTask(project: Project, outputDirectory: Provider) = project.tasks.register("firesiteTransform") { + mustRunAfter("generateDackkaDocumentation") + dackkaFiles.set(outputDirectory) } - // If we decide to publish java variants, we'll need to address the generated format as well - // TODO(b/243833009): Make task cacheable - private fun registerDeleteDackkaGeneratedJavaReferencesTask(project: Project, outputDirectory: Provider) = - project.tasks.register("deleteDackkaGeneratedJavaReferences") { - mustRunAfter("generateDackkaDocumentation") - - val filesWeDoNotNeed = listOf( - "reference/client", - "reference/com" - ) - val filesToDelete = outputDirectory.map { dir -> - filesWeDoNotNeed.map { - project.files("${dir.path}/$it") - } + // TODO(b/246593212): Migrate doc files to single directory + private fun registerCopyJavaDocToCommonDirectoryTask(project: Project, outputDirectory: Provider) = + project.tasks.register("copyJavaDocToCommonDirectory") { + /** + * This is not currently cache compliant. The need for this property is + * temporary while we test it alongside the current javaDoc task. Since it's such a + * temporary behavior, losing cache compliance is fine for now. + */ + if (project.rootProject.findProperty("dackkaJavadoc") == "true") { + mustRunAfter("firesiteTransform") + + val outputFolder = project.file("${project.rootProject.buildDir}/firebase-kotlindoc/android") + val clientFolder = outputDirectory.map { project.file("${it.path}/reference/client") } + val comFolder = outputDirectory.map { project.file("${it.path}/reference/com") } + + fromDirectory(clientFolder) + fromDirectory(comFolder) + + into(outputFolder) } - - delete(filesToDelete) } - private fun registerCopyDackkaOutputToCommonDirectoryTask(project: Project, outputDirectory: Provider) = - project.tasks.register("copyDackkaOutputToCommonDirectory") { - mustRunAfter("deleteDackkaGeneratedJavaReferences") + // TODO(b/246593212): Migrate doc files to single directory + private fun registerCopyKotlinDocToCommonDirectoryTask(project: Project, outputDirectory: Provider) = + project.tasks.register("copyKotlinDocToCommonDirectory") { mustRunAfter("firesiteTransform") - val referenceFolder = outputDirectory.map { project.file("${it.path}/reference") } val outputFolder = project.file("${project.rootProject.buildDir}/firebase-kotlindoc") + val kotlinFolder = outputDirectory.map { project.file("${it.path}/reference/kotlin") } + + fromDirectory(kotlinFolder) - from(referenceFolder) - destinationDir = outputFolder + into(outputFolder) } // Useful for local testing, but may not be desired for standard use (that's why it's not depended on) diff --git a/buildSrc/src/main/java/com/google/firebase/gradle/plugins/GradleUtils.kt b/buildSrc/src/main/java/com/google/firebase/gradle/plugins/GradleUtils.kt new file mode 100644 index 00000000000..d3a5b18a98f --- /dev/null +++ b/buildSrc/src/main/java/com/google/firebase/gradle/plugins/GradleUtils.kt @@ -0,0 +1,10 @@ +package com.google.firebase.gradle.plugins + +import java.io.File +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.Copy + +fun Copy.fromDirectory(directory: Provider) = + from(directory) { + into(directory.map { it.name }) + } diff --git a/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/DefaultHeartBeatControllerTest.java b/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/DefaultHeartBeatControllerTest.java index 63a61a749ad..a39be1fe512 100644 --- a/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/DefaultHeartBeatControllerTest.java +++ b/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/DefaultHeartBeatControllerTest.java @@ -15,6 +15,7 @@ package com.google.firebase.heartbeatinfo; import static com.google.common.truth.Truth.assertThat; +import static com.google.firebase.heartbeatinfo.TaskWaiter.await; import static java.nio.charset.StandardCharsets.UTF_8; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; @@ -26,7 +27,7 @@ import android.content.Context; import android.content.SharedPreferences; import androidx.test.core.app.ApplicationProvider; -import androidx.test.runner.AndroidJUnit4; +import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.firebase.platforminfo.UserAgentPublisher; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -35,13 +36,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeoutException; import java.util.zip.GZIPOutputStream; -import org.json.JSONException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,13 +47,12 @@ @RunWith(AndroidJUnit4.class) public class DefaultHeartBeatControllerTest { - private ExecutorService executor; - private TestOnCompleteListener storeOnCompleteListener; - private TestOnCompleteListener getOnCompleteListener; - private final String DEFAULT_USER_AGENT = "agent1"; - private HeartBeatInfoStorage storage = mock(HeartBeatInfoStorage.class); - private UserAgentPublisher publisher = mock(UserAgentPublisher.class); - private static Context applicationContext = ApplicationProvider.getApplicationContext(); + private static final String DEFAULT_USER_AGENT = "agent1"; + private final Executor executor = Executors.newSingleThreadExecutor(); + + private final HeartBeatInfoStorage storage = mock(HeartBeatInfoStorage.class); + private final UserAgentPublisher publisher = mock(UserAgentPublisher.class); + private final Context applicationContext = ApplicationProvider.getApplicationContext(); private final Set logSources = new HashSet() { { @@ -66,22 +63,18 @@ public class DefaultHeartBeatControllerTest { @Before public void setUp() { - executor = new ThreadPoolExecutor(0, 1, 30L, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); when(publisher.getUserAgent()).thenReturn(DEFAULT_USER_AGENT); - storeOnCompleteListener = new TestOnCompleteListener<>(); - getOnCompleteListener = new TestOnCompleteListener<>(); heartBeatController = new DefaultHeartBeatController( () -> storage, logSources, executor, () -> publisher, applicationContext); } @Test - public void whenNoSource_dontStoreHeartBeat() throws ExecutionException, InterruptedException { + public void whenNoSource_dontStoreHeartBeat() throws InterruptedException, TimeoutException { DefaultHeartBeatController controller = new DefaultHeartBeatController( () -> storage, new HashSet<>(), executor, () -> publisher, applicationContext); - controller.registerHeartBeat().addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); + await(controller.registerHeartBeat()); verify(storage, times(0)).storeHeartBeat(anyLong(), anyString()); } @@ -99,31 +92,24 @@ public void getHeartBeatCode_noHeartBeat() { @Config(sdk = 29) @Test - public void generateHeartBeat_oneHeartBeat() - throws ExecutionException, InterruptedException, JSONException, IOException { + public void generateHeartBeat_oneHeartBeat() throws InterruptedException, TimeoutException { ArrayList returnResults = new ArrayList<>(); returnResults.add( - HeartBeatResult.create( - "test-agent", new ArrayList(Collections.singleton("2015-02-03")))); + HeartBeatResult.create("test-agent", Collections.singletonList("2015-02-03"))); when(storage.getAllHeartBeats()).thenReturn(returnResults); - heartBeatController - .registerHeartBeat() - .addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); + await(heartBeatController.registerHeartBeat()); verify(storage, times(1)).storeHeartBeat(anyLong(), anyString()); - heartBeatController - .getHeartBeatsHeader() - .addOnCompleteListener(executor, getOnCompleteListener); String str = "{\"heartbeats\":[{\"agent\":\"test-agent\",\"dates\":[\"2015-02-03\"]}],\"version\":\"2\"}"; String expected = compress(str); - assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected); + assertThat(await(heartBeatController.getHeartBeatsHeader()).replace("\n", "")) + .isEqualTo(expected); } @Config(sdk = 29) @Test public void firstNewThenOld_synchronizedCorrectly() - throws ExecutionException, InterruptedException { + throws InterruptedException, TimeoutException { Context context = ApplicationProvider.getApplicationContext(); SharedPreferences heartBeatSharedPreferences = context.getSharedPreferences("testHeartBeat", Context.MODE_PRIVATE); @@ -136,10 +122,8 @@ public void firstNewThenOld_synchronizedCorrectly() Base64.getUrlEncoder() .withoutPadding() .encodeToString("{\"heartbeats\":[],\"version\":\"2\"}".getBytes()); - controller.registerHeartBeat().addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); - controller.getHeartBeatsHeader().addOnCompleteListener(executor, getOnCompleteListener); - String output = getOnCompleteListener.await(); + await(controller.registerHeartBeat()); + String output = await(controller.getHeartBeatsHeader()); assertThat(output.replace("\n", "")).isNotEqualTo(emptyString); int heartBeatCode = controller.getHeartBeatCode("test").getCode(); assertThat(heartBeatCode).isEqualTo(0); @@ -148,7 +132,7 @@ public void firstNewThenOld_synchronizedCorrectly() @Config(sdk = 29) @Test public void firstOldThenNew_synchronizedCorrectly() - throws ExecutionException, InterruptedException, IOException { + throws InterruptedException, TimeoutException { Context context = ApplicationProvider.getApplicationContext(); SharedPreferences heartBeatSharedPreferences = context.getSharedPreferences("testHeartBeat", Context.MODE_PRIVATE); @@ -158,46 +142,36 @@ public void firstOldThenNew_synchronizedCorrectly() new DefaultHeartBeatController( () -> heartBeatInfoStorage, logSources, executor, () -> publisher, context); String emptyString = compress("{\"heartbeats\":[],\"version\":\"2\"}"); - controller.registerHeartBeat().addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); + await(controller.registerHeartBeat()); int heartBeatCode = controller.getHeartBeatCode("test").getCode(); assertThat(heartBeatCode).isEqualTo(2); - controller.getHeartBeatsHeader().addOnCompleteListener(executor, getOnCompleteListener); - String output = getOnCompleteListener.await(); + String output = await(controller.getHeartBeatsHeader()); assertThat(output.replace("\n", "")).isEqualTo(emptyString); - controller.registerHeartBeat().addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); - controller.getHeartBeatsHeader().addOnCompleteListener(executor, getOnCompleteListener); - output = getOnCompleteListener.await(); + + await(controller.registerHeartBeat()); + await(controller.getHeartBeatsHeader()); assertThat(output.replace("\n", "")).isEqualTo(emptyString); } @Config(sdk = 29) @Test public void generateHeartBeat_twoHeartBeatsSameUserAgent() - throws ExecutionException, InterruptedException, JSONException, IOException { + throws InterruptedException, TimeoutException { ArrayList returnResults = new ArrayList<>(); ArrayList dateList = new ArrayList<>(); dateList.add("2015-03-02"); dateList.add("2015-03-01"); returnResults.add(HeartBeatResult.create("test-agent", dateList)); when(storage.getAllHeartBeats()).thenReturn(returnResults); - heartBeatController - .registerHeartBeat() - .addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); - heartBeatController - .registerHeartBeat() - .addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); + await(heartBeatController.registerHeartBeat()); + await(heartBeatController.registerHeartBeat()); verify(storage, times(2)).storeHeartBeat(anyLong(), anyString()); - heartBeatController - .getHeartBeatsHeader() - .addOnCompleteListener(executor, getOnCompleteListener); + String str = "{\"heartbeats\":[{\"agent\":\"test-agent\",\"dates\":[\"2015-03-02\",\"2015-03-01\"]}],\"version\":\"2\"}"; String expected = compress(str); - assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected); + assertThat(await(heartBeatController.getHeartBeatsHeader()).replace("\n", "")) + .isEqualTo(expected); } private static String base64Encode(byte[] input) { @@ -218,38 +192,28 @@ private static byte[] gzip(String input) { } } - private String compress(String str) throws IOException { + private String compress(String str) { return base64Encode(gzip(str)); } @Config(sdk = 29) @Test public void generateHeartBeat_twoHeartBeatstwoUserAgents() - throws ExecutionException, InterruptedException, JSONException, IOException { + throws InterruptedException, TimeoutException { ArrayList returnResults = new ArrayList<>(); returnResults.add( - HeartBeatResult.create( - "test-agent", new ArrayList(Collections.singleton("2015-03-02")))); + HeartBeatResult.create("test-agent", Collections.singletonList("2015-03-02"))); returnResults.add( - HeartBeatResult.create( - "test-agent-1", new ArrayList(Collections.singleton("2015-03-03")))); + HeartBeatResult.create("test-agent-1", Collections.singletonList("2015-03-03"))); when(storage.getAllHeartBeats()).thenReturn(returnResults); - heartBeatController - .registerHeartBeat() - .addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); - heartBeatController - .registerHeartBeat() - .addOnCompleteListener(executor, storeOnCompleteListener); - storeOnCompleteListener.await(); - Thread.sleep(1000); + await(heartBeatController.registerHeartBeat()); + await(heartBeatController.registerHeartBeat()); + verify(storage, times(2)).storeHeartBeat(anyLong(), anyString()); - heartBeatController - .getHeartBeatsHeader() - .addOnCompleteListener(executor, getOnCompleteListener); String str = "{\"heartbeats\":[{\"agent\":\"test-agent\",\"dates\":[\"2015-03-02\"]},{\"agent\":\"test-agent-1\",\"dates\":[\"2015-03-03\"]}],\"version\":\"2\"}"; String expected = compress(str); - assertThat(getOnCompleteListener.await().replace("\n", "")).isEqualTo(expected); + assertThat(await(heartBeatController.getHeartBeatsHeader()).replace("\n", "")) + .isEqualTo(expected); } } diff --git a/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/TaskWaiter.java b/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/TaskWaiter.java new file mode 100644 index 00000000000..3de11613829 --- /dev/null +++ b/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/TaskWaiter.java @@ -0,0 +1,56 @@ +// Copyright 2020 Google LLC +// +// 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.firebase.heartbeatinfo; + +import androidx.annotation.NonNull; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +/** + * Helper listener that works around a limitation of the Tasks API where await() cannot be called on + * the main thread. + */ +public class TaskWaiter implements OnCompleteListener { + private static final long TIMEOUT_MS = 500000; + private final CountDownLatch latch = new CountDownLatch(1); + private final Task task; + + private TaskWaiter(Task task) { + this.task = task; + task.addOnCompleteListener(Runnable::run, this); + } + + @Override + public void onComplete(@NonNull Task task) { + latch.countDown(); + } + + public TResult await() throws InterruptedException, TimeoutException { + if (!task.isComplete() && !latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { + throw new TimeoutException("timed out waiting for result"); + } + return task.getResult(); + } + + @CanIgnoreReturnValue + public static TResult await(Task task) + throws InterruptedException, TimeoutException { + return new TaskWaiter<>(task).await(); + } +} diff --git a/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/TestOnCompleteListener.java b/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/TestOnCompleteListener.java deleted file mode 100644 index 1f6d9078621..00000000000 --- a/firebase-common/src/test/java/com/google/firebase/heartbeatinfo/TestOnCompleteListener.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2020 Google LLC -// -// 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.firebase.heartbeatinfo; - -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import java.io.IOException; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - -/** - * Helper listener that works around a limitation of the Tasks API where await() cannot be called on - * the main thread. This listener works around it by running itself on a different thread, thus - * allowing the main thread to be woken up when the Tasks complete. - */ -public class TestOnCompleteListener implements OnCompleteListener { - private static final long TIMEOUT_MS = 5000; - private final CountDownLatch latch = new CountDownLatch(1); - private Task task; - private volatile TResult result; - private volatile Exception exception; - private volatile boolean successful; - - @Override - public void onComplete(@NonNull Task task) { - this.task = task; - successful = task.isSuccessful(); - if (successful) { - result = task.getResult(); - } else { - exception = task.getException(); - } - latch.countDown(); - } - - /** Blocks until the {@link #onComplete} is called. */ - public TResult await() throws InterruptedException, ExecutionException { - if (!latch.await(TIMEOUT_MS, TimeUnit.MILLISECONDS)) { - throw new InterruptedException("timed out waiting for result"); - } - if (successful) { - return result; - } else { - if (exception instanceof InterruptedException) { - throw (InterruptedException) exception; - } - if (exception instanceof IOException) { - throw new ExecutionException(exception); - } - throw new IllegalStateException("got an unexpected exception type", exception); - } - } -} diff --git a/kotlindoc/package-lists/kotlin/package-list b/kotlindoc/package-lists/kotlin/package-list new file mode 100644 index 00000000000..2f683a6cfe6 --- /dev/null +++ b/kotlindoc/package-lists/kotlin/package-list @@ -0,0 +1,317 @@ +$dokka.format:kotlin-website-html +$dokka.linkExtension:html +$dokka.location:kotlin$and(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/and.html +$dokka.location:kotlin$dec(java.math.BigDecimal)kotlin/java.math.-big-decimal/dec.html +$dokka.location:kotlin$dec(java.math.BigInteger)kotlin/java.math.-big-integer/dec.html +$dokka.location:kotlin$div(java.math.BigDecimal, java.math.BigDecimal)kotlin/java.math.-big-decimal/div.html +$dokka.location:kotlin$div(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/div.html +$dokka.location:kotlin$inc(java.math.BigDecimal)kotlin/java.math.-big-decimal/inc.html +$dokka.location:kotlin$inc(java.math.BigInteger)kotlin/java.math.-big-integer/inc.html +$dokka.location:kotlin$inv(java.math.BigInteger)kotlin/java.math.-big-integer/inv.html +$dokka.location:kotlin$minus(java.math.BigDecimal, java.math.BigDecimal)kotlin/java.math.-big-decimal/minus.html +$dokka.location:kotlin$minus(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/minus.html +$dokka.location:kotlin$or(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/or.html +$dokka.location:kotlin$plus(java.math.BigDecimal, java.math.BigDecimal)kotlin/java.math.-big-decimal/plus.html +$dokka.location:kotlin$plus(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/plus.html +$dokka.location:kotlin$rem(java.math.BigDecimal, java.math.BigDecimal)kotlin/java.math.-big-decimal/rem.html +$dokka.location:kotlin$rem(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/rem.html +$dokka.location:kotlin$shl(java.math.BigInteger, kotlin.Int)kotlin/java.math.-big-integer/shl.html +$dokka.location:kotlin$shr(java.math.BigInteger, kotlin.Int)kotlin/java.math.-big-integer/shr.html +$dokka.location:kotlin$times(java.math.BigDecimal, java.math.BigDecimal)kotlin/java.math.-big-decimal/times.html +$dokka.location:kotlin$times(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/times.html +$dokka.location:kotlin$toBigDecimal(java.math.BigInteger)kotlin/java.math.-big-integer/to-big-decimal.html +$dokka.location:kotlin$toBigDecimal(java.math.BigInteger, kotlin.Int, java.math.MathContext)kotlin/java.math.-big-integer/to-big-decimal.html +$dokka.location:kotlin$unaryMinus(java.math.BigDecimal)kotlin/java.math.-big-decimal/unary-minus.html +$dokka.location:kotlin$unaryMinus(java.math.BigInteger)kotlin/java.math.-big-integer/unary-minus.html +$dokka.location:kotlin$xor(java.math.BigInteger, java.math.BigInteger)kotlin/java.math.-big-integer/xor.html +$dokka.location:kotlin.ArithmeticExceptionkotlin/-arithmetic-exception/index.html +$dokka.location:kotlin.AssertionErrorkotlin/-assertion-error/index.html +$dokka.location:kotlin.ClassCastExceptionkotlin/-class-cast-exception/index.html +$dokka.location:kotlin.Comparatorkotlin/-comparator/index.html +$dokka.location:kotlin.ConcurrentModificationExceptionkotlin/-concurrent-modification-exception/index.html +$dokka.location:kotlin.Errorkotlin/-error/index.html +$dokka.location:kotlin.Exceptionkotlin/-exception/index.html +$dokka.location:kotlin.IllegalArgumentExceptionkotlin/-illegal-argument-exception/index.html +$dokka.location:kotlin.IllegalStateExceptionkotlin/-illegal-state-exception/index.html +$dokka.location:kotlin.IndexOutOfBoundsExceptionkotlin/-index-out-of-bounds-exception/index.html +$dokka.location:kotlin.NoSuchElementExceptionkotlin/-no-such-element-exception/index.html +$dokka.location:kotlin.NullPointerExceptionkotlin/-null-pointer-exception/index.html +$dokka.location:kotlin.NumberFormatExceptionkotlin/-number-format-exception/index.html +$dokka.location:kotlin.RuntimeExceptionkotlin/-runtime-exception/index.html +$dokka.location:kotlin.Throwskotlin/-throws/index.html +$dokka.location:kotlin.UnsupportedOperationExceptionkotlin/-unsupported-operation-exception/index.html +$dokka.location:kotlin.collections$getOrPut(java.util.concurrent.ConcurrentMap((kotlin.collections.getOrPut.K, kotlin.collections.getOrPut.V)), kotlin.collections.getOrPut.K, kotlin.Function0((kotlin.collections.getOrPut.V)))kotlin.collections/java.util.concurrent.-concurrent-map/get-or-put.html +$dokka.location:kotlin.collections$iterator(java.util.Enumeration((kotlin.collections.iterator.T)))kotlin.collections/java.util.-enumeration/iterator.html +$dokka.location:kotlin.collections$toList(java.util.Enumeration((kotlin.collections.toList.T)))kotlin.collections/java.util.-enumeration/to-list.html +$dokka.location:kotlin.collections.ArrayListkotlin.collections/-array-list/index.html +$dokka.location:kotlin.collections.HashMapkotlin.collections/-hash-map/index.html +$dokka.location:kotlin.collections.HashSetkotlin.collections/-hash-set/index.html +$dokka.location:kotlin.collections.LinkedHashMapkotlin.collections/-linked-hash-map/index.html +$dokka.location:kotlin.collections.LinkedHashSetkotlin.collections/-linked-hash-set/index.html +$dokka.location:kotlin.concurrent$getOrSet(java.lang.ThreadLocal((kotlin.concurrent.getOrSet.T)), kotlin.Function0((kotlin.concurrent.getOrSet.T)))kotlin.concurrent/java.lang.-thread-local/get-or-set.html +$dokka.location:kotlin.concurrent$read(java.util.concurrent.locks.ReentrantReadWriteLock, kotlin.Function0((kotlin.concurrent.read.T)))kotlin.concurrent/java.util.concurrent.locks.-reentrant-read-write-lock/read.html +$dokka.location:kotlin.concurrent$schedule(java.util.Timer, java.util.Date, kotlin.Function1((java.util.TimerTask, kotlin.Unit)))kotlin.concurrent/java.util.-timer/schedule.html +$dokka.location:kotlin.concurrent$schedule(java.util.Timer, java.util.Date, kotlin.Long, kotlin.Function1((java.util.TimerTask, kotlin.Unit)))kotlin.concurrent/java.util.-timer/schedule.html +$dokka.location:kotlin.concurrent$schedule(java.util.Timer, kotlin.Long, kotlin.Function1((java.util.TimerTask, kotlin.Unit)))kotlin.concurrent/java.util.-timer/schedule.html +$dokka.location:kotlin.concurrent$schedule(java.util.Timer, kotlin.Long, kotlin.Long, kotlin.Function1((java.util.TimerTask, kotlin.Unit)))kotlin.concurrent/java.util.-timer/schedule.html +$dokka.location:kotlin.concurrent$scheduleAtFixedRate(java.util.Timer, java.util.Date, kotlin.Long, kotlin.Function1((java.util.TimerTask, kotlin.Unit)))kotlin.concurrent/java.util.-timer/schedule-at-fixed-rate.html +$dokka.location:kotlin.concurrent$scheduleAtFixedRate(java.util.Timer, kotlin.Long, kotlin.Long, kotlin.Function1((java.util.TimerTask, kotlin.Unit)))kotlin.concurrent/java.util.-timer/schedule-at-fixed-rate.html +$dokka.location:kotlin.concurrent$withLock(java.util.concurrent.locks.Lock, kotlin.Function0((kotlin.concurrent.withLock.T)))kotlin.concurrent/java.util.concurrent.locks.-lock/with-lock.html +$dokka.location:kotlin.concurrent$write(java.util.concurrent.locks.ReentrantReadWriteLock, kotlin.Function0((kotlin.concurrent.write.T)))kotlin.concurrent/java.util.concurrent.locks.-reentrant-read-write-lock/write.html +$dokka.location:kotlin.coroutines.cancellation.CancellationExceptionkotlin.coroutines.cancellation/-cancellation-exception/index.html +$dokka.location:kotlin.io$appendBytes(java.io.File, kotlin.ByteArray)kotlin.io/java.io.-file/append-bytes.html +$dokka.location:kotlin.io$appendText(java.io.File, kotlin.String, java.nio.charset.Charset)kotlin.io/java.io.-file/append-text.html +$dokka.location:kotlin.io$buffered(java.io.InputStream, kotlin.Int)kotlin.io/java.io.-input-stream/buffered.html +$dokka.location:kotlin.io$buffered(java.io.OutputStream, kotlin.Int)kotlin.io/java.io.-output-stream/buffered.html +$dokka.location:kotlin.io$buffered(java.io.Reader, kotlin.Int)kotlin.io/java.io.-reader/buffered.html +$dokka.location:kotlin.io$buffered(java.io.Writer, kotlin.Int)kotlin.io/java.io.-writer/buffered.html +$dokka.location:kotlin.io$bufferedReader(java.io.File, java.nio.charset.Charset, kotlin.Int)kotlin.io/java.io.-file/buffered-reader.html +$dokka.location:kotlin.io$bufferedReader(java.io.InputStream, java.nio.charset.Charset)kotlin.io/java.io.-input-stream/buffered-reader.html +$dokka.location:kotlin.io$bufferedWriter(java.io.File, java.nio.charset.Charset, kotlin.Int)kotlin.io/java.io.-file/buffered-writer.html +$dokka.location:kotlin.io$bufferedWriter(java.io.OutputStream, java.nio.charset.Charset)kotlin.io/java.io.-output-stream/buffered-writer.html +$dokka.location:kotlin.io$copyRecursively(java.io.File, java.io.File, kotlin.Boolean, kotlin.Function2((java.io.File, java.io.IOException, kotlin.io.OnErrorAction)))kotlin.io/java.io.-file/copy-recursively.html +$dokka.location:kotlin.io$copyTo(java.io.File, java.io.File, kotlin.Boolean, kotlin.Int)kotlin.io/java.io.-file/copy-to.html +$dokka.location:kotlin.io$copyTo(java.io.InputStream, java.io.OutputStream, kotlin.Int)kotlin.io/java.io.-input-stream/copy-to.html +$dokka.location:kotlin.io$copyTo(java.io.Reader, java.io.Writer, kotlin.Int)kotlin.io/java.io.-reader/copy-to.html +$dokka.location:kotlin.io$deleteRecursively(java.io.File)kotlin.io/java.io.-file/delete-recursively.html +$dokka.location:kotlin.io$endsWith(java.io.File, java.io.File)kotlin.io/java.io.-file/ends-with.html +$dokka.location:kotlin.io$endsWith(java.io.File, kotlin.String)kotlin.io/java.io.-file/ends-with.html +$dokka.location:kotlin.io$extension#java.io.Filekotlin.io/java.io.-file/extension.html +$dokka.location:kotlin.io$forEachBlock(java.io.File, kotlin.Function2((kotlin.ByteArray, kotlin.Int, kotlin.Unit)))kotlin.io/java.io.-file/for-each-block.html +$dokka.location:kotlin.io$forEachBlock(java.io.File, kotlin.Int, kotlin.Function2((kotlin.ByteArray, kotlin.Int, kotlin.Unit)))kotlin.io/java.io.-file/for-each-block.html +$dokka.location:kotlin.io$forEachLine(java.io.File, java.nio.charset.Charset, kotlin.Function1((kotlin.String, kotlin.Unit)))kotlin.io/java.io.-file/for-each-line.html +$dokka.location:kotlin.io$forEachLine(java.io.Reader, kotlin.Function1((kotlin.String, kotlin.Unit)))kotlin.io/java.io.-reader/for-each-line.html +$dokka.location:kotlin.io$inputStream(java.io.File)kotlin.io/java.io.-file/input-stream.html +$dokka.location:kotlin.io$invariantSeparatorsPath#java.io.Filekotlin.io/java.io.-file/invariant-separators-path.html +$dokka.location:kotlin.io$isRooted#java.io.Filekotlin.io/java.io.-file/is-rooted.html +$dokka.location:kotlin.io$iterator(java.io.BufferedInputStream)kotlin.io/java.io.-buffered-input-stream/iterator.html +$dokka.location:kotlin.io$lineSequence(java.io.BufferedReader)kotlin.io/java.io.-buffered-reader/line-sequence.html +$dokka.location:kotlin.io$nameWithoutExtension#java.io.Filekotlin.io/java.io.-file/name-without-extension.html +$dokka.location:kotlin.io$normalize(java.io.File)kotlin.io/java.io.-file/normalize.html +$dokka.location:kotlin.io$outputStream(java.io.File)kotlin.io/java.io.-file/output-stream.html +$dokka.location:kotlin.io$printWriter(java.io.File, java.nio.charset.Charset)kotlin.io/java.io.-file/print-writer.html +$dokka.location:kotlin.io$readBytes(java.io.File)kotlin.io/java.io.-file/read-bytes.html +$dokka.location:kotlin.io$readBytes(java.io.InputStream)kotlin.io/java.io.-input-stream/read-bytes.html +$dokka.location:kotlin.io$readBytes(java.io.InputStream, kotlin.Int)kotlin.io/java.io.-input-stream/read-bytes.html +$dokka.location:kotlin.io$readBytes(java.net.URL)kotlin.io/java.net.-u-r-l/read-bytes.html +$dokka.location:kotlin.io$readLines(java.io.File, java.nio.charset.Charset)kotlin.io/java.io.-file/read-lines.html +$dokka.location:kotlin.io$readLines(java.io.Reader)kotlin.io/java.io.-reader/read-lines.html +$dokka.location:kotlin.io$readText(java.io.File, java.nio.charset.Charset)kotlin.io/java.io.-file/read-text.html +$dokka.location:kotlin.io$readText(java.io.Reader)kotlin.io/java.io.-reader/read-text.html +$dokka.location:kotlin.io$readText(java.net.URL, java.nio.charset.Charset)kotlin.io/java.net.-u-r-l/read-text.html +$dokka.location:kotlin.io$reader(java.io.File, java.nio.charset.Charset)kotlin.io/java.io.-file/reader.html +$dokka.location:kotlin.io$reader(java.io.InputStream, java.nio.charset.Charset)kotlin.io/java.io.-input-stream/reader.html +$dokka.location:kotlin.io$relativeTo(java.io.File, java.io.File)kotlin.io/java.io.-file/relative-to.html +$dokka.location:kotlin.io$relativeToOrNull(java.io.File, java.io.File)kotlin.io/java.io.-file/relative-to-or-null.html +$dokka.location:kotlin.io$relativeToOrSelf(java.io.File, java.io.File)kotlin.io/java.io.-file/relative-to-or-self.html +$dokka.location:kotlin.io$resolve(java.io.File, java.io.File)kotlin.io/java.io.-file/resolve.html +$dokka.location:kotlin.io$resolve(java.io.File, kotlin.String)kotlin.io/java.io.-file/resolve.html +$dokka.location:kotlin.io$resolveSibling(java.io.File, java.io.File)kotlin.io/java.io.-file/resolve-sibling.html +$dokka.location:kotlin.io$resolveSibling(java.io.File, kotlin.String)kotlin.io/java.io.-file/resolve-sibling.html +$dokka.location:kotlin.io$startsWith(java.io.File, java.io.File)kotlin.io/java.io.-file/starts-with.html +$dokka.location:kotlin.io$startsWith(java.io.File, kotlin.String)kotlin.io/java.io.-file/starts-with.html +$dokka.location:kotlin.io$toRelativeString(java.io.File, java.io.File)kotlin.io/java.io.-file/to-relative-string.html +$dokka.location:kotlin.io$useLines(java.io.File, java.nio.charset.Charset, kotlin.Function1((kotlin.sequences.Sequence((kotlin.String)), kotlin.io.useLines.T)))kotlin.io/java.io.-file/use-lines.html +$dokka.location:kotlin.io$useLines(java.io.Reader, kotlin.Function1((kotlin.sequences.Sequence((kotlin.String)), kotlin.io.useLines.T)))kotlin.io/java.io.-reader/use-lines.html +$dokka.location:kotlin.io$walk(java.io.File, kotlin.io.FileWalkDirection)kotlin.io/java.io.-file/walk.html +$dokka.location:kotlin.io$walkBottomUp(java.io.File)kotlin.io/java.io.-file/walk-bottom-up.html +$dokka.location:kotlin.io$walkTopDown(java.io.File)kotlin.io/java.io.-file/walk-top-down.html +$dokka.location:kotlin.io$writeBytes(java.io.File, kotlin.ByteArray)kotlin.io/java.io.-file/write-bytes.html +$dokka.location:kotlin.io$writeText(java.io.File, kotlin.String, java.nio.charset.Charset)kotlin.io/java.io.-file/write-text.html +$dokka.location:kotlin.io$writer(java.io.File, java.nio.charset.Charset)kotlin.io/java.io.-file/writer.html +$dokka.location:kotlin.io$writer(java.io.OutputStream, java.nio.charset.Charset)kotlin.io/java.io.-output-stream/writer.html +$dokka.location:kotlin.io.path$absolute(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/absolute.html +$dokka.location:kotlin.io.path$absolutePathString(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/absolute-path-string.html +$dokka.location:kotlin.io.path$appendBytes(java.nio.file.Path, kotlin.ByteArray)kotlin.io.path/java.nio.file.-path/append-bytes.html +$dokka.location:kotlin.io.path$appendLines(java.nio.file.Path, kotlin.collections.Iterable((kotlin.CharSequence)), java.nio.charset.Charset)kotlin.io.path/java.nio.file.-path/append-lines.html +$dokka.location:kotlin.io.path$appendLines(java.nio.file.Path, kotlin.sequences.Sequence((kotlin.CharSequence)), java.nio.charset.Charset)kotlin.io.path/java.nio.file.-path/append-lines.html +$dokka.location:kotlin.io.path$appendText(java.nio.file.Path, kotlin.CharSequence, java.nio.charset.Charset)kotlin.io.path/java.nio.file.-path/append-text.html +$dokka.location:kotlin.io.path$bufferedReader(java.nio.file.Path, java.nio.charset.Charset, kotlin.Int, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/buffered-reader.html +$dokka.location:kotlin.io.path$bufferedWriter(java.nio.file.Path, java.nio.charset.Charset, kotlin.Int, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/buffered-writer.html +$dokka.location:kotlin.io.path$copyTo(java.nio.file.Path, java.nio.file.Path, kotlin.Array((java.nio.file.CopyOption)))kotlin.io.path/java.nio.file.-path/copy-to.html +$dokka.location:kotlin.io.path$copyTo(java.nio.file.Path, java.nio.file.Path, kotlin.Boolean)kotlin.io.path/java.nio.file.-path/copy-to.html +$dokka.location:kotlin.io.path$createDirectories(java.nio.file.Path, kotlin.Array((java.nio.file.attribute.FileAttribute((kotlin.Any)))))kotlin.io.path/java.nio.file.-path/create-directories.html +$dokka.location:kotlin.io.path$createDirectory(java.nio.file.Path, kotlin.Array((java.nio.file.attribute.FileAttribute((kotlin.Any)))))kotlin.io.path/java.nio.file.-path/create-directory.html +$dokka.location:kotlin.io.path$createFile(java.nio.file.Path, kotlin.Array((java.nio.file.attribute.FileAttribute((kotlin.Any)))))kotlin.io.path/java.nio.file.-path/create-file.html +$dokka.location:kotlin.io.path$createLinkPointingTo(java.nio.file.Path, java.nio.file.Path)kotlin.io.path/java.nio.file.-path/create-link-pointing-to.html +$dokka.location:kotlin.io.path$createSymbolicLinkPointingTo(java.nio.file.Path, java.nio.file.Path, kotlin.Array((java.nio.file.attribute.FileAttribute((kotlin.Any)))))kotlin.io.path/java.nio.file.-path/create-symbolic-link-pointing-to.html +$dokka.location:kotlin.io.path$deleteExisting(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/delete-existing.html +$dokka.location:kotlin.io.path$deleteIfExists(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/delete-if-exists.html +$dokka.location:kotlin.io.path$div(java.nio.file.Path, java.nio.file.Path)kotlin.io.path/java.nio.file.-path/div.html +$dokka.location:kotlin.io.path$div(java.nio.file.Path, kotlin.String)kotlin.io.path/java.nio.file.-path/div.html +$dokka.location:kotlin.io.path$exists(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/exists.html +$dokka.location:kotlin.io.path$extension#java.nio.file.Pathkotlin.io.path/java.nio.file.-path/extension.html +$dokka.location:kotlin.io.path$fileAttributesView(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/file-attributes-view.html +$dokka.location:kotlin.io.path$fileAttributesViewOrNull(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/file-attributes-view-or-null.html +$dokka.location:kotlin.io.path$fileSize(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/file-size.html +$dokka.location:kotlin.io.path$fileStore(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/file-store.html +$dokka.location:kotlin.io.path$forEachDirectoryEntry(java.nio.file.Path, kotlin.String, kotlin.Function1((java.nio.file.Path, kotlin.Unit)))kotlin.io.path/java.nio.file.-path/for-each-directory-entry.html +$dokka.location:kotlin.io.path$forEachLine(java.nio.file.Path, java.nio.charset.Charset, kotlin.Function1((kotlin.String, kotlin.Unit)))kotlin.io.path/java.nio.file.-path/for-each-line.html +$dokka.location:kotlin.io.path$getAttribute(java.nio.file.Path, kotlin.String, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/get-attribute.html +$dokka.location:kotlin.io.path$getLastModifiedTime(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/get-last-modified-time.html +$dokka.location:kotlin.io.path$getOwner(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/get-owner.html +$dokka.location:kotlin.io.path$getPosixFilePermissions(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/get-posix-file-permissions.html +$dokka.location:kotlin.io.path$inputStream(java.nio.file.Path, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/input-stream.html +$dokka.location:kotlin.io.path$invariantSeparatorsPath#java.nio.file.Pathkotlin.io.path/java.nio.file.-path/invariant-separators-path.html +$dokka.location:kotlin.io.path$invariantSeparatorsPathString#java.nio.file.Pathkotlin.io.path/java.nio.file.-path/invariant-separators-path-string.html +$dokka.location:kotlin.io.path$isDirectory(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/is-directory.html +$dokka.location:kotlin.io.path$isExecutable(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/is-executable.html +$dokka.location:kotlin.io.path$isHidden(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/is-hidden.html +$dokka.location:kotlin.io.path$isReadable(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/is-readable.html +$dokka.location:kotlin.io.path$isRegularFile(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/is-regular-file.html +$dokka.location:kotlin.io.path$isSameFileAs(java.nio.file.Path, java.nio.file.Path)kotlin.io.path/java.nio.file.-path/is-same-file-as.html +$dokka.location:kotlin.io.path$isSymbolicLink(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/is-symbolic-link.html +$dokka.location:kotlin.io.path$isWritable(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/is-writable.html +$dokka.location:kotlin.io.path$listDirectoryEntries(java.nio.file.Path, kotlin.String)kotlin.io.path/java.nio.file.-path/list-directory-entries.html +$dokka.location:kotlin.io.path$moveTo(java.nio.file.Path, java.nio.file.Path, kotlin.Array((java.nio.file.CopyOption)))kotlin.io.path/java.nio.file.-path/move-to.html +$dokka.location:kotlin.io.path$moveTo(java.nio.file.Path, java.nio.file.Path, kotlin.Boolean)kotlin.io.path/java.nio.file.-path/move-to.html +$dokka.location:kotlin.io.path$name#java.nio.file.Pathkotlin.io.path/java.nio.file.-path/name.html +$dokka.location:kotlin.io.path$nameWithoutExtension#java.nio.file.Pathkotlin.io.path/java.nio.file.-path/name-without-extension.html +$dokka.location:kotlin.io.path$notExists(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/not-exists.html +$dokka.location:kotlin.io.path$outputStream(java.nio.file.Path, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/output-stream.html +$dokka.location:kotlin.io.path$pathString#java.nio.file.Pathkotlin.io.path/java.nio.file.-path/path-string.html +$dokka.location:kotlin.io.path$readAttributes(java.nio.file.Path, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/read-attributes.html +$dokka.location:kotlin.io.path$readAttributes(java.nio.file.Path, kotlin.String, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/read-attributes.html +$dokka.location:kotlin.io.path$readBytes(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/read-bytes.html +$dokka.location:kotlin.io.path$readLines(java.nio.file.Path, java.nio.charset.Charset)kotlin.io.path/java.nio.file.-path/read-lines.html +$dokka.location:kotlin.io.path$readSymbolicLink(java.nio.file.Path)kotlin.io.path/java.nio.file.-path/read-symbolic-link.html +$dokka.location:kotlin.io.path$readText(java.nio.file.Path, java.nio.charset.Charset)kotlin.io.path/java.nio.file.-path/read-text.html +$dokka.location:kotlin.io.path$reader(java.nio.file.Path, java.nio.charset.Charset, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/reader.html +$dokka.location:kotlin.io.path$relativeTo(java.nio.file.Path, java.nio.file.Path)kotlin.io.path/java.nio.file.-path/relative-to.html +$dokka.location:kotlin.io.path$relativeToOrNull(java.nio.file.Path, java.nio.file.Path)kotlin.io.path/java.nio.file.-path/relative-to-or-null.html +$dokka.location:kotlin.io.path$relativeToOrSelf(java.nio.file.Path, java.nio.file.Path)kotlin.io.path/java.nio.file.-path/relative-to-or-self.html +$dokka.location:kotlin.io.path$setAttribute(java.nio.file.Path, kotlin.String, kotlin.Any?, kotlin.Array((java.nio.file.LinkOption)))kotlin.io.path/java.nio.file.-path/set-attribute.html +$dokka.location:kotlin.io.path$setLastModifiedTime(java.nio.file.Path, java.nio.file.attribute.FileTime)kotlin.io.path/java.nio.file.-path/set-last-modified-time.html +$dokka.location:kotlin.io.path$setOwner(java.nio.file.Path, java.nio.file.attribute.UserPrincipal)kotlin.io.path/java.nio.file.-path/set-owner.html +$dokka.location:kotlin.io.path$setPosixFilePermissions(java.nio.file.Path, kotlin.collections.Set((java.nio.file.attribute.PosixFilePermission)))kotlin.io.path/java.nio.file.-path/set-posix-file-permissions.html +$dokka.location:kotlin.io.path$toPath(java.net.URI)kotlin.io.path/java.net.-u-r-i/to-path.html +$dokka.location:kotlin.io.path$useDirectoryEntries(java.nio.file.Path, kotlin.String, kotlin.Function1((kotlin.sequences.Sequence((java.nio.file.Path)), kotlin.io.path.useDirectoryEntries.T)))kotlin.io.path/java.nio.file.-path/use-directory-entries.html +$dokka.location:kotlin.io.path$useLines(java.nio.file.Path, java.nio.charset.Charset, kotlin.Function1((kotlin.sequences.Sequence((kotlin.String)), kotlin.io.path.useLines.T)))kotlin.io.path/java.nio.file.-path/use-lines.html +$dokka.location:kotlin.io.path$writeBytes(java.nio.file.Path, kotlin.ByteArray, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/write-bytes.html +$dokka.location:kotlin.io.path$writeLines(java.nio.file.Path, kotlin.collections.Iterable((kotlin.CharSequence)), java.nio.charset.Charset, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/write-lines.html +$dokka.location:kotlin.io.path$writeLines(java.nio.file.Path, kotlin.sequences.Sequence((kotlin.CharSequence)), java.nio.charset.Charset, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/write-lines.html +$dokka.location:kotlin.io.path$writeText(java.nio.file.Path, kotlin.CharSequence, java.nio.charset.Charset, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/write-text.html +$dokka.location:kotlin.io.path$writer(java.nio.file.Path, java.nio.charset.Charset, kotlin.Array((java.nio.file.OpenOption)))kotlin.io.path/java.nio.file.-path/writer.html +$dokka.location:kotlin.jvm$kotlin#java.lang.Class((kotlin.jvm.kotlin.T))kotlin.jvm/java.lang.-class/kotlin.html +$dokka.location:kotlin.jvm.optionals$asSequence(java.util.Optional((kotlin.jvm.optionals.asSequence.T)))kotlin.jvm.optionals/java.util.-optional/as-sequence.html +$dokka.location:kotlin.jvm.optionals$getOrNull(java.util.Optional((kotlin.jvm.optionals.getOrNull.T)))kotlin.jvm.optionals/java.util.-optional/get-or-null.html +$dokka.location:kotlin.jvm.optionals$toCollection(java.util.Optional((kotlin.jvm.optionals.toCollection.T)), kotlin.jvm.optionals.toCollection.C)kotlin.jvm.optionals/java.util.-optional/to-collection.html +$dokka.location:kotlin.jvm.optionals$toList(java.util.Optional((kotlin.jvm.optionals.toList.T)))kotlin.jvm.optionals/java.util.-optional/to-list.html +$dokka.location:kotlin.jvm.optionals$toSet(java.util.Optional((kotlin.jvm.optionals.toSet.T)))kotlin.jvm.optionals/java.util.-optional/to-set.html +$dokka.location:kotlin.random$asKotlinRandom(java.util.Random)kotlin.random/java.util.-random/as-kotlin-random.html +$dokka.location:kotlin.reflect.KAnnotatedElementkotlin.reflect/-k-annotated-element/index.html +$dokka.location:kotlin.reflect.KDeclarationContainerkotlin.reflect/-k-declaration-container/index.html +$dokka.location:kotlin.reflect.KFunctionkotlin.reflect/-k-function/index.html +$dokka.location:kotlin.reflect.KMutablePropertykotlin.reflect/-k-mutable-property/index.html +$dokka.location:kotlin.reflect.KPropertykotlin.reflect/-k-property/index.html +$dokka.location:kotlin.reflect.jvm$kotlinFunction#java.lang.reflect.Constructor((kotlin.reflect.jvm.kotlinFunction.T))kotlin.reflect.jvm/java.lang.reflect.-constructor/kotlin-function.html +$dokka.location:kotlin.reflect.jvm$kotlinFunction#java.lang.reflect.Methodkotlin.reflect.jvm/java.lang.reflect.-method/kotlin-function.html +$dokka.location:kotlin.reflect.jvm$kotlinProperty#java.lang.reflect.Fieldkotlin.reflect.jvm/java.lang.reflect.-field/kotlin-property.html +$dokka.location:kotlin.sequences$asSequence(java.util.Enumeration((kotlin.sequences.asSequence.T)))kotlin.sequences/java.util.-enumeration/as-sequence.html +$dokka.location:kotlin.streams$asSequence(java.util.stream.DoubleStream)kotlin.streams/java.util.stream.-double-stream/as-sequence.html +$dokka.location:kotlin.streams$asSequence(java.util.stream.IntStream)kotlin.streams/java.util.stream.-int-stream/as-sequence.html +$dokka.location:kotlin.streams$asSequence(java.util.stream.LongStream)kotlin.streams/java.util.stream.-long-stream/as-sequence.html +$dokka.location:kotlin.streams$asSequence(java.util.stream.Stream((kotlin.streams.asSequence.T)))kotlin.streams/java.util.stream.-stream/as-sequence.html +$dokka.location:kotlin.streams$asStream(kotlin.sequences.Sequence((kotlin.streams.asStream.T)))kotlin.streams/kotlin.sequences.-sequence/as-stream.html +$dokka.location:kotlin.streams$toList(java.util.stream.DoubleStream)kotlin.streams/java.util.stream.-double-stream/to-list.html +$dokka.location:kotlin.streams$toList(java.util.stream.IntStream)kotlin.streams/java.util.stream.-int-stream/to-list.html +$dokka.location:kotlin.streams$toList(java.util.stream.LongStream)kotlin.streams/java.util.stream.-long-stream/to-list.html +$dokka.location:kotlin.streams$toList(java.util.stream.Stream((kotlin.streams.toList.T)))kotlin.streams/java.util.stream.-stream/to-list.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, java.lang.StringBuffer?)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, java.lang.StringBuilder?)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, kotlin.Byte)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, kotlin.Double)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, kotlin.Float)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, kotlin.Int)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, kotlin.Long)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendLine(java.lang.StringBuilder, kotlin.Short)kotlin.text/java.lang.-string-builder/append-line.html +$dokka.location:kotlin.text$appendRange(java.lang.StringBuilder, kotlin.CharArray, kotlin.Int, kotlin.Int)kotlin.text/java.lang.-string-builder/append-range.html +$dokka.location:kotlin.text$appendRange(java.lang.StringBuilder, kotlin.CharSequence, kotlin.Int, kotlin.Int)kotlin.text/java.lang.-string-builder/append-range.html +$dokka.location:kotlin.text$appendln(java.lang.Appendable)kotlin.text/java.lang.-appendable/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.Appendable, kotlin.Char)kotlin.text/java.lang.-appendable/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.Appendable, kotlin.CharSequence?)kotlin.text/java.lang.-appendable/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, java.lang.StringBuffer?)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, java.lang.StringBuilder?)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Any?)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Boolean)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Byte)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Char)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.CharArray)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.CharSequence?)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Double)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Float)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Int)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Long)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.Short)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$appendln(java.lang.StringBuilder, kotlin.String?)kotlin.text/java.lang.-string-builder/appendln.html +$dokka.location:kotlin.text$clear(java.lang.StringBuilder)kotlin.text/java.lang.-string-builder/clear.html +$dokka.location:kotlin.text$deleteAt(java.lang.StringBuilder, kotlin.Int)kotlin.text/java.lang.-string-builder/delete-at.html +$dokka.location:kotlin.text$deleteRange(java.lang.StringBuilder, kotlin.Int, kotlin.Int)kotlin.text/java.lang.-string-builder/delete-range.html +$dokka.location:kotlin.text$insertRange(java.lang.StringBuilder, kotlin.Int, kotlin.CharArray, kotlin.Int, kotlin.Int)kotlin.text/java.lang.-string-builder/insert-range.html +$dokka.location:kotlin.text$insertRange(java.lang.StringBuilder, kotlin.Int, kotlin.CharSequence, kotlin.Int, kotlin.Int)kotlin.text/java.lang.-string-builder/insert-range.html +$dokka.location:kotlin.text$set(java.lang.StringBuilder, kotlin.Int, kotlin.Char)kotlin.text/java.lang.-string-builder/set.html +$dokka.location:kotlin.text$setRange(java.lang.StringBuilder, kotlin.Int, kotlin.Int, kotlin.String)kotlin.text/java.lang.-string-builder/set-range.html +$dokka.location:kotlin.text$toCharArray(java.lang.StringBuilder, kotlin.CharArray, kotlin.Int, kotlin.Int, kotlin.Int)kotlin.text/java.lang.-string-builder/to-char-array.html +$dokka.location:kotlin.text$toRegex(java.util.regex.Pattern)kotlin.text/java.util.regex.-pattern/to-regex.html +$dokka.location:kotlin.text.Appendablekotlin.text/-appendable/index.html +$dokka.location:kotlin.text.CharacterCodingExceptionkotlin.text/-character-coding-exception/index.html +$dokka.location:kotlin.text.StringBuilderkotlin.text/-string-builder/index.html +$dokka.location:kotlin.time$toDurationUnit(java.util.concurrent.TimeUnit)kotlin.time/java.util.concurrent.-time-unit/to-duration-unit.html +$dokka.location:kotlin.time$toKotlinDuration(java.time.Duration)kotlin.time/java.time.-duration/to-kotlin-duration.html +kotlin +kotlin.annotation +kotlin.browser +kotlin.collections +kotlin.comparisons +kotlin.concurrent +kotlin.contracts +kotlin.coroutines +kotlin.coroutines.cancellation +kotlin.coroutines.intrinsics +kotlin.dom +kotlin.experimental +kotlin.io +kotlin.io.path +kotlin.js +kotlin.jvm +kotlin.jvm.optionals +kotlin.math +kotlin.native +kotlin.native.concurrent +kotlin.native.ref +kotlin.properties +kotlin.random +kotlin.ranges +kotlin.reflect +kotlin.reflect.full +kotlin.reflect.jvm +kotlin.sequences +kotlin.streams +kotlin.system +kotlin.text +kotlin.time +kotlinx.browser +kotlinx.cinterop +kotlinx.cinterop.internal +kotlinx.dom +kotlinx.wasm.jsinterop +org.khronos.webgl +org.w3c.css.masking +org.w3c.dom +org.w3c.dom.clipboard +org.w3c.dom.css +org.w3c.dom.encryptedmedia +org.w3c.dom.events +org.w3c.dom.mediacapture +org.w3c.dom.mediasource +org.w3c.dom.parsing +org.w3c.dom.pointerevents +org.w3c.dom.svg +org.w3c.dom.url +org.w3c.fetch +org.w3c.files +org.w3c.notifications +org.w3c.performance +org.w3c.workers +org.w3c.xhr