docs/development/compiler-internals.md
Note for AI coding assistants (agents): When to load this document: Working on compiler passes, code generation, property bindings, the reactive system, or adding new language features. For general build commands and project structure, see
/AGENTS.md.
The Slint compiler transforms .slint source files into target language code through these stages:
flowchart LR
A[".slint Source"] --> B["Lexer"]
B --> C["Parser"]
C --> D["Object Tree"]
D --> E["Passes"]
E --> F["LLR"]
F --> G["Code Generators"]
G --> H["Rust / C++ / etc."]
| Stage | Location | Description |
|---|---|---|
| Lexer | internal/compiler/lexer.rs | Tokenizes .slint source into tokens |
| Parser | internal/compiler/parser.rs | Builds syntax tree from tokens |
| Object Tree | internal/compiler/object_tree.rs | High-level IR representing components and elements |
| Passes | internal/compiler/passes/ | ~50 transformation and optimization passes |
| LLR | internal/compiler/llr/ | Low-Level Representation for code generation |
| Generators | internal/compiler/generator/ | Target-specific code generators (Rust, C++, etc.) |
Passes are organized into three phases in internal/compiler/passes.rs:
run_import_passes)inject_debug_hooks - Add debugging supportinfer_aliases_types - Resolve type aliasesresolving - Resolve expressions, types, and referencespurity_check - Verify function puritycheck_expressions - Validate expression semanticsrun_passes)lower_* passes - Transform high-level constructs (states, layouts, popups, etc.)inlining - Inline components as neededcollect_* passes - Gather globals, structs, subcomponentsfocus_handling - Set up focus navigationdefault_geometry - Calculate default sizesconst_propagation - Propagate constant valuesremove_aliases - Eliminate property aliasesremove_unused_properties - Dead code eliminationdeduplicate_property_read - Optimize property accessoptimize_useless_rectangles - Remove unnecessary elementsSlint's reactive property system is implemented in internal/core/properties.rs:
flowchart TD
A["Property A"] -->|"dependency"| B["Binding"]
B -->|"evaluates"| C["Property B"]
C -->|"notifies"| D["Dependents"]
D -->|"re-evaluate"| B
Key concepts:
Property<T>) hold values and track dependenciesDependencyListHead/DependencyNode)The binding evaluation is lazy - properties are only recomputed when read after being marked dirty.
Slint supports two execution modes with different code paths:
| Mode | Entry Point | Use Case |
|---|---|---|
| Compiled | slint! macro, slint-build | Production apps, maximum performance |
| Interpreted | slint-interpreter crate | Runtime .slint loading, tooling, scripting |
The interpreter (internal/interpreter/) compiles .slint at runtime and uses dynamic dispatch, while the compiled path generates static Rust/C++ code at build time.
| Structure | Location | Purpose |
|---|---|---|
Document | compiler/object_tree.rs | Root of parsed .slint file |
Component | compiler/object_tree.rs | A component definition |
Element | compiler/object_tree.rs | An element within a component |
Expression | compiler/expression_tree.rs | Compiled expressions |
Type | compiler/langtype.rs | Type system representation |
CompilationUnit | compiler/llr/mod.rs | LLR output ready for code generation |
internal/compiler/builtins.slintinternal/core/items/ (new file or existing)internal/core/items.rs (add to ItemVTable)internal/compiler/typeregister.rsinternal/renderers/*/)tests/cases/elements/internal/compiler/passes/your_pass.rsinternal/compiler/passes/mod.rsinternal/compiler/passes.rs (choose appropriate phase).slint test casesinternal/compiler/langtype.rsinternal/core/ if neededinternal/compiler/generator/To see the Rust code that the compiler generates from a .slint file:
cargo run -p slint-compiler -- -f rust path/to/file.slint | rustfmt > path/to/file.slint.rs
To see the generated C++ code:
cargo run -p slint-compiler -- -f cpp path/to/file.slint > path/to/file.slint.cpp
This is invaluable when debugging code generation issues — you can see exactly what the generators emit without running a full build of an application.