diff --git a/web/compose-compiler-integration/build.gradle.kts b/web/compose-compiler-integration/build.gradle.kts index 8f4c88fabc..5ae69a6704 100644 --- a/web/compose-compiler-integration/build.gradle.kts +++ b/web/compose-compiler-integration/build.gradle.kts @@ -21,6 +21,7 @@ kotlin { sourceSets { val jsMain by getting { dependencies { + implementation(project(":compose-compiler-integration-lib")) implementation(kotlin("stdlib-js")) implementation(compose.runtime) implementation(project(":web-core")) diff --git a/web/compose-compiler-integration/lib/build.gradle.kts b/web/compose-compiler-integration/lib/build.gradle.kts new file mode 100644 index 0000000000..825cb6c3fe --- /dev/null +++ b/web/compose-compiler-integration/lib/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + kotlin("multiplatform") + id("org.jetbrains.compose") +} + +repositories { + mavenLocal() + mavenCentral() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") +} + +kotlin { + js(IR) { + nodejs {} + browser() {} + } + + sourceSets { + val commonMain by getting { + dependencies { + implementation(kotlin("stdlib-common")) + implementation(compose.runtime) + implementation(project(":web-core")) + } + } + } +} diff --git a/web/compose-compiler-integration/lib/src/commonMain/kotlin/Interfaces.kt b/web/compose-compiler-integration/lib/src/commonMain/kotlin/Interfaces.kt new file mode 100644 index 0000000000..545f69d71f --- /dev/null +++ b/web/compose-compiler-integration/lib/src/commonMain/kotlin/Interfaces.kt @@ -0,0 +1,23 @@ +import androidx.compose.runtime.Composable +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.dom.Text + +interface ComposableCollection { + val list: List<@Composable () -> Unit> + fun add(c: @Composable () -> Unit) +} + + +interface ComposableContent { + + @Composable + fun ComposableContent() +} + +abstract class AbstrComposableContent : ComposableContent { + + @Composable + override fun ComposableContent() { + Div { Text("AbstrComposableContent") } + } +} diff --git a/web/compose-compiler-integration/src/jsMain/kotlin/CrossmoduleTestsDependencies.kt b/web/compose-compiler-integration/src/jsMain/kotlin/CrossmoduleTestsDependencies.kt index bc56e265cd..0e72757f8c 100644 --- a/web/compose-compiler-integration/src/jsMain/kotlin/CrossmoduleTestsDependencies.kt +++ b/web/compose-compiler-integration/src/jsMain/kotlin/CrossmoduleTestsDependencies.kt @@ -1,6 +1,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect import kotlinx.browser.document +import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.dom.Text data class DataClassTakesValComposable(val c: @Composable () -> Unit) @@ -105,3 +106,45 @@ sealed interface StableSealedInterface { data class StableDataClass(val abc: Int) data class StableClass(val abc: Int) class StableTypedClass(val abc: T) + + + +class ComposableCollectionImpl : ComposableCollection { + + private val _list = mutableListOf<@Composable () -> Unit>() + + override val list: List<@Composable () -> Unit> + get() = _list + + override fun add(c: @Composable () -> Unit) { + _list.add(c) + } +} + +internal fun createComposableCollection(): ComposableCollection = ComposableCollectionImpl() + +private class ComposableContentImpl : ComposableContent { + + @Composable + override fun ComposableContent() { + Div { Text("ComposableContent") } + } +} + +internal fun createComposableContent(): ComposableContent = ComposableContentImpl() + +internal class ComposableContentDelegation(private val impl: ComposableContent) : ComposableContent by impl + + +class AbstrComposableContentExtendImpl : AbstrComposableContent() { + + @Composable + override fun ComposableContent() { + super.ComposableContent() + Div { + Text("AbstrComposableContentImpl") + } + } +} + +class AbstrComposableContentNoExtendImpl : AbstrComposableContent() diff --git a/web/compose-compiler-integration/src/jsTest/kotlin/InheritanceTests.kt b/web/compose-compiler-integration/src/jsTest/kotlin/InheritanceTests.kt new file mode 100644 index 0000000000..fade82416c --- /dev/null +++ b/web/compose-compiler-integration/src/jsTest/kotlin/InheritanceTests.kt @@ -0,0 +1,86 @@ +import kotlinx.browser.document +import org.jetbrains.compose.web.dom.Div +import org.jetbrains.compose.web.dom.Text +import org.jetbrains.compose.web.renderComposable +import kotlin.test.Test +import kotlin.test.assertEquals + +class InheritanceTests { + + @Test + // Issues: + // https://github.com/JetBrains/compose-jb/issues/2291 + // https://github.com/JetBrains/compose-jb/issues/2660 + fun implementComposableCollection() { + val collection = createComposableCollection().apply { + add { + Div { Text("Div1") } + } + add { + Div { Text("Div2") } + } + add { + Div { Text("Div3") } + } + } + val root = document.createElement("div") + + renderComposable(root) { + collection.list.forEach { it() } + } + + assertEquals("
Div1
Div2
Div3
", root.innerHTML) + } + + @Test + fun implementComposableContent() { + val contentImpl = createComposableContent() + + val root = document.createElement("div") + + renderComposable(root) { + contentImpl.ComposableContent() + } + + assertEquals("
ComposableContent
", root.innerHTML) + } + + @Test + fun implementComposableContentDelegation() { + val contentImpl = ComposableContentDelegation(createComposableContent()) + + val root = document.createElement("div") + + renderComposable(root) { + contentImpl.ComposableContent() + } + + assertEquals("
ComposableContent
", root.innerHTML) + } + + @Test + fun testAbstrComposableContentExtendImpl() { + val contentImpl: ComposableContent = AbstrComposableContentExtendImpl() + + val root = document.createElement("div") + + renderComposable(root) { + contentImpl.ComposableContent() + } + + assertEquals("
AbstrComposableContent
AbstrComposableContentImpl
", root.innerHTML) + } + + @Test + fun testAbstrComposableContentNoExtendImpl() { + val contentImpl: ComposableContent = AbstrComposableContentNoExtendImpl() + + val root = document.createElement("div") + + renderComposable(root) { + contentImpl.ComposableContent() + } + + assertEquals("
AbstrComposableContent
", root.innerHTML) + } +} diff --git a/web/settings.gradle.kts b/web/settings.gradle.kts index ad4c210e79..8bb6643f81 100644 --- a/web/settings.gradle.kts +++ b/web/settings.gradle.kts @@ -62,6 +62,7 @@ module(":web-core", "core") module(":web-svg", "svg") module(":web-integration-core", "integration-core") module(":compose-compiler-integration", "compose-compiler-integration") +module(":compose-compiler-integration-lib", "compose-compiler-integration/lib") module(":internal-web-core-runtime", "internal-web-core-runtime") module(":test-utils", "test-utils")