Skip to content

Commit 9f6f4ea

Browse files
committed
interpreter: Add a way to retrieve the TypeLoader
1 parent 06b04e7 commit 9f6f4ea

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

internal/interpreter/api.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,15 @@ impl ComponentDefinition {
888888
let guard = unsafe { generativity::Guard::new(generativity::Id::new()) };
889889
self.inner.unerase(guard).original.clone()
890890
}
891+
892+
/// Return the `TypeLoader` used when parsing the code in the interpreter.
893+
///
894+
/// WARNING: this is not part of the public API
895+
#[cfg(feature = "highlight")]
896+
pub fn type_loader(&self) -> std::rc::Rc<i_slint_compiler::typeloader::TypeLoader> {
897+
let guard = unsafe { generativity::Guard::new(generativity::Id::new()) };
898+
self.inner.unerase(guard).type_loader.as_ref().unwrap().clone()
899+
}
891900
}
892901

893902
/// Print the diagnostics to stderr

internal/interpreter/dynamic_item_tree.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,11 @@ pub struct ItemTreeDescription<'id> {
379379
/// Map of all exported global singletons and their index in the compiled_globals vector. The key
380380
/// is the normalized name of the global.
381381
exported_globals_by_name: BTreeMap<String, usize>,
382+
383+
/// The type loader, which will be available only on the top-most `ItemTreeDescription`.
384+
/// All other `ItemTreeDescription`s have `None` here.
385+
#[cfg(feature = "highlight")]
386+
pub(crate) type_loader: Option<std::rc::Rc<i_slint_compiler::typeloader::TypeLoader>>,
382387
}
383388

384389
fn internal_properties_to_public<'a>(
@@ -786,7 +791,7 @@ pub async fn load(
786791
if diag.has_error() {
787792
return (Err(()), diag);
788793
}
789-
let (doc, mut diag, _) = compile_syntax_node(syntax_node, diag, compiler_config).await;
794+
let (doc, mut diag, loader) = compile_syntax_node(syntax_node, diag, compiler_config).await;
790795
if diag.has_error() {
791796
return (Err(()), diag);
792797
}
@@ -798,11 +803,12 @@ pub async fn load(
798803
return (Err(()), diag);
799804
}
800805

801-
(Ok(generate_item_tree(&doc.root_component, guard)), diag)
806+
(Ok(generate_item_tree(&doc.root_component, Some(std::rc::Rc::new(loader)), guard)), diag)
802807
}
803808

804809
pub(crate) fn generate_item_tree<'id>(
805810
component: &Rc<object_tree::Component>,
811+
_type_loader: Option<std::rc::Rc<i_slint_compiler::typeloader::TypeLoader>>,
806812
guard: generativity::Guard<'id>,
807813
) -> Rc<ItemTreeDescription<'id>> {
808814
//dbg!(&*component.root_element.borrow());
@@ -884,7 +890,7 @@ pub(crate) fn generate_item_tree<'id>(
884890
generativity::make_guard!(guard);
885891
self.repeater.push(
886892
RepeaterWithinItemTree {
887-
item_tree_to_repeat: generate_item_tree(base_component, guard),
893+
item_tree_to_repeat: generate_item_tree(base_component, None, guard),
888894
offset: self.type_builder.add_field_type::<Repeater<ErasedItemTreeBox>>(),
889895
model: item.repeated.as_ref().unwrap().model.clone(),
890896
}
@@ -1167,6 +1173,8 @@ pub(crate) fn generate_item_tree<'id>(
11671173
public_properties,
11681174
compiled_globals,
11691175
exported_globals_by_name,
1176+
#[cfg(feature = "highlight")]
1177+
type_loader: _type_loader,
11701178
};
11711179

11721180
Rc::new(t)
@@ -2061,7 +2069,7 @@ pub fn show_popup(
20612069
) {
20622070
generativity::make_guard!(guard);
20632071
// FIXME: we should compile once and keep the cached compiled component
2064-
let compiled = generate_item_tree(&popup.component, guard);
2072+
let compiled = generate_item_tree(&popup.component, None, guard);
20652073
let inst = instantiate(
20662074
compiled,
20672075
Some(parent_comp),

internal/interpreter/global_component.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,8 @@ pub(crate) fn generate(component: &Rc<Component>) -> CompiledGlobal {
259259
ElementType::Global => {
260260
generativity::make_guard!(guard);
261261
CompiledGlobal::Component {
262-
component: crate::dynamic_item_tree::generate_item_tree(component, guard).into(),
262+
component: crate::dynamic_item_tree::generate_item_tree(component, None, guard)
263+
.into(),
263264
public_properties: Default::default(),
264265
}
265266
}

0 commit comments

Comments
 (0)