Fix conditional branch rendering: append children to wrapper

**Bug:** Conditional branches (match/case) rendered empty content.
- Tabs would switch but show no content in each tab
- Wrapper div was created but children never appended to it

**Root Cause:**
In `_emit_conditional_branch_function`, statements were rendered but
their return values were discarded:
```python
for stmt in body:
    self._emit_statement(stmt)  # ← return value ignored!
```

**Fix:**
Append returned elements to wrapper, just like `_emit_with` does:
```python
for stmt in body:
    child_var = self._emit_statement(stmt)
    if child_var:
        self.lines.append(f"call void @js_append_child(i32 %{wrapper_var}, i32 %{child_var})")
```

**LLVM Before:**
```llvm
%var87 = call i32 @js_create_element(...)  ; wrapper
%var89 = call i32 @js_create_element(...)  ; content
; ... build var89's children ...
ret i32 %var87  ; ← var89 never appended!
```

**LLVM After:**
```llvm
%var87 = call i32 @js_create_element(...)  ; wrapper
%var89 = call i32 @js_create_element(...)  ; content
; ... build var89's children ...
call void @js_append_child(i32 %var87, i32 %var89)  ; ← FIX!
ret i32 %var87
```

**Result:**
✅ Tabs example now shows content in each tab
✅ Vertical tabs (nested conditionals) also work

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Aaron SinclairandClaude committed 2025-11-15 15:05:10 -08:00
1 parent 0b77c2ff3c
commit 7efa7786cf
4 files changed
+12 -1

No files matched your search

+8
View File
@@ -400,6 +400,7 @@ entry:
%var101 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.15, i32 0, i32 0)) %var101 = call i32 @js_create_text(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.15, i32 0, i32 0))
call void @js_append_child(i32 %var99, i32 %var101) call void @js_append_child(i32 %var99, i32 %var101)
call void @js_append_child(i32 %var89, i32 %var99) call void @js_append_child(i32 %var89, i32 %var99)
call void @js_append_child(i32 %var87, i32 %var89)
ret i32 %var87 ret i32 %var87
} }
@@ -427,6 +428,7 @@ entry:
%var116 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.18, i32 0, i32 0)) %var116 = call i32 @js_create_text(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.18, i32 0, i32 0))
call void @js_append_child(i32 %var114, i32 %var116) call void @js_append_child(i32 %var114, i32 %var116)
call void @js_append_child(i32 %var104, i32 %var114) call void @js_append_child(i32 %var104, i32 %var114)
call void @js_append_child(i32 %var102, i32 %var104)
ret i32 %var102 ret i32 %var102
} }
@@ -454,6 +456,7 @@ entry:
%var131 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.21, i32 0, i32 0)) %var131 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.21, i32 0, i32 0))
call void @js_append_child(i32 %var129, i32 %var131) call void @js_append_child(i32 %var129, i32 %var131)
call void @js_append_child(i32 %var119, i32 %var129) call void @js_append_child(i32 %var119, i32 %var129)
call void @js_append_child(i32 %var117, i32 %var119)
ret i32 %var117 ret i32 %var117
} }
@@ -471,6 +474,7 @@ entry:
%var140 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.22, i32 0, i32 0)) %var140 = call i32 @js_create_text(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.22, i32 0, i32 0))
call void @js_append_child(i32 %var138, i32 %var140) call void @js_append_child(i32 %var138, i32 %var140)
call void @js_append_child(i32 %var134, i32 %var138) call void @js_append_child(i32 %var134, i32 %var138)
call void @js_append_child(i32 %var132, i32 %var134)
ret i32 %var132 ret i32 %var132
} }
@@ -860,6 +864,7 @@ entry:
call void @js_append_child(i32 %var286, i32 %var288) call void @js_append_child(i32 %var286, i32 %var288)
call void @js_append_child(i32 %var278, i32 %var286) call void @js_append_child(i32 %var278, i32 %var286)
call void @js_append_child(i32 %var265, i32 %var278) call void @js_append_child(i32 %var265, i32 %var278)
call void @js_append_child(i32 %var263, i32 %var265)
ret i32 %var263 ret i32 %var263
} }
@@ -903,6 +908,7 @@ entry:
call void @js_append_child(i32 %var311, i32 %var313) call void @js_append_child(i32 %var311, i32 %var313)
call void @js_append_child(i32 %var301, i32 %var311) call void @js_append_child(i32 %var301, i32 %var311)
call void @js_append_child(i32 %var291, i32 %var301) call void @js_append_child(i32 %var291, i32 %var301)
call void @js_append_child(i32 %var289, i32 %var291)
ret i32 %var289 ret i32 %var289
} }
@@ -927,6 +933,7 @@ entry:
call void @js_append_child(i32 %var316, i32 %var323) call void @js_append_child(i32 %var316, i32 %var323)
%var326 = call i32 @render_VerticalTabs() %var326 = call i32 @render_VerticalTabs()
call void @js_append_child(i32 %var316, i32 %var326) call void @js_append_child(i32 %var316, i32 %var326)
call void @js_append_child(i32 %var314, i32 %var316)
ret i32 %var314 ret i32 %var314
} }
@@ -944,6 +951,7 @@ entry:
%var335 = call i32 @js_create_text(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.53, i32 0, i32 0)) %var335 = call i32 @js_create_text(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.53, i32 0, i32 0))
call void @js_append_child(i32 %var333, i32 %var335) call void @js_append_child(i32 %var333, i32 %var335)
call void @js_append_child(i32 %var329, i32 %var333) call void @js_append_child(i32 %var329, i32 %var333)
call void @js_append_child(i32 %var327, i32 %var329)
ret i32 %var327 ret i32 %var327
} }
Binary file not shown.
+4 -1
View File
@@ -920,7 +920,10 @@ class SignalLLVMIRGenerator:
# Render all statements in the branch body # Render all statements in the branch body
for stmt in body: for stmt in body:
self._emit_statement(stmt) child_var = self._emit_statement(stmt)
# Append top-level elements to wrapper
if child_var:
self.lines.append(f" call void @js_append_child(i32 %{wrapper_var}, i32 %{child_var})")
# Pop wrapper from parent stack # Pop wrapper from parent stack
self.parent_element_stack.pop() self.parent_element_stack.pop()