Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ark: occasional panic from LSP when typing #340

Closed
kevinushey opened this issue Mar 29, 2023 · 4 comments
Closed

ark: occasional panic from LSP when typing #340

kevinushey opened this issue Mar 29, 2023 · 4 comments
Milestone

Comments

@kevinushey
Copy link
Contributor

Panic:

thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: Char range out of bounds: char range 9..9, Rope/RopeSlice char length 8', /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/ropey-1.6.0/src/rope.rs:546:37
stack backtrace:
   0: rust_begin_unwind
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/std/src/panicking.rs:575:5
   1: core::panicking::panic_fmt
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/panicking.rs:64:14
   2: core::result::unwrap_failed
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/result.rs:1790:5
   3: core::result::Result<T,E>::unwrap
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/result.rs:1112:23
   4: ropey::rope::Rope::remove
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/ropey-1.6.0/src/rope.rs:546:9
   5: ark::lsp::documents::Document::update
             at /Users/kevin/positron/extensions/positron-r/amalthea/crates/ark/src/lsp/documents.rs:128:9
   6: <ark::lsp::backend::Backend as tower_lsp::LanguageServer>::did_change::{{closure}}
             at /Users/kevin/positron/extensions/positron-r/amalthea/crates/ark/src/lsp/backend.rs:283:33
   7: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/future/future.rs:125:9
   8: tower_lsp::generated::register_lsp_methods::did_change::{{closure}}
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tower-lsp-0.19.0/src/lib.rs:112:1
   9: tower_lsp::jsonrpc::router::Router<S,E>::method::{{closure}}::{{closure}}::{{closure}}
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tower-lsp-0.19.0/src/jsonrpc/router.rs:58:63
  10: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/future/future.rs:125:9
  11: <futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/future/future/map.rs:55:37
  12: <futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/lib.rs:91:13
  13: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/future/future.rs:125:9
  14: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/future/future.rs:125:9
  15: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/future/future.rs:125:9
  16: <tower_lsp::service::LspService<S> as tower_service::Service<tower_lsp::jsonrpc::Request>>::call::{{closure}}
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tower-lsp-0.19.0/src/service.rs:124:31
  17: <core::pin::Pin<P> as core::future::future::Future>::poll
             at /rustc/2c8cc343237b8f7d5a3c3703e3a87f2eb2c54a74/library/core/src/future/future.rs:125:9
  18: <F as futures_core::future::TryFuture>::try_poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-core-0.3.27/src/future.rs:82:9
  19: <futures_util::future::try_future::into_future::IntoFuture<Fut> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/future/try_future/into_future.rs:34:9
  20: <futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/future/future/map.rs:55:37
  21: <futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/lib.rs:91:13
  22: <futures_util::future::try_future::UnwrapOrElse<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/lib.rs:91:13
  23: <futures_util::stream::futures_unordered::FuturesUnordered<Fut> as futures_core::stream::Stream>::poll_next
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/futures_unordered/mod.rs:518:17
  24: futures_util::stream::stream::StreamExt::poll_next_unpin
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/stream/mod.rs:1632:9
  25: <futures_util::stream::stream::buffer_unordered::BufferUnordered<St> as futures_core::stream::Stream>::poll_next
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/stream/buffer_unordered.rs:75:15
  26: <futures_util::stream::stream::filter_map::FilterMap<St,Fut,F> as futures_core::stream::Stream>::poll_next
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/stream/filter_map.rs:79:47
  27: <futures_util::stream::stream::map::Map<St,F> as futures_core::stream::Stream>::poll_next
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/stream/map.rs:58:26
  28: <futures_util::stream::stream::fuse::Fuse<S> as futures_core::stream::Stream>::poll_next
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/stream/fuse.rs:53:27
  29: <futures_util::stream::stream::forward::Forward<St,Si,Item> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/stream/stream/forward.rs:59:19
  30: <futures_util::stream::stream::Forward<St,Si> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/lib.rs:91:13
  31: <futures_util::future::future::map::Map<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/future/future/map.rs:55:37
  32: <futures_util::future::future::Map<Fut,F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/lib.rs:91:13
  33: <futures_util::future::maybe_done::MaybeDone<Fut> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/future/maybe_done.rs:95:38
  34: tower_lsp::transport::Server<I,O,L>::serve::{{closure}}::{{closure}}
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/async_await/join_mod.rs:95:13
  35: <futures_util::future::poll_fn::PollFn<F> as core::future::future::Future>::poll
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/futures-util-0.3.27/src/future/poll_fn.rs:56:9
  36: tower_lsp::transport::Server<I,O,L>::serve::{{closure}}
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tower-lsp-0.19.0/src/transport.rs:163:9
  37: ark::lsp::backend::start_lsp::{{closure}}
             at /Users/kevin/positron/extensions/positron-r/amalthea/crates/ark/src/lsp/backend.rs:608:52
  38: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/park.rs:283:63
  39: tokio::runtime::coop::with_budget
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/coop.rs:107:5
  40: tokio::runtime::coop::budget
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/coop.rs:73:5
  41: tokio::runtime::park::CachedParkThread::block_on
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/park.rs:283:31
  42: tokio::runtime::context::BlockingRegionGuard::block_on
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/context.rs:315:13
  43: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/scheduler/multi_thread/mod.rs:66:9
  44: tokio::runtime::runtime::Runtime::block_on
             at /Users/kevin/.cargo/registry/src/github.aaakk.us.kg-1ecc6299db9ec823/tokio-1.27.0/src/runtime/runtime.rs:304:45
  45: ark::lsp::backend::start_lsp
             at /Users/kevin/positron/extensions/positron-r/amalthea/crates/ark/src/lsp/backend.rs:609:5
  46: <ark::lsp::handler::Lsp as amalthea::language::lsp_handler::LspHandler>::start::{{closure}}
             at /Users/kevin/positron/extensions/positron-r/amalthea/crates/ark/src/lsp/handler.rs:51:31
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

LSP logs:

[Info  - 1:02:25 PM] did_open(inmemory:/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd
[Info  - 1:02:30 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 2 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }), range_length: Some(0), text: "l" }] })
[Info  - 1:02:30 PM] completion(CompletionParams { text_document_position: TextDocumentPositionParams { text_document: TextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None } }, position: Position { line: 0, character: 1 } }, work_done_progress_params: WorkDoneProgressParams { work_done_token: None }, partial_result_params: PartialResultParams { partial_result_token: None }, context: Some(CompletionContext { trigger_kind: Invoked, trigger_character: None }) })
[Info  - 1:02:30 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 3 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 1 }, end: Position { line: 0, character: 1 } }), range_length: Some(0), text: "i" }] })
[Info  - 1:02:30 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 4 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 2 }, end: Position { line: 0, character: 2 } }), range_length: Some(0), text: "s" }] })
[Info  - 1:02:30 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 5 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 3 }, end: Position { line: 0, character: 3 } }), range_length: Some(0), text: "t" }] })
[Info  - 1:02:31 PM] completion_resolve(CompletionItem { label: "list", label_details: None, kind: Some(Function), detail: Some("list(...)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3list"), filter_text: None, insert_text: Some("list($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("list"), "package": String("0x12000e470")}}), tags: None })
[Info  - 1:02:31 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 6 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 4 }, end: Position { line: 0, character: 4 } }), range_length: Some(0), text: "." }] })
[Info  - 1:02:31 PM] completion_resolve(CompletionItem { label: "list.dirs", label_details: None, kind: Some(Function), detail: Some("list.dirs(path, full.names, recursive)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3list.dirs"), filter_text: None, insert_text: Some("list.dirs($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("list.dirs"), "package": String("0x12000e470")}}), tags: None })
[Info  - 1:02:31 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 7 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 5 }, end: Position { line: 0, character: 5 } }), range_length: Some(0), text: "f" }] })
[Info  - 1:02:31 PM] completion_resolve(CompletionItem { label: "list.files", label_details: None, kind: Some(Function), detail: Some("list.files(path, pattern, all.files, full.names, recursive, ignore.case, include.dirs, no..)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3list.files"), filter_text: None, insert_text: Some("list.files($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("list.files"), "package": String("0x12000e470")}}), tags: None })
[Info  - 1:02:31 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 8 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 6 }, end: Position { line: 0, character: 6 } }), range_length: Some(0), text: "i" }] })
[Info  - 1:02:31 PM] completion_resolve(CompletionItem { label: "list.files", label_details: None, kind: Some(Function), detail: Some("list.files(path, pattern, all.files, full.names, recursive, ignore.case, include.dirs, no..)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3list.files"), filter_text: None, insert_text: Some("list.files($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("list.files"), "package": String("0x12000e470")}}), tags: None })
[Info  - 1:02:31 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 9 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 7 }, end: Position { line: 0, character: 7 } }), range_length: Some(0), text: "l" }] })
[Info  - 1:02:31 PM] completion_resolve(CompletionItem { label: "list.files", label_details: None, kind: Some(Function), detail: Some("list.files(path, pattern, all.files, full.names, recursive, ignore.case, include.dirs, no..)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3list.files"), filter_text: None, insert_text: Some("list.files($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("list.files"), "package": String("0x12000e470")}}), tags: None })
[Info  - 1:02:31 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-15232d0c-6e85-4456-8c01-7a172fea59bd", query: None, fragment: None }, version: 10 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 8 }, end: Position { line: 0, character: 8 } }), range_length: Some(0), text: "e" }] })
[Info  - 1:02:31 PM] completion_resolve(CompletionItem { label: "list.files", label_details: None, kind: Some(Function), detail: Some("list.files(path, pattern, all.files, full.names, recursive, ignore.case, include.dirs, no..)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3list.files"), filter_text: None, insert_text: Some("list.files($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("list.files"), "package": String("0x12000e470")}}), tags: None })
@kevinushey kevinushey added this to the Internal Preview milestone Mar 29, 2023
@kevinushey kevinushey reopened this Mar 30, 2023
@kevinushey
Copy link
Contributor Author

Saw this again, unfortunately:

[Info  - 2:46:50 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 2 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 0 } }), range_length: Some(0), text: "S" }] })
[Info  - 2:46:50 PM] completion(CompletionParams { text_document_position: TextDocumentPositionParams { text_document: TextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None } }, position: Position { line: 0, character: 1 } }, work_done_progress_params: WorkDoneProgressParams { work_done_token: None }, partial_result_params: PartialResultParams { partial_result_token: None }, context: Some(CompletionContext { trigger_kind: Invoked, trigger_character: None }) })
[Info  - 2:46:50 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 3 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 1 }, end: Position { line: 0, character: 1 } }), range_length: Some(0), text: "y" }] })
[Info  - 2:46:50 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 4 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 2 }, end: Position { line: 0, character: 2 } }), range_length: Some(0), text: "s" }] })
[Info  - 2:46:50 PM] completion_resolve(CompletionItem { label: "sys", label_details: None, kind: Some(Module), detail: None, documentation: None, deprecated: None, preselect: None, sort_text: Some("3sys"), filter_text: None, insert_text: Some("sys::"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Suggest", command: "editor.action.triggerSuggest", arguments: None }), commit_characters: None, data: Some(Object {"Package": Object {"name": String("sys")}}), tags: None })
[Info  - 2:46:50 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 5 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 3 }, end: Position { line: 0, character: 3 } }), range_length: Some(0), text: "." }] })
[Info  - 2:46:50 PM] completion_resolve(CompletionItem { label: "Sys.chmod", label_details: None, kind: Some(Function), detail: Some("Sys.chmod(paths, mode, use_umask)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3Sys.chmod"), filter_text: None, insert_text: Some("Sys.chmod($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("Sys.chmod"), "package": String("0x14880be70")}}), tags: None })
[Info  - 2:46:51 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 6 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 4 }, end: Position { line: 0, character: 4 } }), range_length: Some(0), text: "g" }] })
[Info  - 2:46:51 PM] completion_resolve(CompletionItem { label: "Sys.getenv", label_details: None, kind: Some(Function), detail: Some("Sys.getenv(x, unset, names)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3Sys.getenv"), filter_text: None, insert_text: Some("Sys.getenv($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("Sys.getenv"), "package": String("0x14880be70")}}), tags: None })
[Info  - 2:46:51 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 7 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 5 }, end: Position { line: 0, character: 5 } }), range_length: Some(0), text: "e" }] })
[Info  - 2:46:51 PM] completion_resolve(CompletionItem { label: "Sys.getenv", label_details: None, kind: Some(Function), detail: Some("Sys.getenv(x, unset, names)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3Sys.getenv"), filter_text: None, insert_text: Some("Sys.getenv($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("Sys.getenv"), "package": String("0x14880be70")}}), tags: None })
[Info  - 2:46:51 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 8 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 6 }, end: Position { line: 0, character: 6 } }), range_length: Some(0), text: "t" }] })
[Info  - 2:46:51 PM] completion_resolve(CompletionItem { label: "Sys.getenv", label_details: None, kind: Some(Function), detail: Some("Sys.getenv(x, unset, names)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3Sys.getenv"), filter_text: None, insert_text: Some("Sys.getenv($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("Sys.getenv"), "package": String("0x14880be70")}}), tags: None })
[Info  - 2:46:51 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 9 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 7 }, end: Position { line: 0, character: 7 } }), range_length: Some(0), text: "e" }] })
[Info  - 2:46:51 PM] completion_resolve(CompletionItem { label: "Sys.getenv", label_details: None, kind: Some(Function), detail: Some("Sys.getenv(x, unset, names)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3Sys.getenv"), filter_text: None, insert_text: Some("Sys.getenv($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("Sys.getenv"), "package": String("0x14880be70")}}), tags: None })
[Info  - 2:46:51 PM] did_change(DidChangeTextDocumentParams { text_document: VersionedTextDocumentIdentifier { uri: Url { scheme: "inmemory", cannot_be_a_base: false, username: "", password: None, host: None, port: None, path: "/repl-r-6cc9a787-4352-45f6-8914-bef569341176", query: None, fragment: None }, version: 10 }, content_changes: [TextDocumentContentChangeEvent { range: Some(Range { start: Position { line: 0, character: 8 }, end: Position { line: 0, character: 8 } }), range_length: Some(0), text: "n" }] })
[Info  - 2:46:51 PM] completion_resolve(CompletionItem { label: "Sys.getenv", label_details: None, kind: Some(Function), detail: Some("Sys.getenv(x, unset, names)"), documentation: None, deprecated: None, preselect: None, sort_text: Some("3Sys.getenv"), filter_text: None, insert_text: Some("Sys.getenv($0)"), insert_text_format: Some(Snippet), insert_text_mode: None, text_edit: None, additional_text_edits: None, command: Some(Command { title: "Trigger Parameter Hints", command: "editor.action.triggerParameterHints", arguments: None }), commit_characters: None, data: Some(Object {"Function": Object {"name": String("Sys.getenv"), "package": String("0x14880be70")}}), tags: None })

@kevinushey
Copy link
Contributor Author

I'm able to reproduce somewhat consistently with these steps:

  1. Start a new R session in Positron,
  2. Start typing Sys.getenv(), as quickly as you can.

When I do this with some extra debugging output, I see:

Inserting text: S at 0
Inserting text: y at 1
Inserting text: s at 2
Inserting text: . at 3
Inserting text: g at 4
Inserting text: e at 5
Inserting text: t at 6
Inserting text: e at 7
Inserting text: v at 9

So it almost seems like certain edits are being dropped for some reason -- will need to dive deeper.

Of course, this example which was briefly reproducing 99% of the time now reproduces 1% of the time. 😞

@kevinushey
Copy link
Contributor Author

Okay, I can reproduce more readily by forcing some latency by making completion_resolve take an extra one second (force the thread to sleep). Some more output below.

My guess is that we need to do some checks on the 'version' of the document being updated, to catch cases where the 'did_change' events are received out-of-order.

DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 2,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 0,
                    },
                    end: Position {
                        line: 0,
                        character: 0,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "S",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 3,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 1,
                    },
                    end: Position {
                        line: 0,
                        character: 1,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "y",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 4,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 2,
                    },
                    end: Position {
                        line: 0,
                        character: 2,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "s",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 5,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 3,
                    },
                    end: Position {
                        line: 0,
                        character: 3,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: ".",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 6,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 4,
                    },
                    end: Position {
                        line: 0,
                        character: 4,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "g",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 7,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 5,
                    },
                    end: Position {
                        line: 0,
                        character: 5,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "e",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 8,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 6,
                    },
                    end: Position {
                        line: 0,
                        character: 6,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "t",
        },
    ],
}
DidChangeTextDocumentParams {
    text_document: VersionedTextDocumentIdentifier {
        uri: Url {
            scheme: "inmemory",
            cannot_be_a_base: false,
            username: "",
            password: None,
            host: None,
            port: None,
            path: "/repl-r-7578d9e4-20ce-41f2-b6cf-28eb17ea36fa",
            query: None,
            fragment: None,
        },
        version: 10,
    },
    content_changes: [
        TextDocumentContentChangeEvent {
            range: Some(
                Range {
                    start: Position {
                        line: 0,
                        character: 8,
                    },
                    end: Position {
                        line: 0,
                        character: 8,
                    },
                },
            ),
            range_length: Some(
                0,
            ),
            text: "n",
        },
    ],
}

@kevinushey
Copy link
Contributor Author

Closed via 6c0f1a9.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant