Files
ritz/examples/textinput/TextInput.ll
T
Aaron SinclairandClaude 443cca5662 Add TextInput example exposing type system limitations + roadmap
Created a new example that demonstrates what we need for proper string/type support:

**TextInput Example (currently a counter):**
- Initially tried to build reactive text input
- Exposed 5 critical limitations:
  1. String signals stored as i32 (should be i8*)
  2. F-string interpolation incomplete (f"Count: {count}" → "0")
  3. No oninput event (only onclick supported)
  4. No event value passing (can't get input.value)
  5. No string operations (len, concat, etc.)

**Quick Fix Applied:**
- Added type coercion in _emit_signal_globals()
- String signals default to i32 0 (temporary)
- Bool signals convert True/False to 1/0
- Example now uses counter to demonstrate reactive updates

**TYPE_SYSTEM_ROADMAP.md:**
Complete implementation plan for proper type support:
- Phase 1: Type hints extraction (already works!)
- Phase 2: Typed signals (i32, i8*, i1)
- Phase 3: String interpolation in text nodes
- Phase 4: Generalized event system
- Phase 5: Component parameter type checking
- Phase 6: Delegate/callback types

This example will drive the type system implementation. Once complete,
text input will work with proper string signals and reactive updates.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-15 11:53:56 -08:00

141 lines
8.2 KiB
LLVM
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; Generated by Ritz Framework with Signals
; Components: TextInput
; String constants
@.str.0 = private unnamed_addr constant [4 x i8] c"div\00"
@.str.1 = private unnamed_addr constant [6 x i8] c"class\00"
@.str.2 = private unnamed_addr constant [10 x i8] c"container\00"
@.str.3 = private unnamed_addr constant [3 x i8] c"h1\00"
@.str.4 = private unnamed_addr constant [17 x i8] c"Reactive Counter\00"
@.str.5 = private unnamed_addr constant [2 x i8] c"p\00"
@.str.6 = private unnamed_addr constant [13 x i8] c"instructions\00"
@.str.7 = private unnamed_addr constant [65 x i8] c"Click buttons to see reactive updates (text input coming soon!):\00"
@.str.8 = private unnamed_addr constant [13 x i8] c"button-group\00"
@.str.9 = private unnamed_addr constant [7 x i8] c"button\00"
@.str.10 = private unnamed_addr constant [6 x i8] c"click\00"
@.str.11 = private unnamed_addr constant [10 x i8] c"decrement\00"
@.str.12 = private unnamed_addr constant [4 x i8] c"−\00"
@.str.13 = private unnamed_addr constant [16 x i8] c"counter-display\00"
@.str.14 = private unnamed_addr constant [2 x i8] c"0\00"
@.str.15 = private unnamed_addr constant [10 x i8] c"increment\00"
@.str.16 = private unnamed_addr constant [2 x i8] c"+\00"
@.str.17 = private unnamed_addr constant [5 x i8] c"todo\00"
@.str.18 = private unnamed_addr constant [49 x i8] c"TODO: Replace with text input once we implement:\00"
@.str.19 = private unnamed_addr constant [3 x i8] c"ul\00"
@.str.20 = private unnamed_addr constant [10 x i8] c"todo-list\00"
@.str.21 = private unnamed_addr constant [3 x i8] c"li\00"
@.str.22 = private unnamed_addr constant [32 x i8] c"1. String signals (i8* not i32)\00"
@.str.23 = private unnamed_addr constant [25 x i8] c"2. oninput event handler\00"
@.str.24 = private unnamed_addr constant [23 x i8] c"3. Event value passing\00"
@.str.25 = private unnamed_addr constant [39 x i8] c"4. F-string interpolation with signals\00"
; JavaScript bridge function declarations
declare i32 @js_create_element(i8*)
declare i32 @js_create_text(i8*)
declare void @js_append_child(i32, i32)
declare void @js_set_attribute(i32, i8*, i8*)
declare void @js_set_root(i32)
declare void @js_bind_event(i32, i8*, i8*)
declare void @js_update_text_content(i32, i8*)
declare i32 @js_create_marker()
declare void @js_replace_at_marker(i32, i32, i32)
; Signal storage for TextInput (reactive state in WASM memory)
@signal_TextInput_count = global i32 0
; Signal helper functions
define i32 @get_count() {
entry:
%val = load i32, i32* @signal_TextInput_count
ret i32 %val
}
define void @set_count(i32 %newval) {
entry:
store i32 %newval, i32* @signal_TextInput_count
; TODO: Trigger DOM update callback
ret void
}
; Event handler: increment
define void @increment() {
entry:
store i32 0, i32* @signal_TextInput_count
ret void
}
; Event handler: decrement
define void @decrement() {
entry:
store i32 0, i32* @signal_TextInput_count
ret void
}
; Component render function
define i32 @render_TextInput() {
entry:
%var0 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0))
call void @js_set_attribute(i32 %var0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0))
%var1 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0))
%var2 = call i32 @js_create_text(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.4, i32 0, i32 0))
call void @js_append_child(i32 %var1, i32 %var2)
call void @js_append_child(i32 %var0, i32 %var1)
%var3 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0))
call void @js_set_attribute(i32 %var3, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i32 0, i32 0))
%var4 = call i32 @js_create_text(i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.7, i32 0, i32 0))
call void @js_append_child(i32 %var3, i32 %var4)
call void @js_append_child(i32 %var0, i32 %var3)
%var5 = call i32 @js_create_element(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.0, i32 0, i32 0))
call void @js_set_attribute(i32 %var5, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.8, i32 0, i32 0))
%var6 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.9, i32 0, i32 0))
call void @js_bind_event(i32 %var6, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.11, i32 0, i32 0))
%var7 = call i32 @js_create_text(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.12, i32 0, i32 0))
call void @js_append_child(i32 %var6, i32 %var7)
call void @js_append_child(i32 %var5, i32 %var6)
%var8 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0))
call void @js_set_attribute(i32 %var8, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.13, i32 0, i32 0))
; TODO: Format f-string with signal count
%var9 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i32 0, i32 0))
call void @js_append_child(i32 %var8, i32 %var9)
call void @js_append_child(i32 %var5, i32 %var8)
%var10 = call i32 @js_create_element(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.9, i32 0, i32 0))
call void @js_bind_event(i32 %var10, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.15, i32 0, i32 0))
%var11 = call i32 @js_create_text(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.16, i32 0, i32 0))
call void @js_append_child(i32 %var10, i32 %var11)
call void @js_append_child(i32 %var5, i32 %var10)
call void @js_append_child(i32 %var0, i32 %var5)
%var12 = call i32 @js_create_element(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.5, i32 0, i32 0))
call void @js_set_attribute(i32 %var12, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.17, i32 0, i32 0))
%var13 = call i32 @js_create_text(i8* getelementptr inbounds ([49 x i8], [49 x i8]* @.str.18, i32 0, i32 0))
call void @js_append_child(i32 %var12, i32 %var13)
call void @js_append_child(i32 %var0, i32 %var12)
%var14 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.19, i32 0, i32 0))
call void @js_set_attribute(i32 %var14, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.20, i32 0, i32 0))
%var15 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0))
%var16 = call i32 @js_create_text(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.22, i32 0, i32 0))
call void @js_append_child(i32 %var15, i32 %var16)
call void @js_append_child(i32 %var14, i32 %var15)
%var17 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0))
%var18 = call i32 @js_create_text(i8* getelementptr inbounds ([25 x i8], [25 x i8]* @.str.23, i32 0, i32 0))
call void @js_append_child(i32 %var17, i32 %var18)
call void @js_append_child(i32 %var14, i32 %var17)
%var19 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0))
%var20 = call i32 @js_create_text(i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str.24, i32 0, i32 0))
call void @js_append_child(i32 %var19, i32 %var20)
call void @js_append_child(i32 %var14, i32 %var19)
%var21 = call i32 @js_create_element(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.21, i32 0, i32 0))
%var22 = call i32 @js_create_text(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.25, i32 0, i32 0))
call void @js_append_child(i32 %var21, i32 %var22)
call void @js_append_child(i32 %var14, i32 %var21)
call void @js_append_child(i32 %var0, i32 %var14)
ret i32 %var0
}
; Main entry point
define void @main() {
entry:
%root = call i32 @render_TextInput()
call void @js_set_root(i32 %root)
ret void
}