slint-ui / slint

Slint is a declarative GUI toolkit to build native user interfaces for Rust, C++, or JavaScript apps.
https://slint.dev
Other
16.94k stars 568 forks source link

LSP Preview panics with "Recursion detected" #3950

Closed ogoffart closed 10 months ago

ogoffart commented 10 months ago

Panic in slint-lsp since 1.3.0, it worked in 1.2.2 and slint-viewer 1.3.0 also doesn't seem to have the issue.

The timing makes me think it's probably the same issue but I can't figure this out from the stack trace above without symbols. Let me know if this would better go in a new issue.

LSP log:

:: [21:42:52.488] --> slint textDocument/documentHighlight (8): {'position': {'line': 35, 'character': 37}, 'textDocument': {'uri': 'file://~/temp/cooperator/ui/main.slint'}}
:: [21:42:52.492] --> slint textDocument/codeAction (9): {'range': {'start': {'line': 35, 'character': 37}, 'end': {'line': 35, 'character': 37}}, 'context': {'triggerKind': 2, 'diagnostics': []}, 'textDocument': {'uri': 'file://~/temp/cooperator/ui/main.slint'}}
:: [21:42:52.493] <<< slint (8) (duration: 4ms): [{'range': {'start': {'line': 35, 'character': 37}, 'end': {'line': 35, 'character': 44}}}]
:: [21:42:52.498] <<< slint (9) (duration: 6ms): [{'command': 'slint/showPreview', 'title': 'Show Preview', 'arguments': ['file://~/temp/cooperator/ui/main.slint', 'MainWindow']}]
:: [21:42:53.529] --> slint workspace/executeCommand (10): {'workDoneToken': '$ublime-work-done-progress-10', 'command': 'slint/showPreview', 'arguments': ['file://~/temp/cooperator/ui/main.slint', 'MainWindow']}
:: [21:42:53.543] <<< slint (10) (duration: 13ms): None
:: [21:42:53.599] <?  slint experimental/serverStatus: {'health': 'ok', 'quiescent': False, 'message': 'Loading Preview…'}
:: [21:42:53.637] <-  slint textDocument/publishDiagnostics: {'diagnostics': [{'message': "The function 'cycle_step_colum' is private. Annotate it with 'public' to make it accessible from other components. Note: this used to be allowed in previous version, but this should be considered an error", 'severity': 2, 'range': {'start': {'line': 58, 'character': 95}, 'end': {'line': 58, 'character': 95}}}, {'message': "The function 'cycle_step_colum' is private. Annotate it with 'public' to make it accessible from other components. Note: this used to be allowed in previous version, but this should be considered an error", 'severity': 2, 'range': {'start': {'line': 59, 'character': 96}, 'end': {'line': 59, 'character': 96}}}], 'uri': 'file://~/temp/cooperator/ui/common.slint'}
:: [21:42:53.639] <?  slint experimental/serverStatus: {'health': 'ok', 'quiescent': False, 'message': 'Preview Loaded'}
slint: thread 'main' panicked at ~/.cargo/registry/src/index.crates.io-6f17d22bba15001f/i-slint-core-1.3.0/properties.rs:486:9:
slint: Recursion detected
slint: stack backtrace:
slint:    0: rust_begin_unwind
slint:              at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/std/src/panicking.rs:595:5
slint:    1: core::panicking::panic_fmt
slint:              at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/panicking.rs:67:14
slint:    2: i_slint_core::properties::Property<T>::get
slint:    3: core::ops::function::FnOnce::call_once
slint:    4: i_slint_core::properties::alloc_binding_holder::evaluate
slint:    5: i_slint_core::properties::Property<T>::get
slint:    6: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as i_slint_core::item_tree::ItemTree_vtable_mod::ItemTree>::item_geometry
slint:    7: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as const_field_offset::PinnedDrop>::drop::VT::item_geometry
slint:    8: i_slint_core::item_tree::ItemRc::is_visible
slint:    9: i_slint_core::item_tree::ItemRc::is_visible
slint:   10: i_slint_core::item_tree::ItemRc::is_visible
slint:   11: i_slint_core::item_tree::ItemRc::is_visible
slint:   12: i_slint_core::item_tree::ItemRc::is_visible
slint:   13: i_slint_core::item_tree::ItemRc::is_visible
slint:   14: i_slint_core::window::WindowInner::move_focus
slint:   15: i_slint_core::window::WindowInner::set_focus_item
slint:   16: slint_interpreter::dynamic_item_tree::InstanceRef::access_window
slint:   17: slint_interpreter::eval::call_builtin_function
slint:   18: slint_interpreter::eval::eval_expression
slint:   19: slint_interpreter::dynamic_item_tree::ErasedItemTreeBox::run_setup_code
slint:   20: slint_interpreter::dynamic_item_tree::ItemTreeDescription::create
slint:   21: slint_interpreter::api::ComponentDefinition::create_embedded
slint:   22: slint_lsp::preview::set_preview_factory::{{closure}}
slint:   23: i_slint_core::component_factory::ComponentFactory::new::{{closure}}
slint:   24: i_slint_core::items::component_container::ComponentContainer::ensure_updated
slint:   25: <i_slint_core::items::component_container::ComponentContainer as i_slint_core::items::Item_vtable_mod::Item>::layout_info
slint:   26: core::ops::function::FnOnce::call_once
slint:   27: i_slint_core::properties::alloc_binding_holder::evaluate
slint:   28: i_slint_core::properties::Property<T>::get
slint:   29: core::ops::function::FnOnce::call_once
slint:   30: i_slint_core::properties::alloc_binding_holder::evaluate
slint:   31: i_slint_core::properties::Property<T>::get
slint:   32: core::ops::function::FnOnce::call_once
slint:   33: i_slint_core::properties::alloc_binding_holder::evaluate
slint:   34: i_slint_core::properties::Property<T>::get
slint:   35: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as i_slint_core::item_tree::ItemTree_vtable_mod::ItemTree>::item_geometry
slint:   36: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as const_field_offset::PinnedDrop>::drop::VT::item_geometry
slint:   37: i_slint_core::item_tree::ItemRc::geometry
slint:   38: i_slint_core::item_rendering::ItemRenderer::filter_item
slint:   39: i_slint_core::item_tree::<impl i_slint_core::item_tree::ItemVisitor_vtable_mod::ItemVisitor for T>::visit_item
slint:   40: i_slint_core::item_tree::visit_item_tree::{{closure}}
slint:   41: i_slint_core::item_tree::visit_item_tree
slint:   42: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as i_slint_core::item_tree::ItemTree_vtable_mod::ItemTree>::visit_children_item
slint:   43: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as const_field_offset::PinnedDrop>::drop::VT::visit_children_item
slint:   44: i_slint_core::item_tree::<impl i_slint_core::item_tree::ItemVisitor_vtable_mod::ItemVisitor for T>::visit_item
slint:   45: i_slint_core::item_tree::visit_item_tree::{{closure}}
slint:   46: i_slint_core::item_tree::visit_item_tree
slint:   47: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as i_slint_core::item_tree::ItemTree_vtable_mod::ItemTree>::visit_children_item
slint:   48: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as const_field_offset::PinnedDrop>::drop::VT::visit_children_item
slint:   49: i_slint_core::item_rendering::render_component_items
slint:   50: i_slint_backend_qt::qt_window::QtWindow::paint_event::{{closure}}
slint:   51: i_slint_core::properties::PropertyTracker<DirtyHandler>::evaluate_as_dependency_root
slint:   52: Slint_paintEvent
slint:   53: _ZN11SlintWidget10paintEventEP11QPaintEvent
slint:   54: _ZN7QWidget5eventEP6QEvent
slint:   55: _ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent
slint:   56: _ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent
slint:   57: _ZN14QWidgetPrivate14sendPaintEventERK7QRegion
slint:   58: _ZN14QWidgetPrivate10drawWidgetEP12QPaintDeviceRK7QRegionRK6QPoint6QFlagsINS_14DrawWidgetFlagEEP8QPainterP21QWidgetRepaintManager
slint:   59: <unknown>
slint:   60: <unknown>
slint:   61: <unknown>
slint:   62: _ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent
slint:   63: _ZN16QCoreApplication15notifyInternal2EP7QObjectP6QEvent
slint:   64: _ZN22QGuiApplicationPrivate18processExposeEventEPN29QWindowSystemInterfacePrivate11ExposeEventE
slint:   65: _ZN22QWindowSystemInterface22sendWindowSystemEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE
slint:   66: <unknown>
slint:   67: <unknown>
slint:   68: <unknown>
slint:   69: g_main_context_iteration
slint:   70: _ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE
slint:   71: _ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE
slint:   72: _ZN16QCoreApplication4execEv
slint:   73: <i_slint_backend_qt::Backend as i_slint_core::platform::Platform>::run_event_loop
slint:   74: i_slint_core::with_platform
slint:   75: slint_lsp::preview::native::start_ui_event_loop
slint:   76: slint_lsp::main

Originally posted by @jturcotte in https://github.com/slint-ui/slint/issues/3916#issuecomment-1811266349

ogoffart commented 10 months ago

@jturcotte , @qarmin : do you have example to reproduce this?

jturcotte commented 10 months ago

I did "Show Preview" on the MainWindow component of https://github.com/jturcotte/chiptrack/blob/bbe9c9d/ui/main.slint

I didn't try to reduce it, but if those repro steps don't work for you I'll try.

qarmin commented 10 months ago

When creating minimal project I found that this is logic bug

export component SelectableTableView {
    forward-focus: focus_item;
    focus_item := FocusScope {
    }
}
thread 'main' panicked at /home/runner/work/slint/slint/internal/core/properties.rs:486:9:
Recursion detected
stack backtrace:
   0: rust_begin_unwind
             at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/std/src/panicking.rs:597:5
   1: core::panicking::panic_fmt
             at /rustc/79e9716c980570bfd1f666e3b16ac583f0168962/library/core/src/panicking.rs:72:14
   2: i_slint_core::properties::Property<T>::get
   3: core::ops::function::FnOnce::call_once
   4: i_slint_core::properties::alloc_binding_holder::evaluate
   5: i_slint_core::properties::Property<T>::get
   6: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as i_slint_core::item_tree::ItemTree_vtable_mod::ItemTree>::item_geometry
   7: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as const_field_offset::PinnedDrop>::drop::VT::item_geometry
   8: i_slint_core::item_tree::ItemRc::is_visible
   9: i_slint_core::item_tree::ItemRc::is_visible
  10: i_slint_core::item_tree::ItemRc::is_visible
  11: i_slint_core::item_tree::ItemRc::is_visible
  12: i_slint_core::window::WindowInner::move_focus
  13: i_slint_core::window::WindowInner::set_focus_item
  14: slint_interpreter::eval::call_builtin_function
  15: slint_interpreter::eval::eval_expression
  16: slint_interpreter::dynamic_item_tree::ErasedItemTreeBox::run_setup_code
  17: slint_lsp::preview::set_preview_factory::{{closure}}
  18: i_slint_core::component_factory::ComponentFactory::new::{{closure}}
  19: i_slint_core::items::component_container::ComponentContainer::ensure_updated
  20: core::ops::function::FnOnce::call_once
  21: i_slint_core::properties::alloc_binding_holder::evaluate
  22: i_slint_core::properties::Property<T>::get
  23: core::ops::function::FnOnce::call_once
  24: i_slint_core::properties::alloc_binding_holder::evaluate
  25: i_slint_core::properties::Property<T>::get
  26: core::ops::function::FnOnce::call_once
  27: i_slint_core::properties::alloc_binding_holder::evaluate
  28: i_slint_core::properties::Property<T>::get
  29: core::ops::function::FnOnce::call_once
  30: i_slint_core::properties::alloc_binding_holder::evaluate
  31: i_slint_core::properties::Property<T>::get
  32: <slint_lsp::preview::ui::slint_generatedPreviewUi::InnerPreviewUi as const_field_offset::PinnedDrop>::drop::VT::layout_info
  33: <i_slint_backend_winit::winitwindowadapter::WinitWindowAdapter as i_slint_core::window::WindowAdapter>::update_window_properties
  34: i_slint_core::properties::PropertyTracker<DirtyHandler>::evaluate_as_dependency_root
  35: i_slint_core::window::WindowInner::update_window_properties
  36: core::ops::function::FnOnce::call_once{{vtable.shim}}
  37: i_slint_core::timers::TimerList::maybe_activate_timers
  38: i_slint_backend_winit::event_loop::EventLoopState::process_event
  39: i_slint_backend_winit::event_loop::EventLoopState::run
  40: <i_slint_backend_winit::Backend as i_slint_core::platform::Platform>::run_event_loop
  41: slint_lsp::main
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
[Info  - 3:07:20 PM] Connection to server got closed. Server will restart.