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

Workspace symbol search does not support special characters #5714

Closed
frondeus opened this issue Jan 28, 2023 · 7 comments · Fixed by #9647
Closed

Workspace symbol search does not support special characters #5714

frondeus opened this issue Jan 28, 2023 · 7 comments · Fixed by #9647
Labels
A-helix-term Area: Helix term improvements C-bug Category: This is a bug

Comments

@frondeus
Copy link

Summary

Rust analyzer has a feature where if you type * at the end of the workspace symbol search, it does include STDLIB.
However, the helix editor cannot display it correctly.

You can see, actually, that something is sent since the result count changes from 0/1 to 0/6, AND when you press backspace (to remove *), it shows the results for a fraction of a second.

Reproduction Steps

https://asciinema.org/a/oCCBJaSXXysbECQc3nw2FlVpR

  1. Open any Rust workspace;
  2. Wait till the indexing finishes;
  3. Press CTRL+SHIFT+S
  4. type Mutex - there should be no results from stdlib.
  5. add * at the end

Expected behavior:
Helix should display the response from the server with Mutex entry from stdlib, as well as from dependencies, etc.

Actual behavior:
An empty list with the correct result count.

Additionally:

  1. Remove * from the input

Suddenly for a couple of milliseconds, Helix shows the results of Mutex* query.

Helix log

~/.cache/helix/helix.log
2023-01-28T18:27:59.233 helix_loader [DEBUG] Located configuration folders: ["/tmp/helix-demo/.helix"]
2023-01-28T18:27:59.242 helix_view::clipboard [INFO] Using xclip to interact with the system and selection (primary) clipboard
2023-01-28T18:27:59.243 globset [DEBUG] glob converted to regex: Glob { glob: "*.{zip,gz,bz2,zst,lzo,sz,tgz,tbz2,lz,lz4,lzma,lzo,z,Z,xz,7z,rar,cab}", re: "(?-u)^[^/]*\\.(cab|rar|7z|xz|Z|z|lzo|lzma|lz4|lz|tbz2|tgz|sz|lzo|zst|bz2|gz|zip)$", opts: GlobOptions { case_insensitive: false, literal_separator: true, backslash_escape: true }, tokens: Tokens([ZeroOrMore, Literal('.'), Alternates([Tokens([Literal('c'), Literal('a'), Literal('b')]), Tokens([Literal('r'), Literal('a'), Literal('r')]), Tokens([Literal('7'), Literal('z')]), Tokens([Literal('x'), Literal('z')]), Tokens([Literal('Z')]), Tokens([Literal('z')]), Tokens([Literal('l'), Literal('z'), Literal('o')]), Tokens([Literal('l'), Literal('z'), Literal('m'), Literal('a')]), Tokens([Literal('l'), Literal('z'), Literal('4')]), Tokens([Literal('l'), Literal('z')]), Tokens([Literal('t'), Literal('b'), Literal('z'), Literal('2')]), Tokens([Literal('t'), Literal('g'), Literal('z')]), Tokens([Literal('s'), Literal('z')]), Tokens([Literal('l'), Literal('z'), Literal('o')]), Tokens([Literal('z'), Literal('s'), Literal('t')]), Tokens([Literal('b'), Literal('z'), Literal('2')]), Tokens([Literal('g'), Literal('z')]), Tokens([Literal('z'), Literal('i'), Literal('p')])])]) }
2023-01-28T18:27:59.243 globset [DEBUG] built glob set; 0 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 1 regexes
2023-01-28T18:27:59.243 globset [DEBUG] built glob set; 1 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes
2023-01-28T18:27:59.243 ignore::walk [DEBUG] ignoring ./target: Ignore(IgnoreMatch(Gitignore(Glob { from: Some("./.gitignore"), original: "/target", actual: "target", is_whitelist: false, is_only_dir: false })))
2023-01-28T18:27:59.243 ignore::walk [DEBUG] ignoring ./.gitignore: Ignore(IgnoreMatch(Hidden))
2023-01-28T18:27:59.243 ignore::walk [DEBUG] ignoring ./.git: Ignore(IgnoreMatch(Hidden))
2023-01-28T18:27:59.243 helix_term::ui [DEBUG] file_picker init 670.78µs
2023-01-28T18:27:59.243 mio::poll [TRACE] registering event source with poller: token=Token(0), interests=READABLE | WRITABLE
2023-01-28T18:27:59.243 mio::poll [TRACE] registering event source with poller: token=Token(1), interests=READABLE | WRITABLE
2023-01-28T18:27:59.243 mio::poll [TRACE] registering event source with poller: token=Token(0), interests=READABLE
2023-01-28T18:27:59.243 mio::poll [TRACE] registering event source with poller: token=Token(1), interests=READABLE
2023-01-28T18:27:59.243 helix_view::document [DEBUG] id 1 modified - last saved: 0, current: 0
2023-01-28T18:27:59.644 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:27:59.645 helix_view::document [DEBUG] id 1 modified - last saved: 0, current: 0
2023-01-28T18:28:00.288 helix_view::document [DEBUG] id 1 modified - last saved: 0, current: 0
2023-01-28T18:28:00.466 helix_view::document [DEBUG] id 1 modified - last saved: 0, current: 0
2023-01-28T18:28:00.757 mio::poll [TRACE] registering event source with poller: token=Token(2), interests=READABLE | WRITABLE
2023-01-28T18:28:00.757 mio::poll [TRACE] registering event source with poller: token=Token(3), interests=READABLE | WRITABLE
2023-01-28T18:28:00.757 mio::poll [TRACE] registering event source with poller: token=Token(4), interests=READABLE | WRITABLE
2023-01-28T18:28:00.758 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"completion":{"completionItem":{"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]},"snippetSupport":false},"completionItemKind":{}},"hover":{"contentFormat":["markdown"]},"publishDiagnostics":{},"rename":{"dynamicRegistration":false,"honorsChangeAnnotations":false,"prepareSupport":false},"signatureHelp":{"signatureInformation":{"activeParameterSupport":true,"documentationFormat":["markdown"],"parameterInformation":{"labelOffsetSupport":true}}}},"window":{"workDoneProgress":true},"workspace":{"applyEdit":true,"configuration":true,"didChangeConfiguration":{"dynamicRegistration":false},"executeCommand":{"dynamicRegistration":false},"symbol":{"dynamicRegistration":false},"workspaceFolders":true}},"clientInfo":{"name":"helix","version":"22.12 (2c6bf6fc)"},"processId":1280565,"rootPath":"/tmp/helix-demo","rootUri":"file:///tmp/helix-demo","workspaceFolders":[{"name":"helix-demo","uri":"file:///tmp/helix-demo"}]},"id":0}
2023-01-28T18:28:00.758 helix_view::document [DEBUG] id 1 modified - last saved: 0, current: 0
2023-01-28T18:28:00.758 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:00.760 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":0,"result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"selectionRangeProvider":true,"hoverProvider":true,"completionProvider":{"resolveProvider":true,"triggerCharacters":[":",".","'","("],"completionItem":{"labelDetailsSupport":false}},"signatureHelpProvider":{"triggerCharacters":["(",",","<"]},"definitionProvider":true,"typeDefinitionProvider":true,"implementationProvider":true,"referencesProvider":true,"documentHighlightProvider":true,"documentSymbolProvider":true,"workspaceSymbolProvider":true,"codeActionProvider":{"codeActionKinds":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite"],"resolveProvider":true},"codeLensProvider":{"resolveProvider":true},"documentFormattingProvider":true,"documentRangeFormattingProvider":false,"documentOnTypeFormattingProvider":{"firstTriggerCharacter":"=","moreTriggerCharacter":[".",">","{"]},"renameProvider":{"prepareProvider":true},"foldingRangeProvider":true,"declarationProvider":true,"workspace":{"fileOperations":{"willRename":{"filters":[{"scheme":"file","pattern":{"glob":"**/*.rs","matches":"file"}},{"scheme":"file","pattern":{"glob":"**","matches":"folder"}}]}}},"callHierarchyProvider":true,"semanticTokensProvider":{"legend":{"tokenTypes":["comment","decorator","enumMember","enum","function","interface","keyword","macro","method","namespace","number","operator","parameter","property","string","struct","typeParameter","variable","angle","arithmetic","attribute","attributeBracket","bitwise","boolean","brace","bracket","builtinAttribute","builtinType","character","colon","comma","comparison","constParameter","derive","deriveHelper","dot","escapeSequence","formatSpecifier","generic","label","lifetime","logical","macroBang","parenthesis","punctuation","selfKeyword","selfTypeKeyword","semicolon","typeAlias","toolModule","union","unresolvedReference"],"tokenModifiers":["documentation","declaration","static","defaultLibrary","async","attribute","callable","constant","consuming","controlFlow","crateRoot","injected","intraDocLink","library","mutable","public","reference","trait","unsafe"]},"range":true,"full":{"delta":true}},"inlayHintProvider":{"resolveProvider":true},"experimental":{"externalDocs":true,"hoverRange":true,"joinLines":true,"matchingBrace":true,"moveItem":true,"onEnter":true,"openCargoToml":true,"parentModule":true,"runnables":{"kinds":["cargo"]},"ssr":true,"workspaceSymbolScopeKindFiltering":true}},"serverInfo":{"name":"rust-analyzer","version":"0.0.0 (21e61bee8 2022-12-10)"}}}
2023-01-28T18:28:00.760 helix_lsp::transport [INFO] <- {"capabilities":{"callHierarchyProvider":true,"codeActionProvider":{"codeActionKinds":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite"],"resolveProvider":true},"codeLensProvider":{"resolveProvider":true},"completionProvider":{"completionItem":{"labelDetailsSupport":false},"resolveProvider":true,"triggerCharacters":[":",".","'","("]},"declarationProvider":true,"definitionProvider":true,"documentFormattingProvider":true,"documentHighlightProvider":true,"documentOnTypeFormattingProvider":{"firstTriggerCharacter":"=","moreTriggerCharacter":[".",">","{"]},"documentRangeFormattingProvider":false,"documentSymbolProvider":true,"experimental":{"externalDocs":true,"hoverRange":true,"joinLines":true,"matchingBrace":true,"moveItem":true,"onEnter":true,"openCargoToml":true,"parentModule":true,"runnables":{"kinds":["cargo"]},"ssr":true,"workspaceSymbolScopeKindFiltering":true},"foldingRangeProvider":true,"hoverProvider":true,"implementationProvider":true,"inlayHintProvider":{"resolveProvider":true},"referencesProvider":true,"renameProvider":{"prepareProvider":true},"selectionRangeProvider":true,"semanticTokensProvider":{"full":{"delta":true},"legend":{"tokenModifiers":["documentation","declaration","static","defaultLibrary","async","attribute","callable","constant","consuming","controlFlow","crateRoot","injected","intraDocLink","library","mutable","public","reference","trait","unsafe"],"tokenTypes":["comment","decorator","enumMember","enum","function","interface","keyword","macro","method","namespace","number","operator","parameter","property","string","struct","typeParameter","variable","angle","arithmetic","attribute","attributeBracket","bitwise","boolean","brace","bracket","builtinAttribute","builtinType","character","colon","comma","comparison","constParameter","derive","deriveHelper","dot","escapeSequence","formatSpecifier","generic","label","lifetime","logical","macroBang","parenthesis","punctuation","selfKeyword","selfTypeKeyword","semicolon","typeAlias","toolModule","union","unresolvedReference"]},"range":true},"signatureHelpProvider":{"triggerCharacters":["(",",","<"]},"textDocumentSync":{"change":2,"openClose":true,"save":{}},"typeDefinitionProvider":true,"workspace":{"fileOperations":{"willRename":{"filters":[{"pattern":{"glob":"**/*.rs","matches":"file"},"scheme":"file"},{"pattern":{"glob":"**","matches":"folder"},"scheme":"file"}]}}},"workspaceSymbolProvider":true},"serverInfo":{"name":"rust-analyzer","version":"0.0.0 (21e61bee8 2022-12-10)"}}
2023-01-28T18:28:00.760 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"initialized","params":{}}
2023-01-28T18:28:00.760 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: None, method: "initialized", params: None })))
2023-01-28T18:28:00.760 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"rust","text":"fn main() {\n    println!(\"Hello, world!\");\n}\n","uri":"file:///tmp/helix-demo/src/main.rs","version":0}}}
2023-01-28T18:28:00.760 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:00.762 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":0,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Fetching"}}
2023-01-28T18:28:00.762 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"begin","title":"Fetching","cancellable":false}}}
2023-01-28T18:28:00.762 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Fetching")}), id: Num(0) })))
2023-01-28T18:28:00.762 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "title": String("Fetching")}}) })))
2023-01-28T18:28:00.762 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Fetching] Fetching
2023-01-28T18:28:00.762 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":0}
2023-01-28T18:28:00.842 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"report","cancellable":false,"message":"metadata"}}}
2023-01-28T18:28:00.842 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("metadata")}}) })))
2023-01-28T18:28:00.842 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Fetching] metadata
2023-01-28T18:28:00.842 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.015 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"end"}}}
2023-01-28T18:28:01.015 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":1,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Roots Scanned"}}
2023-01-28T18:28:01.015 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Roots Scanned","value":{"kind":"begin","title":"Roots Scanned","cancellable":false,"message":"0/2","percentage":0}}}
2023-01-28T18:28:01.015 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":2,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Fetching"}}
2023-01-28T18:28:01.015 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"begin","title":"Fetching","cancellable":false}}}
2023-01-28T18:28:01.015 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Roots Scanned","value":{"kind":"report","cancellable":false,"message":"1/2","percentage":50}}}
2023-01-28T18:28:01.015 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"kind": String("end")}}) })))
2023-01-28T18:28:01.016 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.016 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Roots Scanned")}), id: Num(1) })))
2023-01-28T18:28:01.016 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Roots Scanned"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "message": String("0/2"), "percentage": Number(0), "title": String("Roots Scanned")}}) })))
2023-01-28T18:28:01.016 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Roots Scanned] 0% Roots Scanned - 0/2
2023-01-28T18:28:01.016 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":1}
2023-01-28T18:28:01.016 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Fetching")}), id: Num(2) })))
2023-01-28T18:28:01.016 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":2}
2023-01-28T18:28:01.016 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "title": String("Fetching")}}) })))
2023-01-28T18:28:01.016 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Fetching] Fetching
2023-01-28T18:28:01.016 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Roots Scanned"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("1/2"), "percentage": Number(50)}}) })))
2023-01-28T18:28:01.016 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Roots Scanned] 50% 1/2
2023-01-28T18:28:01.029 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Roots Scanned","value":{"kind":"end","message":"2/2"}}}
2023-01-28T18:28:01.029 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Roots Scanned"), "value": Object {"kind": String("end"), "message": String("2/2")}}) })))
2023-01-28T18:28:01.029 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Roots Scanned] 2/2
2023-01-28T18:28:01.096 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"report","cancellable":false,"message":"metadata"}}}
2023-01-28T18:28:01.096 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("metadata")}}) })))
2023-01-28T18:28:01.096 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Fetching] metadata
2023-01-28T18:28:01.096 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.128 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:01.212 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"end"}}}
2023-01-28T18:28:01.212 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":3,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Fetching"}}
2023-01-28T18:28:01.212 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"begin","title":"Fetching","cancellable":false}}}
2023-01-28T18:28:01.212 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"kind": String("end")}}) })))
2023-01-28T18:28:01.212 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.212 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Fetching")}), id: Num(3) })))
2023-01-28T18:28:01.212 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "title": String("Fetching")}}) })))
2023-01-28T18:28:01.212 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Fetching] Fetching
2023-01-28T18:28:01.212 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":3}
2023-01-28T18:28:01.291 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"report","cancellable":false,"message":"metadata"}}}
2023-01-28T18:28:01.291 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("metadata")}}) })))
2023-01-28T18:28:01.292 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Fetching] metadata
2023-01-28T18:28:01.292 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.409 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Fetching","value":{"kind":"end"}}}
2023-01-28T18:28:01.409 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Fetching"), "value": Object {"kind": String("end")}}) })))
2023-01-28T18:28:01.409 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.409 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":4,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Loading"}}
2023-01-28T18:28:01.409 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Loading","value":{"kind":"begin","title":"Loading","cancellable":false}}}
2023-01-28T18:28:01.409 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Loading")}), id: Num(4) })))
2023-01-28T18:28:01.409 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Loading"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "title": String("Loading")}}) })))
2023-01-28T18:28:01.409 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Loading] Loading
2023-01-28T18:28:01.409 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":4}
2023-01-28T18:28:01.557 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Loading","value":{"kind":"report","cancellable":false,"message":"building proc-macros: helix-demo"}}}
2023-01-28T18:28:01.557 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Loading","value":{"kind":"report","cancellable":false,"message":"building proc-macros: helix-demo"}}}
2023-01-28T18:28:01.557 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Loading"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("building proc-macros: helix-demo")}}) })))
2023-01-28T18:28:01.557 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Loading] building proc-macros: helix-demo
2023-01-28T18:28:01.557 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.557 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Loading"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("building proc-macros: helix-demo")}}) })))
2023-01-28T18:28:01.557 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Loading] building proc-macros: helix-demo
2023-01-28T18:28:01.567 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Loading","value":{"kind":"end"}}}
2023-01-28T18:28:01.567 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":5,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Roots Scanned"}}
2023-01-28T18:28:01.567 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Roots Scanned","value":{"kind":"begin","title":"Roots Scanned","cancellable":false,"message":"0/2","percentage":0}}}
2023-01-28T18:28:01.567 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Roots Scanned","value":{"kind":"report","cancellable":false,"message":"1/2","percentage":50}}}
2023-01-28T18:28:01.567 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Loading"), "value": Object {"kind": String("end")}}) })))
2023-01-28T18:28:01.567 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Roots Scanned")}), id: Num(5) })))
2023-01-28T18:28:01.567 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Roots Scanned"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "message": String("0/2"), "percentage": Number(0), "title": String("Roots Scanned")}}) })))
2023-01-28T18:28:01.567 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":5}
2023-01-28T18:28:01.567 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Roots Scanned] 0% Roots Scanned - 0/2
2023-01-28T18:28:01.567 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Roots Scanned"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("1/2"), "percentage": Number(50)}}) })))
2023-01-28T18:28:01.567 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Roots Scanned] 50% 1/2
2023-01-28T18:28:01.582 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Roots Scanned","value":{"kind":"end","message":"2/2"}}}
2023-01-28T18:28:01.582 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Roots Scanned"), "value": Object {"kind": String("end"), "message": String("2/2")}}) })))
2023-01-28T18:28:01.582 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Roots Scanned] 2/2
2023-01-28T18:28:01.582 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":6,"method":"window/workDoneProgress/create","params":{"token":"rustAnalyzer/Indexing"}}
2023-01-28T18:28:01.582 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"begin","title":"Indexing","cancellable":false,"percentage":0}}}
2023-01-28T18:28:01.582 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.583 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rustAnalyzer/Indexing")}), id: Num(6) })))
2023-01-28T18:28:01.583 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("begin"), "percentage": Number(0), "title": String("Indexing")}}) })))
2023-01-28T18:28:01.583 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 0% Indexing
2023-01-28T18:28:01.583 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":6}
2023-01-28T18:28:01.583 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"message":"0/5 (core)","percentage":0}}}
2023-01-28T18:28:01.583 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"message":"0/5 (core + 1 more)","percentage":0}}}
2023-01-28T18:28:01.583 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("0/5 (core)"), "percentage": Number(0)}}) })))
2023-01-28T18:28:01.583 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 0% 0/5 (core)
2023-01-28T18:28:01.583 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("0/5 (core + 1 more)"), "percentage": Number(0)}}) })))
2023-01-28T18:28:01.583 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 0% 0/5 (core + 1 more)
2023-01-28T18:28:01.606 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"message":"1/5 (core)","percentage":20}}}
2023-01-28T18:28:01.606 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("1/5 (core)"), "percentage": Number(20)}}) })))
2023-01-28T18:28:01.606 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 20% 1/5 (core)
2023-01-28T18:28:01.606 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.637 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":7,"method":"window/workDoneProgress/create","params":{"token":"rust-analyzer/checkOnSave/0"}}
2023-01-28T18:28:01.637 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rust-analyzer/checkOnSave/0","value":{"kind":"begin","title":"cargo check","cancellable":true}}}
2023-01-28T18:28:01.637 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, MethodCall(MethodCall { jsonrpc: Some(V2), method: "window/workDoneProgress/create", params: Map({"token": String("rust-analyzer/checkOnSave/0")}), id: Num(7) })))
2023-01-28T18:28:01.637 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","result":null,"id":7}
2023-01-28T18:28:01.637 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:01.637 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rust-analyzer/checkOnSave/0"), "value": Object {"cancellable": Bool(true), "kind": String("begin"), "title": String("cargo check")}}) })))
2023-01-28T18:28:01.637 helix_view::editor [DEBUG] editor status: [rust-analyzer/checkOnSave/0] cargo check
2023-01-28T18:28:01.791 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rust-analyzer/checkOnSave/0","value":{"kind":"end"}}}
2023-01-28T18:28:01.791 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rust-analyzer/checkOnSave/0"), "value": Object {"kind": String("end")}}) })))
2023-01-28T18:28:01.791 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:03.073 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"message":"2/5 (alloc)","percentage":40}}}
2023-01-28T18:28:03.073 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("2/5 (alloc)"), "percentage": Number(40)}}) })))
2023-01-28T18:28:03.073 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 40% 2/5 (alloc)
2023-01-28T18:28:03.073 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:03.196 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"percentage":60}}}
2023-01-28T18:28:03.196 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"message":"3/5 (std)","percentage":60}}}
2023-01-28T18:28:03.196 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "percentage": Number(60)}}) })))
2023-01-28T18:28:03.196 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 60%
2023-01-28T18:28:03.196 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:03.196 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("3/5 (std)"), "percentage": Number(60)}}) })))
2023-01-28T18:28:03.196 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 60% 3/5 (std)
2023-01-28T18:28:03.473 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"percentage":80}}}
2023-01-28T18:28:03.473 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "percentage": Number(80)}}) })))
2023-01-28T18:28:03.473 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"message":"4/5 (proc_macro)","percentage":80}}}
2023-01-28T18:28:03.473 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 80%
2023-01-28T18:28:03.473 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:03.473 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "message": String("4/5 (proc_macro)"), "percentage": Number(80)}}) })))
2023-01-28T18:28:03.473 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 80% 4/5 (proc_macro)
2023-01-28T18:28:03.521 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"report","cancellable":false,"percentage":100}}}
2023-01-28T18:28:03.521 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"$/progress","params":{"token":"rustAnalyzer/Indexing","value":{"kind":"end"}}}
2023-01-28T18:28:03.521 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"cancellable": Bool(false), "kind": String("report"), "percentage": Number(100)}}) })))
2023-01-28T18:28:03.521 helix_view::editor [DEBUG] editor status: [rustAnalyzer/Indexing] 100%
2023-01-28T18:28:03.521 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:03.521 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "$/progress", params: Map({"token": String("rustAnalyzer/Indexing"), "value": Object {"kind": String("end")}}) })))
2023-01-28T18:28:04.547 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/helix-demo/src/main.rs","diagnostics":[],"version":0}}
2023-01-28T18:28:04.547 helix_term::application [DEBUG] received editor event: LanguageServerMessage((0, Notification(Notification { jsonrpc: Some(V2), method: "textDocument/publishDiagnostics", params: Map({"diagnostics": Array [], "uri": String("file:///tmp/helix-demo/src/main.rs"), "version": Number(0)}) })))
2023-01-28T18:28:04.547 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:05.976 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:06.377 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:06.693 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:06.694 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"workspace/symbol","params":{"query":""},"id":1}
2023-01-28T18:28:06.698 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":1,"result":[{"name":"main","kind":12,"location":{"uri":"file:///tmp/helix-demo/src/main.rs","range":{"start":{"line":0,"character":0},"end":{"line":2,"character":1}}}}]}
2023-01-28T18:28:06.698 helix_lsp::transport [INFO] <- [{"kind":12,"location":{"range":{"end":{"character":1,"line":2},"start":{"character":0,"line":0}},"uri":"file:///tmp/helix-demo/src/main.rs"},"name":"main"}]
2023-01-28T18:28:06.699 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:07.094 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:07.094 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:08.219 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:08.383 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:08.660 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:08.730 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:09.058 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:09.390 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:09.791 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:09.792 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:09.792 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"workspace/symbol","params":{"query":"Mutex*"},"id":2}
2023-01-28T18:28:11.337 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":2,"result":[{"name":"MovableMutex","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/mutex.rs","range":{"start":{"line":2,"character":0},"end":{"line":12,"character":43}}}},{"name":"Mutex","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs","range":{"start":{"line":9,"character":0},"end":{"line":168,"character":1}}}},{"name":"MutexGuard","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs","range":{"start":{"line":177,"character":0},"end":{"line":198,"character":1}}}},{"name":"ReentrantMutex","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs","range":{"start":{"line":9,"character":0},"end":{"line":45,"character":1}}}},{"name":"ReentrantMutexGuard","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs","range":{"start":{"line":53,"character":0},"end":{"line":68,"character":1}}}},{"name":"SameMutexCheck","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/condvar/check.rs","range":{"start":{"line":16,"character":0},"end":{"line":18,"character":1}}}}]}
2023-01-28T18:28:11.338 helix_lsp::transport [INFO] <- [{"kind":23,"location":{"range":{"end":{"character":43,"line":12},"start":{"character":0,"line":2}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/mutex.rs"},"name":"MovableMutex"},{"kind":23,"location":{"range":{"end":{"character":1,"line":168},"start":{"character":0,"line":9}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs"},"name":"Mutex"},{"kind":23,"location":{"range":{"end":{"character":1,"line":198},"start":{"character":0,"line":177}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs"},"name":"MutexGuard"},{"kind":23,"location":{"range":{"end":{"character":1,"line":45},"start":{"character":0,"line":9}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs"},"name":"ReentrantMutex"},{"kind":23,"location":{"range":{"end":{"character":1,"line":68},"start":{"character":0,"line":53}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs"},"name":"ReentrantMutexGuard"},{"kind":23,"location":{"range":{"end":{"character":1,"line":18},"start":{"character":0,"line":16}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/condvar/check.rs"},"name":"SameMutexCheck"}]
2023-01-28T18:28:11.338 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:11.739 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:11.740 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:12.261 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:12.661 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:12.669 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:12.670 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"workspace/symbol","params":{"query":"Mutex"},"id":3}
2023-01-28T18:28:12.671 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":3,"result":[]}
2023-01-28T18:28:12.671 helix_lsp::transport [INFO] <- []
2023-01-28T18:28:12.671 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:13.072 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:13.072 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:13.558 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:13.959 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:13.960 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:13.960 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"workspace/symbol","params":{"query":"Mutex*"},"id":4}
2023-01-28T18:28:13.967 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":4,"result":[{"name":"MovableMutex","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/mutex.rs","range":{"start":{"line":2,"character":0},"end":{"line":12,"character":43}}}},{"name":"Mutex","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs","range":{"start":{"line":9,"character":0},"end":{"line":168,"character":1}}}},{"name":"MutexGuard","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs","range":{"start":{"line":177,"character":0},"end":{"line":198,"character":1}}}},{"name":"ReentrantMutex","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs","range":{"start":{"line":9,"character":0},"end":{"line":45,"character":1}}}},{"name":"ReentrantMutexGuard","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs","range":{"start":{"line":53,"character":0},"end":{"line":68,"character":1}}}},{"name":"SameMutexCheck","kind":23,"location":{"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/condvar/check.rs","range":{"start":{"line":16,"character":0},"end":{"line":18,"character":1}}}}]}
2023-01-28T18:28:13.967 helix_lsp::transport [INFO] <- [{"kind":23,"location":{"range":{"end":{"character":43,"line":12},"start":{"character":0,"line":2}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/mutex.rs"},"name":"MovableMutex"},{"kind":23,"location":{"range":{"end":{"character":1,"line":168},"start":{"character":0,"line":9}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs"},"name":"Mutex"},{"kind":23,"location":{"range":{"end":{"character":1,"line":198},"start":{"character":0,"line":177}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sync/mutex.rs"},"name":"MutexGuard"},{"kind":23,"location":{"range":{"end":{"character":1,"line":45},"start":{"character":0,"line":9}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs"},"name":"ReentrantMutex"},{"kind":23,"location":{"range":{"end":{"character":1,"line":68},"start":{"character":0,"line":53}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/remutex.rs"},"name":"ReentrantMutexGuard"},{"kind":23,"location":{"range":{"end":{"character":1,"line":18},"start":{"character":0,"line":16}},"uri":"file:///home/frondeus/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/condvar/check.rs"},"name":"SameMutexCheck"}]
2023-01-28T18:28:13.968 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:14.369 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:14.369 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:14.749 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:15.151 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:15.151 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:15.154 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"workspace/symbol","params":{"query":"Mutex"},"id":5}
2023-01-28T18:28:15.155 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":5,"result":[]}
2023-01-28T18:28:15.155 helix_lsp::transport [INFO] <- []
2023-01-28T18:28:15.155 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:15.555 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:15.556 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:15.989 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:16.390 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:17.288 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:17.486 helix_term::commands::typed [DEBUG] quitting...
2023-01-28T18:28:17.486 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:17.689 helix_term::application [DEBUG] received editor event: IdleTimer
2023-01-28T18:28:17.778 helix_term::commands::typed [DEBUG] quitting...
2023-01-28T18:28:17.778 helix_view::document [DEBUG] id 2 modified - last saved: 0, current: 0
2023-01-28T18:28:17.778 helix_term::job [DEBUG] waiting on jobs...
2023-01-28T18:28:17.778 helix_term::job [DEBUG] waiting on jobs...
2023-01-28T18:28:17.779 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"shutdown","id":6}
2023-01-28T18:28:17.779 helix_lsp::transport [INFO] <- {"jsonrpc":"2.0","id":6,"result":null}
2023-01-28T18:28:17.779 helix_lsp::transport [INFO] <- null
2023-01-28T18:28:17.779 helix_lsp::transport [INFO] -> {"jsonrpc":"2.0","method":"exit"}
2023-01-28T18:28:17.781 mio::poll [TRACE] deregistering event source from poller
2023-01-28T18:28:17.782 mio::poll [TRACE] deregistering event source from poller
2023-01-28T18:28:17.783 mio::poll [TRACE] deregistering event source from poller
2023-01-28T18:28:17.783 mio::poll [TRACE] deregistering event source from poller
2023-01-28T18:28:17.783 mio::poll [TRACE] deregistering event source from poller

Platform

Linux

Terminal Emulator

alacritty

Helix Version

22.12-189-g2c6bf6fc

@frondeus frondeus added the C-bug Category: This is a bug label Jan 28, 2023
@frondeus
Copy link
Author

Two notes:

  1. I'm sure that my helix (built from master) has already merged PR with dynamic search.
  2. I'm willing to do my first contribution and fix the issue if I can :)

@the-mikedavis
Copy link
Member

This is because the picker showing the symbol results is also filtering by the input text so it's filtering out options that don't have a literal * character. The solution for this would probably also help #4687 which has problems with regex characters. I wonder if we can just not use the underlying picker's filtering and rely on the DynamicPicker's callback? (cc @sudormrfbin)

@frondeus
Copy link
Author

Ah, yes, I see score mechanism :)

@frondeus
Copy link
Author

Alright, so the easiest possible solution (that works!) is to extend force_score method by should_filter: bool argument.
Fortunately, this method is used externally only in DynamicPicker.

But... that sounds more like a workaround than clean code to me, so I wonder if I should add a new option to the picker itself.

image

@sudormrfbin
Copy link
Member

Something that's slightly better would be to not call force_score in the dynamic picker at all and set the matches manually to be the same as the current options.

Ideally we want to completely avoid using the underlying picker's filtering and use the dynamic pickers callback as @the-mikedavis said. But since a DynamicPicker embeds a whole Picker internally and delegates most events to it, normal filtering is done internally before we overwrite the options and matches with the new dynamic values like in the proposed change above:

let event_result = self.file_picker.handle_event(event, cx);

Tracing the self.file_picker.handle_event() call points us to a potential call to Picker::score() which is unnecessary and wasteful inside a DynamicPicker (could be detrimental when live-grepping a huge repository for example):

fn prompt_handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult {
if let EventResult::Consumed(_) = self.prompt.handle_event(event, cx) {
// TODO: recalculate only if pattern changed
self.score();
}
EventResult::Consumed(None)
}

I think the proper solution would be to refactor out a picker that doesn't do filtering, simply displays a list of items with a prompt, handles most common events (like moving up and down the list, changing the prompt, etc) and emits an event when the prompt changes and it's time to re-filter the list. This picker could be embedded in and composed together with the current picker and dynamic picker to get specific behavior.

@pascalkuthe
Copy link
Member

pascalkuthe commented Jan 31, 2023

Something that's slightly better would be to not call force_score in the dynamic picker at all and set the matches manually to be the same as the current options.

Ideally we want to completely avoid using the underlying picker's filtering and use the dynamic pickers callback as @the-mikedavis said. But since a DynamicPicker embeds a whole Picker internally and delegates most events to it, normal filtering is done internally before we overwrite the options and matches with the new dynamic values like in the proposed change above:

let event_result = self.file_picker.handle_event(event, cx);

Tracing the self.file_picker.handle_event() call points us to a potential call to Picker::score() which is unnecessary and wasteful inside a DynamicPicker (could be detrimental when live-grepping a huge repository for example):

fn prompt_handle_event(&mut self, event: &Event, cx: &mut Context) -> EventResult {
if let EventResult::Consumed(_) = self.prompt.handle_event(event, cx) {
// TODO: recalculate only if pattern changed
self.score();
}
EventResult::Consumed(None)
}

I think the proper solution would be to refactor out a picker that doesn't do filtering, simply displays a list of items with a prompt, handles most common events (like moving up and down the list, changing the prompt, etc) and emits an event when the prompt changes and it's time to re-filter the list. This picker could be embedded in and composed together with the current picker and dynamic picker to get specific behavior.

One unfortunate sideeffect of this is that we losse the normal picker syntax (and ranking) like using space as a logical and or stuff like #5114. There is probably no way around that (I can think of) except introducing a bunch of escapes (which we probably don't want to do). For global search that is quite intuitive as we are not really filtering the picker items (which would be the files) but a separate property (the search query which is a regex). For the symbol picker it's kind of confusing tough as it looks just like a normal picker where you would expect the normal syntax would just work.

Maybe we could somehow indicate visually what kind of syntax a picker accepts?
Like showing a little F in the corner for the normal fuzzy matching syntax and a R for regex (I don't know enough about workspace symbols to know what symbol would be appropriate there).

It's probably not super critical but it would be a nice discoverability feature

@sudormrfbin
Copy link
Member

I don't think it's possible to have the normal picker syntax in any of the dynamic pickers since the syntax relies on having the full list of options upfront. Taking an example from #5114, !fire would not be possible to implement in a dynamic picker because we need to know all the options that do match fire in order to get the ones that don't. A dynamic picker simply forwards the prompt input as-is to the registered callback so unless the underlying mechanism (file searching via regex or LSP returning workspace symbols) recognizes the syntax I don't see a way of implementing it properly.

That said this would be definitely confusing in the workspace symbol picker like you said, so a visual indicator would indeed be nice to have.

sudormrfbin added a commit to sudormrfbin/helix that referenced this issue Feb 3, 2023
Merges the code for the Picker and FilePicker into a single Picker that
can show a file preview if a preview callback is provided. This change
was mainly made to facilitate refactoring out a simple skeleton of a
picker that does not do any filtering to be reused in a normal Picker
and a DynamicPicker (see helix-editor#5714; in particular [mikes-comment] and
[gokuls-comment]).

The crux of the issue is that a picker maintains a list of predefined
options (eg. list of files in the directory) and (re-)filters them every
time the picker prompt changes, while a dynamic picker (eg. interactive
global search, helix-editor#4687) recalculates the full list of options on every
prompt change. Using a filtering picker to drive a dynamic picker hence
does duplicate work of filtering thousands of matches for no reason. It
could also cause problems like interfering with the regex pattern in the
global search.

I tried to directly extract a PickerBase to be reused in Picker and
FilePicker and DynamicPicker, but the problem is that DynamicPicker is
actually a DynamicFilePicker (i.e. it can preview file contents) which
means we would need PickerBase, Picker, FilePicker, DynamicPicker and
DynamicFilePicker and then another way of sharing the previewing code
between a FilePicker and a DynamicFilePicker. By merging Picker and
FilePicker into Picker, we only need PickerBase, Picker and
DynamicPicker.

[gokuls-comment]: helix-editor#5714 (comment)
[mikes-comment]: helix-editor#5714 (comment)
sudormrfbin added a commit to sudormrfbin/helix that referenced this issue Feb 3, 2023
Merges the code for the Picker and FilePicker into a single Picker that
can show a file preview if a preview callback is provided. This change
was mainly made to facilitate refactoring out a simple skeleton of a
picker that does not do any filtering to be reused in a normal Picker
and a DynamicPicker (see helix-editor#5714; in particular [mikes-comment] and
[gokuls-comment]).

The crux of the issue is that a picker maintains a list of predefined
options (eg. list of files in the directory) and (re-)filters them every
time the picker prompt changes, while a dynamic picker (eg. interactive
global search, helix-editor#4687) recalculates the full list of options on every
prompt change. Using a filtering picker to drive a dynamic picker hence
does duplicate work of filtering thousands of matches for no reason. It
could also cause problems like interfering with the regex pattern in the
global search.

I tried to directly extract a PickerBase to be reused in Picker and
FilePicker and DynamicPicker, but the problem is that DynamicPicker is
actually a DynamicFilePicker (i.e. it can preview file contents) which
means we would need PickerBase, Picker, FilePicker, DynamicPicker and
DynamicFilePicker and then another way of sharing the previewing code
between a FilePicker and a DynamicFilePicker. By merging Picker and
FilePicker into Picker, we only need PickerBase, Picker and
DynamicPicker.

[gokuls-comment]: helix-editor#5714 (comment)
[mikes-comment]: helix-editor#5714 (comment)
@kirawi kirawi added the A-helix-term Area: Helix term improvements label Feb 5, 2023
the-mikedavis pushed a commit that referenced this issue Jun 18, 2023
Merges the code for the Picker and FilePicker into a single Picker that
can show a file preview if a preview callback is provided. This change
was mainly made to facilitate refactoring out a simple skeleton of a
picker that does not do any filtering to be reused in a normal Picker
and a DynamicPicker (see #5714; in particular [mikes-comment] and
[gokuls-comment]).

The crux of the issue is that a picker maintains a list of predefined
options (eg. list of files in the directory) and (re-)filters them every
time the picker prompt changes, while a dynamic picker (eg. interactive
global search, #4687) recalculates the full list of options on every
prompt change. Using a filtering picker to drive a dynamic picker hence
does duplicate work of filtering thousands of matches for no reason. It
could also cause problems like interfering with the regex pattern in the
global search.

I tried to directly extract a PickerBase to be reused in Picker and
FilePicker and DynamicPicker, but the problem is that DynamicPicker is
actually a DynamicFilePicker (i.e. it can preview file contents) which
means we would need PickerBase, Picker, FilePicker, DynamicPicker and
DynamicFilePicker and then another way of sharing the previewing code
between a FilePicker and a DynamicFilePicker. By merging Picker and
FilePicker into Picker, we only need PickerBase, Picker and
DynamicPicker.

[gokuls-comment]: #5714 (comment)
[mikes-comment]: #5714 (comment)
wes-adams pushed a commit to wes-adams/helix that referenced this issue Jul 4, 2023
Merges the code for the Picker and FilePicker into a single Picker that
can show a file preview if a preview callback is provided. This change
was mainly made to facilitate refactoring out a simple skeleton of a
picker that does not do any filtering to be reused in a normal Picker
and a DynamicPicker (see helix-editor#5714; in particular [mikes-comment] and
[gokuls-comment]).

The crux of the issue is that a picker maintains a list of predefined
options (eg. list of files in the directory) and (re-)filters them every
time the picker prompt changes, while a dynamic picker (eg. interactive
global search, helix-editor#4687) recalculates the full list of options on every
prompt change. Using a filtering picker to drive a dynamic picker hence
does duplicate work of filtering thousands of matches for no reason. It
could also cause problems like interfering with the regex pattern in the
global search.

I tried to directly extract a PickerBase to be reused in Picker and
FilePicker and DynamicPicker, but the problem is that DynamicPicker is
actually a DynamicFilePicker (i.e. it can preview file contents) which
means we would need PickerBase, Picker, FilePicker, DynamicPicker and
DynamicFilePicker and then another way of sharing the previewing code
between a FilePicker and a DynamicFilePicker. By merging Picker and
FilePicker into Picker, we only need PickerBase, Picker and
DynamicPicker.

[gokuls-comment]: helix-editor#5714 (comment)
[mikes-comment]: helix-editor#5714 (comment)
mtoohey31 pushed a commit to mtoohey31/helix that referenced this issue Jun 2, 2024
Merges the code for the Picker and FilePicker into a single Picker that
can show a file preview if a preview callback is provided. This change
was mainly made to facilitate refactoring out a simple skeleton of a
picker that does not do any filtering to be reused in a normal Picker
and a DynamicPicker (see helix-editor#5714; in particular [mikes-comment] and
[gokuls-comment]).

The crux of the issue is that a picker maintains a list of predefined
options (eg. list of files in the directory) and (re-)filters them every
time the picker prompt changes, while a dynamic picker (eg. interactive
global search, helix-editor#4687) recalculates the full list of options on every
prompt change. Using a filtering picker to drive a dynamic picker hence
does duplicate work of filtering thousands of matches for no reason. It
could also cause problems like interfering with the regex pattern in the
global search.

I tried to directly extract a PickerBase to be reused in Picker and
FilePicker and DynamicPicker, but the problem is that DynamicPicker is
actually a DynamicFilePicker (i.e. it can preview file contents) which
means we would need PickerBase, Picker, FilePicker, DynamicPicker and
DynamicFilePicker and then another way of sharing the previewing code
between a FilePicker and a DynamicFilePicker. By merging Picker and
FilePicker into Picker, we only need PickerBase, Picker and
DynamicPicker.

[gokuls-comment]: helix-editor#5714 (comment)
[mikes-comment]: helix-editor#5714 (comment)
smortime pushed a commit to smortime/helix that referenced this issue Jul 10, 2024
Merges the code for the Picker and FilePicker into a single Picker that
can show a file preview if a preview callback is provided. This change
was mainly made to facilitate refactoring out a simple skeleton of a
picker that does not do any filtering to be reused in a normal Picker
and a DynamicPicker (see helix-editor#5714; in particular [mikes-comment] and
[gokuls-comment]).

The crux of the issue is that a picker maintains a list of predefined
options (eg. list of files in the directory) and (re-)filters them every
time the picker prompt changes, while a dynamic picker (eg. interactive
global search, helix-editor#4687) recalculates the full list of options on every
prompt change. Using a filtering picker to drive a dynamic picker hence
does duplicate work of filtering thousands of matches for no reason. It
could also cause problems like interfering with the regex pattern in the
global search.

I tried to directly extract a PickerBase to be reused in Picker and
FilePicker and DynamicPicker, but the problem is that DynamicPicker is
actually a DynamicFilePicker (i.e. it can preview file contents) which
means we would need PickerBase, Picker, FilePicker, DynamicPicker and
DynamicFilePicker and then another way of sharing the previewing code
between a FilePicker and a DynamicFilePicker. By merging Picker and
FilePicker into Picker, we only need PickerBase, Picker and
DynamicPicker.

[gokuls-comment]: helix-editor#5714 (comment)
[mikes-comment]: helix-editor#5714 (comment)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-helix-term Area: Helix term improvements C-bug Category: This is a bug
Projects
None yet
5 participants