I've originally posted a question on compose chann...
# javascript
r
I've originally posted a question on compose channel (https://kotlinlang.slack.com/archives/CJLTWPH7S/p1721823623013829), but after some testing I'm no longer sure my problem is compose related. I'll try here because it seems related to Kotlin/JS (but also Kotlin/Wasm) compiler. More in thread.
I have some Kotlin code which looks like this:
Copy code
currentComposer.startNode()
    if (currentComposer.inserting) {
        currentComposer.createNode { componentInScope }
    } else {
        currentComposer.useNode()
    }
    Updater<C>(currentComposer).update()
    currentComposer.startReplaceableGroup(0x7ab4aae9)
With Kotlin version before 2.0.20 (I'm testing 2.0.10-RC2-532) its translated to this JS code, which seems ok.
Copy code
var content_1 = content_0._v;
    var $changed_0 = 6 | 896 & $dirty >> 3;
    var $composer_1 = $composer_0;
    $composer_1.startNode_htvs8k_k$();
    if ($composer_1.get_inserting_25mlsw_k$()) {
      var tmp_1 = $composer_1;
      tmp_1.createNode_ahrd54_k$(div$lambda(component));
    } else {
      $composer_1.useNode_io5s9l_k$();
    }
    // Inline function 'dev.kilua.html.div.<anonymous>' call
    var $this$ComponentNode = _Updater___init__impl__rbfxm8($composer_1);
    var tmp_2 = className_0._v;
    Updater__set_impl_v7kwss($this$ComponentNode, tmp_2, div$lambda_0);
    var tmp_3 = id_0._v;
    Updater__set_impl_v7kwss($this$ComponentNode, tmp_3, div$lambda_1);
    $composer_1.startReplaceableGroup_ip860b_k$(2058660585);
But with Kotlin 2.0.20-Beta2 (also tested 2.0.20-RC-154) the generated JS code looks like this:
Copy code
var content_1 = content_0._v;
    var $changed_0 = 6 | 896 & $dirty >> 3;
    var $composer_1 = $composer_0;
    $composer_1.startNode_htvs8k_k$();
    if ($composer_1.get_inserting_25mlsw_k$()) {
      var tmp_1 = $composer_1;
      $composer_1.startReplaceableGroup_ip860b_k$(786731146);
      // Inline function 'androidx.compose.runtime.cache' call
      var invalid = ($changed_0 & 14 ^ 6) > 4 && $composer_1.changedInstance_s1wkiy_k$(component) || ($changed_0 & 6) === 4;
      // Inline function 'kotlin.let' call
      // Inline function 'kotlin.contracts.contract' call
      // Inline function 'androidx.compose.runtime.cache.<anonymous>' call
      var it_0 = $composer_1.rememberedValue_4dg93v_k$();
      var tmp_2;
      if (invalid || it_0 === Companion_getInstance().get_Empty_i9b85g_k$()) {
        // Inline function 'dev.kilua.compose.ComponentNode.<anonymous>' call
        var value_0 = div$lambda(component);
        $composer_1.updateRememberedValue_l1wh71_k$(value_0);
        tmp_2 = value_0;
      } else {
        tmp_2 = it_0;
      }
      var tmp_3 = tmp_2;
      var tmp0_group_0 = (tmp_3 == null ? true : !(tmp_3 == null)) ? tmp_3 : THROW_CCE();
      $composer_1.endReplaceableGroup_ern0ak_k$();
      tmp_1.createNode_ahrd54_k$(tmp0_group_0);
    } else {
      $composer_1.useNode_io5s9l_k$();
    }
And it's totally broken. A call to startReplaceableGroup crashes because createNode or useNode needs to be called first.
What happened here?
In the end it seems to be compose compiler "feature" (https://github.com/JetBrains/kotlin/commit/3281e53a1bb15af932157d42178184aed55e6d71) . I've managed to fix this by moving lambda creation above startNode call.