Skip to content

replace doesn't work on Theia but others like add labels or remove does #18868

@ChayimFriedman2

Description

@ChayimFriedman2

Discussed in #18839

Originally posted by hsnoil January 6, 2025
When using theia, and you have something like this it doesn't work.

enum Pet {
    Cat,
    Dog
}


fn main() {
    let pet = Pet::Cat;
    match pet {
        
    }
}

But if you were to just add like add_label_to_loop, it works:

 fn main() {
     loop {
         break;
         continue;
     }
 }

Another interesting case is this one:

 struct X();
 mod foo {
     use super::X;
 }

If you do "split import" or "remove whole use item" they work but remove all unused imports doesn't.

From the looks of it, replacing with syntax::ted::replace is the issue. Replacing, adding and deleting works unless it touches that function.

Is this an issue with Theia or an underlying issue with how rowan's splice_children works? I know it works with vscode, but sometime things are done in workaround manners (like match arms in analyzer plugin has a bunch of FIXME there)

For now I opened a ticket with Theia:

eclipse-theia/theia#13922

But it has been a while and likely it being rust and not javascript, if someone isn't explicitly familiar with rust I can understand the hesitation to go through it all. Anyone have any idea what the issue can be?

Edit:

I compiled it with with debug=2 and I got this error:

thread 'Worker' panicked at /home/user/Develop/rowan/src/ast.rs:99:9:
tree is mutable
stack backtrace:
   0: rust_begin_unwind
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panicking.rs:652:5
   1: core::panicking::panic_fmt
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/core/src/panicking.rs:72:14
   2: rowan::ast::SyntaxNodePtr<L>::try_to_node
             at /home/user/Develop/rowan/src/ast.rs:99:9
   3: rowan::ast::SyntaxNodePtr<L>::to_node
             at /home/user/Develop/rowan/src/ast.rs:81:9
   4: ide_db::source_change::TreeMutator::make_syntax_mut
             at /home/user/Develop/rust-analyzer-master/crates/ide-db/src/source_change.rs:230:9
   5: ide_db::source_change::SourceChangeBuilder::make_syntax_mut
             at /home/user/Develop/rust-analyzer-master/crates/ide-db/src/source_change.rs:282:9
   6: ide_assists::handlers::add_missing_match_arms::add_missing_match_arms::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/handlers/add_missing_match_arms.rs:274:53
   7: ide_assists::assist_context::Assists::add::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/assist_context.rs:161:65
   8: ide_assists::assist_context::Assists::add_impl
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/assist_context.rs:191:13
   9: ide_assists::assist_context::Assists::add
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/assist_context.rs:161:9
  10: ide_assists::handlers::add_missing_match_arms::add_missing_match_arms
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/handlers/add_missing_match_arms.rs:201:5
  11: ide_assists::assists::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/lib.rs:95:9
  12: <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::for_each
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/core/src/slice/iter/macros.rs:252:21
  13: ide_assists::assists
             at /home/user/Develop/rust-analyzer-master/crates/ide-assists/src/lib.rs:94:5
  14: ide::Analysis::assists_with_fixes::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/ide/src/lib.rs:730:27
  15: ide::Analysis::with_db::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/ide/src/lib.rs:826:29
  16: std::panicking::try::do_call
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panicking.rs:559:40
  17: __rust_try
  18: std::panicking::try
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panicking.rs:523:19
  19: std::panic::catch_unwind
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panic.rs:149:14
  20: salsa::Cancelled::catch
             at /home/user/Develop/rust-analyzer-master/crates/salsa/src/lib.rs:633:15
  21: ide::Analysis::with_db
             at /home/user/Develop/rust-analyzer-master/crates/ide/src/lib.rs:826:9
  22: ide::Analysis::assists_with_fixes
             at /home/user/Develop/rust-analyzer-master/crates/ide/src/lib.rs:719:9
  23: rust_analyzer::handlers::request::handle_code_action_resolve
             at /home/user/Develop/rust-analyzer-master/crates/rust-analyzer/src/handlers/request.rs:1384:19
  24: rust_analyzer::handlers::dispatch::RequestDispatcher::on_with_thread_intent::{{closure}}::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/rust-analyzer/src/handlers/dispatch.rs:219:17
  25: std::panicking::try::do_call
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panicking.rs:559:40
  26: __rust_try
  27: std::panicking::try
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panicking.rs:523:19
  28: std::panic::catch_unwind
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/std/src/panic.rs:149:14
  29: rust_analyzer::handlers::dispatch::RequestDispatcher::on_with_thread_intent::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/rust-analyzer/src/handlers/dispatch.rs:217:26
  30: rust_analyzer::task_pool::TaskPool<T>::spawn::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/rust-analyzer/src/task_pool.rs:26:33
  31: stdx::thread::pool::Pool::spawn::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/stdx/src/thread/pool.rs:82:13
  32: core::ops::function::FnOnce::call_once{{vtable.shim}}
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/core/src/ops/function.rs:250:5
  33: <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once
             at /rustc/3f5fd8dd41153bc5fdca9427e9e05be2c767ba23/library/alloc/src/boxed.rs:2063:9
  34: stdx::thread::pool::Pool::new::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/stdx/src/thread/pool.rs:61:29
  35: stdx::thread::Builder::spawn::{{closure}}
             at /home/user/Develop/rust-analyzer-master/crates/stdx/src/thread.rs:66:13
```</div>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions