diff options
| author | Błażej Kardyś <bkardys@virtuslab.com> | 2020-11-20 17:23:10 +0100 |
|---|---|---|
| committer | Błażej Kardyś <bkardys@virtuslab.com> | 2020-11-27 03:15:02 +0100 |
| commit | 3cb4702a68139788de6e1f7b087ced345f2b71ba (patch) | |
| tree | a383471c9915ae4aaff078b4f3b81bb99a4fde35 /plugins | |
| parent | 076a5f421c5e4621539efd814be612f43fef33f5 (diff) | |
| download | dokka-3cb4702a68139788de6e1f7b087ced345f2b71ba.tar.gz dokka-3cb4702a68139788de6e1f7b087ced345f2b71ba.tar.bz2 dokka-3cb4702a68139788de6e1f7b087ced345f2b71ba.zip | |
Changing how multimodule location provider works and improving gfm link substitution
Diffstat (limited to 'plugins')
39 files changed, 312 insertions, 265 deletions
diff --git a/plugins/all-module-page/src/main/kotlin/MultimoduleLocationProvider.kt b/plugins/all-module-page/src/main/kotlin/MultimoduleLocationProvider.kt deleted file mode 100644 index cb1eca7b..00000000 --- a/plugins/all-module-page/src/main/kotlin/MultimoduleLocationProvider.kt +++ /dev/null @@ -1,40 +0,0 @@ -package org.jetbrains.dokka.allModulesPage - -import org.jetbrains.dokka.base.resolvers.local.DokkaBaseLocationProvider -import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider -import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider.Companion.identifierToFilename -import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.model.DisplaySourceSet -import org.jetbrains.dokka.pages.PageNode -import org.jetbrains.dokka.pages.RootPageNode -import org.jetbrains.dokka.plugability.DokkaContext - -open class MultimoduleLocationProvider(private val root: RootPageNode, val context: DokkaContext, private val fileExtension: String = ".html") : DokkaBaseLocationProvider(root, context, fileExtension) { - - protected open val defaultLocationProvider = DokkaLocationProvider(root, context) - val paths = context.configuration.modules.map { - it.name to it.relativePathToOutputDirectory - }.toMap() - - override fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode?) = - dri.takeIf { it.packageName == MULTIMODULE_PACKAGE_PLACEHOLDER }?.classNames?.let { paths[it] }?.let { - "$it/${identifierToFilename(dri.classNames.orEmpty())}/index$fileExtension" - } ?: defaultLocationProvider.resolve(dri, sourceSets, context) - - override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean) = - defaultLocationProvider.resolve(node, context, skipExtension) - - override fun pathToRoot(from: PageNode): String = defaultLocationProvider.pathToRoot(from) - - override fun ancestors(node: PageNode): List<PageNode> = listOf(root) - - companion object { - const val MULTIMODULE_PACKAGE_PLACEHOLDER = ".ext" - } - - class Factory(private val context: DokkaContext): LocationProviderFactory { - override fun getLocationProvider(pageNode: RootPageNode) = - MultimoduleLocationProvider(pageNode, context) - } -} diff --git a/plugins/all-module-page/src/main/kotlin/templates/ExternalModuleLinkResolver.kt b/plugins/all-module-page/src/main/kotlin/templates/ExternalModuleLinkResolver.kt deleted file mode 100644 index 5a3d3d33..00000000 --- a/plugins/all-module-page/src/main/kotlin/templates/ExternalModuleLinkResolver.kt +++ /dev/null @@ -1,49 +0,0 @@ -package org.jetbrains.dokka.allModulesPage.templates - -import org.jetbrains.dokka.base.DokkaBase -import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation -import org.jetbrains.dokka.base.resolvers.shared.PackageList -import org.jetbrains.dokka.links.DRI -import org.jetbrains.dokka.plugability.DokkaContext -import org.jetbrains.dokka.plugability.plugin -import org.jetbrains.dokka.plugability.query -import java.net.URL -import java.io.File - -class ExternalModuleLinkResolver(val context: DokkaContext) { - private val elpFactory = context.plugin<DokkaBase>().query { externalLocationProviderFactory } - private val externalDocumentations by lazy(::setupExternalDocumentations) - private val elps by lazy { - elpFactory.flatMap { externalDocumentations.map { ed -> it.getExternalLocationProvider(ed) } }.filterNotNull() - } - - private fun setupExternalDocumentations(): List<ExternalDocumentation> { - val packageLists = - context.configuration.modules.map { it.sourceOutputDirectory.resolve(it.relativePathToOutputDirectory) } - .map { module -> - module to PackageList.load( - URL("file:" + module.resolve("package-list").path), - 8, - true - ) - }.toMap() - return packageLists.map { (module, pckgList) -> - ExternalDocumentation( - URL("file:/${module.name}/${module.name}"), - pckgList!! - ) - } - } - - fun resolve(dri: DRI, fileContext: File): String? { - val absoluteLink = elps.mapNotNull { it.resolve(dri) }.firstOrNull() ?: return null - val modulePath = context.configuration.outputDir.absolutePath.split(File.separator) - val contextPath = fileContext.absolutePath.split(File.separator) - val commonPathElements = modulePath.zip(contextPath) - .takeWhile { (a, b) -> a == b }.count() - - return (List(contextPath.size - commonPathElements - 1) { ".." } + modulePath.drop(commonPathElements)).joinToString( - "/" - ) + absoluteLink.removePrefix("file:") - } -}
\ No newline at end of file diff --git a/plugins/all-module-page/build.gradle.kts b/plugins/all-modules-page/build.gradle.kts index a0c5a5ed..a0c5a5ed 100644 --- a/plugins/all-module-page/build.gradle.kts +++ b/plugins/all-modules-page/build.gradle.kts diff --git a/plugins/all-module-page/src/main/kotlin/AllModulesPageGeneration.kt b/plugins/all-modules-page/src/main/kotlin/AllModulesPageGeneration.kt index 1ba63627..5ac854b4 100644 --- a/plugins/all-module-page/src/main/kotlin/AllModulesPageGeneration.kt +++ b/plugins/all-modules-page/src/main/kotlin/AllModulesPageGeneration.kt @@ -11,9 +11,11 @@ import org.jetbrains.dokka.plugability.querySingle class AllModulesPageGeneration(private val context: DokkaContext) : Generation { + private val allModulesPagePlugin by lazy { context.plugin<AllModulesPagePlugin>() } + override fun Timer.generate() { report("Creating all modules page") - val pages = createAllModulePage() + val pages = createAllModulesPage() report("Transforming pages") val transformedPages = transformAllModulesPage(pages) @@ -22,19 +24,20 @@ class AllModulesPageGeneration(private val context: DokkaContext) : Generation { render(transformedPages) report("Processing submodules") - allModulesPagePlugin().querySingle { templateProcessor }.process() + processSubmodules() } override val generationName = "index page for project" - fun createAllModulePage() = allModulesPagePlugin().querySingle { allModulePageCreator }.invoke() + fun createAllModulesPage() = allModulesPagePlugin.querySingle { allModulesPageCreator }.invoke() fun transformAllModulesPage(pages: RootPageNode) = - allModulesPagePlugin().query { allModulePageTransformer }.fold(pages) { acc, t -> t(acc) } + allModulesPagePlugin.query { allModulesPageTransformer }.fold(pages) { acc, t -> t(acc) } fun render(transformedPages: RootPageNode) { context.single(CoreExtensions.renderer).render(transformedPages) } - private fun allModulesPagePlugin() = context.plugin<AllModulesPagePlugin>() + fun processSubmodules() = + allModulesPagePlugin.querySingle { templateProcessor }.process() }
\ No newline at end of file diff --git a/plugins/all-module-page/src/main/kotlin/AllModulesPagePlugin.kt b/plugins/all-modules-page/src/main/kotlin/AllModulesPagePlugin.kt index bcc43043..95a94cf4 100644 --- a/plugins/all-module-page/src/main/kotlin/AllModulesPagePlugin.kt +++ b/plugins/all-modules-page/src/main/kotlin/AllModulesPagePlugin.kt @@ -3,6 +3,8 @@ package org.jetbrains.dokka.allModulesPage import org.jetbrains.dokka.CoreExtensions import org.jetbrains.dokka.allModulesPage.templates.* import org.jetbrains.dokka.base.DokkaBase +import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProviderFactory +import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory import org.jetbrains.dokka.plugability.DokkaPlugin import org.jetbrains.dokka.transformers.pages.PageCreator import org.jetbrains.dokka.transformers.pages.PageTransformer @@ -11,20 +13,25 @@ class AllModulesPagePlugin : DokkaPlugin() { val templateProcessor by extensionPoint<TemplateProcessor>() val templateProcessingStrategy by extensionPoint<TemplateProcessingStrategy>() - val allModulePageCreator by extensionPoint<PageCreator>() - val allModulePageTransformer by extensionPoint<PageTransformer>() + val partialLocationProviderFactory by extensionPoint<LocationProviderFactory>() + val allModulesPageCreator by extensionPoint<PageCreator>() + val allModulesPageTransformer by extensionPoint<PageTransformer>() + val externalModuleLinkResolver by extensionPoint<ExternalModuleLinkResolver>() val substitutor by extensionPoint<Substitutor>() - val allModulePageCreators by extending { - allModulePageCreator providing ::MultimodulePageCreator + val allModulesPageCreators by extending { + allModulesPageCreator providing ::MultimodulePageCreator } val multimoduleLocationProvider by extending { (plugin<DokkaBase>().locationProviderFactory providing MultimoduleLocationProvider::Factory - override plugin<DokkaBase>().locationProvider - applyIf { modules.size > 1 }) + override plugin<DokkaBase>().locationProvider) + } + + val baseLocationProviderFactory by extending { + partialLocationProviderFactory providing ::DokkaLocationProviderFactory } val allModulesPageGeneration by extending { @@ -50,4 +57,8 @@ class AllModulesPagePlugin : DokkaPlugin() { val pathToRootSubstitutor by extending { substitutor providing ::PathToRootSubstitutor } + + val multiModuleLinkResolver by extending { + externalModuleLinkResolver providing ::DefaultExternalModuleLinkResolver + } }
\ No newline at end of file diff --git a/plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt b/plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt new file mode 100644 index 00000000..1dbbd386 --- /dev/null +++ b/plugins/all-modules-page/src/main/kotlin/MultimoduleLocationProvider.kt @@ -0,0 +1,36 @@ +package org.jetbrains.dokka.allModulesPage + +import org.jetbrains.dokka.allModulesPage.MultimodulePageCreator.Companion.MULTIMODULE_PACKAGE_PLACEHOLDER +import org.jetbrains.dokka.base.DokkaBase +import org.jetbrains.dokka.base.resolvers.local.DokkaBaseLocationProvider +import org.jetbrains.dokka.base.resolvers.local.LocationProviderFactory +import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.model.DisplaySourceSet +import org.jetbrains.dokka.pages.PageNode +import org.jetbrains.dokka.pages.RootPageNode +import org.jetbrains.dokka.plugability.DokkaContext +import org.jetbrains.dokka.plugability.plugin +import org.jetbrains.dokka.plugability.querySingle + +open class MultimoduleLocationProvider(private val root: RootPageNode, dokkaContext: DokkaContext) : DokkaBaseLocationProvider(root, dokkaContext) { + + private val defaultLocationProvider = dokkaContext.plugin<AllModulesPagePlugin>().querySingle { partialLocationProviderFactory }.getLocationProvider(root) + private val externalModuleLinkResolver = dokkaContext.plugin<AllModulesPagePlugin>().querySingle { externalModuleLinkResolver } + + override fun resolve(dri: DRI, sourceSets: Set<DisplaySourceSet>, context: PageNode?) = + if (dri == MultimodulePageCreator.MULTIMODULE_ROOT_DRI) pathToRoot(root) + else dri.takeIf { it.packageName == MULTIMODULE_PACKAGE_PLACEHOLDER }?.classNames + ?.let(externalModuleLinkResolver::resolveLinkToModuleIndex) + + override fun resolve(node: PageNode, context: PageNode?, skipExtension: Boolean) = + defaultLocationProvider.resolve(node, context, skipExtension) + + override fun pathToRoot(from: PageNode): String = defaultLocationProvider.pathToRoot(from) + + override fun ancestors(node: PageNode): List<PageNode> = listOf(root) + + class Factory(private val context: DokkaContext) : LocationProviderFactory { + override fun getLocationProvider(pageNode: RootPageNode) = + MultimoduleLocationProvider(pageNode, context) + } +} diff --git a/plugins/all-module-page/src/main/kotlin/MultimodulePageCreator.kt b/plugins/all-modules-page/src/main/kotlin/MultimodulePageCreator.kt index 123dee2b..7f441aa1 100644 --- a/plugins/all-module-page/src/main/kotlin/MultimodulePageCreator.kt +++ b/plugins/all-modules-page/src/main/kotlin/MultimodulePageCreator.kt @@ -2,7 +2,6 @@ package org.jetbrains.dokka.allModulesPage import org.jetbrains.dokka.DokkaConfiguration.DokkaModuleDescription import org.jetbrains.dokka.DokkaConfiguration.DokkaSourceSet -import org.jetbrains.dokka.allModulesPage.MultimoduleLocationProvider.Companion.MULTIMODULE_PACKAGE_PLACEHOLDER import org.jetbrains.dokka.base.DokkaBase import org.jetbrains.dokka.base.parsers.moduleAndPackage.ModuleAndPackageDocumentation.Classifier.Module import org.jetbrains.dokka.base.parsers.moduleAndPackage.ModuleAndPackageDocumentationParsingContext @@ -62,7 +61,7 @@ class MultimodulePageCreator( } } return MultimoduleRootPageNode( - setOf(DRI(packageName = MULTIMODULE_PACKAGE_PLACEHOLDER, classNames = "allModules")), + setOf(MULTIMODULE_ROOT_DRI), contentNode ) } @@ -94,4 +93,9 @@ class MultimodulePageCreator( return if (firstChildParagraph == null && this is P) this else firstChildParagraph } + + companion object { + const val MULTIMODULE_PACKAGE_PLACEHOLDER = ".ext" + val MULTIMODULE_ROOT_DRI = DRI(packageName = MULTIMODULE_PACKAGE_PLACEHOLDER, classNames = "allModules") + } } diff --git a/plugins/all-module-page/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt b/plugins/all-modules-page/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt index feba2d4e..2b065731 100644 --- a/plugins/all-module-page/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt +++ b/plugins/all-modules-page/src/main/kotlin/templates/DirectiveBasedTemplateProcessing.kt @@ -9,6 +9,7 @@ import org.jetbrains.dokka.base.templating.* import org.jetbrains.dokka.plugability.DokkaContext import org.jetbrains.dokka.plugability.plugin import org.jetbrains.dokka.plugability.query +import org.jetbrains.dokka.plugability.querySingle import org.jsoup.Jsoup import org.jsoup.nodes.* import org.jsoup.parser.Tag @@ -20,7 +21,7 @@ class DirectiveBasedHtmlTemplateProcessingStrategy(private val context: DokkaCon private val navigationFragments = ConcurrentHashMap<String, Element>() private val substitutors = context.plugin<AllModulesPagePlugin>().query { substitutor } - private val externalModuleLinkResolver = ExternalModuleLinkResolver(context) + private val externalModuleLinkResolver = context.plugin<AllModulesPagePlugin>().querySingle { externalModuleLinkResolver } override suspend fun process(input: File, output: File): Boolean = coroutineScope { if (input.extension == "html") { @@ -78,35 +79,37 @@ class DirectiveBasedHtmlTemplateProcessingStrategy(private val context: DokkaCon substitutors.asSequence().mapNotNull { it.trySubstitute(commandContext, match) }.firstOrNull() ?: match.value override suspend fun finish(output: File) { - val attributes = Attributes().apply { - put("class", "sideMenu") - } - val node = Element(Tag.valueOf("div"), "", attributes) - navigationFragments.entries.sortedBy { it.key }.forEach { (moduleName, command) -> - command.select("a").forEach { a -> - a.attr("href")?.also { a.attr("href", "${moduleName}/${it}") } + if (navigationFragments.isNotEmpty()) { + val attributes = Attributes().apply { + put("class", "sideMenu") } - command.childNodes().toList().forEachIndexed { index, child -> - if (index == 0) { - child.attr("id", "$moduleName-nav-submenu") + val node = Element(Tag.valueOf("div"), "", attributes) + navigationFragments.entries.sortedBy { it.key }.forEach { (moduleName, command) -> + command.select("a").forEach { a -> + a.attr("href")?.also { a.attr("href", "${moduleName}/${it}") } + } + command.childNodes().toList().forEachIndexed { index, child -> + if (index == 0) { + child.attr("id", "$moduleName-nav-submenu") + } + node.appendChild(child) } - node.appendChild(child) } - } - withContext(IO) { - Files.write(output.resolve("navigation.html").toPath(), listOf(node.outerHtml())) - } - - node.select("a").forEach { a -> - a.attr("href")?.also { a.attr("href", "../${it}") } - } - navigationFragments.keys.forEach { withContext(IO) { - Files.write( - output.resolve(it).resolve("navigation.html").toPath(), - listOf(node.outerHtml()) - ) + Files.write(output.resolve("navigation.html").toPath(), listOf(node.outerHtml())) + } + + node.select("a").forEach { a -> + a.attr("href")?.also { a.attr("href", "../${it}") } + } + navigationFragments.keys.forEach { + withContext(IO) { + Files.write( + output.resolve(it).resolve("navigation.html").toPath(), + listOf(node.outerHtml()) + ) + } } } } @@ -127,7 +130,7 @@ class DirectiveBasedHtmlTemplateProcessingStrategy(private val context: DokkaCon } val attributes = Attributes().apply { - put("href", link) // TODO: resolve + put("href", link) } val children = it.childNodes().toList() val element = Element(Tag.valueOf("a"), "", attributes).apply { diff --git a/plugins/all-modules-page/src/main/kotlin/templates/ExternalModuleLinkResolver.kt b/plugins/all-modules-page/src/main/kotlin/templates/ExternalModuleLinkResolver.kt new file mode 100644 index 00000000..d0e787b6 --- /dev/null +++ b/plugins/all-modules-page/src/main/kotlin/templates/ExternalModuleLinkResolver.kt @@ -0,0 +1,77 @@ +package org.jetbrains.dokka.allModulesPage.templates + +import org.jetbrains.dokka.DokkaConfiguration +import org.jetbrains.dokka.base.DokkaBase +import org.jetbrains.dokka.base.resolvers.local.DokkaLocationProvider.Companion.identifierToFilename +import org.jetbrains.dokka.base.resolvers.shared.ExternalDocumentation +import org.jetbrains.dokka.base.resolvers.shared.PackageList +import org.jetbrains.dokka.base.resolvers.shared.RecognizedLinkFormat +import org.jetbrains.dokka.links.DRI +import org.jetbrains.dokka.plugability.DokkaContext +import org.jetbrains.dokka.plugability.plugin +import org.jetbrains.dokka.plugability.query +import java.io.File +import java.net.URL + +interface ExternalModuleLinkResolver { + fun resolve(dri: DRI, fileContext: File): String? + fun resolveLinkToModuleIndex(moduleName: String): String? +} + +class DefaultExternalModuleLinkResolver(val context: DokkaContext) : ExternalModuleLinkResolver { + private val elpFactory = context.plugin<DokkaBase>().query { externalLocationProviderFactory } + private val externalDocumentations by lazy(::setupExternalDocumentations) + private val elps by lazy { + elpFactory.flatMap { externalDocumentations.map { ed -> it.getExternalLocationProvider(ed) } }.filterNotNull() + } + + private fun setupExternalDocumentations(): List<ExternalDocumentation> { + val packageLists = + context.configuration.modules.map(::loadPackageListForModule).toMap() + return packageLists.mapNotNull { (module, packageList) -> + packageList?.let { + ExternalDocumentation( + URL("file:/${module.name}/${module.name}"), + packageList + ) + } + } + } + + private fun loadPackageListForModule(module: DokkaConfiguration.DokkaModuleDescription) = + module.sourceOutputDirectory.resolve(File(identifierToFilename(module.name))).let { + it to PackageList.load( + URL("file:" + it.resolve("package-list").path), + 8, + true + ) + } + + override fun resolve(dri: DRI, fileContext: File): String? { + val absoluteLink = elps.mapNotNull { it.resolve(dri) }.firstOrNull() ?: return null + val modulePath = context.configuration.outputDir.absolutePath.split(File.separator) + val contextPath = fileContext.absolutePath.split(File.separator) + val commonPathElements = modulePath.zip(contextPath) + .takeWhile { (a, b) -> a == b }.count() + + return (List(contextPath.size - commonPathElements - 1) { ".." } + modulePath.drop(commonPathElements)).joinToString( + "/" + ) + absoluteLink.removePrefix("file:") + } + + override fun resolveLinkToModuleIndex(moduleName: String): String? = + context.configuration.modules.firstOrNull { it.name == moduleName } + ?.let { module -> + val (_, packageList) = loadPackageListForModule(module) + val extension = when (packageList?.linkFormat) { + RecognizedLinkFormat.KotlinWebsiteHtml, + RecognizedLinkFormat.DokkaOldHtml, + RecognizedLinkFormat.DokkaHtml -> ".html" + RecognizedLinkFormat.DokkaGFM, + RecognizedLinkFormat.DokkaJekyll -> ".md" + else -> "" + } + "${module.relativePathToOutputDirectory}/${identifierToFilename(moduleName)}/index$extension" + } + +} diff --git a/plugins/all-module-page/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt b/plugins/all-modules-page/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt index 9b5251ac..9b5251ac 100644 --- a/plugins/all-module-page/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt +++ b/plugins/all-modules-page/src/main/kotlin/templates/FallbackTemplateProcessingStrategy.kt diff --git a/plugins/all-module-page/src/main/kotlin/templates/PathToRootSubstitutor.kt b/plugins/all-modules-page/src/main/kotlin/templates/PathToRootSubstitutor.kt index 5056b724..5056b724 100644 --- a/plugins/all-module-page/src/main/kotlin/templates/PathToRootSubstitutor.kt +++ b/plugins/all-modules-page/src/main/kotlin/templates/PathToRootSubstitutor.kt diff --git a/plugins/all-module-page/src/main/kotlin/templates/Substitutor.kt b/plugins/all-modules-page/src/main/kotlin/templates/Substitutor.kt index 98f1d88e..98f1d88e 100644 --- a/plugins/all-module-page/src/main/kotlin/templates/Substitutor.kt +++ b/plugins/all-modules-page/src/main/kotlin/templates/Substitutor.kt diff --git a/plugins/all-module-page/src/main/kotlin/templates/TemplateProcessor.kt b/plugins/all-modules-page/src/main/kotlin/templates/TemplateProcessor.kt index 18d63df0..18d63df0 100644 --- a/plugins/all-module-page/src/main/kotlin/templates/TemplateProcessor.kt +++ b/plugins/all-modules-page/src/main/kotlin/templates/TemplateProcessor.kt diff --git a/plugins/all-module-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin b/plugins/all-modules-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin index 3ac59dc6..3ac59dc6 100644 --- a/plugins/all-module-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin +++ b/plugins/all-modules-page/src/main/resources/META-INF/services/org.jetbrains.dokka.plugability.DokkaPlugin diff --git a/plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt b/plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt index cfc5ed43..a0c681eb 100644 --- a/plugins/base/base-test-utils/src/main/kotlin/testRunner/baseTestApi.kt +++ b/ |
