* bug#57669: 29.0.50; C-n, C-p off under long lines @ 2022-09-08 5:40 dick.r.chiang 2022-09-08 7:38 ` Gregory Heytings 2022-09-08 8:17 ` Eli Zaretskii 0 siblings, 2 replies; 54+ messages in thread From: dick.r.chiang @ 2022-09-08 5:40 UTC (permalink / raw) To: 57669 Try C-n through a file with long lines. It jumps around. src/emacs -Q -l cl-lib --eval " \ (let ((long-line-threshold 10000) \ (file (make-temp-file \"baz\"))) \ (cl-assert (= 80 (window-width)) t) \ (with-temp-file file \ (insert (make-string (1+ long-line-threshold) ?x))) \ (dolist (toggle (list nil long-line-threshold)) \ (let* ((long-line-threshold toggle) \ (note (format \"long-line-threshold = %s\" \ long-line-threshold)) \ (buffer (find-file-literally file))) \ (with-current-buffer buffer \ (show-paren-mode -1) \ (goto-char (point-min)) \ (catch (quote done) \ (while (condition-case nil \ (prog1 t (call-interactively \ (function next-line))) \ (end-of-buffer)) \ (redisplay) \ (unless (zerop (% (current-column) (window-width))) \ (princ (format \"BAD under %s (column is %d)\n\" \ note (current-column)) \ (function external-debugging-output)) \ (throw (quote done) nil))) \ (princ (format \"GOOD under %s (column is %d)\n\" \ note (current-column)) \ (function external-debugging-output)))) \ (kill-buffer buffer))))" In Commercial Emacs 0.3.1snapshot e6f9ecd in dev (upstream 29.0.50, x86_64-pc-linux-gnu) built on dick Repository revision: e6f9ecde2eaaa40ddb78b88b81f612b1e8ec1665 Repository branch: dev Windowing system distributor 'The X.Org Foundation', version 11.0.12013000 System Description: Ubuntu 20.04.4 LTS Configured using: 'configure WERROR_CFLAGS=-Werror --prefix=/home/dick/.local --with-tree-sitter' Configured features: CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GSETTINGS HARFBUZZ JPEG JSON TREE_SITTER LCMS2 LIBSELINUX LIBXML2 MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB Important settings: value of $LANG: en_US.UTF-8 locale-coding-system: utf-8-unix Major mode: Group Minor modes in effect: shell-dirtrack-mode: t gnus-topic-mode: t gnus-undo-mode: t projectile-mode: t flx-ido-mode: t override-global-mode: t global-hl-line-mode: t hl-line-mode: t winner-mode: t tooltip-mode: t global-eldoc-mode: t show-paren-mode: t mouse-wheel-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t buffer-read-only: t column-number-mode: t line-number-mode: t transient-mark-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t Load-path shadows: /home/dick/gomacro-mode/gomacro-mode hides /home/dick/.emacs.d/elpa/gomacro-mode-20200326.1103/gomacro-mode /home/dick/.emacs.d/elpa/go-rename-20190805.2101/go-rename hides /home/dick/.emacs.d/elpa/go-mode-1.6.0/go-rename /home/dick/.emacs.d/elpa/go-guru-20181012.330/go-guru hides /home/dick/.emacs.d/elpa/go-mode-1.6.0/go-guru /home/dick/org-gcal.el/org-gcal hides /home/dick/.emacs.d/elpa/org-gcal-0.3/org-gcal /home/dick/.emacs.d/elpa/request-deferred-0.2.0/request-deferred hides /home/dick/.emacs.d/elpa/request-0.3.3/request-deferred /home/dick/.emacs.d/elpa/chess-2.0.5/_pkg hides /home/dick/.local/share/emacs/site-lisp/_pkg /home/dick/.emacs.d/elpa/chess-2.0.5/chess-pos hides /home/dick/.local/share/emacs/site-lisp/chess-pos /home/dick/.emacs.d/elpa/chess-2.0.5/chess-module hides /home/dick/.local/share/emacs/site-lisp/chess-module /home/dick/.emacs.d/elpa/chess-2.0.5/chess-ucb hides /home/dick/.local/share/emacs/site-lisp/chess-ucb /home/dick/.emacs.d/elpa/chess-2.0.5/chess-scid hides /home/dick/.local/share/emacs/site-lisp/chess-scid /home/dick/.emacs.d/elpa/chess-2.0.5/chess-puzzle hides /home/dick/.local/share/emacs/site-lisp/chess-puzzle /home/dick/.emacs.d/elpa/chess-2.0.5/chess-irc hides /home/dick/.local/share/emacs/site-lisp/chess-irc /home/dick/.emacs.d/elpa/chess-2.0.5/chess-network hides /home/dick/.local/share/emacs/site-lisp/chess-network /home/dick/.emacs.d/elpa/chess-2.0.5/chess-autosave hides /home/dick/.local/share/emacs/site-lisp/chess-autosave /home/dick/.emacs.d/elpa/chess-2.0.5/chess-engine hides /home/dick/.local/share/emacs/site-lisp/chess-engine /home/dick/.emacs.d/elpa/chess-2.0.5/chess-tutorial hides /home/dick/.local/share/emacs/site-lisp/chess-tutorial /home/dick/.emacs.d/elpa/chess-2.0.5/chess-german hides /home/dick/.local/share/emacs/site-lisp/chess-german /home/dick/.emacs.d/elpa/chess-2.0.5/chess-file hides /home/dick/.local/share/emacs/site-lisp/chess-file /home/dick/.emacs.d/elpa/chess-2.0.5/chess-random hides /home/dick/.local/share/emacs/site-lisp/chess-random /home/dick/.emacs.d/elpa/chess-2.0.5/chess-stockfish hides /home/dick/.local/share/emacs/site-lisp/chess-stockfish /home/dick/.emacs.d/elpa/chess-2.0.5/chess-pgn hides /home/dick/.local/share/emacs/site-lisp/chess-pgn /home/dick/.emacs.d/elpa/chess-2.0.5/chess-kibitz hides /home/dick/.local/share/emacs/site-lisp/chess-kibitz /home/dick/.emacs.d/elpa/chess-2.0.5/chess-eco hides /home/dick/.local/share/emacs/site-lisp/chess-eco /home/dick/.emacs.d/elpa/chess-2.0.5/chess-display hides /home/dick/.local/share/emacs/site-lisp/chess-display /home/dick/.emacs.d/elpa/chess-2.0.5/chess-var hides /home/dick/.local/share/emacs/site-lisp/chess-var /home/dick/.emacs.d/elpa/chess-2.0.5/chess-test hides /home/dick/.local/share/emacs/site-lisp/chess-test /home/dick/.emacs.d/elpa/chess-2.0.5/chess-ply hides /home/dick/.local/share/emacs/site-lisp/chess-ply /home/dick/.emacs.d/elpa/chess-2.0.5/chess-message hides /home/dick/.local/share/emacs/site-lisp/chess-message /home/dick/.emacs.d/elpa/chess-2.0.5/chess-ics1 hides /home/dick/.local/share/emacs/site-lisp/chess-ics1 /home/dick/.emacs.d/elpa/chess-2.0.5/chess-phalanx hides /home/dick/.local/share/emacs/site-lisp/chess-phalanx /home/dick/.emacs.d/elpa/chess-2.0.5/chess-game hides /home/dick/.local/share/emacs/site-lisp/chess-game /home/dick/.emacs.d/elpa/chess-2.0.5/chess-log hides /home/dick/.local/share/emacs/site-lisp/chess-log /home/dick/.emacs.d/elpa/chess-2.0.5/chess-plain hides /home/dick/.local/share/emacs/site-lisp/chess-plain /home/dick/.emacs.d/elpa/chess-2.0.5/chess-perft hides /home/dick/.local/share/emacs/site-lisp/chess-perft /home/dick/.emacs.d/elpa/chess-2.0.5/chess-glaurung hides /home/dick/.local/share/emacs/site-lisp/chess-glaurung /home/dick/.emacs.d/elpa/chess-2.0.5/chess-ai hides /home/dick/.local/share/emacs/site-lisp/chess-ai /home/dick/.emacs.d/elpa/chess-2.0.5/chess-fruit hides /home/dick/.local/share/emacs/site-lisp/chess-fruit /home/dick/.emacs.d/elpa/chess-2.0.5/chess-uci hides /home/dick/.local/share/emacs/site-lisp/chess-uci /home/dick/.emacs.d/elpa/chess-2.0.5/chess-epd hides /home/dick/.local/share/emacs/site-lisp/chess-epd /home/dick/.emacs.d/elpa/chess-2.0.5/chess-database hides /home/dick/.local/share/emacs/site-lisp/chess-database /home/dick/.emacs.d/elpa/chess-2.0.5/chess-link hides /home/dick/.local/share/emacs/site-lisp/chess-link /home/dick/.emacs.d/elpa/chess-2.0.5/chess-transport hides /home/dick/.local/share/emacs/site-lisp/chess-transport /home/dick/.emacs.d/elpa/chess-2.0.5/chess-none hides /home/dick/.local/share/emacs/site-lisp/chess-none /home/dick/.emacs.d/elpa/chess-2.0.5/chess-polyglot hides /home/dick/.local/share/emacs/site-lisp/chess-polyglot /home/dick/.emacs.d/elpa/chess-2.0.5/chess-crafty hides /home/dick/.local/share/emacs/site-lisp/chess-crafty /home/dick/.emacs.d/elpa/chess-2.0.5/chess-chat hides /home/dick/.local/share/emacs/site-lisp/chess-chat /home/dick/.emacs.d/elpa/chess-2.0.5/chess hides /home/dick/.local/share/emacs/site-lisp/chess /home/dick/.emacs.d/elpa/chess-2.0.5/chess-images hides /home/dick/.local/share/emacs/site-lisp/chess-images /home/dick/.emacs.d/elpa/chess-2.0.5/chess-gnuchess hides /home/dick/.local/share/emacs/site-lisp/chess-gnuchess /home/dick/.emacs.d/elpa/chess-2.0.5/chess-fen hides /home/dick/.local/share/emacs/site-lisp/chess-fen /home/dick/.emacs.d/elpa/chess-2.0.5/chess-ics hides /home/dick/.local/share/emacs/site-lisp/chess-ics /home/dick/.emacs.d/elpa/chess-2.0.5/chess-ics2 hides /home/dick/.local/share/emacs/site-lisp/chess-ics2 /home/dick/.emacs.d/elpa/chess-2.0.5/chess-common hides /home/dick/.local/share/emacs/site-lisp/chess-common /home/dick/.emacs.d/elpa/chess-2.0.5/chess-input hides /home/dick/.local/share/emacs/site-lisp/chess-input /home/dick/.emacs.d/elpa/chess-2.0.5/chess-announce hides /home/dick/.local/share/emacs/site-lisp/chess-announce /home/dick/.emacs.d/elpa/chess-2.0.5/chess-clock hides /home/dick/.local/share/emacs/site-lisp/chess-clock /home/dick/.emacs.d/elpa/chess-2.0.5/chess-sound hides /home/dick/.local/share/emacs/site-lisp/chess-sound /home/dick/.emacs.d/elpa/chess-2.0.5/chess-sjeng hides /home/dick/.local/share/emacs/site-lisp/chess-sjeng /home/dick/.emacs.d/elpa/chess-2.0.5/chess-algebraic hides /home/dick/.local/share/emacs/site-lisp/chess-algebraic /home/dick/.emacs.d/elpa/transient-0.3.7snapshot/transient hides /home/dick/.local/share/emacs/0.3.1/lisp/transient Features: (shadow sort bbdb-message footnote mail-extr emacsbug qp gnus-async gnus-ml gnus-notifications gnus-fun notifications gnus-kill gnus-dup disp-table utf-7 blamer a tramp tramp-loaddefs trampver tramp-integration cus-start files-x tramp-compat shell pcomplete ls-lisp url-cache benchmark nnrss nnfolder nndiscourse rbenv nnhackernews nntwitter nntwitter-api bbdb-gnus gnus-demon nntp nnmairix nnml nnreddit gnus-topic url-http url-auth url-gw network-stream nsm request virtualenvwrapper gud s json-rpc python gnus-score score-mode gnus-bcklg gnus-srvr gnus-cite anaphora bbdb-mua bbdb-com bbdb bbdb-site timezone gnus-delay gnus-draft gnus-cache gnus-agent gnus-msg gnus-art mm-uu mml2015 mm-view mml-smime smime gnutls dig gnus-sum shr pixel-fill kinsoku url-file svg dom nndraft nnmh gnus-group mm-url gnus-undo use-package use-package-delight use-package-diminish gnus-start gnus-dbus dbus xml gnus-cloud nnimap nnmail mail-source utf7 nnoo parse-time iso8601 gnus-spec gnus-int gnus-range message sendmail yank-media puny dired-x dired dired-loaddefs rfc822 mml mml-sec epa epg rfc6068 epg-config mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045 ietf-drums mailabbrev gmm-utils mailheader gnus-win paredit-ext paredit inf-ruby ruby-mode smie company pcase haskell-interactive-mode haskell-presentation-mode haskell-process haskell-session haskell-compile haskell-mode haskell-cabal haskell-utils haskell-font-lock haskell-indentation haskell-string haskell-sort-imports haskell-lexeme haskell-align-imports haskell-complete-module haskell-ghc-support noutline outline flymake-proc flymake warnings etags fileloop generator dabbrev haskell-customize hydra lv use-package-ensure solarized-theme solarized-definitions projectile lisp-mnt ibuf-ext ibuffer ibuffer-loaddefs thingatpt magit-autorevert autorevert filenotify magit-git magit-base magit-section format-spec crm dash rx compat-27 compat-26 compat grep compile comint ansi-color gnus nnheader range mail-utils mm-util mail-prsvr gnus-util text-property-search time-date flx-ido flx google-translate-default-ui google-translate-core-ui facemenu color ido google-translate-core google-translate-tk google-translate-backend use-package-bind-key bind-key auto-complete easy-mmode advice edmacro kmacro popup cus-edit pp cus-load icons wid-edit emms-player-mplayer emms-player-simple emms emms-compat cl-extra help-mode xref project use-package-core derived hl-line winner ring acm-autoloads debbugs-autoloads eglot-autoloads elpaso-disc-autoloads elpaso-autoloads find-func finder-inf go-mode-autoloads json-reformat-autoloads json-snatcher-autoloads lsp-bridge-autoloads magit-autoloads posframe-autoloads projectile-autoloads markdown-mode-autoloads sml-mode-autoloads epl-autoloads tornado-template-mode-autoloads typescript-mode-autoloads request-autoloads info wordnut-autoloads yasnippet-autoloads package browse-url url url-proxy url-privacy url-expand url-methods url-history url-cookie generate-lisp-file url-domsuf url-util mailcap url-handlers url-parse auth-source cl-seq eieio eieio-core cl-macs password-cache json subr-x map byte-opt gv bytecomp byte-compile cconv cldefs url-vars cl-loaddefs cl-lib rmc iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock font-lock syntax font-core term/tty-colors frame minibuffer nadvice seq simple cl-generic indonesian philippine cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite emoji-zwj charscript charprop case-table epa-hook jka-cmpr-hook help abbrev obarray oclosure cl-preloaded button loaddefs faces cus-face macroexp files window text-properties overlay sha1 md5 base64 format env code-pages mule custom widget keymap hashtable-print-readable backquote threads dbusbind inotify lcms2 dynamic-setting system-font-setting font-render-setting cairo move-toolbar gtk x-toolkit xinput2 x multi-tty make-network-process emacs) Memory information: ((conses 16 531228 40963) (symbols 48 34319 1) (strings 32 131931 13242) (string-bytes 1 4229331) (vectors 16 48586) (vector-slots 8 645891 28513) (floats 8 997 358) (intervals 56 511 0) (buffers 1008 25)) ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 5:40 bug#57669: 29.0.50; C-n, C-p off under long lines dick.r.chiang @ 2022-09-08 7:38 ` Gregory Heytings 2022-09-08 8:17 ` Eli Zaretskii 1 sibling, 0 replies; 54+ messages in thread From: Gregory Heytings @ 2022-09-08 7:38 UTC (permalink / raw) To: dick.r.chiang; +Cc: 57669-done > > Try C-n through a file with long lines. It jumps around. > Thanks, but this is well-known, and is an (unavoidable) compromise. Closing. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 5:40 bug#57669: 29.0.50; C-n, C-p off under long lines dick.r.chiang 2022-09-08 7:38 ` Gregory Heytings @ 2022-09-08 8:17 ` Eli Zaretskii 2022-09-08 12:02 ` dick 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-08 8:17 UTC (permalink / raw) To: dick.r.chiang; +Cc: 57669 > From: dick.r.chiang@gmail.com > Date: Thu, 08 Sep 2022 01:40:01 -0400 > > > Try C-n through a file with long lines. It jumps around. That's expected, and is one of the prices we pay for reasonable performance with such long lines: keeping the same column is no longer guaranteed. I see no problem with that, FWIW. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 8:17 ` Eli Zaretskii @ 2022-09-08 12:02 ` dick 2022-09-08 17:12 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-08 12:02 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > I see no problem with that, FWIW. No problem? None? The fortune you could have made had you pursued a career in corporate messaging. In all the reams of tail-chasing in Bug#56682 and Bug#56393, I managed to locate just one preemptive mention by the proposer: This feature comes at a (IMO) very little price, namely... point sometimes moves to another column... He is careful to minimize the issue, but he doesn't say "I see no problem with that." Emacs devs are fascinating. Even with no money or fame at stake, guys choose the weirdest hills to die on. One guy repudiated the long lines fix over some cc-mode regression. Another for imperfectly colorizing json. Another for circumstantially forbidding "widen". But none of them appeared to care the slightest about something as basic as "C-n" and "C-p". A "very little price" indeed. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 12:02 ` dick @ 2022-09-08 17:12 ` Gregory Heytings 2022-09-08 18:13 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-08 17:12 UTC (permalink / raw) To: dick; +Cc: Eli Zaretskii, 57669 > > No problem? None? > None, indeed. Even without long lines, C-n and C-p are not 100% accurate. > > This feature comes at a (IMO) very little price, namely... point > sometimes moves to another column... > Indeed. > > He is careful to minimize the issue, but he doesn't say "I see no > problem with that." > I wasn't "careful to minimize the issue", I state what it was black on white. I was careful to minimize its impact, however: it could have been much worse. What we now have is that sometimes, but rarely, point moves to another column. That doesn't make Emacs unusable, does it? > > A "very little price" indeed. > Indeed. I'm glad to read you agree. Or are the quotation marks supposed to convey something else? ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 17:12 ` Gregory Heytings @ 2022-09-08 18:13 ` dick 2022-09-08 18:26 ` Gregory Heytings 2022-09-09 6:00 ` Eli Zaretskii 0 siblings, 2 replies; 54+ messages in thread From: dick @ 2022-09-08 18:13 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 [-- Attachment #1: Type: text/plain, Size: 43 bytes --] DRC> No Problem? None? GH> None, indeed. [-- Attachment #2: languageclient.out --] [-- Type: text/plain, Size: 584464 bytes --] ####### LanguageClient 0.1.161 ####### 16:30:46 DEBUG unnamed src/language_client.rs:108 state: null ==> {"capabilities":{},"code_lens":{},"diagnostics":{},"highlight_match_ids":[],"highlight_source":null,"highlights":{},"highlights_placed":{},"initialization_options":null,"inlay_hints":{},"last_cursor_line":0,"last_line_diagnostic":" ","logger":{"level":"DEBUG","path":"/tmp/shiz"},"namespace_ids":{},"registrations":[],"roots":{},"semantic_highlights":{},"semantic_scope_to_hl_group_table":{},"semantic_scopes":{},"stashed_code_action_actions":[],"text_documents":{},"text_documents_metadata":{},"user_handlers":{},"viewports":{}} 16:30:46 INFO unnamed src/language_server_protocol.rs:3580 settings synced 16:30:46 INFO unnamed src/language_server_protocol.rs:3607 Project root: /home/dick/LanguageClient-neovim 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:EchomsgEllipsis","params":["Project root: /home/dick/LanguageClient-neovim"]} 16:30:46 DEBUG unnamed src/language_client.rs:108 state.roots.rust: null ==> "/home/dick/LanguageClient-neovim" 16:30:46 INFO unnamed src/language_server_protocol.rs:840 initialize; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:command","params":["sign define LanguageClientWarning text= texthl=LanguageClientWarningSign","sign define LanguageClientError text= texthl=LanguageClientErrorSign","sign define LanguageClientInformation text= texthl=LanguageClientInfoSign","sign define LanguageClientHint text= texthl=LanguageClientInfoSign"]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["s:hasSnippetSupport()"],"id":3} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 3, "jsonrpc": "2.0", "result": 0} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"colorProvider":{"dynamicRegistration":false},"completion":{"completionItem":{"insertReplaceSupport":false,"snippetSupport":false}},"declaration":{"linkSupport":true},"definition":{"linkSupport":true},"hover":{},"implementation":{"linkSupport":true},"publishDiagnostics":{"relatedInformation":true},"semanticHighlightingCapabilities":{"semanticHighlighting":true},"signatureHelp":{"signatureInformation":{"parameterInformation":{"labelOffsetSupport":true}}},"typeDefinition":{"linkSupport":true}},"workspace":{"applyEdit":true,"didChangeWatchedFiles":{"dynamicRegistration":true}}},"clientInfo":{"name":"LanguageClient-neovim","version":"0.1.161"},"processId":243451,"rootPath":"/home/dick/LanguageClient-neovim","rootUri":"file:///home/dick/LanguageClient-neovim","trace":"off"},"id":0} 16:30:46 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":0,"result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"selectionRangeProvider":true,"hoverProvider":true,"completionProvider":{"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 (8ddb8b7e8 2022-09-03)"}}} 16:30:46 DEBUG unnamed src/language_client.rs:108 state.capabilities.rust: null ==> {"capabilities":{"callHierarchyProvider":true,"codeActionProvider":{"codeActionKinds":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite"],"resolveProvider":true},"codeLensProvider":{"resolveProvider":true},"completionProvider":{"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,"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":{},"workspaceSymbolProvider":true},"serverInfo":{"name":"rust-analyzer","version":"0.0.0 (8ddb8b7e8 2022-09-03)"}} 16:30:46 INFO unnamed src/language_server_protocol.rs:567 register_cm_source; language_id="rust" result=Object({"capabilities": Object({"callHierarchyProvider": Bool(true), "codeActionProvider": Object({"codeActionKinds": Array([String(""), String("quickfix"), String("refactor"), String("refactor.extract"), String("refactor.inline"), String("refactor.rewrite")]), "resolveProvider": Bool(true)}), "codeLensProvider": Object({"resolveProvider": Bool(true)}), "completionProvider": Object({"completionItem": Object({"labelDetailsSupport": Bool(false)}), "triggerCharacters": Array([String(":"), String("."), String("'"), String("(")])}), "declarationProvider": Bool(true), "definitionProvider": Bool(true), "documentFormattingProvider": Bool(true), "documentHighlightProvider": Bool(true), "documentOnTypeFormattingProvider": Object({"firstTriggerCharacter": String("="), "moreTriggerCharacter": Array([String("."), String(">"), String("{")])}), "documentRangeFormattingProvider": Bool(false), "documentSymbolProvider": Bool(true), "experimental": Object({"externalDocs": Bool(true), "hoverRange": Bool(true), "joinLines": Bool(true), "matchingBrace": Bool(true), "moveItem": Bool(true), "onEnter": Bool(true), "openCargoToml": Bool(true), "parentModule": Bool(true), "runnables": Object({"kinds": Array([String("cargo")])}), "ssr": Bool(true), "workspaceSymbolScopeKindFiltering": Bool(true)}), "foldingRangeProvider": Bool(true), "hoverProvider": Bool(true), "implementationProvider": Bool(true), "inlayHintProvider": Object({"resolveProvider": Bool(true)}), "referencesProvider": Bool(true), "renameProvider": Object({"prepareProvider": Bool(true)}), "selectionRangeProvider": Bool(true), "semanticTokensProvider": Object({"full": Object({"delta": Bool(true)}), "legend": Object({"tokenModifiers": Array([String("documentation"), String("declaration"), String("static"), String("defaultLibrary"), String("async"), String("attribute"), String("callable"), String("constant"), String("consuming"), String("controlFlow"), String("crateRoot"), String("injected"), String("intraDocLink"), String("library"), String("mutable"), String("public"), String("reference"), String("trait"), String("unsafe")]), "tokenTypes": Array([String("comment"), String("decorator"), String("enumMember"), String("enum"), String("function"), String("interface"), String("keyword"), String("macro"), String("method"), String("namespace"), String("number"), String("operator"), String("parameter"), String("property"), String("string"), String("struct"), String("typeParameter"), String("variable"), String("angle"), String("arithmetic"), String("attribute"), String("attributeBracket"), String("bitwise"), String("boolean"), String("brace"), String("bracket"), String("builtinAttribute"), String("builtinType"), String("character"), String("colon"), String("comma"), String("comparison"), String("constParameter"), String("derive"), String("deriveHelper"), String("dot"), String("escapeSequence"), String("formatSpecifier"), String("generic"), String("label"), String("lifetime"), String("logical"), String("macroBang"), String("parenthesis"), String("punctuation"), String("selfKeyword"), String("selfTypeKeyword"), String("semicolon"), String("typeAlias"), String("toolModule"), String("union"), String("unresolvedReference")])}), "range": Bool(true)}), "signatureHelpProvider": Object({"triggerCharacters": Array([String("("), String(","), String("<")])}), "textDocumentSync": Object({"change": Number(2), "openClose": Bool(true), "save": Object({})}), "typeDefinitionProvider": Bool(true), "workspace": Object({"fileOperations": Object({"willRename": Object({"filters": Array([Object({"pattern": Object({"glob": String("**/*.rs"), "matches": String("file")}), "scheme": String("file")}), Object({"pattern": Object({"glob": String("**"), "matches": String("folder")}), "scheme": String("file")})])})})}), "workspaceSymbolProvider": Bool(true)}), "serverInfo": Object({"name": String("rust-analyzer"), "version": String("0.0.0 (8ddb8b7e8 2022-09-03)")})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["exists('g:cm_matcher')"],"id":4} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 4, "jsonrpc": "2.0", "result": 0} 16:30:46 INFO unnamed src/language_server_protocol.rs:607 register_ncm2_source; language_id="rust" result=Object({"capabilities": Object({"callHierarchyProvider": Bool(true), "codeActionProvider": Object({"codeActionKinds": Array([String(""), String("quickfix"), String("refactor"), String("refactor.extract"), String("refactor.inline"), String("refactor.rewrite")]), "resolveProvider": Bool(true)}), "codeLensProvider": Object({"resolveProvider": Bool(true)}), "completionProvider": Object({"completionItem": Object({"labelDetailsSupport": Bool(false)}), "triggerCharacters": Array([String(":"), String("."), String("'"), String("(")])}), "declarationProvider": Bool(true), "definitionProvider": Bool(true), "documentFormattingProvider": Bool(true), "documentHighlightProvider": Bool(true), "documentOnTypeFormattingProvider": Object({"firstTriggerCharacter": String("="), "moreTriggerCharacter": Array([String("."), String(">"), String("{")])}), "documentRangeFormattingProvider": Bool(false), "documentSymbolProvider": Bool(true), "experimental": Object({"externalDocs": Bool(true), "hoverRange": Bool(true), "joinLines": Bool(true), "matchingBrace": Bool(true), "moveItem": Bool(true), "onEnter": Bool(true), "openCargoToml": Bool(true), "parentModule": Bool(true), "runnables": Object({"kinds": Array([String("cargo")])}), "ssr": Bool(true), "workspaceSymbolScopeKindFiltering": Bool(true)}), "foldingRangeProvider": Bool(true), "hoverProvider": Bool(true), "implementationProvider": Bool(true), "inlayHintProvider": Object({"resolveProvider": Bool(true)}), "referencesProvider": Bool(true), "renameProvider": Object({"prepareProvider": Bool(true)}), "selectionRangeProvider": Bool(true), "semanticTokensProvider": Object({"full": Object({"delta": Bool(true)}), "legend": Object({"tokenModifiers": Array([String("documentation"), String("declaration"), String("static"), String("defaultLibrary"), String("async"), String("attribute"), String("callable"), String("constant"), String("consuming"), String("controlFlow"), String("crateRoot"), String("injected"), String("intraDocLink"), String("library"), String("mutable"), String("public"), String("reference"), String("trait"), String("unsafe")]), "tokenTypes": Array([String("comment"), String("decorator"), String("enumMember"), String("enum"), String("function"), String("interface"), String("keyword"), String("macro"), String("method"), String("namespace"), String("number"), String("operator"), String("parameter"), String("property"), String("string"), String("struct"), String("typeParameter"), String("variable"), String("angle"), String("arithmetic"), String("attribute"), String("attributeBracket"), String("bitwise"), String("boolean"), String("brace"), String("bracket"), String("builtinAttribute"), String("builtinType"), String("character"), String("colon"), String("comma"), String("comparison"), String("constParameter"), String("derive"), String("deriveHelper"), String("dot"), String("escapeSequence"), String("formatSpecifier"), String("generic"), String("label"), String("lifetime"), String("logical"), String("macroBang"), String("parenthesis"), String("punctuation"), String("selfKeyword"), String("selfTypeKeyword"), String("semicolon"), String("typeAlias"), String("toolModule"), String("union"), String("unresolvedReference")])}), "range": Bool(true)}), "signatureHelpProvider": Object({"triggerCharacters": Array([String("("), String(","), String("<")])}), "textDocumentSync": Object({"change": Number(2), "openClose": Bool(true), "save": Object({})}), "typeDefinitionProvider": Bool(true), "workspace": Object({"fileOperations": Object({"willRename": Object({"filters": Array([Object({"pattern": Object({"glob": String("**/*.rs"), "matches": String("file")}), "scheme": String("file")}), Object({"pattern": Object({"glob": String("**"), "matches": String("folder")}), "scheme": String("file")})])})})}), "workspaceSymbolProvider": Bool(true)}), "serverInfo": Object({"name": String("rust-analyzer"), "version": String("0.0.0 (8ddb8b7e8 2022-09-03)")})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["exists('g:ncm2_loaded')"],"id":5} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 5, "jsonrpc": "2.0", "result": 0} 16:30:46 INFO unnamed src/language_server_protocol.rs:647 parse_semantic_scopes; language_id="rust" result=Object({"capabilities": Object({"callHierarchyProvider": Bool(true), "codeActionProvider": Object({"codeActionKinds": Array([String(""), String("quickfix"), String("refactor"), String("refactor.extract"), String("refactor.inline"), String("refactor.rewrite")]), "resolveProvider": Bool(true)}), "codeLensProvider": Object({"resolveProvider": Bool(true)}), "completionProvider": Object({"completionItem": Object({"labelDetailsSupport": Bool(false)}), "triggerCharacters": Array([String(":"), String("."), String("'"), String("(")])}), "declarationProvider": Bool(true), "definitionProvider": Bool(true), "documentFormattingProvider": Bool(true), "documentHighlightProvider": Bool(true), "documentOnTypeFormattingProvider": Object({"firstTriggerCharacter": String("="), "moreTriggerCharacter": Array([String("."), String(">"), String("{")])}), "documentRangeFormattingProvider": Bool(false), "documentSymbolProvider": Bool(true), "experimental": Object({"externalDocs": Bool(true), "hoverRange": Bool(true), "joinLines": Bool(true), "matchingBrace": Bool(true), "moveItem": Bool(true), "onEnter": Bool(true), "openCargoToml": Bool(true), "parentModule": Bool(true), "runnables": Object({"kinds": Array([String("cargo")])}), "ssr": Bool(true), "workspaceSymbolScopeKindFiltering": Bool(true)}), "foldingRangeProvider": Bool(true), "hoverProvider": Bool(true), "implementationProvider": Bool(true), "inlayHintProvider": Object({"resolveProvider": Bool(true)}), "referencesProvider": Bool(true), "renameProvider": Object({"prepareProvider": Bool(true)}), "selectionRangeProvider": Bool(true), "semanticTokensProvider": Object({"full": Object({"delta": Bool(true)}), "legend": Object({"tokenModifiers": Array([String("documentation"), String("declaration"), String("static"), String("defaultLibrary"), String("async"), String("attribute"), String("callable"), String("constant"), String("consuming"), String("controlFlow"), String("crateRoot"), String("injected"), String("intraDocLink"), String("library"), String("mutable"), String("public"), String("reference"), String("trait"), String("unsafe")]), "tokenTypes": Array([String("comment"), String("decorator"), String("enumMember"), String("enum"), String("function"), String("interface"), String("keyword"), String("macro"), String("method"), String("namespace"), String("number"), String("operator"), String("parameter"), String("property"), String("string"), String("struct"), String("typeParameter"), String("variable"), String("angle"), String("arithmetic"), String("attribute"), String("attributeBracket"), String("bitwise"), String("boolean"), String("brace"), String("bracket"), String("builtinAttribute"), String("builtinType"), String("character"), String("colon"), String("comma"), String("comparison"), String("constParameter"), String("derive"), String("deriveHelper"), String("dot"), String("escapeSequence"), String("formatSpecifier"), String("generic"), String("label"), String("lifetime"), String("logical"), String("macroBang"), String("parenthesis"), String("punctuation"), String("selfKeyword"), String("selfTypeKeyword"), String("semicolon"), String("typeAlias"), String("toolModule"), String("union"), String("unresolvedReference")])}), "range": Bool(true)}), "signatureHelpProvider": Object({"triggerCharacters": Array([String("("), String(","), String("<")])}), "textDocumentSync": Object({"change": Number(2), "openClose": Bool(true), "save": Object({})}), "typeDefinitionProvider": Bool(true), "workspace": Object({"fileOperations": Object({"willRename": Object({"filters": Array([Object({"pattern": Object({"glob": String("**/*.rs"), "matches": String("file")}), "scheme": String("file")}), Object({"pattern": Object({"glob": String("**"), "matches": String("folder")}), "scheme": String("file")})])})})}), "workspaceSymbolProvider": Bool(true)}), "serverInfo": Object({"name": String("rust-analyzer"), "version": String("0.0.0 (8ddb8b7e8 2022-09-03)")})}) 16:30:46 INFO unnamed src/language_server_protocol.rs:1019 initialized; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 INFO unnamed src/language_server_protocol.rs:666 update_semantic_highlight_tables; language_id="rust" 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"initialized","params":{}} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":6} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 6, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:30:46 INFO unnamed src/language_server_protocol.rs:1946 text_document_did_open; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_isServerRunning",1]} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{"rust":{"all_targets":false,"build_on_save":true,"clippy_preference":"on","wait_to_build":0}}}} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientStarted"]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"LSP#text","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs"],"id":7} 16:30:46 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":0,"method":"workspace/configuration","params":{"items":[{"section":"rust-analyzer"}]}} 16:30:46 ERROR unnamed src/rpchandler.rs:27 Error handling message: Message not handled: MethodCall { jsonrpc: Some(V2), method: "workspace/configuration", params: Map({"items": Array([Object({"section": String("rust-analyzer")})])}), id: Num(0) } Message: {"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"section":"rust-analyzer"}]},"id":0} Error: Message not handled: MethodCall { jsonrpc: Some(V2), method: "workspace/configuration", params: Map({"items": Array([Object({"section": String("rust-analyzer")})])}), id: Num(0) } 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","error":{"code":-32603,"message":"Message not handled: MethodCall { jsonrpc: Some(V2), method: \"workspace/configuration\", params: Map({\"items\": Array([Object({\"section\": String(\"rust-analyzer\")})])}), id: Num(0) }"},"id":0} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 7, "jsonrpc": "2.0", "result": ["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};", "use anyhow::{anyhow, Result};", "use crossbeam::channel::{bounded, unbounded, Receiver, Sender};", "use log::*;", "use regex::Regex;", "use serde::{de::DeserializeOwned, Serialize};", "use std::io::Write;", "use std::str::FromStr;", "use std::{", " collections::HashMap,", " io::BufRead,", " sync::atomic::{AtomicU64, Ordering},", " thread,", " time::Duration,", "};", "", "const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;", "", "lazy_static! {", " // this regex is used to remove some additional fields that we get from some servers, namely:", " // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.", " static ref RE_REMOVE_EXTRA_FIELDS: Regex =", " Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();", "}", "", "#[derive(Serialize)]", "pub struct RpcClient {", " language_id: LanguageId,", " #[serde(skip_serializing)]", " id: AtomicU64,", " #[serde(skip_serializing)]", " writer_tx: Sender<RawMessage>,", " #[serde(skip_serializing)]", " reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,", " pub process_id: Option<u32>,", "}", "", "impl RpcClient {", " #[allow(clippy::new_ret_no_self)]", " pub fn new(", " language_id: LanguageId,", " reader: impl BufRead + Send + 'static,", " writer: impl Write + Send + 'static,", " process_id: Option<u32>,", " sink: Sender<Call>,", " on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,", " ) -> Result<Self> {", " let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();", "", " let language_id_clone = language_id.clone();", " let reader_thread_name = format!(\"reader-{:?}\", language_id);", " let on_crash_clone = on_crash.clone();", " thread::Builder::new()", " .name(reader_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {", " on_crash_clone(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);", " }", " })?;", "", " let (writer_tx, writer_rx) = unbounded();", " let writer_thread_name = format!(\"writer-{:?}\", language_id);", " let language_id_clone = language_id.clone();", " thread::Builder::new()", " .name(writer_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {", " on_crash(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);", " }", " })?;", "", " Ok(Self {", " language_id,", " id: AtomicU64::default(),", " process_id,", " reader_tx,", " writer_tx,", " })", " }", "", " pub fn call<R: DeserializeOwned>(", " &self,", " method: impl AsRef<str>,", " params: impl Serialize,", " ) -> Result<R> {", " let method = method.as_ref();", " let id = self.id.fetch_add(1, Ordering::SeqCst);", " let msg = jsonrpc_core::MethodCall {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " let (tx, rx) = bounded(1);", " self.reader_tx.send((id, tx))?;", " self.writer_tx.send(RawMessage::MethodCall(msg))?;", " // TODO: duration from config.", " match rx.recv_timeout(Duration::from_secs(60))? {", " jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),", " // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,", " // which we don't want to show to the user and should ignore, as the result of the", " // request that triggered this error has been invalidated by changes to the state", " // of the server, so we must handle this error specifically.", " jsonrpc_core::Output::Failure(err)", " if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>", " {", " Err(anyhow::Error::from(LSError::ContentModified))", " }", " jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),", " }", " }", "", " pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {", " let method = method.as_ref();", "", " let msg = jsonrpc_core::Notification {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " self.writer_tx.send(RawMessage::Notification(msg))?;", " Ok(())", " }", "", " pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {", " let output = match result {", " Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " result: serde_json::to_value(ok)?,", " }),", " Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " error: err.to_rpc_error(),", " }),", " };", "", " self.writer_tx.send(RawMessage::Output(output))?;", " Ok(())", " }", "}", "", "fn loop_read(", " reader: impl BufRead,", " reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,", " sink: &Sender<Call>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut pending_outputs = HashMap::new();", "", " // Count how many consequent empty lines.", " let mut count_empty_lines = 0;", "", " let mut reader = reader;", " let mut content_length = 0;", " loop {", " let mut message = String::new();", " let mut line = String::new();", " if language_id.is_some() {", " reader.read_line(&mut line)?;", " let line = line.trim();", " if line.is_empty() {", " count_empty_lines += 1;", " if count_empty_lines > 5 {", " return Err(anyhow!(\"Unable to read from language server\"));", " }", "", " let mut buf = vec![0; content_length];", " reader.read_exact(buf.as_mut_slice())?;", " message = String::from_utf8(buf)?;", " } else {", " count_empty_lines = 0;", " if !line.starts_with(\"Content-Length\") {", " continue;", " }", "", " let tokens: Vec<&str> = line.splitn(2, ':').collect();", " let len = tokens", " .get(1)", " .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?", " .trim();", " content_length = usize::from_str(len)?;", " }", " } else if reader.read_line(&mut message)? == 0 {", " break;", " }", "", " let message = message.trim();", " if message.is_empty() {", " continue;", " }", " debug!(\"<= {:?} {}\", language_id, message);", " // FIXME: Remove extra `meta` property from javascript-typescript-langserver and", " // `requestMethod` sent by Sorbet.", " let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let message = serde_json::from_str(&s);", " if let Err(ref err) = message {", " error!(", " \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",", " err, s, err", " );", " continue;", " }", " // TODO: cleanup.", " let message = message.unwrap();", " match message {", " RawMessage::MethodCall(method_call) => {", " sink.send(Call::MethodCall(language_id.clone(), method_call))?;", " }", " RawMessage::Notification(notification) => {", " sink.send(Call::Notification(language_id.clone(), notification))?;", " }", " RawMessage::Output(output) => {", " while let Ok((id, tx)) = reader_rx.try_recv() {", " pending_outputs.insert(id, tx);", " }", "", " if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {", " tx.send(output)", " .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;", " }", " }", " };", " }", "", " info!(\"reader-{:?} terminated\", language_id);", " Ok(())", "}", "", "fn loop_write(", " writer: impl Write,", " rx: &Receiver<RawMessage>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut writer = writer;", "", " for msg in rx.iter() {", " let s = serde_json::to_string(&msg)?;", " debug!(\"=> {:?} {}\", language_id, s);", " if language_id.is_none() {", " // Use different convention for two reasons,", " // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim", " // receives `content`.", " // 2. Without last line ending, vim output handler won't be triggered.", " write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;", " } else {", " write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;", " };", " writer.flush()?;", " }", " Ok(())", "}", "", "#[cfg(test)]", "mod test {", " use super::RE_REMOVE_EXTRA_FIELDS;", " use crate::types::RawMessage;", "", " #[test]", " // The library we're using for json-rpc doesn't accept extra fields in the structs used to", " // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so", " // the client fails to deserialize that response.", " // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is", " // suboptimal, so we now try to remove the extra fields we know of from the response.", " //", " // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892", " fn it_should_remove_extra_fields() {", " // it removes the requestMethod field from Sorbet", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " let message =", " r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " // it removes the meta field from javascript-typescript-langserver", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", " }", "}", ""]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["s:GetVar('LanguageClient_setOmnifunc', v:true)"],"id":8} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 8, "jsonrpc": "2.0", "result": true} 16:30:46 DEBUG unnamed src/language_client.rs:108 state.text_documents./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> {"languageId":"rust","text":"use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};\nuse anyhow::{anyhow, Result};\nuse crossbeam::channel::{bounded, unbounded, Receiver, Sender};\nuse log::*;\nuse regex::Regex;\nuse serde::{de::DeserializeOwned, Serialize};\nuse std::io::Write;\nuse std::str::FromStr;\nuse std::{\n collections::HashMap,\n io::BufRead,\n sync::atomic::{AtomicU64, Ordering},\n thread,\n time::Duration,\n};\n\nconst CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;\n\nlazy_static! {\n // this regex is used to remove some additional fields that we get from some servers, namely:\n // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.\n static ref RE_REMOVE_EXTRA_FIELDS: Regex =\n Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();\n}\n\n#[derive(Serialize)]\npub struct RpcClient {\n language_id: LanguageId,\n #[serde(skip_serializing)]\n id: AtomicU64,\n #[serde(skip_serializing)]\n writer_tx: Sender<RawMessage>,\n #[serde(skip_serializing)]\n reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,\n pub process_id: Option<u32>,\n}\n\nimpl RpcClient {\n #[allow(clippy::new_ret_no_self)]\n pub fn new(\n language_id: LanguageId,\n reader: impl BufRead + Send + 'static,\n writer: impl Write + Send + 'static,\n process_id: Option<u32>,\n sink: Sender<Call>,\n on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,\n ) -> Result<Self> {\n let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();\n\n let language_id_clone = language_id.clone();\n let reader_thread_name = format!(\"reader-{:?}\", language_id);\n let on_crash_clone = on_crash.clone();\n thread::Builder::new()\n .name(reader_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {\n on_crash_clone(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);\n }\n })?;\n\n let (writer_tx, writer_rx) = unbounded();\n let writer_thread_name = format!(\"writer-{:?}\", language_id);\n let language_id_clone = language_id.clone();\n thread::Builder::new()\n .name(writer_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {\n on_crash(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);\n }\n })?;\n\n Ok(Self {\n language_id,\n id: AtomicU64::default(),\n process_id,\n reader_tx,\n writer_tx,\n })\n }\n\n pub fn call<R: DeserializeOwned>(\n &self,\n method: impl AsRef<str>,\n params: impl Serialize,\n ) -> Result<R> {\n let method = method.as_ref();\n let id = self.id.fetch_add(1, Ordering::SeqCst);\n let msg = jsonrpc_core::MethodCall {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n let (tx, rx) = bounded(1);\n self.reader_tx.send((id, tx))?;\n self.writer_tx.send(RawMessage::MethodCall(msg))?;\n // TODO: duration from config.\n match rx.recv_timeout(Duration::from_secs(60))? {\n jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),\n // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,\n // which we don't want to show to the user and should ignore, as the result of the\n // request that triggered this error has been invalidated by changes to the state\n // of the server, so we must handle this error specifically.\n jsonrpc_core::Output::Failure(err)\n if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>\n {\n Err(anyhow::Error::from(LSError::ContentModified))\n }\n jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),\n }\n }\n\n pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {\n let method = method.as_ref();\n\n let msg = jsonrpc_core::Notification {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n self.writer_tx.send(RawMessage::Notification(msg))?;\n Ok(())\n }\n\n pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {\n let output = match result {\n Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n result: serde_json::to_value(ok)?,\n }),\n Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n error: err.to_rpc_error(),\n }),\n };\n\n self.writer_tx.send(RawMessage::Output(output))?;\n Ok(())\n }\n}\n\nfn loop_read(\n reader: impl BufRead,\n reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,\n sink: &Sender<Call>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut pending_outputs = HashMap::new();\n\n // Count how many consequent empty lines.\n let mut count_empty_lines = 0;\n\n let mut reader = reader;\n let mut content_length = 0;\n loop {\n let mut message = String::new();\n let mut line = String::new();\n if language_id.is_some() {\n reader.read_line(&mut line)?;\n let line = line.trim();\n if line.is_empty() {\n count_empty_lines += 1;\n if count_empty_lines > 5 {\n return Err(anyhow!(\"Unable to read from language server\"));\n }\n\n let mut buf = vec![0; content_length];\n reader.read_exact(buf.as_mut_slice())?;\n message = String::from_utf8(buf)?;\n } else {\n count_empty_lines = 0;\n if !line.starts_with(\"Content-Length\") {\n continue;\n }\n\n let tokens: Vec<&str> = line.splitn(2, ':').collect();\n let len = tokens\n .get(1)\n .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?\n .trim();\n content_length = usize::from_str(len)?;\n }\n } else if reader.read_line(&mut message)? == 0 {\n break;\n }\n\n let message = message.trim();\n if message.is_empty() {\n continue;\n }\n debug!(\"<= {:?} {}\", language_id, message);\n // FIXME: Remove extra `meta` property from javascript-typescript-langserver and\n // `requestMethod` sent by Sorbet.\n let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let message = serde_json::from_str(&s);\n if let Err(ref err) = message {\n error!(\n \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",\n err, s, err\n );\n continue;\n }\n // TODO: cleanup.\n let message = message.unwrap();\n match message {\n RawMessage::MethodCall(method_call) => {\n sink.send(Call::MethodCall(language_id.clone(), method_call))?;\n }\n RawMessage::Notification(notification) => {\n sink.send(Call::Notification(language_id.clone(), notification))?;\n }\n RawMessage::Output(output) => {\n while let Ok((id, tx)) = reader_rx.try_recv() {\n pending_outputs.insert(id, tx);\n }\n\n if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {\n tx.send(output)\n .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;\n }\n }\n };\n }\n\n info!(\"reader-{:?} terminated\", language_id);\n Ok(())\n}\n\nfn loop_write(\n writer: impl Write,\n rx: &Receiver<RawMessage>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut writer = writer;\n\n for msg in rx.iter() {\n let s = serde_json::to_string(&msg)?;\n debug!(\"=> {:?} {}\", language_id, s);\n if language_id.is_none() {\n // Use different convention for two reasons,\n // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim\n // receives `content`.\n // 2. Without last line ending, vim output handler won't be triggered.\n write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;\n } else {\n write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;\n };\n writer.flush()?;\n }\n Ok(())\n}\n\n#[cfg(test)]\nmod test {\n use super::RE_REMOVE_EXTRA_FIELDS;\n use crate::types::RawMessage;\n\n #[test]\n // The library we're using for json-rpc doesn't accept extra fields in the structs used to\n // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so\n // the client fails to deserialize that response.\n // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is\n // suboptimal, so we now try to remove the extra fields we know of from the response.\n //\n // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892\n fn it_should_remove_extra_fields() {\n // it removes the requestMethod field from Sorbet\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n let message =\n r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n // it removes the meta field from javascript-typescript-langserver\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n }\n}\n","uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs","version":0} 16:30:46 INFO unnamed src/language_server_protocol.rs:1888 text_document_code_lens; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:command","params":["setlocal omnifunc=LanguageClient#complete"]} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"rust","text":"use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};\nuse anyhow::{anyhow, Result};\nuse crossbeam::channel::{bounded, unbounded, Receiver, Sender};\nuse log::*;\nuse regex::Regex;\nuse serde::{de::DeserializeOwned, Serialize};\nuse std::io::Write;\nuse std::str::FromStr;\nuse std::{\n collections::HashMap,\n io::BufRead,\n sync::atomic::{AtomicU64, Ordering},\n thread,\n time::Duration,\n};\n\nconst CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;\n\nlazy_static! {\n // this regex is used to remove some additional fields that we get from some servers, namely:\n // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.\n static ref RE_REMOVE_EXTRA_FIELDS: Regex =\n Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();\n}\n\n#[derive(Serialize)]\npub struct RpcClient {\n language_id: LanguageId,\n #[serde(skip_serializing)]\n id: AtomicU64,\n #[serde(skip_serializing)]\n writer_tx: Sender<RawMessage>,\n #[serde(skip_serializing)]\n reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,\n pub process_id: Option<u32>,\n}\n\nimpl RpcClient {\n #[allow(clippy::new_ret_no_self)]\n pub fn new(\n language_id: LanguageId,\n reader: impl BufRead + Send + 'static,\n writer: impl Write + Send + 'static,\n process_id: Option<u32>,\n sink: Sender<Call>,\n on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,\n ) -> Result<Self> {\n let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();\n\n let language_id_clone = language_id.clone();\n let reader_thread_name = format!(\"reader-{:?}\", language_id);\n let on_crash_clone = on_crash.clone();\n thread::Builder::new()\n .name(reader_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {\n on_crash_clone(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);\n }\n })?;\n\n let (writer_tx, writer_rx) = unbounded();\n let writer_thread_name = format!(\"writer-{:?}\", language_id);\n let language_id_clone = language_id.clone();\n thread::Builder::new()\n .name(writer_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {\n on_crash(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);\n }\n })?;\n\n Ok(Self {\n language_id,\n id: AtomicU64::default(),\n process_id,\n reader_tx,\n writer_tx,\n })\n }\n\n pub fn call<R: DeserializeOwned>(\n &self,\n method: impl AsRef<str>,\n params: impl Serialize,\n ) -> Result<R> {\n let method = method.as_ref();\n let id = self.id.fetch_add(1, Ordering::SeqCst);\n let msg = jsonrpc_core::MethodCall {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n let (tx, rx) = bounded(1);\n self.reader_tx.send((id, tx))?;\n self.writer_tx.send(RawMessage::MethodCall(msg))?;\n // TODO: duration from config.\n match rx.recv_timeout(Duration::from_secs(60))? {\n jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),\n // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,\n // which we don't want to show to the user and should ignore, as the result of the\n // request that triggered this error has been invalidated by changes to the state\n // of the server, so we must handle this error specifically.\n jsonrpc_core::Output::Failure(err)\n if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>\n {\n Err(anyhow::Error::from(LSError::ContentModified))\n }\n jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),\n }\n }\n\n pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {\n let method = method.as_ref();\n\n let msg = jsonrpc_core::Notification {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n self.writer_tx.send(RawMessage::Notification(msg))?;\n Ok(())\n }\n\n pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {\n let output = match result {\n Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n result: serde_json::to_value(ok)?,\n }),\n Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n error: err.to_rpc_error(),\n }),\n };\n\n self.writer_tx.send(RawMessage::Output(output))?;\n Ok(())\n }\n}\n\nfn loop_read(\n reader: impl BufRead,\n reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,\n sink: &Sender<Call>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut pending_outputs = HashMap::new();\n\n // Count how many consequent empty lines.\n let mut count_empty_lines = 0;\n\n let mut reader = reader;\n let mut content_length = 0;\n loop {\n let mut message = String::new();\n let mut line = String::new();\n if language_id.is_some() {\n reader.read_line(&mut line)?;\n let line = line.trim();\n if line.is_empty() {\n count_empty_lines += 1;\n if count_empty_lines > 5 {\n return Err(anyhow!(\"Unable to read from language server\"));\n }\n\n let mut buf = vec![0; content_length];\n reader.read_exact(buf.as_mut_slice())?;\n message = String::from_utf8(buf)?;\n } else {\n count_empty_lines = 0;\n if !line.starts_with(\"Content-Length\") {\n continue;\n }\n\n let tokens: Vec<&str> = line.splitn(2, ':').collect();\n let len = tokens\n .get(1)\n .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?\n .trim();\n content_length = usize::from_str(len)?;\n }\n } else if reader.read_line(&mut message)? == 0 {\n break;\n }\n\n let message = message.trim();\n if message.is_empty() {\n continue;\n }\n debug!(\"<= {:?} {}\", language_id, message);\n // FIXME: Remove extra `meta` property from javascript-typescript-langserver and\n // `requestMethod` sent by Sorbet.\n let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let message = serde_json::from_str(&s);\n if let Err(ref err) = message {\n error!(\n \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",\n err, s, err\n );\n continue;\n }\n // TODO: cleanup.\n let message = message.unwrap();\n match message {\n RawMessage::MethodCall(method_call) => {\n sink.send(Call::MethodCall(language_id.clone(), method_call))?;\n }\n RawMessage::Notification(notification) => {\n sink.send(Call::Notification(language_id.clone(), notification))?;\n }\n RawMessage::Output(output) => {\n while let Ok((id, tx)) = reader_rx.try_recv() {\n pending_outputs.insert(id, tx);\n }\n\n if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {\n tx.send(output)\n .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;\n }\n }\n };\n }\n\n info!(\"reader-{:?} terminated\", language_id);\n Ok(())\n}\n\nfn loop_write(\n writer: impl Write,\n rx: &Receiver<RawMessage>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut writer = writer;\n\n for msg in rx.iter() {\n let s = serde_json::to_string(&msg)?;\n debug!(\"=> {:?} {}\", language_id, s);\n if language_id.is_none() {\n // Use different convention for two reasons,\n // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim\n // receives `content`.\n // 2. Without last line ending, vim output handler won't be triggered.\n write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;\n } else {\n write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;\n };\n writer.flush()?;\n }\n Ok(())\n}\n\n#[cfg(test)]\nmod test {\n use super::RE_REMOVE_EXTRA_FIELDS;\n use crate::types::RawMessage;\n\n #[test]\n // The library we're using for json-rpc doesn't accept extra fields in the structs used to\n // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so\n // the client fails to deserialize that response.\n // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is\n // suboptimal, so we now try to remove the extra fields we know of from the response.\n //\n // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892\n fn it_should_remove_extra_fields() {\n // it removes the requestMethod field from Sorbet\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n let message =\n r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n // it removes the meta field from javascript-typescript-langserver\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n }\n}\n","uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs","version":0}}} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_projectRoot","/home/dick/LanguageClient-neovim"]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientTextDocumentDidOpenPost"]} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/codeLens","params":{"textDocument":{"uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs"}},"id":1} 16:30:46 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":1,"error":{"code":-32801,"message":"waiting for cargo metadata or cargo check"}} 16:30:47 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":1,"method":"client/registerCapability","params":{"registrations":[{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}]}} 16:30:47 INFO unnamed src/language_server_protocol.rs:2489 client_register_capability; language_id="rust" params=Object({"registrations": Array([Object({"id": String("workspace/didChangeWatchedFiles"), "method": String("workspace/didChangeWatchedFiles"), "registerOptions": Object({"watchers": Array([Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/*.rs")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.toml")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.lock")})])})})])}) 16:30:47 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/*.rs 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/mod.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/server_command.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/clangd.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/gopls.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/java.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/mod.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/rust_analyzer.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_client.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_server_protocol.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/logger.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/main.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpcclient.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpchandler.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/sign.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/types.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/utils.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/viewport.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vim.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vimext.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/watcher.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-fa158a1d365cbdd8/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-4457d73fa8da0d46/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-7418c11d7db55b23/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/rls/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/libs.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/main.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.toml 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.toml" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.toml" 16:30:47 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.lock 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.lock" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.lock" 16:30:47 DEBUG unnamed src/language_client.rs:108 state.registrations: [] ==> [{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}] 16:30:47 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","result":null,"id":1} 16:30:48 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":2,"method":"client/registerCapability","params":{"registrations":[{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}]}} 16:30:48 INFO unnamed src/language_server_protocol.rs:2489 client_register_capability; language_id="rust" params=Object({"registrations": Array([Object({"id": String("workspace/didChangeWatchedFiles"), "method": String("workspace/didChangeWatchedFiles"), "registerOptions": Object({"watchers": Array([Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/*.rs")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.toml")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.lock")})])})})])}) 16:30:48 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/*.rs 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/mod.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/server_command.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/clangd.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/gopls.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/java.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/mod.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/rust_analyzer.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_client.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_server_protocol.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/logger.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/main.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpcclient.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpchandler.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/sign.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/types.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/utils.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/viewport.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vim.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vimext.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/watcher.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-fa158a1d365cbdd8/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-4457d73fa8da0d46/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-7418c11d7db55b23/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/rls/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/libs.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/main.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.toml 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.toml" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.toml" 16:30:48 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.lock 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.lock" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.lock" 16:30:48 DEBUG unnamed src/language_client.rs:108 state.registrations: [{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}] ==> [{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}},{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}] 16:30:48 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","result":null,"id":2} 16:31:04 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs","diagnostics":[],"version":0}} 16:31:04 INFO unnamed src/language_server_protocol.rs:2095 text_document_publish_diagnostics; params=Object({"diagnostics": Array([]), "uri": String("file:///home/dick/LanguageClient-neovim/src/rpcclient.rs"), "version": Number(0)}) 16:31:04 DEBUG unnamed src/language_client.rs:108 state.diagnostics./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> [] 16:31:04 INFO unnamed src/vim.rs:225 Begin setqflist 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setqflist","params":[[],"r"]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setqflist","params":[[],"a",{"title":"[LC]: diagnostics"}]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["bufnr('/home/dick/LanguageClient-neovim/src/rpcclient.rs')"],"id":9} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 9, "jsonrpc": "2.0", "result": 1} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_statusLineDiagnosticsCounts",{"E":0,"H":0,"I":0,"W":0}]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":10} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 10, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:31:04 DEBUG unnamed src/language_client.rs:108 state.highlights./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> [] 16:31:04 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Null force_redraw=true 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":11} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 11, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"getbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","&filetype"],"id":12} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 12, "jsonrpc": "2.0", "result": "rust"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#position()"],"id":13} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 13, "jsonrpc": "2.0", "result": {"character": 0, "line": 0}} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#viewport()"],"id":14} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 14, "jsonrpc": "2.0", "result": {"end": 20, "start": 0}} 16:31:04 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 0, end: 20 } 16:31:04 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> {"end":20,"start":0} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":15} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 15, "jsonrpc": "2.0", "result": 0} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":16} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 16, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#viewport()"],"id":17} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 17, "jsonrpc": "2.0", "result": {"end": 20, "start": 0}} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["bufnr('/home/dick/LanguageClient-neovim/src/rpcclient.rs')"],"id":18} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 18, "jsonrpc": "2.0", "result": 1} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"nvim_create_namespace","params":["LanguageClient_VirtualText"],"id":19} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 19, "jsonrpc": "2.0", "result": 3} 16:31:04 DEBUG unnamed src/language_client.rs:108 state.namespace_ids.LanguageClient_VirtualText: null ==> 3 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":20} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 20, "jsonrpc": "2.0", "result": "c"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,0,20,[]],"id":21} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 21, "jsonrpc": "2.0", "result": 0} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientDiagnosticsChanged"]} 17:00:02 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 20, "start": 0}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 1}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:00:02 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(1)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) force_redraw=false 17:00:02 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:EchoEllipsis","params":[""]} 17:00:02 DEBUG unnamed src/language_client.rs:108 state.last_line_diagnostic: " " ==> "" 17:00:02 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 0 ==> 1 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 24, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:00:03 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(24), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:00:03 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 1 ==> 49 17:00:03 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 40, end: 59 } 17:00:03 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.start: 0 ==> 40 17:00:03 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.end: 20 ==> 59 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":22} 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 22, "jsonrpc": "2.0", "result": 0} 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":23} 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 23, "jsonrpc": "2.0", "result": "n"} 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,40,59,[]],"id":24} 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 24, "jsonrpc": "2.0", "result": 0} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 1, "jsonrpc": "2.0", "method": "textDocument/definition", "params": {"bufnr": 1, "character": 45, "handle": true, "languageId": "rust", "gotoCmd": null, "line": 49, "text": ["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};", "use anyhow::{anyhow, Result};", "use crossbeam::channel::{bounded, unbounded, Receiver, Sender};", "use log::*;", "use regex::Regex;", "use serde::{de::DeserializeOwned, Serialize};", "use std::io::Write;", "use std::str::FromStr;", "use std::{", " collections::HashMap,", " io::BufRead,", " sync::atomic::{AtomicU64, Ordering},", " thread,", " time::Duration,", "};", "", "const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;", "", "lazy_static! {", " // this regex is used to remove some additional fields that we get from some servers, namely:", " // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.", " static ref RE_REMOVE_EXTRA_FIELDS: Regex =", " Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();", "}", "", "#[derive(Serialize)]", "pub struct RpcClient {", " language_id: LanguageId,", " #[serde(skip_serializing)]", " id: AtomicU64,", " #[serde(skip_serializing)]", " writer_tx: Sender<RawMessage>,", " #[serde(skip_serializing)]", " reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,", " pub process_id: Option<u32>,", "}", "", "impl RpcClient {", " #[allow(clippy::new_ret_no_self)]", " pub fn new(", " language_id: LanguageId,", " reader: impl BufRead + Send + 'static,", " writer: impl Write + Send + 'static,", " process_id: Option<u32>,", " sink: Sender<Call>,", " on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,", " ) -> Result<Self> {", " let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();", "", " let language_id_clone = language_id.clone();", " let reader_thread_name = format!(\"reader-{:?}\", language_id);", " let on_crash_clone = on_crash.clone();", " thread::Builder::new()", " .name(reader_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {", " on_crash_clone(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);", " }", " })?;", "", " let (writer_tx, writer_rx) = unbounded();", " let writer_thread_name = format!(\"writer-{:?}\", language_id);", " let language_id_clone = language_id.clone();", " thread::Builder::new()", " .name(writer_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {", " on_crash(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);", " }", " })?;", "", " Ok(Self {", " language_id,", " id: AtomicU64::default(),", " process_id,", " reader_tx,", " writer_tx,", " })", " }", "", " pub fn call<R: DeserializeOwned>(", " &self,", " method: impl AsRef<str>,", " params: impl Serialize,", " ) -> Result<R> {", " let method = method.as_ref();", " let id = self.id.fetch_add(1, Ordering::SeqCst);", " let msg = jsonrpc_core::MethodCall {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " let (tx, rx) = bounded(1);", " self.reader_tx.send((id, tx))?;", " self.writer_tx.send(RawMessage::MethodCall(msg))?;", " // TODO: duration from config.", " match rx.recv_timeout(Duration::from_secs(60))? {", " jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),", " // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,", " // which we don't want to show to the user and should ignore, as the result of the", " // request that triggered this error has been invalidated by changes to the state", " // of the server, so we must handle this error specifically.", " jsonrpc_core::Output::Failure(err)", " if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>", " {", " Err(anyhow::Error::from(LSError::ContentModified))", " }", " jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),", " }", " }", "", " pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {", " let method = method.as_ref();", "", " let msg = jsonrpc_core::Notification {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " self.writer_tx.send(RawMessage::Notification(msg))?;", " Ok(())", " }", "", " pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {", " let output = match result {", " Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " result: serde_json::to_value(ok)?,", " }),", " Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " error: err.to_rpc_error(),", " }),", " };", "", " self.writer_tx.send(RawMessage::Output(output))?;", " Ok(())", " }", "}", "", "fn loop_read(", " reader: impl BufRead,", " reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,", " sink: &Sender<Call>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut pending_outputs = HashMap::new();", "", " // Count how many consequent empty lines.", " let mut count_empty_lines = 0;", "", " let mut reader = reader;", " let mut content_length = 0;", " loop {", " let mut message = String::new();", " let mut line = String::new();", " if language_id.is_some() {", " reader.read_line(&mut line)?;", " let line = line.trim();", " if line.is_empty() {", " count_empty_lines += 1;", " if count_empty_lines > 5 {", " return Err(anyhow!(\"Unable to read from language server\"));", " }", "", " let mut buf = vec![0; content_length];", " reader.read_exact(buf.as_mut_slice())?;", " message = String::from_utf8(buf)?;", " } else {", " count_empty_lines = 0;", " if !line.starts_with(\"Content-Length\") {", " continue;", " }", "", " let tokens: Vec<&str> = line.splitn(2, ':').collect();", " let len = tokens", " .get(1)", " .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?", " .trim();", " content_length = usize::from_str(len)?;", " }", " } else if reader.read_line(&mut message)? == 0 {", " break;", " }", "", " let message = message.trim();", " if message.is_empty() {", " continue;", " }", " debug!(\"<= {:?} {}\", language_id, message);", " // FIXME: Remove extra `meta` property from javascript-typescript-langserver and", " // `requestMethod` sent by Sorbet.", " let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let message = serde_json::from_str(&s);", " if let Err(ref err) = message {", " error!(", " \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",", " err, s, err", " );", " continue;", " }", " // TODO: cleanup.", " let message = message.unwrap();", " match message {", " RawMessage::MethodCall(method_call) => {", " sink.send(Call::MethodCall(language_id.clone(), method_call))?;", " }", " RawMessage::Notification(notification) => {", " sink.send(Call::Notification(language_id.clone(), notification))?;", " }", " RawMessage::Output(output) => {", " while let Ok((id, tx)) = reader_rx.try_recv() {", " pending_outputs.insert(id, tx);", " }", "", " if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {", " tx.send(output)", " .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;", " }", " }", " };", " }", "", " info!(\"reader-{:?} terminated\", language_id);", " Ok(())", "}", "", "fn loop_write(", " writer: impl Write,", " rx: &Receiver<RawMessage>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut writer = writer;", "", " for msg in rx.iter() {", " let s = serde_json::to_string(&msg)?;", " debug!(\"=> {:?} {}\", language_id, s);", " if language_id.is_none() {", " // Use different convention for two reasons,", " // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim", " // receives `content`.", " // 2. Without last line ending, vim output handler won't be triggered.", " write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;", " } else {", " write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;", " };", " writer.flush()?;", " }", " Ok(())", "}", "", "#[cfg(test)]", "mod test {", " use super::RE_REMOVE_EXTRA_FIELDS;", " use crate::types::RawMessage;", "", " #[test]", " // The library we're using for json-rpc doesn't accept extra fields in the structs used to", " // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so", " // the client fails to deserialize that response.", " // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is", " // suboptimal, so we now try to remove the extra fields we know of from the response.", " //", " // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892", " fn it_should_remove_extra_fields() {", " // it removes the requestMethod field from Sorbet", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " let message =", " r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " // it removes the meta field from javascript-typescript-langserver", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", " }", "}", ""], "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:1473 text_document_definition; params=Object({"bufnr": Number(1), "character": Number(45), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "gotoCmd": Null, "handle": Bool(true), "languageId": String("rust"), "line": Number(49), "text": Array([String("use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};"), String("use anyhow::{anyhow, Result};"), String("use crossbeam::channel::{bounded, unbounded, Receiver, Sender};"), String("use log::*;"), String("use regex::Regex;"), String("use serde::{de::DeserializeOwned, Serialize};"), String("use std::io::Write;"), String("use std::str::FromStr;"), String("use std::{"), String(" collections::HashMap,"), String(" io::BufRead,"), String(" sync::atomic::{AtomicU64, Ordering},"), String(" thread,"), String(" time::Duration,"), String("};"), String(""), String("const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;"), String(""), String("lazy_static! {"), String(" // this regex is used to remove some additional fields that we get from some servers, namely:"), String(" // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."), String(" static ref RE_REMOVE_EXTRA_FIELDS: Regex ="), String(" Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();"), String("}"), String(""), String("#[derive(Serialize)]"), String("pub struct RpcClient {"), String(" language_id: LanguageId,"), String(" #[serde(skip_serializing)]"), String(" id: AtomicU64,"), String(" #[serde(skip_serializing)]"), String(" writer_tx: Sender<RawMessage>,"), String(" #[serde(skip_serializing)]"), String(" reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"), String(" pub process_id: Option<u32>,"), String("}"), String(""), String("impl RpcClient {"), String(" #[allow(clippy::new_ret_no_self)]"), String(" pub fn new("), String(" language_id: LanguageId,"), String(" reader: impl BufRead + Send + 'static,"), String(" writer: impl Write + Send + 'static,"), String(" process_id: Option<u32>,"), String(" sink: Sender<Call>,"), String(" on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"), String(" ) -> Result<Self> {"), String(" let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();"), String(""), String(" let language_id_clone = language_id.clone();"), String(" let reader_thread_name = format!(\"reader-{:?}\", language_id);"), String(" let on_crash_clone = on_crash.clone();"), String(" thread::Builder::new()"), String(" .name(reader_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"), String(" on_crash_clone(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" let (writer_tx, writer_rx) = unbounded();"), String(" let writer_thread_name = format!(\"writer-{:?}\", language_id);"), String(" let language_id_clone = language_id.clone();"), String(" thread::Builder::new()"), String(" .name(writer_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"), String(" on_crash(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" Ok(Self {"), String(" language_id,"), String(" id: AtomicU64::default(),"), String(" process_id,"), String(" reader_tx,"), String(" writer_tx,"), String(" })"), String(" }"), String(""), String(" pub fn call<R: DeserializeOwned>("), String(" &self,"), String(" method: impl AsRef<str>,"), String(" params: impl Serialize,"), String(" ) -> Result<R> {"), String(" let method = method.as_ref();"), String(" let id = self.id.fetch_add(1, Ordering::SeqCst);"), String(" let msg = jsonrpc_core::MethodCall {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" let (tx, rx) = bounded(1);"), String(" self.reader_tx.send((id, tx))?;"), String(" self.writer_tx.send(RawMessage::MethodCall(msg))?;"), String(" // TODO: duration from config."), String(" match rx.recv_timeout(Duration::from_secs(60))? {"), String(" jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"), String(" // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"), String(" // which we don't want to show to the user and should ignore, as the result of the"), String(" // request that triggered this error has been invalidated by changes to the state"), String(" // of the server, so we must handle this error specifically."), String(" jsonrpc_core::Output::Failure(err)"), String(" if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"), String(" {"), String(" Err(anyhow::Error::from(LSError::ContentModified))"), String(" }"), String(" jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"), String(" }"), String(" }"), String(""), String(" pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"), String(" let method = method.as_ref();"), String(""), String(" let msg = jsonrpc_core::Notification {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" self.writer_tx.send(RawMessage::Notification(msg))?;"), String(" Ok(())"), String(" }"), String(""), String(" pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"), String(" let output = match result {"), String(" Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" result: serde_json::to_value(ok)?,"), String(" }),"), String(" Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" error: err.to_rpc_error(),"), String(" }),"), String(" };"), String(""), String(" self.writer_tx.send(RawMessage::Output(output))?;"), String(" Ok(())"), String(" }"), String("}"), String(""), String("fn loop_read("), String(" reader: impl BufRead,"), String(" reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"), String(" sink: &Sender<Call>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut pending_outputs = HashMap::new();"), String(""), String(" // Count how many consequent empty lines."), String(" let mut count_empty_lines = 0;"), String(""), String(" let mut reader = reader;"), String(" let mut content_length = 0;"), String(" loop {"), String(" let mut message = String::new();"), String(" let mut line = String::new();"), String(" if language_id.is_some() {"), String(" reader.read_line(&mut line)?;"), String(" let line = line.trim();"), String(" if line.is_empty() {"), String(" count_empty_lines += 1;"), String(" if count_empty_lines > 5 {"), String(" return Err(anyhow!(\"Unable to read from language server\"));"), String(" }"), String(""), String(" let mut buf = vec![0; content_length];"), String(" reader.read_exact(buf.as_mut_slice())?;"), String(" message = String::from_utf8(buf)?;"), String(" } else {"), String(" count_empty_lines = 0;"), String(" if !line.starts_with(\"Content-Length\") {"), String(" continue;"), String(" }"), String(""), String(" let tokens: Vec<&str> = line.splitn(2, ':').collect();"), String(" let len = tokens"), String(" .get(1)"), String(" .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"), String(" .trim();"), String(" content_length = usize::from_str(len)?;"), String(" }"), String(" } else if reader.read_line(&mut message)? == 0 {"), String(" break;"), String(" }"), String(""), String(" let message = message.trim();"), String(" if message.is_empty() {"), String(" continue;"), String(" }"), String(" debug!(\"<= {:?} {}\", language_id, message);"), String(" // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"), String(" // `requestMethod` sent by Sorbet."), String(" let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let message = serde_json::from_str(&s);"), String(" if let Err(ref err) = message {"), String(" error!("), String(" \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","), String(" err, s, err"), String(" );"), String(" continue;"), String(" }"), String(" // TODO: cleanup."), String(" let message = message.unwrap();"), String(" match message {"), String(" RawMessage::MethodCall(method_call) => {"), String(" sink.send(Call::MethodCall(language_id.clone(), method_call))?;"), String(" }"), String(" RawMessage::Notification(notification) => {"), String(" sink.send(Call::Notification(language_id.clone(), notification))?;"), String(" }"), String(" RawMessage::Output(output) => {"), String(" while let Ok((id, tx)) = reader_rx.try_recv() {"), String(" pending_outputs.insert(id, tx);"), String(" }"), String(""), String(" if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"), String(" tx.send(output)"), String(" .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"), String(" }"), String(" }"), String(" };"), String(" }"), String(""), String(" info!(\"reader-{:?} terminated\", language_id);"), String(" Ok(())"), String("}"), String(""), String("fn loop_write("), String(" writer: impl Write,"), String(" rx: &Receiver<RawMessage>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut writer = writer;"), String(""), String(" for msg in rx.iter() {"), String(" let s = serde_json::to_string(&msg)?;"), String(" debug!(\"=> {:?} {}\", language_id, s);"), String(" if language_id.is_none() {"), String(" // Use different convention for two reasons,"), String(" // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"), String(" // receives `content`."), String(" // 2. Without last line ending, vim output handler won't be triggered."), String(" write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"), String(" } else {"), String(" write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"), String(" };"), String(" writer.flush()?;"), String(" }"), String(" Ok(())"), String("}"), String(""), String("#[cfg(test)]"), String("mod test {"), String(" use super::RE_REMOVE_EXTRA_FIELDS;"), String(" use crate::types::RawMessage;"), String(""), String(" #[test]"), String(" // The library we're using for json-rpc doesn't accept extra fields in the structs used to"), String(" // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"), String(" // the client fails to deserialize that response."), String(" // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"), String(" // suboptimal, so we now try to remove the extra fields we know of from the response."), String(" //"), String(" // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"), String(" fn it_should_remove_extra_fields() {"), String(" // it removes the requestMethod field from Sorbet"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" let message ="), String(" r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" // it removes the meta field from javascript-typescript-langserver"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(" }"), String("}"), String("")])}) 17:00:16 INFO unnamed src/language_server_protocol.rs:1077 find_locations; params=Object({"bufnr": Number(1), "character": Number(45), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "gotoCmd": Null, "handle": Bool(true), "languageId": String("rust"), "line": Number(49), "method": String("textDocument/definition"), "text": Array([String("use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};"), String("use anyhow::{anyhow, Result};"), String("use crossbeam::channel::{bounded, unbounded, Receiver, Sender};"), String("use log::*;"), String("use regex::Regex;"), String("use serde::{de::DeserializeOwned, Serialize};"), String("use std::io::Write;"), String("use std::str::FromStr;"), String("use std::{"), String(" collections::HashMap,"), String(" io::BufRead,"), String(" sync::atomic::{AtomicU64, Ordering},"), String(" thread,"), String(" time::Duration,"), String("};"), String(""), String("const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;"), String(""), String("lazy_static! {"), String(" // this regex is used to remove some additional fields that we get from some servers, namely:"), String(" // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."), String(" static ref RE_REMOVE_EXTRA_FIELDS: Regex ="), String(" Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();"), String("}"), String(""), String("#[derive(Serialize)]"), String("pub struct RpcClient {"), String(" language_id: LanguageId,"), String(" #[serde(skip_serializing)]"), String(" id: AtomicU64,"), String(" #[serde(skip_serializing)]"), String(" writer_tx: Sender<RawMessage>,"), String(" #[serde(skip_serializing)]"), String(" reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"), String(" pub process_id: Option<u32>,"), String("}"), String(""), String("impl RpcClient {"), String(" #[allow(clippy::new_ret_no_self)]"), String(" pub fn new("), String(" language_id: LanguageId,"), String(" reader: impl BufRead + Send + 'static,"), String(" writer: impl Write + Send + 'static,"), String(" process_id: Option<u32>,"), String(" sink: Sender<Call>,"), String(" on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"), String(" ) -> Result<Self> {"), String(" let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();"), String(""), String(" let language_id_clone = language_id.clone();"), String(" let reader_thread_name = format!(\"reader-{:?}\", language_id);"), String(" let on_crash_clone = on_crash.clone();"), String(" thread::Builder::new()"), String(" .name(reader_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"), String(" on_crash_clone(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" let (writer_tx, writer_rx) = unbounded();"), String(" let writer_thread_name = format!(\"writer-{:?}\", language_id);"), String(" let language_id_clone = language_id.clone();"), String(" thread::Builder::new()"), String(" .name(writer_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"), String(" on_crash(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" Ok(Self {"), String(" language_id,"), String(" id: AtomicU64::default(),"), String(" process_id,"), String(" reader_tx,"), String(" writer_tx,"), String(" })"), String(" }"), String(""), String(" pub fn call<R: DeserializeOwned>("), String(" &self,"), String(" method: impl AsRef<str>,"), String(" params: impl Serialize,"), String(" ) -> Result<R> {"), String(" let method = method.as_ref();"), String(" let id = self.id.fetch_add(1, Ordering::SeqCst);"), String(" let msg = jsonrpc_core::MethodCall {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" let (tx, rx) = bounded(1);"), String(" self.reader_tx.send((id, tx))?;"), String(" self.writer_tx.send(RawMessage::MethodCall(msg))?;"), String(" // TODO: duration from config."), String(" match rx.recv_timeout(Duration::from_secs(60))? {"), String(" jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"), String(" // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"), String(" // which we don't want to show to the user and should ignore, as the result of the"), String(" // request that triggered this error has been invalidated by changes to the state"), String(" // of the server, so we must handle this error specifically."), String(" jsonrpc_core::Output::Failure(err)"), String(" if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"), String(" {"), String(" Err(anyhow::Error::from(LSError::ContentModified))"), String(" }"), String(" jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"), String(" }"), String(" }"), String(""), String(" pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"), String(" let method = method.as_ref();"), String(""), String(" let msg = jsonrpc_core::Notification {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" self.writer_tx.send(RawMessage::Notification(msg))?;"), String(" Ok(())"), String(" }"), String(""), String(" pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"), String(" let output = match result {"), String(" Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" result: serde_json::to_value(ok)?,"), String(" }),"), String(" Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" error: err.to_rpc_error(),"), String(" }),"), String(" };"), String(""), String(" self.writer_tx.send(RawMessage::Output(output))?;"), String(" Ok(())"), String(" }"), String("}"), String(""), String("fn loop_read("), String(" reader: impl BufRead,"), String(" reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"), String(" sink: &Sender<Call>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut pending_outputs = HashMap::new();"), String(""), String(" // Count how many consequent empty lines."), String(" let mut count_empty_lines = 0;"), String(""), String(" let mut reader = reader;"), String(" let mut content_length = 0;"), String(" loop {"), String(" let mut message = String::new();"), String(" let mut line = String::new();"), String(" if language_id.is_some() {"), String(" reader.read_line(&mut line)?;"), String(" let line = line.trim();"), String(" if line.is_empty() {"), String(" count_empty_lines += 1;"), String(" if count_empty_lines > 5 {"), String(" return Err(anyhow!(\"Unable to read from language server\"));"), String(" }"), String(""), String(" let mut buf = vec![0; content_length];"), String(" reader.read_exact(buf.as_mut_slice())?;"), String(" message = String::from_utf8(buf)?;"), String(" } else {"), String(" count_empty_lines = 0;"), String(" if !line.starts_with(\"Content-Length\") {"), String(" continue;"), String(" }"), String(""), String(" let tokens: Vec<&str> = line.splitn(2, ':').collect();"), String(" let len = tokens"), String(" .get(1)"), String(" .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"), String(" .trim();"), String(" content_length = usize::from_str(len)?;"), String(" }"), String(" } else if reader.read_line(&mut message)? == 0 {"), String(" break;"), String(" }"), String(""), String(" let message = message.trim();"), String(" if message.is_empty() {"), String(" continue;"), String(" }"), String(" debug!(\"<= {:?} {}\", language_id, message);"), String(" // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"), String(" // `requestMethod` sent by Sorbet."), String(" let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let message = serde_json::from_str(&s);"), String(" if let Err(ref err) = message {"), String(" error!("), String(" \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","), String(" err, s, err"), String(" );"), String(" continue;"), String(" }"), String(" // TODO: cleanup."), String(" let message = message.unwrap();"), String(" match message {"), String(" RawMessage::MethodCall(method_call) => {"), String(" sink.send(Call::MethodCall(language_id.clone(), method_call))?;"), String(" }"), String(" RawMessage::Notification(notification) => {"), String(" sink.send(Call::Notification(language_id.clone(), notification))?;"), String(" }"), String(" RawMessage::Output(output) => {"), String(" while let Ok((id, tx)) = reader_rx.try_recv() {"), String(" pending_outputs.insert(id, tx);"), String(" }"), String(""), String(" if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"), String(" tx.send(output)"), String(" .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"), String(" }"), String(" }"), String(" };"), String(" }"), String(""), String(" info!(\"reader-{:?} terminated\", language_id);"), String(" Ok(())"), String("}"), String(""), String("fn loop_write("), String(" writer: impl Write,"), String(" rx: &Receiver<RawMessage>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut writer = writer;"), String(""), String(" for msg in rx.iter() {"), String(" let s = serde_json::to_string(&msg)?;"), String(" debug!(\"=> {:?} {}\", language_id, s);"), String(" if language_id.is_none() {"), String(" // Use different convention for two reasons,"), String(" // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"), String(" // receives `content`."), String(" // 2. Without last line ending, vim output handler won't be triggered."), String(" write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"), String(" } else {"), String(" write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"), String(" };"), String(" writer.flush()?;"), String(" }"), String(" Ok(())"), String("}"), String(""), String("#[cfg(test)]"), String("mod test {"), String(" use super::RE_REMOVE_EXTRA_FIELDS;"), String(" use crate::types::RawMessage;"), String(""), String(" #[test]"), String(" // The library we're using for json-rpc doesn't accept extra fields in the structs used to"), String(" // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"), String(" // the client fails to deserialize that response."), String(" // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"), String(" // suboptimal, so we now try to remove the extra fields we know of from the response."), String(" //"), String(" // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"), String(" fn it_should_remove_extra_fields() {"), String(" // it removes the requestMethod field from Sorbet"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" let message ="), String(" r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" // it removes the meta field from javascript-typescript-langserver"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(" }"), String("}"), String("")])}) 17:00:16 INFO unnamed src/language_server_protocol.rs:1993 text_document_did_change; params=Object({"bufnr": Number(1), "character": Number(45), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "gotoCmd": Null, "handle": Bool(true), "languageId": String("rust"), "line": Number(49), "method": String("textDocument/definition"), "text": Array([String("use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};"), String("use anyhow::{anyhow, Result};"), String("use crossbeam::channel::{bounded, unbounded, Receiver, Sender};"), String("use log::*;"), String("use regex::Regex;"), String("use serde::{de::DeserializeOwned, Serialize};"), String("use std::io::Write;"), String("use std::str::FromStr;"), String("use std::{"), String(" collections::HashMap,"), String(" io::BufRead,"), String(" sync::atomic::{AtomicU64, Ordering},"), String(" thread,"), String(" time::Duration,"), String("};"), String(""), String("const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;"), String(""), String("lazy_static! {"), String(" // this regex is used to remove some additional fields that we get from some servers, namely:"), String(" // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."), String(" static ref RE_REMOVE_EXTRA_FIELDS: Regex ="), String(" Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();"), String("}"), String(""), String("#[derive(Serialize)]"), String("pub struct RpcClient {"), String(" language_id: LanguageId,"), String(" #[serde(skip_serializing)]"), String(" id: AtomicU64,"), String(" #[serde(skip_serializing)]"), String(" writer_tx: Sender<RawMessage>,"), String(" #[serde(skip_serializing)]"), String(" reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"), String(" pub process_id: Option<u32>,"), String("}"), String(""), String("impl RpcClient {"), String(" #[allow(clippy::new_ret_no_self)]"), String(" pub fn new("), String(" language_id: LanguageId,"), String(" reader: impl BufRead + Send + 'static,"), String(" writer: impl Write + Send + 'static,"), String(" process_id: Option<u32>,"), String(" sink: Sender<Call>,"), String(" on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"), String(" ) -> Result<Self> {"), String(" let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();"), String(""), String(" let language_id_clone = language_id.clone();"), String(" let reader_thread_name = format!(\"reader-{:?}\", language_id);"), String(" let on_crash_clone = on_crash.clone();"), String(" thread::Builder::new()"), String(" .name(reader_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"), String(" on_crash_clone(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" let (writer_tx, writer_rx) = unbounded();"), String(" let writer_thread_name = format!(\"writer-{:?}\", language_id);"), String(" let language_id_clone = language_id.clone();"), String(" thread::Builder::new()"), String(" .name(writer_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"), String(" on_crash(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" Ok(Self {"), String(" language_id,"), String(" id: AtomicU64::default(),"), String(" process_id,"), String(" reader_tx,"), String(" writer_tx,"), String(" })"), String(" }"), String(""), String(" pub fn call<R: DeserializeOwned>("), String(" &self,"), String(" method: impl AsRef<str>,"), String(" params: impl Serialize,"), String(" ) -> Result<R> {"), String(" let method = method.as_ref();"), String(" let id = self.id.fetch_add(1, Ordering::SeqCst);"), String(" let msg = jsonrpc_core::MethodCall {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" let (tx, rx) = bounded(1);"), String(" self.reader_tx.send((id, tx))?;"), String(" self.writer_tx.send(RawMessage::MethodCall(msg))?;"), String(" // TODO: duration from config."), String(" match rx.recv_timeout(Duration::from_secs(60))? {"), String(" jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"), String(" // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"), String(" // which we don't want to show to the user and should ignore, as the result of the"), String(" // request that triggered this error has been invalidated by changes to the state"), String(" // of the server, so we must handle this error specifically."), String(" jsonrpc_core::Output::Failure(err)"), String(" if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"), String(" {"), String(" Err(anyhow::Error::from(LSError::ContentModified))"), String(" }"), String(" jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"), String(" }"), String(" }"), String(""), String(" pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"), String(" let method = method.as_ref();"), String(""), String(" let msg = jsonrpc_core::Notification {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" self.writer_tx.send(RawMessage::Notification(msg))?;"), String(" Ok(())"), String(" }"), String(""), String(" pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"), String(" let output = match result {"), String(" Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" result: serde_json::to_value(ok)?,"), String(" }),"), String(" Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" error: err.to_rpc_error(),"), String(" }),"), String(" };"), String(""), String(" self.writer_tx.send(RawMessage::Output(output))?;"), String(" Ok(())"), String(" }"), String("}"), String(""), String("fn loop_read("), String(" reader: impl BufRead,"), String(" reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"), String(" sink: &Sender<Call>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut pending_outputs = HashMap::new();"), String(""), String(" // Count how many consequent empty lines."), String(" let mut count_empty_lines = 0;"), String(""), String(" let mut reader = reader;"), String(" let mut content_length = 0;"), String(" loop {"), String(" let mut message = String::new();"), String(" let mut line = String::new();"), String(" if language_id.is_some() {"), String(" reader.read_line(&mut line)?;"), String(" let line = line.trim();"), String(" if line.is_empty() {"), String(" count_empty_lines += 1;"), String(" if count_empty_lines > 5 {"), String(" return Err(anyhow!(\"Unable to read from language server\"));"), String(" }"), String(""), String(" let mut buf = vec![0; content_length];"), String(" reader.read_exact(buf.as_mut_slice())?;"), String(" message = String::from_utf8(buf)?;"), String(" } else {"), String(" count_empty_lines = 0;"), String(" if !line.starts_with(\"Content-Length\") {"), String(" continue;"), String(" }"), String(""), String(" let tokens: Vec<&str> = line.splitn(2, ':').collect();"), String(" let len = tokens"), String(" .get(1)"), String(" .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"), String(" .trim();"), String(" content_length = usize::from_str(len)?;"), String(" }"), String(" } else if reader.read_line(&mut message)? == 0 {"), String(" break;"), String(" }"), String(""), String(" let message = message.trim();"), String(" if message.is_empty() {"), String(" continue;"), String(" }"), String(" debug!(\"<= {:?} {}\", language_id, message);"), String(" // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"), String(" // `requestMethod` sent by Sorbet."), String(" let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let message = serde_json::from_str(&s);"), String(" if let Err(ref err) = message {"), String(" error!("), String(" \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","), String(" err, s, err"), String(" );"), String(" continue;"), String(" }"), String(" // TODO: cleanup."), String(" let message = message.unwrap();"), String(" match message {"), String(" RawMessage::MethodCall(method_call) => {"), String(" sink.send(Call::MethodCall(language_id.clone(), method_call))?;"), String(" }"), String(" RawMessage::Notification(notification) => {"), String(" sink.send(Call::Notification(language_id.clone(), notification))?;"), String(" }"), String(" RawMessage::Output(output) => {"), String(" while let Ok((id, tx)) = reader_rx.try_recv() {"), String(" pending_outputs.insert(id, tx);"), String(" }"), String(""), String(" if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"), String(" tx.send(output)"), String(" .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"), String(" }"), String(" }"), String(" };"), String(" }"), String(""), String(" info!(\"reader-{:?} terminated\", language_id);"), String(" Ok(())"), String("}"), String(""), String("fn loop_write("), String(" writer: impl Write,"), String(" rx: &Receiver<RawMessage>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut writer = writer;"), String(""), String(" for msg in rx.iter() {"), String(" let s = serde_json::to_string(&msg)?;"), String(" debug!(\"=> {:?} {}\", language_id, s);"), String(" if language_id.is_none() {"), String(" // Use different convention for two reasons,"), String(" // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"), String(" // receives `content`."), String(" // 2. Without last line ending, vim output handler won't be triggered."), String(" write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"), String(" } else {"), String(" write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"), String(" };"), String(" writer.flush()?;"), String(" }"), String(" Ok(())"), String("}"), String(""), String("#[cfg(test)]"), String("mod test {"), String(" use super::RE_REMOVE_EXTRA_FIELDS;"), String(" use crate::types::RawMessage;"), String(""), String(" #[test]"), String(" // The library we're using for json-rpc doesn't accept extra fields in the structs used to"), String(" // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"), String(" // the client fails to deserialize that response."), String(" // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"), String(" // suboptimal, so we now try to remove the extra fields we know of from the response."), String(" //"), String(" // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"), String(" fn it_should_remove_extra_fields() {"), String(" // it removes the requestMethod field from Sorbet"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" let message ="), String(" r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" // it removes the meta field from javascript-typescript-langserver"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(" }"), String("}"), String("")])}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"LSP#text","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs"],"id":25} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 25, "jsonrpc": "2.0", "result": ["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};", "use anyhow::{anyhow, Result};", "use crossbeam::channel::{bounded, unbounded, Receiver, Sender};", "use log::*;", "use regex::Regex;", "use serde::{de::DeserializeOwned, Serialize};", "use std::io::Write;", "use std::str::FromStr;", "use std::{", " collections::HashMap,", " io::BufRead,", " sync::atomic::{AtomicU64, Ordering},", " thread,", " time::Duration,", "};", "", "const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;", "", "lazy_static! {", " // this regex is used to remove some additional fields that we get from some servers, namely:", " // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.", " static ref RE_REMOVE_EXTRA_FIELDS: Regex =", " Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();", "}", "", "#[derive(Serialize)]", "pub struct RpcClient {", " language_id: LanguageId,", " #[serde(skip_serializing)]", " id: AtomicU64,", " #[serde(skip_serializing)]", " writer_tx: Sender<RawMessage>,", " #[serde(skip_serializing)]", " reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,", " pub process_id: Option<u32>,", "}", "", "impl RpcClient {", " #[allow(clippy::new_ret_no_self)]", " pub fn new(", " language_id: LanguageId,", " reader: impl BufRead + Send + 'static,", " writer: impl Write + Send + 'static,", " process_id: Option<u32>,", " sink: Sender<Call>,", " on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,", " ) -> Result<Self> {", " let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();", "", " let language_id_clone = language_id.clone();", " let reader_thread_name = format!(\"reader-{:?}\", language_id);", " let on_crash_clone = on_crash.clone();", " thread::Builder::new()", " .name(reader_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {", " on_crash_clone(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);", " }", " })?;", "", " let (writer_tx, writer_rx) = unbounded();", " let writer_thread_name = format!(\"writer-{:?}\", language_id);", " let language_id_clone = language_id.clone();", " thread::Builder::new()", " .name(writer_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {", " on_crash(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);", " }", " })?;", "", " Ok(Self {", " language_id,", " id: AtomicU64::default(),", " process_id,", " reader_tx,", " writer_tx,", " })", " }", "", " pub fn call<R: DeserializeOwned>(", " &self,", " method: impl AsRef<str>,", " params: impl Serialize,", " ) -> Result<R> {", " let method = method.as_ref();", " let id = self.id.fetch_add(1, Ordering::SeqCst);", " let msg = jsonrpc_core::MethodCall {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " let (tx, rx) = bounded(1);", " self.reader_tx.send((id, tx))?;", " self.writer_tx.send(RawMessage::MethodCall(msg))?;", " // TODO: duration from config.", " match rx.recv_timeout(Duration::from_secs(60))? {", " jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),", " // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,", " // which we don't want to show to the user and should ignore, as the result of the", " // request that triggered this error has been invalidated by changes to the state", " // of the server, so we must handle this error specifically.", " jsonrpc_core::Output::Failure(err)", " if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>", " {", " Err(anyhow::Error::from(LSError::ContentModified))", " }", " jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),", " }", " }", "", " pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {", " let method = method.as_ref();", "", " let msg = jsonrpc_core::Notification {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " self.writer_tx.send(RawMessage::Notification(msg))?;", " Ok(())", " }", "", " pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {", " let output = match result {", " Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " result: serde_json::to_value(ok)?,", " }),", " Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " error: err.to_rpc_error(),", " }),", " };", "", " self.writer_tx.send(RawMessage::Output(output))?;", " Ok(())", " }", "}", "", "fn loop_read(", " reader: impl BufRead,", " reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,", " sink: &Sender<Call>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut pending_outputs = HashMap::new();", "", " // Count how many consequent empty lines.", " let mut count_empty_lines = 0;", "", " let mut reader = reader;", " let mut content_length = 0;", " loop {", " let mut message = String::new();", " let mut line = String::new();", " if language_id.is_some() {", " reader.read_line(&mut line)?;", " let line = line.trim();", " if line.is_empty() {", " count_empty_lines += 1;", " if count_empty_lines > 5 {", " return Err(anyhow!(\"Unable to read from language server\"));", " }", "", " let mut buf = vec![0; content_length];", " reader.read_exact(buf.as_mut_slice())?;", " message = String::from_utf8(buf)?;", " } else {", " count_empty_lines = 0;", " if !line.starts_with(\"Content-Length\") {", " continue;", " }", "", " let tokens: Vec<&str> = line.splitn(2, ':').collect();", " let len = tokens", " .get(1)", " .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?", " .trim();", " content_length = usize::from_str(len)?;", " }", " } else if reader.read_line(&mut message)? == 0 {", " break;", " }", "", " let message = message.trim();", " if message.is_empty() {", " continue;", " }", " debug!(\"<= {:?} {}\", language_id, message);", " // FIXME: Remove extra `meta` property from javascript-typescript-langserver and", " // `requestMethod` sent by Sorbet.", " let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let message = serde_json::from_str(&s);", " if let Err(ref err) = message {", " error!(", " \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",", " err, s, err", " );", " continue;", " }", " // TODO: cleanup.", " let message = message.unwrap();", " match message {", " RawMessage::MethodCall(method_call) => {", " sink.send(Call::MethodCall(language_id.clone(), method_call))?;", " }", " RawMessage::Notification(notification) => {", " sink.send(Call::Notification(language_id.clone(), notification))?;", " }", " RawMessage::Output(output) => {", " while let Ok((id, tx)) = reader_rx.try_recv() {", " pending_outputs.insert(id, tx);", " }", "", " if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {", " tx.send(output)", " .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;", " }", " }", " };", " }", "", " info!(\"reader-{:?} terminated\", language_id);", " Ok(())", "}", "", "fn loop_write(", " writer: impl Write,", " rx: &Receiver<RawMessage>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut writer = writer;", "", " for msg in rx.iter() {", " let s = serde_json::to_string(&msg)?;", " debug!(\"=> {:?} {}\", language_id, s);", " if language_id.is_none() {", " // Use different convention for two reasons,", " // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim", " // receives `content`.", " // 2. Without last line ending, vim output handler won't be triggered.", " write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;", " } else {", " write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;", " };", " writer.flush()?;", " }", " Ok(())", "}", "", "#[cfg(test)]", "mod test {", " use super::RE_REMOVE_EXTRA_FIELDS;", " use crate::types::RawMessage;", "", " #[test]", " // The library we're using for json-rpc doesn't accept extra fields in the structs used to", " // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so", " // the client fails to deserialize that response.", " // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is", " // suboptimal, so we now try to remove the extra fields we know of from the response.", " //", " // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892", " fn it_should_remove_extra_fields() {", " // it removes the requestMethod field from Sorbet", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " let message =", " r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " // it removes the meta field from javascript-typescript-langserver", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", " }", "}", ""]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#position()"],"id":26} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 26, "jsonrpc": "2.0", "result": {"character": 45, "line": 49}} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["expand('<cword>')"],"id":27} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 27, "jsonrpc": "2.0", "result": "clone"} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/definition","params":{"bufnr":1,"character":45,"filename":"/home/dick/LanguageClient-neovim/src/rpcclient.rs","gotoCmd":null,"handle":true,"languageId":"rust","line":49,"method":"textDocument/definition","position":{"character":45,"line":49},"text":["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};","use anyhow::{anyhow, Result};","use crossbeam::channel::{bounded, unbounded, Receiver, Sender};","use log::*;","use regex::Regex;","use serde::{de::DeserializeOwned, Serialize};","use std::io::Write;","use std::str::FromStr;","use std::{"," collections::HashMap,"," io::BufRead,"," sync::atomic::{AtomicU64, Ordering},"," thread,"," time::Duration,","};","","const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;","","lazy_static! {"," // this regex is used to remove some additional fields that we get from some servers, namely:"," // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."," static ref RE_REMOVE_EXTRA_FIELDS: Regex ="," Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();","}","","#[derive(Serialize)]","pub struct RpcClient {"," language_id: LanguageId,"," #[serde(skip_serializing)]"," id: AtomicU64,"," #[serde(skip_serializing)]"," writer_tx: Sender<RawMessage>,"," #[serde(skip_serializing)]"," reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"," pub process_id: Option<u32>,","}","","impl RpcClient {"," #[allow(clippy::new_ret_no_self)]"," pub fn new("," language_id: LanguageId,"," reader: impl BufRead + Send + 'static,"," writer: impl Write + Send + 'static,"," process_id: Option<u32>,"," sink: Sender<Call>,"," on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"," ) -> Result<Self> {"," let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();",""," let language_id_clone = language_id.clone();"," let reader_thread_name = format!(\"reader-{:?}\", language_id);"," let on_crash_clone = on_crash.clone();"," thread::Builder::new()"," .name(reader_thread_name.clone())"," .spawn(move || {"," if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"," match err.downcast_ref::<std::io::Error>() {"," Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"," on_crash_clone(&language_id_clone)"," }"," _ => {}"," }",""," error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"," }"," })?;",""," let (writer_tx, writer_rx) = unbounded();"," let writer_thread_name = format!(\"writer-{:?}\", language_id);"," let language_id_clone = language_id.clone();"," thread::Builder::new()"," .name(writer_thread_name.clone())"," .spawn(move || {"," if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"," match err.downcast_ref::<std::io::Error>() {"," Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"," on_crash(&language_id_clone)"," }"," _ => {}"," }",""," error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"," }"," })?;",""," Ok(Self {"," language_id,"," id: AtomicU64::default(),"," process_id,"," reader_tx,"," writer_tx,"," })"," }",""," pub fn call<R: DeserializeOwned>("," &self,"," method: impl AsRef<str>,"," params: impl Serialize,"," ) -> Result<R> {"," let method = method.as_ref();"," let id = self.id.fetch_add(1, Ordering::SeqCst);"," let msg = jsonrpc_core::MethodCall {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," id: jsonrpc_core::Id::Num(id),"," method: method.to_owned(),"," params: params.to_params()?,"," };"," let (tx, rx) = bounded(1);"," self.reader_tx.send((id, tx))?;"," self.writer_tx.send(RawMessage::MethodCall(msg))?;"," // TODO: duration from config."," match rx.recv_timeout(Duration::from_secs(60))? {"," jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"," // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"," // which we don't want to show to the user and should ignore, as the result of the"," // request that triggered this error has been invalidated by changes to the state"," // of the server, so we must handle this error specifically."," jsonrpc_core::Output::Failure(err)"," if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"," {"," Err(anyhow::Error::from(LSError::ContentModified))"," }"," jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"," }"," }",""," pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"," let method = method.as_ref();",""," let msg = jsonrpc_core::Notification {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," method: method.to_owned(),"," params: params.to_params()?,"," };"," self.writer_tx.send(RawMessage::Notification(msg))?;"," Ok(())"," }",""," pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"," let output = match result {"," Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," id: jsonrpc_core::Id::Num(id),"," result: serde_json::to_value(ok)?,"," }),"," Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," id: jsonrpc_core::Id::Num(id),"," error: err.to_rpc_error(),"," }),"," };",""," self.writer_tx.send(RawMessage::Output(output))?;"," Ok(())"," }","}","","fn loop_read("," reader: impl BufRead,"," reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"," sink: &Sender<Call>,"," language_id: &LanguageId,",") -> Result<()> {"," let mut pending_outputs = HashMap::new();",""," // Count how many consequent empty lines."," let mut count_empty_lines = 0;",""," let mut reader = reader;"," let mut content_length = 0;"," loop {"," let mut message = String::new();"," let mut line = String::new();"," if language_id.is_some() {"," reader.read_line(&mut line)?;"," let line = line.trim();"," if line.is_empty() {"," count_empty_lines += 1;"," if count_empty_lines > 5 {"," return Err(anyhow!(\"Unable to read from language server\"));"," }",""," let mut buf = vec![0; content_length];"," reader.read_exact(buf.as_mut_slice())?;"," message = String::from_utf8(buf)?;"," } else {"," count_empty_lines = 0;"," if !line.starts_with(\"Content-Length\") {"," continue;"," }",""," let tokens: Vec<&str> = line.splitn(2, ':').collect();"," let len = tokens"," .get(1)"," .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"," .trim();"," content_length = usize::from_str(len)?;"," }"," } else if reader.read_line(&mut message)? == 0 {"," break;"," }",""," let message = message.trim();"," if message.is_empty() {"," continue;"," }"," debug!(\"<= {:?} {}\", language_id, message);"," // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"," // `requestMethod` sent by Sorbet."," let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let message = serde_json::from_str(&s);"," if let Err(ref err) = message {"," error!("," \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","," err, s, err"," );"," continue;"," }"," // TODO: cleanup."," let message = message.unwrap();"," match message {"," RawMessage::MethodCall(method_call) => {"," sink.send(Call::MethodCall(language_id.clone(), method_call))?;"," }"," RawMessage::Notification(notification) => {"," sink.send(Call::Notification(language_id.clone(), notification))?;"," }"," RawMessage::Output(output) => {"," while let Ok((id, tx)) = reader_rx.try_recv() {"," pending_outputs.insert(id, tx);"," }",""," if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"," tx.send(output)"," .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"," }"," }"," };"," }",""," info!(\"reader-{:?} terminated\", language_id);"," Ok(())","}","","fn loop_write("," writer: impl Write,"," rx: &Receiver<RawMessage>,"," language_id: &LanguageId,",") -> Result<()> {"," let mut writer = writer;",""," for msg in rx.iter() {"," let s = serde_json::to_string(&msg)?;"," debug!(\"=> {:?} {}\", language_id, s);"," if language_id.is_none() {"," // Use different convention for two reasons,"," // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"," // receives `content`."," // 2. Without last line ending, vim output handler won't be triggered."," write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"," } else {"," write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"," };"," writer.flush()?;"," }"," Ok(())","}","","#[cfg(test)]","mod test {"," use super::RE_REMOVE_EXTRA_FIELDS;"," use crate::types::RawMessage;",""," #[test]"," // The library we're using for json-rpc doesn't accept extra fields in the structs used to"," // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"," // the client fails to deserialize that response."," // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"," // suboptimal, so we now try to remove the extra fields we know of from the response."," //"," // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"," fn it_should_remove_extra_fields() {"," // it removes the requestMethod field from Sorbet"," let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"," let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let result: Result<RawMessage, _> = serde_json::from_str(&message);"," assert!(result.is_ok());",""," let message ="," r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"," let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let result: Result<RawMessage, _> = serde_json::from_str(&message);"," assert!(result.is_ok());",""," // it removes the meta field from javascript-typescript-langserver"," let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"," let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let result: Result<RawMessage, _> = serde_json::from_str(&message);"," assert!(result.is_ok());"," }","}",""],"textDocument":{"uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs"}},"id":2} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":2,"result":[{"originSelectionRange":{"start":{"line":49,"character":44},"end":{"line":49,"character":49}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1886,"character":4},"end":{"line":1892,"character":5}},"targetSelectionRange":{"start":{"line":1887,"character":7},"end":{"line":1887,"character":12}}}]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:Edit","params":["edit","/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"cursor","params":[1888,8]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["expand('%')"],"id":28} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleFileType", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 22, "start": 0}, "languageId": "rust", "position": {"character": 0, "line": 0}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:2760 handle_file_type; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) 17:00:16 INFO unnamed src/language_server_protocol.rs:1946 text_document_did_open; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"LSP#text","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"],"id":29} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleBufEnter", "jsonrpc": "2.0", "params": {"bufnr": 2, "languageId": "rust", "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:2739 handle_buf_enter; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust")}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","LanguageClient_isServerRunning",1]} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 28, "jsonrpc": "2.0", "result": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:EchomsgEllipsis","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs 1888:8"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","result":[{"originSelectionRange":{"end":{"character":49,"line":49},"start":{"character":44,"line":49}},"targetRange":{"end":{"character":5,"line":1892},"start":{"character":4,"line":1886}},"targetSelectionRange":{"end":{"character":12,"line":1887},"start":{"character":7,"line":1887}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}],"id":1} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 29, "jsonrpc": "2.0", "result": ["//! Optional values.", "//!", "//! Type [`Option`] represents an optional value: every [`Option`]", "//! is either [`Some`] and contains a value, or [`None`], and", "//! does not. [`Option`] types are very common in Rust code, as", "//! they have a number of uses:", "//!", "//! * Initial values", "//! * Return values for functions that are not defined", "//! over their entire input range (partial functions)", "//! * Return value for otherwise reporting simple errors, where [`None`] is", "//! returned on error", "//! * Optional struct fields", "//! * Struct fields that can be loaned or \"taken\"", "//! * Optional function arguments", "//! * Nullable pointers", "//! * Swapping things out of difficult situations", "//!", "//! [`Option`]s are commonly paired with pattern matching to query the presence", "//! of a value and take action, always accounting for the [`None`] case.", "//!", "//! ```", "//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {", "//! if denominator == 0.0 {", "//! None", "//! } else {", "//! Some(numerator / denominator)", "//! }", "//! }", "//!", "//! // The return value of the function is an option", "//! let result = divide(2.0, 3.0);", "//!", "//! // Pattern match to retrieve the value", "//! match result {", "//! // The division was valid", "//! Some(x) => println!(\"Result: {x}\"),", "//! // The division was invalid", "//! None => println!(\"Cannot divide by 0\"),", "//! }", "//! ```", "//!", "//", "// FIXME: Show how `Option` is used in practice, with lots of methods", "//", "//! # Options and pointers (\"nullable\" pointers)", "//!", "//! Rust's pointer types must always point to a valid location; there are", "//! no \"null\" references. Instead, Rust has *optional* pointers, like", "//! the optional owned box, <code>[Option]<[Box\\<T>]></code>.", "//!", "//! [Box\\<T>]: ../../std/boxed/struct.Box.html", "//!", "//! The following example uses [`Option`] to create an optional box of", "//! [`i32`]. Notice that in order to use the inner [`i32`] value, the", "//! `check_optional` function first needs to use pattern matching to", "//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or", "//! not ([`None`]).", "//!", "//! ```", "//! let optional = None;", "//! check_optional(optional);", "//!", "//! let optional = Some(Box::new(9000));", "//! check_optional(optional);", "//!", "//! fn check_optional(optional: Option<Box<i32>>) {", "//! match optional {", "//! Some(p) => println!(\"has value {p}\"),", "//! None => println!(\"has no value\"),", "//! }", "//! }", "//! ```", "//!", "//! # Representation", "//!", "//! Rust guarantees to optimize the following types `T` such that", "//! [`Option<T>`] has the same size as `T`:", "//!", "//! * [`Box<U>`]", "//! * `&U`", "//! * `&mut U`", "//! * `fn`, `extern \"C\" fn`[^extern_fn]", "//! * [`num::NonZero*`]", "//! * [`ptr::NonNull<U>`]", "//! * `#[repr(transparent)]` struct around one of the types in this list.", "//!", "//! [^extern_fn]: this remains true for any other ABI: `extern \"abi\" fn` (_e.g._, `extern \"system\" fn`)", "//!", "//! [`Box<U>`]: ../../std/boxed/struct.Box.html", "//! [`num::NonZero*`]: crate::num", "//! [`ptr::NonNull<U>`]: crate::ptr::NonNull", "//!", "//! This is called the \"null pointer optimization\" or NPO.", "//!", "//! It is further guaranteed that, for the cases above, one can", "//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and", "//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`", "//! is undefined behaviour).", "//!", "//! # Method overview", "//!", "//! In addition to working with pattern matching, [`Option`] provides a wide", "//! variety of different methods.", "//!", "//! ## Querying the variant", "//!", "//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]", "//! is [`Some`] or [`None`], respectively.", "//!", "//! [`is_none`]: Option::is_none", "//! [`is_some`]: Option::is_some", "//!", "//! ## Adapters for working with references", "//!", "//! * [`as_ref`] converts from <code>[&][][Option]\\<T></code> to <code>[Option]<[&]T></code>", "//! * [`as_mut`] converts from <code>[&mut] [Option]\\<T></code> to <code>[Option]<[&mut] T></code>", "//! * [`as_deref`] converts from <code>[&][][Option]\\<T></code> to", "//! <code>[Option]<[&]T::[Target]></code>", "//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\\<T></code> to", "//! <code>[Option]<[&mut] T::[Target]></code>", "//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\\<T>></code> to", "//! <code>[Option]<[Pin]<[&]T>></code>", "//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\\<T>></code> to", "//! <code>[Option]<[Pin]<[&mut] T>></code>", "//!", "//! [&]: reference \"shared reference\"", "//! [&mut]: reference \"mutable reference\"", "//! [Target]: Deref::Target \"ops::Deref::Target\"", "//! [`as_deref`]: Option::as_deref", "//! [`as_deref_mut`]: Option::as_deref_mut", "//! [`as_mut`]: Option::as_mut", "//! [`as_pin_mut`]: Option::as_pin_mut", "//! [`as_pin_ref`]: Option::as_pin_ref", "//! [`as_ref`]: Option::as_ref", "//!", "//! ## Extracting the contained value", "//!", "//! These methods extract the contained value in an [`Option<T>`] when it", "//! is the [`Some`] variant. If the [`Option`] is [`None`]:", "//!", "//! * [`expect`] panics with a provided custom message", "//! * [`unwrap`] panics with a generic message", "//! * [`unwrap_or`] returns the provided default value", "//! * [`unwrap_or_default`] returns the default value of the type `T`", "//! (which must implement the [`Default`] trait)", "//! * [`unwrap_or_else`] returns the result of evaluating the provided", "//! function", "//!", "//! [`expect`]: Option::expect", "//! [`unwrap`]: Option::unwrap", "//! [`unwrap_or`]: Option::unwrap_or", "//! [`unwrap_or_default`]: Option::unwrap_or_default", "//! [`unwrap_or_else`]: Option::unwrap_or_else", "//!", "//! ## Transforming contained values", "//!", "//! These methods transform [`Option`] to [`Result`]:", "//!", "//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to", "//! [`Err(err)`] using the provided default `err` value", "//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to", "//! a value of [`Err`] using the provided function", "//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a", "//! [`Result`] of an [`Option`]", "//!", "//! [`Err(err)`]: Err", "//! [`Ok(v)`]: Ok", "//! [`Some(v)`]: Some", "//! [`ok_or`]: Option::ok_or", "//! [`ok_or_else`]: Option::ok_or_else", "//! [`transpose`]: Option::transpose", "//!", "//! These methods transform the [`Some`] variant:", "//!", "//! * [`filter`] calls the provided predicate function on the contained", "//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]", "//! if the function returns `true`; otherwise, returns [`None`]", "//! * [`flatten`] removes one level of nesting from an", "//! [`Option<Option<T>>`]", "//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the", "//! provided function to the contained value of [`Some`] and leaving", "//! [`None`] values unchanged", "//!", "//! [`Some(t)`]: Some", "//! [`filter`]: Option::filter", "//! [`flatten`]: Option::flatten", "//! [`map`]: Option::map", "//!", "//! These methods transform [`Option<T>`] to a value of a possibly", "//! different type `U`:", "//!", "//! * [`map_or`] applies the provided function to the contained value of", "//! [`Some`], or returns the provided default value if the [`Option`] is", "//! [`None`]", "//! * [`map_or_else`] applies the provided function to the contained value", "//! of [`Some`], or returns the result of evaluating the provided", "//! fallback function if the [`Option`] is [`None`]", "//!", "//! [`map_or`]: Option::map_or", "//! [`map_or_else`]: Option::map_or_else", "//!", "//! These methods combine the [`Some`] variants of two [`Option`] values:", "//!", "//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the", "//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]", "//! * [`zip_with`] calls the provided function `f` and returns", "//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided", "//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]", "//!", "//! [`Some(f(s, o))`]: Some", "//! [`Some(o)`]: Some", "//! [`Some(s)`]: Some", "//! [`Some((s, o))`]: Some", "//! [`zip`]: Option::zip", "//! [`zip_with`]: Option::zip_with", "//!", "//! ## Boolean operators", "//!", "//! These methods treat the [`Option`] as a boolean value, where [`Some`]", "//! acts like [`true`] and [`None`] acts like [`false`]. There are two", "//! categories of these methods: ones that take an [`Option`] as input, and", "//! ones that take a function as input (to be lazily evaluated).", "//!", "//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as", "//! input, and produce an [`Option`] as output. Only the [`and`] method can", "//! produce an [`Option<U>`] value having a different inner type `U` than", "//! [`Option<T>`].", "//!", "//! | method | self | input | output |", "//! |---------|-----------|-----------|-----------|", "//! | [`and`] | `None` | (ignored) | `None` |", "//! | [`and`] | `Some(x)` | `None` | `None` |", "//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |", "//! | [`or`] | `None` | `None` | `None` |", "//! | [`or`] | `None` | `Some(y)` | `Some(y)` |", "//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |", "//! | [`xor`] | `None` | `None` | `None` |", "//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |", "//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |", "//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |", "//!", "//! [`and`]: Option::and", "//! [`or`]: Option::or", "//! [`xor`]: Option::xor", "//!", "//! The [`and_then`] and [`or_else`] methods take a function as input, and", "//! only evaluate the function when they need to produce a new value. Only", "//! the [`and_then`] method can produce an [`Option<U>`] value having a", "//! different inner type `U` than [`Option<T>`].", "//!", "//! | method | self | function input | function result | output |", "//! |--------------|-----------|----------------|-----------------|-----------|", "//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |", "//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |", "//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |", "//! | [`or_else`] | `None` | (not provided) | `None` | `None` |", "//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |", "//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |", "//!", "//! [`and_then`]: Option::and_then", "//! [`or_else`]: Option::or_else", "//!", "//! This is an example of using methods like [`and_then`] and [`or`] in a", "//! pipeline of method calls. Early stages of the pipeline pass failure", "//! values ([`None`]) through unchanged, and continue processing on", "//! success values ([`Some`]). Toward the end, [`or`] substitutes an error", "//! message if it receives [`None`].", "//!", "//! ```", "//! # use std::collections::BTreeMap;", "//! let mut bt = BTreeMap::new();", "//! bt.insert(20u8, \"foo\");", "//! bt.insert(42u8, \"bar\");", "//! let res = [0u8, 1, 11, 200, 22]", "//! .into_iter()", "//! .map(|x| {", "//! // `checked_sub()` returns `None` on error", "//! x.checked_sub(1)", "//! // same with `checked_mul()`", "//! .and_then(|x| x.checked_mul(2))", "//! // `BTreeMap::get` returns `None` on error", "//! .and_then(|x| bt.get(&x))", "//! // Substitute an error message if we have `None` so far", "//! .or(Some(&\"error!\"))", "//! .copied()", "//! // Won't panic because we unconditionally used `Some` above", "//! .unwrap()", "//! })", "//! .collect::<Vec<_>>();", "//! assert_eq!(res, [\"error!\", \"error!\", \"foo\", \"error!\", \"bar\"]);", "//! ```", "//!", "//! ## Comparison operators", "//!", "//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its", "//! [`PartialOrd`] implementation. With this order, [`None`] compares as", "//! less than any [`Some`], and two [`Some`] compare the same way as their", "//! contained values would in `T`. If `T` also implements", "//! [`Ord`], then so does [`Option<T>`].", "//!", "//! ```", "//! assert!(None < Some(0));", "//! assert!(Some(0) < Some(1));", "//! ```", "//!", "//! ## Iterating over `Option`", "//!", "//! An [`Option`] can be iterated over. This can be helpful if you need an", "//! iterator that is conditionally empty. The iterator will either produce", "//! a single value (when the [`Option`] is [`Some`]), or produce no values", "//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like", "//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if", "//! the [`Option`] is [`None`].", "//!", "//! [`Some(v)`]: Some", "//! [`empty()`]: crate::iter::empty", "//! [`once(v)`]: crate::iter::once", "//!", "//! Iterators over [`Option<T>`] come in three types:", "//!", "//! * [`into_iter`] consumes the [`Option`] and produces the contained", "//! value", "//! * [`iter`] produces an immutable reference of type `&T` to the", "//! contained value", "//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the", "//! contained value", "//!", "//! [`into_iter`]: Option::into_iter", "//! [`iter`]: Option::iter", "//! [`iter_mut`]: Option::iter_mut", "//!", "//! An iterator over [`Option`] can be useful when chaining iterators, for", "//! example, to conditionally insert items. (It's not always necessary to", "//! explicitly call an iterator constructor: many [`Iterator`] methods that", "//! accept other iterators will also accept iterable types that implement", "//! [`IntoIterator`], which includes [`Option`].)", "//!", "//! ```", "//! let yep = Some(42);", "//! let nope = None;", "//! // chain() already calls into_iter(), so we don't have to do so", "//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();", "//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);", "//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();", "//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);", "//! ```", "//!", "//! One reason to chain iterators in this way is that a function returning", "//! `impl Iterator` must have all possible return values be of the same", "//! concrete type. Chaining an iterated [`Option`] can help with that.", "//!", "//! ```", "//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {", "//! // Explicit returns to illustrate return types matching", "//! match do_insert {", "//! true => return (0..4).chain(Some(42)).chain(4..8),", "//! false => return (0..4).chain(None).chain(4..8),", "//! }", "//! }", "//! println!(\"{:?}\", make_iter(true).collect::<Vec<_>>());", "//! println!(\"{:?}\", make_iter(false).collect::<Vec<_>>());", "//! ```", "//!", "//! If we try to do the same thing, but using [`once()`] and [`empty()`],", "//! we can't return `impl Iterator` anymore because the concrete types of", "//! the return values differ.", "//!", "//! [`empty()`]: crate::iter::empty", "//! [`once()`]: crate::iter::once", "//!", "//! ```compile_fail,E0308", "//! # use std::iter::{empty, once};", "//! // This won't compile because all possible returns from the function", "//! // must have the same concrete type.", "//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {", "//! // Explicit returns to illustrate return types not matching", "//! match do_insert {", "//! true => return (0..4).chain(once(42)).chain(4..8),", "//! false => return (0..4).chain(empty()).chain(4..8),", "//! }", "//! }", "//! ```", "//!", "//! ## Collecting into `Option`", "//!", "//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,", "//! which allows an iterator over [`Option`] values to be collected into an", "//! [`Option`] of a collection of each contained value of the original", "//! [`Option`] values, or [`None`] if any of the elements was [`None`].", "//!", "//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E", "//!", "//! ```", "//! let v = [Some(2), Some(4), None, Some(8)];", "//! let res: Option<Vec<_>> = v.into_iter().collect();", "//! assert_eq!(res, None);", "//! let v = [Some(2), Some(4), Some(8)];", "//! let res: Option<Vec<_>> = v.into_iter().collect();", "//! assert_eq!(res, Some(vec![2, 4, 8]));", "//! ```", "//!", "//! [`Option`] also implements the [`Product`][impl-Product] and", "//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values", "//! to provide the [`product`][Iterator::product] and", "//! [`sum`][Iterator::sum] methods.", "//!", "//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E", "//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E", "//!", "//! ```", "//! let v = [None, Some(1), Some(2), Some(3)];", "//! let res: Option<i32> = v.into_iter().sum();", "//! assert_eq!(res, None);", "//! let v = [Some(1), Some(2), Some(21)];", "//! let res: Option<i32> = v.into_iter().product();", "//! assert_eq!(res, Some(42));", "//! ```", "//!", "//! ## Modifying an [`Option`] in-place", "//!", "//! These methods return a mutable reference to the contained value of an", "//! [`Option<T>`]:", "//!", "//! * [`insert`] inserts a value, dropping any old contents", "//! * [`get_or_insert`] gets the current value, inserting a provided", "//! default value if it is [`None`]", "//! * [`get_or_insert_default`] gets the current value, inserting the", "//! default value of type `T` (which must implement [`Default`]) if it is", "//! [`None`]", "//! * [`get_or_insert_with`] gets the current value, inserting a default", "//! computed by the provided function if it is [`None`]", "//!", "//! [`get_or_insert`]: Option::get_or_insert", "//! [`get_or_insert_default`]: Option::get_or_insert_default", "//! [`get_or_insert_with`]: Option::get_or_insert_with", "//! [`insert`]: Option::insert", "//!", "//! These methods transfer ownership of the contained value of an", "//! [`Option`]:", "//!", "//! * [`take`] takes ownership of the contained value of an [`Option`], if", "//! any, replacing the [`Option`] with [`None`]", "//! * [`replace`] takes ownership of the contained value of an [`Option`],", "//! if any, replacing the [`Option`] with a [`Some`] containing the", "//! provided value", "//!", "//! [`replace`]: Option::replace", "//! [`take`]: Option::take", "//!", "//! # Examples", "//!", "//! Basic pattern matching on [`Option`]:", "//!", "//! ```", "//! let msg = Some(\"howdy\");", "//!", "//! // Take a reference to the contained string", "//! if let Some(m) = &msg {", "//! println!(\"{}\", *m);", "//! }", "//!", "//! // Remove the contained string, destroying the Option", "//! let unwrapped_msg = msg.unwrap_or(\"default message\");", "//! ```", "//!", "//! Initialize a result to [`None`] before a loop:", "//!", "//! ```", "//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }", "//!", "//! // A list of data to search through.", "//! let all_the_big_things = [", "//! Kingdom::Plant(250, \"redwood\"),", "//! Kingdom::Plant(230, \"noble fir\"),", "//! Kingdom::Plant(229, \"sugar pine\"),", "//! Kingdom::Animal(25, \"blue whale\"),", "//! Kingdom::Animal(19, \"fin whale\"),", "//! Kingdom::Animal(15, \"north pacific right whale\"),", "//! ];", "//!", "//! // We're going to search for the name of the biggest animal,", "//! // but to start with we've just got `None`.", "//! let mut name_of_biggest_animal = None;", "//! let mut size_of_biggest_animal = 0;", "//! for big_thing in &all_the_big_things {", "//! match *big_thing {", "//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {", "//! // Now we've found the name of some big animal", "//! size_of_biggest_animal = size;", "//! name_of_biggest_animal = Some(name);", "//! }", "//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()", "//! }", "//! }", "//!", "//! match name_of_biggest_animal {", "//! Some(name) => println!(\"the biggest animal is {name}\"),", "//! None => println!(\"there are no animals :(\"),", "//! }", "//! ```", "", "#![stable(feature = \"rust1\", since = \"1.0.0\")]", "", "use crate::iter::{self, FromIterator, FusedIterator, TrustedLen};", "use crate::marker::Destruct;", "use crate::panicking::{panic, panic_str};", "use crate::pin::Pin;", "use crate::{", " convert, hint, mem,", " ops::{self, ControlFlow, Deref, DerefMut},", "};", "", "/// The `Option` type. See [the module level documentation](self) for more.", "#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]", "#[rustc_diagnostic_item = \"Option\"]", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "pub enum Option<T> {", " /// No value.", " #[lang = \"None\"]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " None,", " /// Some value of type `T`.", " #[lang = \"Some\"]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " Some(#[stable(feature = \"rust1\", since = \"1.0.0\")] T),", "}", "", "/////////////////////////////////////////////////////////////////////////////", "// Type implementation", "/////////////////////////////////////////////////////////////////////////////", "", "impl<T> Option<T> {", " /////////////////////////////////////////////////////////////////////////", " // Querying the contained values", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns `true` if the option is a [`Some`] value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.is_some(), true);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.is_some(), false);", " /// ```", " #[must_use = \"if you intended to assert that this has a value, consider `.unwrap()` instead\"]", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]", " pub const fn is_some(&self) -> bool {", " matches!(*self, Some(_))", " }", "", " /// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(is_some_with)]", " ///", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.is_some_and(|&x| x > 1), true);", " ///", " /// let x: Option<u32> = Some(0);", " /// assert_eq!(x.is_some_and(|&x| x > 1), false);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.is_some_and(|&x| x > 1), false);", " /// ```", " #[must_use]", " #[inline]", " #[unstable(feature = \"is_some_with\", issue = \"93050\")]", " pub fn is_some_and(&self, f: impl FnOnce(&T) -> bool) -> bool {", " matches!(self, Some(x) if f(x))", " }", "", " /// Returns `true` if the option is a [`None`] value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.is_none(), false);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.is_none(), true);", " /// ```", " #[must_use = \"if you intended to assert that this doesn't have a value, consider \\", " `.and_then(|_| panic!(\\\"`Option` had a value when expected `None`\\\"))` instead\"]", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]", " pub const fn is_none(&self) -> bool {", " !self.is_some()", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Adapter for working with references", " /////////////////////////////////////////////////////////////////////////", "", " /// Converts from `&Option<T>` to `Option<&T>`.", " ///", " /// # Examples", " ///", " /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, preserving", " /// the original. The [`map`] method takes the `self` argument by value, consuming the original,", " /// so this technique uses `as_ref` to first take an `Option` to a reference", " /// to the value inside the original.", " ///", " /// [`map`]: Option::map", " /// [String]: ../../std/string/struct.String.html \"String\"", " ///", " /// ```", " /// let text: Option<String> = Some(\"Hello, world!\".to_string());", " /// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,", " /// // then consume *that* with `map`, leaving `text` on the stack.", " /// let text_length: Option<usize> = text.as_ref().map(|s| s.len());", " /// println!(\"still can print text: {text:?}\");", " /// ```", " #[inline]", " #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " pub const fn as_ref(&self) -> Option<&T> {", " match *self {", " Some(ref x) => Some(x),", " None => None,", " }", " }", "", " /// Converts from `&mut Option<T>` to `Option<&mut T>`.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(2);", " /// match x.as_mut() {", " /// Some(v) => *v = 42,", " /// None => {},", " /// }", " /// assert_eq!(x, Some(42));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn as_mut(&mut self) -> Option<&mut T> {", " match *self {", " Some(ref mut x) => Some(x),", " None => None,", " }", " }", "", " /// Converts from <code>[Pin]<[&]Option\\<T>></code> to <code>Option<[Pin]<[&]T>></code>.", " ///", " /// [&]: reference \"shared reference\"", " #[inline]", " #[must_use]", " #[stable(feature = \"pin\", since = \"1.33.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {", " match Pin::get_ref(self).as_ref() {", " // SAFETY: `x` is guaranteed to be pinned because it comes from `self`", " // which is pinned.", " Some(x) => unsafe { Some(Pin::new_unchecked(x)) },", " None => None,", " }", " }", "", " /// Converts from <code>[Pin]<[&mut] Option\\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.", " ///", " /// [&mut]: reference \"mutable reference\"", " #[inline]", " #[must_use]", " #[stable(feature = \"pin\", since = \"1.33.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {", " // SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.", " // `x` is guaranteed to be pinned because it comes from `self` which is pinned.", " unsafe {", " match Pin::get_unchecked_mut(self).as_mut() {", " Some(x) => Some(Pin::new_unchecked(x)),", " None => None,", " }", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Getting to contained values", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns the contained [`Some`] value, consuming the `self` value.", " ///", " /// # Panics", " ///", " /// Panics if the value is a [`None`] with a custom panic message provided by", " /// `msg`.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"value\");", " /// assert_eq!(x.expect(\"fruits are healthy\"), \"value\");", " /// ```", " ///", " /// ```should_panic", " /// let x: Option<&str> = None;", " /// x.expect(\"fruits are healthy\"); // panics with `fruits are healthy`", " /// ```", " ///", " /// # Recommended Message Style", " ///", " /// We recommend that `expect` messages are used to describe the reason you", " /// _expect_ the `Option` should be `Some`.", " ///", " /// ```should_panic", " /// # let slice: &[u8] = &[];", " /// let item = slice.get(0)", " /// .expect(\"slice should not be empty\");", " /// ```", " ///", " /// **Hint**: If you're having trouble remembering how to phrase expect", " /// error messages remember to focus on the word \"should\" as in \"env", " /// variable should be set by blah\" or \"the given binary should be available", " /// and executable by the current user\".", " ///", " /// For more detail on expect message styles and the reasoning behind our", " /// recommendation please refer to the section on [\"Common Message", " /// Styles\"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.", " #[inline]", " #[track_caller]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn expect(self, msg: &str) -> T {", " match self {", " Some(val) => val,", " None => expect_failed(msg),", " }", " }", "", " /// Returns the contained [`Some`] value, consuming the `self` value.", " ///", " /// Because this function may panic, its use is generally discouraged.", " /// Instead, prefer to use pattern matching and handle the [`None`]", " /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or", " /// [`unwrap_or_default`].", " ///", " /// [`unwrap_or`]: Option::unwrap_or", " /// [`unwrap_or_else`]: Option::unwrap_or_else", " /// [`unwrap_or_default`]: Option::unwrap_or_default", " ///", " /// # Panics", " ///", " /// Panics if the self value equals [`None`].", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"air\");", " /// assert_eq!(x.unwrap(), \"air\");", " /// ```", " ///", " /// ```should_panic", " /// let x: Option<&str> = None;", " /// assert_eq!(x.unwrap(), \"air\"); // fails", " /// ```", " #[inline]", " #[track_caller]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn unwrap(self) -> T {", " match self {", " Some(val) => val,", " None => panic(\"called `Option::unwrap()` on a `None` value\"),", " }", " }", "", " /// Returns the contained [`Some`] value or a provided default.", " ///", " /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing", " /// the result of a function call, it is recommended to use [`unwrap_or_else`],", " /// which is lazily evaluated.", " ///", " /// [`unwrap_or_else`]: Option::unwrap_or_else", " ///", " /// # Examples", " ///", " /// ```", " /// assert_eq!(Some(\"car\").unwrap_or(\"bike\"), \"car\");", " /// assert_eq!(None.unwrap_or(\"bike\"), \"bike\");", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn unwrap_or(self, default: T) -> T", " where", " T: ~const Destruct,", " {", " match self {", " Some(x) => x,", " None => default,", " }", " }", "", " /// Returns the contained [`Some`] value or computes it from a closure.", " ///", " /// # Examples", " ///", " /// ```", " /// let k = 10;", " /// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);", " /// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn unwrap_or_else<F>(self, f: F) -> T", " where", " F: ~const FnOnce() -> T,", " F: ~const Destruct,", " {", " match self {", " Some(x) => x,", " None => f(),", " }", " }", "", " /// Returns the contained [`Some`] value or a default.", " ///", " /// Consumes the `self` argument then, if [`Some`], returns the contained", " /// value, otherwise if [`None`], returns the [default value] for that", " /// type.", " ///", " /// # Examples", " ///", " /// Converts a string to an integer, turning poorly-formed strings", " /// into 0 (the default value for integers). [`parse`] converts", " /// a string to any other type that implements [`FromStr`], returning", " /// [`None`] on error.", " ///", " /// ```", " /// let good_year_from_input = \"1909\";", " /// let bad_year_from_input = \"190blarg\";", " /// let good_year = good_year_from_input.parse().ok().unwrap_or_default();", " /// let bad_year = bad_year_from_input.parse().ok().unwrap_or_default();", " ///", " /// assert_eq!(1909, good_year);", " /// assert_eq!(0, bad_year);", " /// ```", " ///", " /// [default value]: Default::default", " /// [`parse`]: str::parse", " /// [`FromStr`]: crate::str::FromStr", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn unwrap_or_default(self) -> T", " where", " T: ~const Default,", " {", " match self {", " Some(x) => x,", " None => Default::default(),", " }", " }", "", " /// Returns the contained [`Some`] value, consuming the `self` value,", " /// without checking that the value is not [`None`].", " ///", " /// # Safety", " ///", " /// Calling this method on [`None`] is *[undefined behavior]*.", " ///", " /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"air\");", " /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\");", " /// ```", " ///", " /// ```no_run", " /// let x: Option<&str> = None;", " /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\"); // Undefined behavior!", " /// ```", " #[inline]", " #[track_caller]", " #[stable(feature = \"option_result_unwrap_unchecked\", since = \"1.58.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const unsafe fn unwrap_unchecked(self) -> T {", " debug_assert!(self.is_some());", " match self {", " Some(val) => val,", " // SAFETY: the safety contract must be upheld by the caller.", " None => unsafe { hint::unreachable_unchecked() },", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Transforming contained values", " /////////////////////////////////////////////////////////////////////////", "", " /// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.", " ///", " /// # Examples", " ///", " /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, consuming", " /// the original:", " ///", " /// [String]: ../../std/string/struct.String.html \"String\"", " /// ```", " /// let maybe_some_string = Some(String::from(\"Hello, World!\"));", " /// // `Option::map` takes self *by value*, consuming `maybe_some_string`", " /// let maybe_some_len = maybe_some_string.map(|s| s.len());", " ///", " /// assert_eq!(maybe_some_len, Some(13));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn map<U, F>(self, f: F) -> Option<U>", " where", " F: ~const FnOnce(T) -> U,", " F: ~const Destruct,", " {", " match self {", " Some(x) => Some(f(x)),", " None => None,", " }", " }", "", " /// Calls the provided closure with a reference to the contained value (if [`Some`]).", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(result_option_inspect)]", " ///", " /// let v = vec![1, 2, 3, 4, 5];", " ///", " /// // prints \"got: 4\"", " /// let x: Option<&usize> = v.get(3).inspect(|x| println!(\"got: {x}\"));", " ///", " /// // prints nothing", " /// let x: Option<&usize> = v.get(5).inspect(|x| println!(\"got: {x}\"));", " /// ```", " #[inline]", " #[unstable(feature = \"result_option_inspect\", issue = \"91345\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn inspect<F>(self, f: F) -> Self", " where", " F: ~const FnOnce(&T),", " F: ~const Destruct,", " {", " if let Some(ref x) = self {", " f(x);", " }", "", " self", " }", "", " /// Returns the provided default result (if none),", " /// or applies a function to the contained value (if any).", " ///", " /// Arguments passed to `map_or` are eagerly evaluated; if you are passing", " /// the result of a function call, it is recommended to use [`map_or_else`],", " /// which is lazily evaluated.", " ///", " /// [`map_or_else`]: Option::map_or_else", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"foo\");", " /// assert_eq!(x.map_or(42, |v| v.len()), 3);", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.map_or(42, |v| v.len()), 42);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn map_or<U, F>(self, default: U, f: F) -> U", " where", " F: ~const FnOnce(T) -> U,", " F: ~const Destruct,", " U: ~const Destruct,", " {", " match self {", " Some(t) => f(t),", " None => default,", " }", " }", "", " /// Computes a default function result (if none), or", " /// applies a different function to the contained value (if any).", " ///", " /// # Examples", " ///", " /// ```", " /// let k = 21;", " ///", " /// let x = Some(\"foo\");", " /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U", " where", " D: ~const FnOnce() -> U,", " D: ~const Destruct,", " F: ~const FnOnce(T) -> U,", " F: ~const Destruct,", " {", " match self {", " Some(t) => f(t),", " None => default(),", " }", " }", "", " /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to", " /// [`Ok(v)`] and [`None`] to [`Err(err)`].", " ///", " /// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the", " /// result of a function call, it is recommended to use [`ok_or_else`], which is", " /// lazily evaluated.", " ///", " /// [`Ok(v)`]: Ok", " /// [`Err(err)`]: Err", " /// [`Some(v)`]: Some", " /// [`ok_or_else`]: Option::ok_or_else", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"foo\");", " /// assert_eq!(x.ok_or(0), Ok(\"foo\"));", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.ok_or(0), Err(0));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn ok_or<E>(self, err: E) -> Result<T, E>", " where", " E: ~const Destruct,", " {", " match self {", " Some(v) => Ok(v),", " None => Err(err),", " }", " }", "", " /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to", " /// [`Ok(v)`] and [`None`] to [`Err(err())`].", " ///", " /// [`Ok(v)`]: Ok", " /// [`Err(err())`]: Err", " /// [`Some(v)`]: Some", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"foo\");", " /// assert_eq!(x.ok_or_else(|| 0), Ok(\"foo\"));", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.ok_or_else(|| 0), Err(0));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>", " where", " F: ~const FnOnce() -> E,", " F: ~const Destruct,", " {", " match self {", " Some(v) => Ok(v),", " None => Err(err()),", " }", " }", "", " /// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.", " ///", " /// Leaves the original Option in-place, creating a new one with a reference", " /// to the original one, additionally coercing the contents via [`Deref`].", " ///", " /// # Examples", " ///", " /// ```", " /// let x: Option<String> = Some(\"hey\".to_owned());", " /// assert_eq!(x.as_deref(), Some(\"hey\"));", " ///", " /// let x: Option<String> = None;", " /// assert_eq!(x.as_deref(), None);", " /// ```", " #[stable(feature = \"option_deref\", since = \"1.40.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_deref(&self) -> Option<&T::Target>", " where", " T: ~const Deref,", " {", " match self.as_ref() {", " Some(t) => Some(t.deref()),", " None => None,", " }", " }", "", " /// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.", " ///", " /// Leaves the original `Option` in-place, creating a new one containing a mutable reference to", " /// the inner type's [`Deref::Target`] type.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x: Option<String> = Some(\"hey\".to_owned());", " /// assert_eq!(x.as_deref_mut().map(|x| {", " /// x.make_ascii_uppercase();", " /// x", " /// }), Some(\"HEY\".to_owned().as_mut_str()));", " /// ```", " #[stable(feature = \"option_deref\", since = \"1.40.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>", " where", " T: ~const DerefMut,", " {", " match self.as_mut() {", " Some(t) => Some(t.deref_mut()),", " None => None,", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Iterator constructors", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns an iterator over the possibly contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(4);", " /// assert_eq!(x.iter().next(), Some(&4));", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.iter().next(), None);", " /// ```", " #[inline]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " pub const fn iter(&self) -> Iter<'_, T> {", " Iter { inner: Item { opt: self.as_ref() } }", " }", "", " /// Returns a mutable iterator over the possibly contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(4);", " /// match x.iter_mut().next() {", " /// Some(v) => *v = 42,", " /// None => {},", " /// }", " /// assert_eq!(x, Some(42));", " ///", " /// let mut x: Option<u32> = None;", " /// assert_eq!(x.iter_mut().next(), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " pub fn iter_mut(&mut self) -> IterMut<'_, T> {", " IterMut { inner: Item { opt: self.as_mut() } }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Boolean operations on the values, eager and lazy", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns [`None`] if the option is [`None`], otherwise returns `optb`.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(2);", " /// let y: Option<&str> = None;", " /// assert_eq!(x.and(y), None);", " ///", " /// let x: Option<u32> = None;", " /// let y = Some(\"foo\");", " /// assert_eq!(x.and(y), None);", " ///", " /// let x = Some(2);", " /// let y = Some(\"foo\");", " /// assert_eq!(x.and(y), Some(\"foo\"));", " ///", " /// let x: Option<u32> = None;", " /// let y: Option<&str> = None;", " /// assert_eq!(x.and(y), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn and<U>(self, optb: Option<U>) -> Option<U>", " where", " T: ~const Destruct,", " U: ~const Destruct,", " {", " match self {", " Some(_) => optb,", " None => None,", " }", " }", "", " /// Returns [`None`] if the option is [`None`], otherwise calls `f` with the", " /// wrapped value and returns the result.", " ///", " /// Some languages call this operation flatmap.", " ///", " /// # Examples", " ///", " /// ```", " /// fn sq_then_to_string(x: u32) -> Option<String> {", " /// x.checked_mul(x).map(|sq| sq.to_string())", " /// }", " ///", " /// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));", " /// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!", " /// assert_eq!(None.and_then(sq_then_to_string), None);", " /// ```", " ///", " /// Often used to chain fallible operations that may return [`None`].", " ///", " /// ```", " /// let arr_2d = [[\"A0\", \"A1\"], [\"B0\", \"B1\"]];", " ///", " /// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));", " /// assert_eq!(item_0_1, Some(&\"A1\"));", " ///", " /// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));", " /// assert_eq!(item_2_0, None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn and_then<U, F>(self, f: F) -> Option<U>", " where", " F: ~const FnOnce(T) -> Option<U>,", " F: ~const Destruct,", " {", " match self {", " Some(x) => f(x),", " None => None,", " }", " }", "", " /// Returns [`None`] if the option is [`None`], otherwise calls `predicate`", " /// with the wrapped value and returns:", " ///", " /// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped", " /// value), and", " /// - [`None`] if `predicate` returns `false`.", " ///", " /// This function works similar to [`Iterator::filter()`]. You can imagine", " /// the `Option<T>` being an iterator over one or zero elements. `filter()`", " /// lets you decide which elements to keep.", " ///", " /// # Examples", " ///", " /// ```rust", " /// fn is_even(n: &i32) -> bool {", " /// n % 2 == 0", " /// }", " ///", " /// assert_eq!(None.filter(is_even), None);", " /// assert_eq!(Some(3).filter(is_even), None);", " /// assert_eq!(Some(4).filter(is_even), Some(4));", " /// ```", " ///", " /// [`Some(t)`]: Some", " #[inline]", " #[stable(feature = \"option_filter\", since = \"1.27.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn filter<P>(self, predicate: P) -> Self", " where", " T: ~const Destruct,", " P: ~const FnOnce(&T) -> bool,", " P: ~const Destruct,", " {", " if let Some(x) = self {", " if predicate(&x) {", " return Some(x);", " }", " }", " None", " }", "", " /// Returns the option if it contains a value, otherwise returns `optb`.", " ///", " /// Arguments passed to `or` are eagerly evaluated; if you are passing the", " /// result of a function call, it is recommended to use [`or_else`], which is", " /// lazily evaluated.", " ///", " /// [`or_else`]: Option::or_else", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(2);", " /// let y = None;", " /// assert_eq!(x.or(y), Some(2));", " ///", " /// let x = None;", " /// let y = Some(100);", " /// assert_eq!(x.or(y), Some(100));", " ///", " /// let x = Some(2);", " /// let y = Some(100);", " /// assert_eq!(x.or(y), Some(2));", " ///", " /// let x: Option<u32> = None;", " /// let y = None;", " /// assert_eq!(x.or(y), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn or(self, optb: Option<T>) -> Option<T>", " where", " T: ~const Destruct,", " {", " match self {", " Some(x) => Some(x),", " None => optb,", " }", " }", "", " /// Returns the option if it contains a value, otherwise calls `f` and", " /// returns the result.", " ///", " /// # Examples", " ///", " /// ```", " /// fn nobody() -> Option<&'static str> { None }", " /// fn vikings() -> Option<&'static str> { Some(\"vikings\") }", " ///", " /// assert_eq!(Some(\"barbarians\").or_else(vikings), Some(\"barbarians\"));", " /// assert_eq!(None.or_else(vikings), Some(\"vikings\"));", " /// assert_eq!(None.or_else(nobody), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn or_else<F>(self, f: F) -> Option<T>", " where", " F: ~const FnOnce() -> Option<T>,", " F: ~const Destruct,", " {", " match self {", " Some(x) => Some(x),", " None => f(),", " }", " }", "", " /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(2);", " /// let y: Option<u32> = None;", " /// assert_eq!(x.xor(y), Some(2));", " ///", " /// let x: Option<u32> = None;", " /// let y = Some(2);", " /// assert_eq!(x.xor(y), Some(2));", " ///", " /// let x = Some(2);", " /// let y = Some(2);", " /// assert_eq!(x.xor(y), None);", " ///", " /// let x: Option<u32> = None;", " /// let y: Option<u32> = None;", " /// assert_eq!(x.xor(y), None);", " /// ```", " #[inline]", " #[stable(feature = \"option_xor\", since = \"1.37.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn xor(self, optb: Option<T>) -> Option<T>", " where", " T: ~const Destruct,", " {", " match (self, optb) {", " (Some(a), None) => Some(a),", " (None, Some(b)) => Some(b),", " _ => None,", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Entry-like operations to insert a value and return a reference", " /////////////////////////////////////////////////////////////////////////", "", " /// Inserts `value` into the option, then returns a mutable reference to it.", " ///", " /// If the option already contains a value, the old value is dropped.", " ///", " /// See also [`Option::get_or_insert`], which doesn't update the value if", " /// the option already contains [`Some`].", " ///", " /// # Example", " ///", " /// ```", " /// let mut opt = None;", " /// let val = opt.insert(1);", " /// assert_eq!(*val, 1);", " /// assert_eq!(opt.unwrap(), 1);", " /// let val = opt.insert(2);", " /// assert_eq!(*val, 2);", " /// *val = 3;", " /// assert_eq!(opt.unwrap(), 3);", " /// ```", " #[must_use = \"if you intended to set a value, consider assignment instead\"]", " #[inline]", " #[stable(feature = \"option_insert\", since = \"1.53.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn insert(&mut self, value: T) -> &mut T", " where", " T: ~const Destruct,", " {", " *self = Some(value);", "", " // SAFETY: the code above just filled the option", " unsafe { self.as_mut().unwrap_unchecked() }", " }", "", " /// Inserts `value` into the option if it is [`None`], then", " /// returns a mutable reference to the contained value.", " ///", " /// See also [`Option::insert`], which updates the value even if", " /// the option already contains [`Some`].", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = None;", " ///", " /// {", " /// let y: &mut u32 = x.get_or_insert(5);", " /// assert_eq!(y, &5);", " ///", " /// *y = 7;", " /// }", " ///", " /// assert_eq!(x, Some(7));", " /// ```", " #[inline]", " #[stable(feature = \"option_entry\", since = \"1.20.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn get_or_insert(&mut self, value: T) -> &mut T", " where", " T: ~const Destruct,", " {", " if let None = *self {", " *self = Some(value);", " }", "", " // SAFETY: a `None` variant for `self` would have been replaced by a `Some`", " // variant in the code above.", " unsafe { self.as_mut().unwrap_unchecked() }", " }", "", " /// Inserts the default value into the option if it is [`None`], then", " /// returns a mutable reference to the contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(option_get_or_insert_default)]", " ///", " /// let mut x = None;", " ///", " /// {", " /// let y: &mut u32 = x.get_or_insert_default();", " /// assert_eq!(y, &0);", " ///", " /// *y = 7;", " /// }", " ///", " /// assert_eq!(x, Some(7));", " /// ```", " #[inline]", " #[unstable(feature = \"option_get_or_insert_default\", issue = \"82901\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn get_or_insert_default(&mut self) -> &mut T", " where", " T: ~const Default,", " {", " const fn default<T: ~const Default>() -> T {", " T::default()", " }", "", " self.get_or_insert_with(default)", " }", "", " /// Inserts a value computed from `f` into the option if it is [`None`],", " /// then returns a mutable reference to the contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = None;", " ///", " /// {", " /// let y: &mut u32 = x.get_or_insert_with(|| 5);", " /// assert_eq!(y, &5);", " ///", " /// *y = 7;", " /// }", " ///", " /// assert_eq!(x, Some(7));", " /// ```", " #[inline]", " #[stable(feature = \"option_entry\", since = \"1.20.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T", " where", " F: ~const FnOnce() -> T,", " F: ~const Destruct,", " {", " if let None = *self {", " // the compiler isn't smart enough to know that we are not dropping a `T`", " // here and wants us to ensure `T` can be dropped at compile time.", " mem::forget(mem::replace(self, Some(f())))", " }", "", " // SAFETY: a `None` variant for `self` would have been replaced by a `Some`", " // variant in the code above.", " unsafe { self.as_mut().unwrap_unchecked() }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Misc", " /////////////////////////////////////////////////////////////////////////", "", " /// Takes the value out of the option, leaving a [`None`] in its place.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(2);", " /// let y = x.take();", " /// assert_eq!(x, None);", " /// assert_eq!(y, Some(2));", " ///", " /// let mut x: Option<u32> = None;", " /// let y = x.take();", " /// assert_eq!(x, None);", " /// assert_eq!(y, None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn take(&mut self) -> Option<T> {", " // FIXME replace `mem::replace` by `mem::take` when the latter is const ready", " mem::replace(self, None)", " }", "", " /// Replaces the actual value in the option by the value given in parameter,", " /// returning the old value if present,", " /// leaving a [`Some`] in its place without deinitializing either one.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(2);", " /// let old = x.replace(5);", " /// assert_eq!(x, Some(5));", " /// assert_eq!(old, Some(2));", " ///", " /// let mut x = None;", " /// let old = x.replace(3);", " /// assert_eq!(x, Some(3));", " /// assert_eq!(old, None);", " /// ```", " #[inline]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " #[stable(feature = \"option_replace\", since = \"1.31.0\")]", " pub const fn replace(&mut self, value: T) -> Option<T> {", " mem::replace(self, Some(value))", " }", "", " /// Returns `true` if the option is a [`Some`] value containing the given value.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(option_result_contains)]", " ///", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.contains(&2), true);", " ///", " /// let x: Option<u32> = Some(3);", " /// assert_eq!(x.contains(&2), false);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.contains(&2), false);", " /// ```", " #[must_use]", " #[inline]", " #[unstable(feature = \"option_result_contains\", issue = \"62358\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn contains<U>(&self, x: &U) -> bool", " where", " U: ~const PartialEq<T>,", " {", " match self {", " Some(y) => x.eq(y),", " None => false,", " }", " }", "", " /// Zips `self` with another `Option`.", " ///", " /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.", " /// Otherwise, `None` is returned.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(1);", " /// let y = Some(\"hi\");", " /// let z = None::<u8>;", " ///", " /// assert_eq!(x.zip(y), Some((1, \"hi\")));", " /// assert_eq!(x.zip(z), None);", " /// ```", " #[stable(feature = \"option_zip_option\", since = \"1.46.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>", " where", " T: ~const Destruct,", " U: ~const Destruct,", " {", " match (self, other) {", " (Some(a), Some(b)) => Some((a, b)),", " _ => None,", " }", " }", "", " /// Zips `self` and another `Option` with function `f`.", " ///", " /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.", " /// Otherwise, `None` is returned.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(option_zip)]", " ///", " /// #[derive(Debug, PartialEq)]", " /// struct Point {", " /// x: f64,", " /// y: f64,", " /// }", " ///", " /// impl Point {", " /// fn new(x: f64, y: f64) -> Self {", " /// Self { x, y }", " /// }", " /// }", " ///", " /// let x = Some(17.5);", " /// let y = Some(42.7);", " ///", " /// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));", " /// assert_eq!(x.zip_with(None, Point::new), None);", " /// ```", " #[unstable(feature = \"option_zip\", issue = \"70086\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>", " where", " F: ~const FnOnce(T, U) -> R,", " F: ~const Destruct,", " T: ~const Destruct,", " U: ~const Destruct,", " {", " match (self, other) {", " (Some(a), Some(b)) => Some(f(a, b)),", " _ => None,", " }", " }", "}", "", "impl<T, U> Option<(T, U)> {", " /// Unzips an option containing a tuple of two options.", " ///", " /// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.", " /// Otherwise, `(None, None)` is returned.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(unzip_option)]", " ///", " /// let x = Some((1, \"hi\"));", " /// let y = None::<(u8, u32)>;", " ///", " /// assert_eq!(x.unzip(), (Some(1), Some(\"hi\")));", " /// assert_eq!(y.unzip(), (None, None));", " /// ```", " #[inline]", " #[unstable(feature = \"unzip_option\", issue = \"87800\", reason = \"recently added\")]", " pub const fn unzip(self) -> (Option<T>, Option<U>) {", " match self {", " Some((a, b)) => (Some(a), Some(b)),", " None => (None, None),", " }", " }", "}", "", "impl<T> Option<&T> {", " /// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = 12;", " /// let opt_x = Some(&x);", " /// assert_eq!(opt_x, Some(&12));", " /// let copied = opt_x.copied();", " /// assert_eq!(copied, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(feature = \"copied\", since = \"1.35.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn copied(self) -> Option<T>", " where", " T: Copy,", " {", " // FIXME: this implementation, which sidesteps using `Option::map` since it's not const", " // ready yet, should be reverted when possible to avoid code repetition", " match self {", " Some(&v) => Some(v),", " None => None,", " }", " }", "", " /// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = 12;", " /// let opt_x = Some(&x);", " /// assert_eq!(opt_x, Some(&12));", " /// let cloned = opt_x.cloned();", " /// assert_eq!(cloned, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]", " pub const fn cloned(self) -> Option<T>", " where", " T: ~const Clone,", " {", " match self {", " Some(t) => Some(t.clone()),", " None => None,", " }", " }", "}", "", "impl<T> Option<&mut T> {", " /// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = 12;", " /// let opt_x = Some(&mut x);", " /// assert_eq!(opt_x, Some(&mut 12));", " /// let copied = opt_x.copied();", " /// assert_eq!(copied, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(feature = \"copied\", since = \"1.35.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn copied(self) -> Option<T>", " where", " T: Copy,", " {", " match self {", " Some(&mut t) => Some(t),", " None => None,", " }", " }", "", " /// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = 12;", " /// let opt_x = Some(&mut x);", " /// assert_eq!(opt_x, Some(&mut 12));", " /// let cloned = opt_x.cloned();", " /// assert_eq!(cloned, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(since = \"1.26.0\", feature = \"option_ref_mut_cloned\")]", " #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]", " pub const fn cloned(self) -> Option<T>", " where", " T: ~const Clone,", " {", " match self {", " Some(t) => Some(t.clone()),", " None => None,", " }", " }", "}", "", "impl<T, E> Option<Result<T, E>> {", " /// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.", " ///", " /// [`None`] will be mapped to <code>[Ok]\\([None])</code>.", " /// <code>[Some]\\([Ok]\\(\\_))</code> and <code>[Some]\\([Err]\\(\\_))</code> will be mapped to", " /// <code>[Ok]\\([Some]\\(\\_))</code> and <code>[Err]\\(\\_)</code>.", " ///", " /// # Examples", " ///", " /// ```", " /// #[derive(Debug, Eq, PartialEq)]", " /// struct SomeErr;", " ///", " /// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));", " /// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));", " /// assert_eq!(x, y.transpose());", " /// ```", " #[inline]", " #[stable(feature = \"transpose_result\", since = \"1.33.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn transpose(self) -> Result<Option<T>, E> {", " match self {", " Some(Ok(x)) => Ok(Some(x)),", " Some(Err(e)) => Err(e),", " None => Ok(None),", " }", " }", "}", "", "// This is a separate function to reduce the code size of .expect() itself.", "#[cfg_attr(not(feature = \"panic_immediate_abort\"), inline(never))]", "#[cfg_attr(feature = \"panic_immediate_abort\", inline)]", "#[cold]", "#[track_caller]", "#[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", "const fn expect_failed(msg: &str) -> ! {", " panic_str(msg)", "}", "", "/////////////////////////////////////////////////////////////////////////////", "// Trait implementations", "/////////////////////////////////////////////////////////////////////////////", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[rustc_const_unstable(feature = \"const_clone\", issue = \"91805\")]", "impl<T> const Clone for Option<T>", "where", " T: ~const Clone + ~const Destruct,", "{", " #[inline]", " fn clone(&self) -> Self {", " match self {", " Some(x) => Some(x.clone()),", " None => None,", " }", " }", "", " #[inline]", " fn clone_from(&mut self, source: &Self) {", " match (self, source) {", " (Some(to), Some(from)) => to.clone_from(from),", " (to, from) => *to = from.clone(),", " }", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[rustc_const_unstable(feature = \"const_default_impls\", issue = \"87864\")]", "impl<T> const Default for Option<T> {", " /// Returns [`None`][Option::None].", " ///", " /// # Examples", " ///", " /// ```", " /// let opt: Option<u32> = Option::default();", " /// assert!(opt.is_none());", " /// ```", " #[inline]", " fn default() -> Option<T> {", " None", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<T> IntoIterator for Option<T> {", " type Item = T;", " type IntoIter = IntoIter<T>;", "", " /// Returns a consuming iterator over the possibly contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"string\");", " /// let v: Vec<&str> = x.into_iter().collect();", " /// assert_eq!(v, [\"string\"]);", " ///", " /// let x = None;", " /// let v: Vec<&str> = x.into_iter().collect();", " /// assert!(v.is_empty());", " /// ```", " #[inline]", " fn into_iter(self) -> IntoIter<T> {", " IntoIter { inner: Item { opt: self } }", " }", "}", "", "#[stable(since = \"1.4.0\", feature = \"option_iter\")]", "impl<'a, T> IntoIterator for &'a Option<T> {", " type Item = &'a T;", " type IntoIter = Iter<'a, T>;", "", " fn into_iter(self) -> Iter<'a, T> {", " self.iter()", " }", "}", "", "#[stable(since = \"1.4.0\", feature = \"option_iter\")]", "impl<'a, T> IntoIterator for &'a mut Option<T> {", " type Item = &'a mut T;", " type IntoIter = IterMut<'a, T>;", "", " fn into_iter(self) -> IterMut<'a, T> {", " self.iter_mut()", " }", "}", "", "#[stable(since = \"1.12.0\", feature = \"option_from\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<T> const From<T> for Option<T> {", " /// Moves `val` into a new [`Some`].", " ///", " /// # Examples", " ///", " /// ```", " /// let o: Option<u8> = Option::from(67);", " ///", " /// assert_eq!(Some(67), o);", " /// ```", " fn from(val: T) -> Option<T> {", " Some(val)", " }", "}", "", "#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<'a, T> const From<&'a Option<T>> for Option<&'a T> {", " /// Converts from `&Option<T>` to `Option<&T>`.", " ///", " /// # Examples", " ///", " /// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving", " /// the original. The [`map`] method takes the `self` argument by value, consuming the original,", " /// so this technique uses `from` to first take an [`Option`] to a reference", " /// to the value inside the original.", " ///", " /// [`map`]: Option::map", " /// [String]: ../../std/string/struct.String.html \"String\"", " ///", " /// ```", " /// let s: Option<String> = Some(String::from(\"Hello, Rustaceans!\"));", " /// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());", " ///", " /// println!(\"Can still print s: {s:?}\");", " ///", " /// assert_eq!(o, Some(18));", " /// ```", " fn from(o: &'a Option<T>) -> Option<&'a T> {", " o.as_ref()", " }", "}", "", "#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {", " /// Converts from `&mut Option<T>` to `Option<&mut T>`", " ///", " /// # Examples", " ///", " /// ```", " /// let mut s = Some(String::from(\"Hello\"));", " /// let o: Option<&mut String> = Option::from(&mut s);", " ///", " /// match o {", " /// Some(t) => *t = String::from(\"Hello, Rustaceans!\"),", " /// None => (),", " /// }", " ///", " /// assert_eq!(s, Some(String::from(\"Hello, Rustaceans!\")));", " /// ```", " fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {", " o.as_mut()", " }", "}", "", "/////////////////////////////////////////////////////////////////////////////", "// The Option Iterators", "/////////////////////////////////////////////////////////////////////////////", "", "#[derive(Clone, Debug)]", "struct Item<A> {", " opt: Option<A>,", "}", "", "impl<A> Iterator for Item<A> {", " type Item = A;", "", " #[inline]", " fn next(&mut self) -> Option<A> {", " self.opt.take()", " }", "", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " match self.opt {", " Some(_) => (1, Some(1)),", " None => (0, Some(0)),", " }", " }", "}", "", "impl<A> DoubleEndedIterator for Item<A> {", " #[inline]", " fn next_back(&mut self) -> Option<A> {", " self.opt.take()", " }", "}", "", "impl<A> ExactSizeIterator for Item<A> {}", "impl<A> FusedIterator for Item<A> {}", "unsafe impl<A> TrustedLen for Item<A> {}", "", "/// An iterator over a reference to the [`Some`] variant of an [`Option`].", "///", "/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.", "///", "/// This `struct` is created by the [`Option::iter`] function.", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[derive(Debug)]", "pub struct Iter<'a, A: 'a> {", " inner: Item<&'a A>,", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> Iterator for Iter<'a, A> {", " type Item = &'a A;", "", " #[inline]", " fn next(&mut self) -> Option<&'a A> {", " self.inner.next()", " }", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " self.inner.size_hint()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> DoubleEndedIterator for Iter<'a, A> {", " #[inline]", " fn next_back(&mut self) -> Option<&'a A> {", " self.inner.next_back()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> ExactSizeIterator for Iter<'_, A> {}", "", "#[stable(feature = \"fused\", since = \"1.26.0\")]", "impl<A> FusedIterator for Iter<'_, A> {}", "", "#[unstable(feature = \"trusted_len\", issue = \"37572\")]", "unsafe impl<A> TrustedLen for Iter<'_, A> {}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> Clone for Iter<'_, A> {", " #[inline]", " fn clone(&self) -> Self {", " Iter { inner: self.inner.clone() }", " }", "}", "", "/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].", "///", "/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.", "///", "/// This `struct` is created by the [`Option::iter_mut`] function.", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[derive(Debug)]", "pub struct IterMut<'a, A: 'a> {", " inner: Item<&'a mut A>,", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> Iterator for IterMut<'a, A> {", " type Item = &'a mut A;", "", " #[inline]", " fn next(&mut self) -> Option<&'a mut A> {", " self.inner.next()", " }", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " self.inner.size_hint()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> DoubleEndedIterator for IterMut<'a, A> {", " #[inline]", " fn next_back(&mut self) -> Option<&'a mut A> {", " self.inner.next_back()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> ExactSizeIterator for IterMut<'_, A> {}", "", "#[stable(feature = \"fused\", since = \"1.26.0\")]", "impl<A> FusedIterator for IterMut<'_, A> {}", "#[unstable(feature = \"trusted_len\", issue = \"37572\")]", "unsafe impl<A> TrustedLen for IterMut<'_, A> {}", "", "/// An iterator over the value in [`Some`] variant of an [`Option`].", "///", "/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.", "///", "/// This `struct` is created by the [`Option::into_iter`] function.", "#[derive(Clone, Debug)]", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "pub struct IntoIter<A> {", " inner: Item<A>,", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> Iterator for IntoIter<A> {", " type Item = A;", "", " #[inline]", " fn next(&mut self) -> Option<A> {", " self.inner.next()", " }", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " self.inner.size_hint()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> DoubleEndedIterator for IntoIter<A> {", " #[inline]", " fn next_back(&mut self) -> Option<A> {", " self.inner.next_back()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> ExactSizeIterator for IntoIter<A> {}", "", "#[stable(feature = \"fused\", since = \"1.26.0\")]", "impl<A> FusedIterator for IntoIter<A> {}", "", "#[unstable(feature = \"trusted_len\", issue = \"37572\")]", "unsafe impl<A> TrustedLen for IntoIter<A> {}", "", "/////////////////////////////////////////////////////////////////////////////", "// FromIterator", "/////////////////////////////////////////////////////////////////////////////", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {", " /// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],", " /// no further elements are taken, and the [`None`][Option::None] is", " /// returned. Should no [`None`][Option::None] occur, a container of type", " /// `V` containing the values of each [`Option`] is returned.", " ///", " /// # Examples", " ///", " /// Here is an example which increments every integer in a vector.", " /// We use the checked variant of `add` that returns `None` when the", " /// calculation would result in an overflow.", " ///", " /// ```", " /// let items = vec![0_u16, 1, 2];", " ///", " /// let res: Option<Vec<u16>> = items", " /// .iter()", " /// .map(|x| x.checked_add(1))", " /// .collect();", " ///", " /// assert_eq!(res, Some(vec![1, 2, 3]));", " /// ```", " ///", " /// As you can see, this will return the expected, valid items.", " ///", " /// Here is another example that tries to subtract one from another list", " /// of integers, this time checking for underflow:", " ///", " /// ```", " /// let items = vec![2_u16, 1, 0];", " ///", " /// let res: Option<Vec<u16>> = items", " /// .iter()", " /// .map(|x| x.checked_sub(1))", " /// .collect();", " ///", " /// assert_eq!(res, None);", " /// ```", " ///", " /// Since the last element is zero, it would underflow. Thus, the resulting", " /// value is `None`.", " ///", " /// Here is a variation on the previous example, showing that no", " /// further elements are taken from `iter` after the first `None`.", " ///", " /// ```", " /// let items = vec![3_u16, 2, 1, 10];", " ///", " /// let mut shared = 0;", " ///", " /// let res: Option<Vec<u16>> = items", " /// .iter()", " /// .map(|x| { shared += x; x.checked_sub(2) })", " /// .collect();", " ///", " /// assert_eq!(res, None);", " /// assert_eq!(shared, 6);", " /// ```", " ///", " /// Since the third element caused an underflow, no further elements were taken,", " /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.", " #[inline]", " fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {", " // FIXME(#11084): This could be replaced with Iterator::scan when this", " // performance bug is closed.", "", " iter::try_process(iter.into_iter(), |i| i.collect())", " }", "}", "", "#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<T> const ops::Try for Option<T> {", " type Output = T;", " type Residual = Option<convert::Infallible>;", "", " #[inline]", " fn from_output(output: Self::Output) -> Self {", " Some(output)", " }", "", " #[inline]", " fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {", " match self {", " Some(v) => ControlFlow::Continue(v),", " None => ControlFlow::Break(None),", " }", " }", "}", "", "#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<T> const ops::FromResidual for Option<T> {", " #[inline]", " fn from_residual(residual: Option<convert::Infallible>) -> Self {", " match residual {", " None => None,", " }", " }", "}", "", "#[unstable(feature = \"try_trait_v2_yeet\", issue = \"96374\")]", "impl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {", " #[inline]", " fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {", " None", " }", "}", "", "#[unstable(feature = \"try_trait_v2_residual\", issue = \"91285\")]", "impl<T> ops::Residual<T> for Option<convert::Infallible> {", " type TryType = Option<T>;", "}", "", "impl<T> Option<Option<T>> {", " /// Converts from `Option<Option<T>>` to `Option<T>`.", " ///", " /// # Examples", " ///", " /// Basic usage:", " ///", " /// ```", " /// let x: Option<Option<u32>> = Some(Some(6));", " /// assert_eq!(Some(6), x.flatten());", " ///", " /// let x: Option<Option<u32>> = Some(None);", " /// assert_eq!(None, x.flatten());", " ///", " /// let x: Option<Option<u32>> = None;", " /// assert_eq!(None, x.flatten());", " /// ```", " ///", " /// Flattening only removes one level of nesting at a time:", " ///", " /// ```", " /// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));", " /// assert_eq!(Some(Some(6)), x.flatten());", " /// assert_eq!(Some(6), x.flatten().flatten());", " /// ```", " #[inline]", " #[stable(feature = \"option_flattening\", since = \"1.40.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn flatten(self) -> Option<T> {", " match self {", " Some(inner) => inner,", " None => None,", " }", " }", "}", ""]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["s:GetVar('LanguageClient_setOmnifunc', v:true)"],"id":30} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 30, "jsonrpc": "2.0", "result": true} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.text_documents./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> {"languageId":"rust","text":"//! Optional values.\n//!\n//! Type [`Option`] represents an optional value: every [`Option`]\n//! is either [`Some`] and contains a value, or [`None`], and\n//! does not. [`Option`] types are very common in Rust code, as\n//! they have a number of uses:\n//!\n//! * Initial values\n//! * Return values for functions that are not defined\n//! over their entire input range (partial functions)\n//! * Return value for otherwise reporting simple errors, where [`None`] is\n//! returned on error\n//! * Optional struct fields\n//! * Struct fields that can be loaned or \"taken\"\n//! * Optional function arguments\n//! * Nullable pointers\n//! * Swapping things out of difficult situations\n//!\n//! [`Option`]s are commonly paired with pattern matching to query the presence\n//! of a value and take action, always accounting for the [`None`] case.\n//!\n//! ```\n//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {\n//! if denominator == 0.0 {\n//! None\n//! } else {\n//! Some(numerator / denominator)\n//! }\n//! }\n//!\n//! // The return value of the function is an option\n//! let result = divide(2.0, 3.0);\n//!\n//! // Pattern match to retrieve the value\n//! match result {\n//! // The division was valid\n//! Some(x) => println!(\"Result: {x}\"),\n//! // The division was invalid\n//! None => println!(\"Cannot divide by 0\"),\n//! }\n//! ```\n//!\n//\n// FIXME: Show how `Option` is used in practice, with lots of methods\n//\n//! # Options and pointers (\"nullable\" pointers)\n//!\n//! Rust's pointer types must always point to a valid location; there are\n//! no \"null\" references. Instead, Rust has *optional* pointers, like\n//! the optional owned box, <code>[Option]<[Box\\<T>]></code>.\n//!\n//! [Box\\<T>]: ../../std/boxed/struct.Box.html\n//!\n//! The following example uses [`Option`] to create an optional box of\n//! [`i32`]. Notice that in order to use the inner [`i32`] value, the\n//! `check_optional` function first needs to use pattern matching to\n//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or\n//! not ([`None`]).\n//!\n//! ```\n//! let optional = None;\n//! check_optional(optional);\n//!\n//! let optional = Some(Box::new(9000));\n//! check_optional(optional);\n//!\n//! fn check_optional(optional: Option<Box<i32>>) {\n//! match optional {\n//! Some(p) => println!(\"has value {p}\"),\n//! None => println!(\"has no value\"),\n//! }\n//! }\n//! ```\n//!\n//! # Representation\n//!\n//! Rust guarantees to optimize the following types `T` such that\n//! [`Option<T>`] has the same size as `T`:\n//!\n//! * [`Box<U>`]\n//! * `&U`\n//! * `&mut U`\n//! * `fn`, `extern \"C\" fn`[^extern_fn]\n//! * [`num::NonZero*`]\n//! * [`ptr::NonNull<U>`]\n//! * `#[repr(transparent)]` struct around one of the types in this list.\n//!\n//! [^extern_fn]: this remains true for any other ABI: `extern \"abi\" fn` (_e.g._, `extern \"system\" fn`)\n//!\n//! [`Box<U>`]: ../../std/boxed/struct.Box.html\n//! [`num::NonZero*`]: crate::num\n//! [`ptr::NonNull<U>`]: crate::ptr::NonNull\n//!\n//! This is called the \"null pointer optimization\" or NPO.\n//!\n//! It is further guaranteed that, for the cases above, one can\n//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and\n//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`\n//! is undefined behaviour).\n//!\n//! # Method overview\n//!\n//! In addition to working with pattern matching, [`Option`] provides a wide\n//! variety of different methods.\n//!\n//! ## Querying the variant\n//!\n//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]\n//! is [`Some`] or [`None`], respectively.\n//!\n//! [`is_none`]: Option::is_none\n//! [`is_some`]: Option::is_some\n//!\n//! ## Adapters for working with references\n//!\n//! * [`as_ref`] converts from <code>[&][][Option]\\<T></code> to <code>[Option]<[&]T></code>\n//! * [`as_mut`] converts from <code>[&mut] [Option]\\<T></code> to <code>[Option]<[&mut] T></code>\n//! * [`as_deref`] converts from <code>[&][][Option]\\<T></code> to\n//! <code>[Option]<[&]T::[Target]></code>\n//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\\<T></code> to\n//! <code>[Option]<[&mut] T::[Target]></code>\n//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&]T>></code>\n//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&mut] T>></code>\n//!\n//! [&]: reference \"shared reference\"\n//! [&mut]: reference \"mutable reference\"\n//! [Target]: Deref::Target \"ops::Deref::Target\"\n//! [`as_deref`]: Option::as_deref\n//! [`as_deref_mut`]: Option::as_deref_mut\n//! [`as_mut`]: Option::as_mut\n//! [`as_pin_mut`]: Option::as_pin_mut\n//! [`as_pin_ref`]: Option::as_pin_ref\n//! [`as_ref`]: Option::as_ref\n//!\n//! ## Extracting the contained value\n//!\n//! These methods extract the contained value in an [`Option<T>`] when it\n//! is the [`Some`] variant. If the [`Option`] is [`None`]:\n//!\n//! * [`expect`] panics with a provided custom message\n//! * [`unwrap`] panics with a generic message\n//! * [`unwrap_or`] returns the provided default value\n//! * [`unwrap_or_default`] returns the default value of the type `T`\n//! (which must implement the [`Default`] trait)\n//! * [`unwrap_or_else`] returns the result of evaluating the provided\n//! function\n//!\n//! [`expect`]: Option::expect\n//! [`unwrap`]: Option::unwrap\n//! [`unwrap_or`]: Option::unwrap_or\n//! [`unwrap_or_default`]: Option::unwrap_or_default\n//! [`unwrap_or_else`]: Option::unwrap_or_else\n//!\n//! ## Transforming contained values\n//!\n//! These methods transform [`Option`] to [`Result`]:\n//!\n//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! [`Err(err)`] using the provided default `err` value\n//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! a value of [`Err`] using the provided function\n//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a\n//! [`Result`] of an [`Option`]\n//!\n//! [`Err(err)`]: Err\n//! [`Ok(v)`]: Ok\n//! [`Some(v)`]: Some\n//! [`ok_or`]: Option::ok_or\n//! [`ok_or_else`]: Option::ok_or_else\n//! [`transpose`]: Option::transpose\n//!\n//! These methods transform the [`Some`] variant:\n//!\n//! * [`filter`] calls the provided predicate function on the contained\n//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]\n//! if the function returns `true`; otherwise, returns [`None`]\n//! * [`flatten`] removes one level of nesting from an\n//! [`Option<Option<T>>`]\n//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the\n//! provided function to the contained value of [`Some`] and leaving\n//! [`None`] values unchanged\n//!\n//! [`Some(t)`]: Some\n//! [`filter`]: Option::filter\n//! [`flatten`]: Option::flatten\n//! [`map`]: Option::map\n//!\n//! These methods transform [`Option<T>`] to a value of a possibly\n//! different type `U`:\n//!\n//! * [`map_or`] applies the provided function to the contained value of\n//! [`Some`], or returns the provided default value if the [`Option`] is\n//! [`None`]\n//! * [`map_or_else`] applies the provided function to the contained value\n//! of [`Some`], or returns the result of evaluating the provided\n//! fallback function if the [`Option`] is [`None`]\n//!\n//! [`map_or`]: Option::map_or\n//! [`map_or_else`]: Option::map_or_else\n//!\n//! These methods combine the [`Some`] variants of two [`Option`] values:\n//!\n//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the\n//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//! * [`zip_with`] calls the provided function `f` and returns\n//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided\n//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//!\n//! [`Some(f(s, o))`]: Some\n//! [`Some(o)`]: Some\n//! [`Some(s)`]: Some\n//! [`Some((s, o))`]: Some\n//! [`zip`]: Option::zip\n//! [`zip_with`]: Option::zip_with\n//!\n//! ## Boolean operators\n//!\n//! These methods treat the [`Option`] as a boolean value, where [`Some`]\n//! acts like [`true`] and [`None`] acts like [`false`]. There are two\n//! categories of these methods: ones that take an [`Option`] as input, and\n//! ones that take a function as input (to be lazily evaluated).\n//!\n//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as\n//! input, and produce an [`Option`] as output. Only the [`and`] method can\n//! produce an [`Option<U>`] value having a different inner type `U` than\n//! [`Option<T>`].\n//!\n//! | method | self | input | output |\n//! |---------|-----------|-----------|-----------|\n//! | [`and`] | `None` | (ignored) | `None` |\n//! | [`and`] | `Some(x)` | `None` | `None` |\n//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `None` | `None` | `None` |\n//! | [`or`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |\n//! | [`xor`] | `None` | `None` | `None` |\n//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |\n//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |\n//!\n//! [`and`]: Option::and\n//! [`or`]: Option::or\n//! [`xor`]: Option::xor\n//!\n//! The [`and_then`] and [`or_else`] methods take a function as input, and\n//! only evaluate the function when they need to produce a new value. Only\n//! the [`and_then`] method can produce an [`Option<U>`] value having a\n//! different inner type `U` than [`Option<T>`].\n//!\n//! | method | self | function input | function result | output |\n//! |--------------|-----------|----------------|-----------------|-----------|\n//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `None` | (not provided) | `None` | `None` |\n//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |\n//!\n//! [`and_then`]: Option::and_then\n//! [`or_else`]: Option::or_else\n//!\n//! This is an example of using methods like [`and_then`] and [`or`] in a\n//! pipeline of method calls. Early stages of the pipeline pass failure\n//! values ([`None`]) through unchanged, and continue processing on\n//! success values ([`Some`]). Toward the end, [`or`] substitutes an error\n//! message if it receives [`None`].\n//!\n//! ```\n//! # use std::collections::BTreeMap;\n//! let mut bt = BTreeMap::new();\n//! bt.insert(20u8, \"foo\");\n//! bt.insert(42u8, \"bar\");\n//! let res = [0u8, 1, 11, 200, 22]\n//! .into_iter()\n//! .map(|x| {\n//! // `checked_sub()` returns `None` on error\n//! x.checked_sub(1)\n//! // same with `checked_mul()`\n//! .and_then(|x| x.checked_mul(2))\n//! // `BTreeMap::get` returns `None` on error\n//! .and_then(|x| bt.get(&x))\n//! // Substitute an error message if we have `None` so far\n//! .or(Some(&\"error!\"))\n//! .copied()\n//! // Won't panic because we unconditionally used `Some` above\n//! .unwrap()\n//! })\n//! .collect::<Vec<_>>();\n//! assert_eq!(res, [\"error!\", \"error!\", \"foo\", \"error!\", \"bar\"]);\n//! ```\n//!\n//! ## Comparison operators\n//!\n//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its\n//! [`PartialOrd`] implementation. With this order, [`None`] compares as\n//! less than any [`Some`], and two [`Some`] compare the same way as their\n//! contained values would in `T`. If `T` also implements\n//! [`Ord`], then so does [`Option<T>`].\n//!\n//! ```\n//! assert!(None < Some(0));\n//! assert!(Some(0) < Some(1));\n//! ```\n//!\n//! ## Iterating over `Option`\n//!\n//! An [`Option`] can be iterated over. This can be helpful if you need an\n//! iterator that is conditionally empty. The iterator will either produce\n//! a single value (when the [`Option`] is [`Some`]), or produce no values\n//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like\n//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if\n//! the [`Option`] is [`None`].\n//!\n//! [`Some(v)`]: Some\n//! [`empty()`]: crate::iter::empty\n//! [`once(v)`]: crate::iter::once\n//!\n//! Iterators over [`Option<T>`] come in three types:\n//!\n//! * [`into_iter`] consumes the [`Option`] and produces the contained\n//! value\n//! * [`iter`] produces an immutable reference of type `&T` to the\n//! contained value\n//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the\n//! contained value\n//!\n//! [`into_iter`]: Option::into_iter\n//! [`iter`]: Option::iter\n//! [`iter_mut`]: Option::iter_mut\n//!\n//! An iterator over [`Option`] can be useful when chaining iterators, for\n//! example, to conditionally insert items. (It's not always necessary to\n//! explicitly call an iterator constructor: many [`Iterator`] methods that\n//! accept other iterators will also accept iterable types that implement\n//! [`IntoIterator`], which includes [`Option`].)\n//!\n//! ```\n//! let yep = Some(42);\n//! let nope = None;\n//! // chain() already calls into_iter(), so we don't have to do so\n//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);\n//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);\n//! ```\n//!\n//! One reason to chain iterators in this way is that a function returning\n//! `impl Iterator` must have all possible return values be of the same\n//! concrete type. Chaining an iterated [`Option`] can help with that.\n//!\n//! ```\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types matching\n//! match do_insert {\n//! true => return (0..4).chain(Some(42)).chain(4..8),\n//! false => return (0..4).chain(None).chain(4..8),\n//! }\n//! }\n//! println!(\"{:?}\", make_iter(true).collect::<Vec<_>>());\n//! println!(\"{:?}\", make_iter(false).collect::<Vec<_>>());\n//! ```\n//!\n//! If we try to do the same thing, but using [`once()`] and [`empty()`],\n//! we can't return `impl Iterator` anymore because the concrete types of\n//! the return values differ.\n//!\n//! [`empty()`]: crate::iter::empty\n//! [`once()`]: crate::iter::once\n//!\n//! ```compile_fail,E0308\n//! # use std::iter::{empty, once};\n//! // This won't compile because all possible returns from the function\n//! // must have the same concrete type.\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types not matching\n//! match do_insert {\n//! true => return (0..4).chain(once(42)).chain(4..8),\n//! false => return (0..4).chain(empty()).chain(4..8),\n//! }\n//! }\n//! ```\n//!\n//! ## Collecting into `Option`\n//!\n//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,\n//! which allows an iterator over [`Option`] values to be collected into an\n//! [`Option`] of a collection of each contained value of the original\n//! [`Option`] values, or [`None`] if any of the elements was [`None`].\n//!\n//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E\n//!\n//! ```\n//! let v = [Some(2), Some(4), None, Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, None);\n//! let v = [Some(2), Some(4), Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, Some(vec![2, 4, 8]));\n//! ```\n//!\n//! [`Option`] also implements the [`Product`][impl-Product] and\n//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values\n//! to provide the [`product`][Iterator::product] and\n//! [`sum`][Iterator::sum] methods.\n//!\n//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E\n//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E\n//!\n//! ```\n//! let v = [None, Some(1), Some(2), Some(3)];\n//! let res: Option<i32> = v.into_iter().sum();\n//! assert_eq!(res, None);\n//! let v = [Some(1), Some(2), Some(21)];\n//! let res: Option<i32> = v.into_iter().product();\n//! assert_eq!(res, Some(42));\n//! ```\n//!\n//! ## Modifying an [`Option`] in-place\n//!\n//! These methods return a mutable reference to the contained value of an\n//! [`Option<T>`]:\n//!\n//! * [`insert`] inserts a value, dropping any old contents\n//! * [`get_or_insert`] gets the current value, inserting a provided\n//! default value if it is [`None`]\n//! * [`get_or_insert_default`] gets the current value, inserting the\n//! default value of type `T` (which must implement [`Default`]) if it is\n//! [`None`]\n//! * [`get_or_insert_with`] gets the current value, inserting a default\n//! computed by the provided function if it is [`None`]\n//!\n//! [`get_or_insert`]: Option::get_or_insert\n//! [`get_or_insert_default`]: Option::get_or_insert_default\n//! [`get_or_insert_with`]: Option::get_or_insert_with\n//! [`insert`]: Option::insert\n//!\n//! These methods transfer ownership of the contained value of an\n//! [`Option`]:\n//!\n//! * [`take`] takes ownership of the contained value of an [`Option`], if\n//! any, replacing the [`Option`] with [`None`]\n//! * [`replace`] takes ownership of the contained value of an [`Option`],\n//! if any, replacing the [`Option`] with a [`Some`] containing the\n//! provided value\n//!\n//! [`replace`]: Option::replace\n//! [`take`]: Option::take\n//!\n//! # Examples\n//!\n//! Basic pattern matching on [`Option`]:\n//!\n//! ```\n//! let msg = Some(\"howdy\");\n//!\n//! // Take a reference to the contained string\n//! if let Some(m) = &msg {\n//! println!(\"{}\", *m);\n//! }\n//!\n//! // Remove the contained string, destroying the Option\n//! let unwrapped_msg = msg.unwrap_or(\"default message\");\n//! ```\n//!\n//! Initialize a result to [`None`] before a loop:\n//!\n//! ```\n//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }\n//!\n//! // A list of data to search through.\n//! let all_the_big_things = [\n//! Kingdom::Plant(250, \"redwood\"),\n//! Kingdom::Plant(230, \"noble fir\"),\n//! Kingdom::Plant(229, \"sugar pine\"),\n//! Kingdom::Animal(25, \"blue whale\"),\n//! Kingdom::Animal(19, \"fin whale\"),\n//! Kingdom::Animal(15, \"north pacific right whale\"),\n//! ];\n//!\n//! // We're going to search for the name of the biggest animal,\n//! // but to start with we've just got `None`.\n//! let mut name_of_biggest_animal = None;\n//! let mut size_of_biggest_animal = 0;\n//! for big_thing in &all_the_big_things {\n//! match *big_thing {\n//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {\n//! // Now we've found the name of some big animal\n//! size_of_biggest_animal = size;\n//! name_of_biggest_animal = Some(name);\n//! }\n//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()\n//! }\n//! }\n//!\n//! match name_of_biggest_animal {\n//! Some(name) => println!(\"the biggest animal is {name}\"),\n//! None => println!(\"there are no animals :(\"),\n//! }\n//! ```\n\n#![stable(feature = \"rust1\", since = \"1.0.0\")]\n\nuse crate::iter::{self, FromIterator, FusedIterator, TrustedLen};\nuse crate::marker::Destruct;\nuse crate::panicking::{panic, panic_str};\nuse crate::pin::Pin;\nuse crate::{\n convert, hint, mem,\n ops::{self, ControlFlow, Deref, DerefMut},\n};\n\n/// The `Option` type. See [the module level documentation](self) for more.\n#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]\n#[rustc_diagnostic_item = \"Option\"]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub enum Option<T> {\n /// No value.\n #[lang = \"None\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n None,\n /// Some value of type `T`.\n #[lang = \"Some\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n Some(#[stable(feature = \"rust1\", since = \"1.0.0\")] T),\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Type implementation\n/////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Option<T> {\n /////////////////////////////////////////////////////////////////////////\n // Querying the contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns `true` if the option is a [`Some`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some(), true);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some(), false);\n /// ```\n #[must_use = \"if you intended to assert that this has a value, consider `.unwrap()` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_some(&self) -> bool {\n matches!(*self, Some(_))\n }\n\n /// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(is_some_with)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some_and(|&x| x > 1), true);\n ///\n /// let x: Option<u32> = Some(0);\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"is_some_with\", issue = \"93050\")]\n pub fn is_some_and(&self, f: impl FnOnce(&T) -> bool) -> bool {\n matches!(self, Some(x) if f(x))\n }\n\n /// Returns `true` if the option is a [`None`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_none(), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_none(), true);\n /// ```\n #[must_use = \"if you intended to assert that this doesn't have a value, consider \\\n `.and_then(|_| panic!(\\\"`Option` had a value when expected `None`\\\"))` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_none(&self) -> bool {\n !self.is_some()\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Adapter for working with references\n /////////////////////////////////////////////////////////////////////////\n\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `as_ref` to first take an `Option` to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let text: Option<String> = Some(\"Hello, world!\".to_string());\n /// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,\n /// // then consume *that* with `map`, leaving `text` on the stack.\n /// let text_length: Option<usize> = text.as_ref().map(|s| s.len());\n /// println!(\"still can print text: {text:?}\");\n /// ```\n #[inline]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn as_ref(&self) -> Option<&T> {\n match *self {\n Some(ref x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from `&mut Option<T>` to `Option<&mut T>`.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// match x.as_mut() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn as_mut(&mut self) -> Option<&mut T> {\n match *self {\n Some(ref mut x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&]Option\\<T>></code> to <code>Option<[Pin]<[&]T>></code>.\n ///\n /// [&]: reference \"shared reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {\n match Pin::get_ref(self).as_ref() {\n // SAFETY: `x` is guaranteed to be pinned because it comes from `self`\n // which is pinned.\n Some(x) => unsafe { Some(Pin::new_unchecked(x)) },\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&mut] Option\\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.\n ///\n /// [&mut]: reference \"mutable reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {\n // SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.\n // `x` is guaranteed to be pinned because it comes from `self` which is pinned.\n unsafe {\n match Pin::get_unchecked_mut(self).as_mut() {\n Some(x) => Some(Pin::new_unchecked(x)),\n None => None,\n }\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Getting to contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// # Panics\n ///\n /// Panics if the value is a [`None`] with a custom panic message provided by\n /// `msg`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"value\");\n /// assert_eq!(x.expect(\"fruits are healthy\"), \"value\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// x.expect(\"fruits are healthy\"); // panics with `fruits are healthy`\n /// ```\n ///\n /// # Recommended Message Style\n ///\n /// We recommend that `expect` messages are used to describe the reason you\n /// _expect_ the `Option` should be `Some`.\n ///\n /// ```should_panic\n /// # let slice: &[u8] = &[];\n /// let item = slice.get(0)\n /// .expect(\"slice should not be empty\");\n /// ```\n ///\n /// **Hint**: If you're having trouble remembering how to phrase expect\n /// error messages remember to focus on the word \"should\" as in \"env\n /// variable should be set by blah\" or \"the given binary should be available\n /// and executable by the current user\".\n ///\n /// For more detail on expect message styles and the reasoning behind our\n /// recommendation please refer to the section on [\"Common Message\n /// Styles\"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn expect(self, msg: &str) -> T {\n match self {\n Some(val) => val,\n None => expect_failed(msg),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// Because this function may panic, its use is generally discouraged.\n /// Instead, prefer to use pattern matching and handle the [`None`]\n /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or\n /// [`unwrap_or_default`].\n ///\n /// [`unwrap_or`]: Option::unwrap_or\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n /// [`unwrap_or_default`]: Option::unwrap_or_default\n ///\n /// # Panics\n ///\n /// Panics if the self value equals [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(x.unwrap(), \"air\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// assert_eq!(x.unwrap(), \"air\"); // fails\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn unwrap(self) -> T {\n match self {\n Some(val) => val,\n None => panic(\"called `Option::unwrap()` on a `None` value\"),\n }\n }\n\n /// Returns the contained [`Some`] value or a provided default.\n ///\n /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`unwrap_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// assert_eq!(Some(\"car\").unwrap_or(\"bike\"), \"car\");\n /// assert_eq!(None.unwrap_or(\"bike\"), \"bike\");\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or(self, default: T) -> T\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => default,\n }\n }\n\n /// Returns the contained [`Some`] value or computes it from a closure.\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 10;\n /// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);\n /// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_else<F>(self, f: F) -> T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => f(),\n }\n }\n\n /// Returns the contained [`Some`] value or a default.\n ///\n /// Consumes the `self` argument then, if [`Some`], returns the contained\n /// value, otherwise if [`None`], returns the [default value] for that\n /// type.\n ///\n /// # Examples\n ///\n /// Converts a string to an integer, turning poorly-formed strings\n /// into 0 (the default value for integers). [`parse`] converts\n /// a string to any other type that implements [`FromStr`], returning\n /// [`None`] on error.\n ///\n /// ```\n /// let good_year_from_input = \"1909\";\n /// let bad_year_from_input = \"190blarg\";\n /// let good_year = good_year_from_input.parse().ok().unwrap_or_default();\n /// let bad_year = bad_year_from_input.parse().ok().unwrap_or_default();\n ///\n /// assert_eq!(1909, good_year);\n /// assert_eq!(0, bad_year);\n /// ```\n ///\n /// [default value]: Default::default\n /// [`parse`]: str::parse\n /// [`FromStr`]: crate::str::FromStr\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_default(self) -> T\n where\n T: ~const Default,\n {\n match self {\n Some(x) => x,\n None => Default::default(),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value,\n /// without checking that the value is not [`None`].\n ///\n /// # Safety\n ///\n /// Calling this method on [`None`] is *[undefined behavior]*.\n ///\n /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\");\n /// ```\n ///\n /// ```no_run\n /// let x: Option<&str> = None;\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\"); // Undefined behavior!\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"option_result_unwrap_unchecked\", since = \"1.58.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const unsafe fn unwrap_unchecked(self) -> T {\n debug_assert!(self.is_some());\n match self {\n Some(val) => val,\n // SAFETY: the safety contract must be upheld by the caller.\n None => unsafe { hint::unreachable_unchecked() },\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Transforming contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, consuming\n /// the original:\n ///\n /// [String]: ../../std/string/struct.String.html \"String\"\n /// ```\n /// let maybe_some_string = Some(String::from(\"Hello, World!\"));\n /// // `Option::map` takes self *by value*, consuming `maybe_some_string`\n /// let maybe_some_len = maybe_some_string.map(|s| s.len());\n ///\n /// assert_eq!(maybe_some_len, Some(13));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(f(x)),\n None => None,\n }\n }\n\n /// Calls the provided closure with a reference to the contained value (if [`Some`]).\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(result_option_inspect)]\n ///\n /// let v = vec![1, 2, 3, 4, 5];\n ///\n /// // prints \"got: 4\"\n /// let x: Option<&usize> = v.get(3).inspect(|x| println!(\"got: {x}\"));\n ///\n /// // prints nothing\n /// let x: Option<&usize> = v.get(5).inspect(|x| println!(\"got: {x}\"));\n /// ```\n #[inline]\n #[unstable(feature = \"result_option_inspect\", issue = \"91345\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn inspect<F>(self, f: F) -> Self\n where\n F: ~const FnOnce(&T),\n F: ~const Destruct,\n {\n if let Some(ref x) = self {\n f(x);\n }\n\n self\n }\n\n /// Returns the provided default result (if none),\n /// or applies a function to the contained value (if any).\n ///\n /// Arguments passed to `map_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`map_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`map_or_else`]: Option::map_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or(42, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or(42, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or<U, F>(self, default: U, f: F) -> U\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default,\n }\n }\n\n /// Computes a default function result (if none), or\n /// applies a different function to the contained value (if any).\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 21;\n ///\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U\n where\n D: ~const FnOnce() -> U,\n D: ~const Destruct,\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default(),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err)`].\n ///\n /// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`ok_or_else`], which is\n /// lazily evaluated.\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err)`]: Err\n /// [`Some(v)`]: Some\n /// [`ok_or_else`]: Option::ok_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or(0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or(0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or<E>(self, err: E) -> Result<T, E>\n where\n E: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err())`].\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err())`]: Err\n /// [`Some(v)`]: Some\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or_else(|| 0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or_else(|| 0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>\n where\n F: ~const FnOnce() -> E,\n F: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err()),\n }\n }\n\n /// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.\n ///\n /// Leaves the original Option in-place, creating a new one with a reference\n /// to the original one, additionally coercing the contents via [`Deref`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref(), Some(\"hey\"));\n ///\n /// let x: Option<String> = None;\n /// assert_eq!(x.as_deref(), None);\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref(&self) -> Option<&T::Target>\n where\n T: ~const Deref,\n {\n match self.as_ref() {\n Some(t) => Some(t.deref()),\n None => None,\n }\n }\n\n /// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.\n ///\n /// Leaves the original `Option` in-place, creating a new one containing a mutable reference to\n /// the inner type's [`Deref::Target`] type.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref_mut().map(|x| {\n /// x.make_ascii_uppercase();\n /// x\n /// }), Some(\"HEY\".to_owned().as_mut_str()));\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>\n where\n T: ~const DerefMut,\n {\n match self.as_mut() {\n Some(t) => Some(t.deref_mut()),\n None => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Iterator constructors\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns an iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(4);\n /// assert_eq!(x.iter().next(), Some(&4));\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.iter().next(), None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn iter(&self) -> Iter<'_, T> {\n Iter { inner: Item { opt: self.as_ref() } }\n }\n\n /// Returns a mutable iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(4);\n /// match x.iter_mut().next() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n ///\n /// let mut x: Option<u32> = None;\n /// assert_eq!(x.iter_mut().next(), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub fn iter_mut(&mut self) -> IterMut<'_, T> {\n IterMut { inner: Item { opt: self.as_mut() } }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Boolean operations on the values, eager and lazy\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns [`None`] if the option is [`None`], otherwise returns `optb`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), None);\n ///\n /// let x = Some(2);\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), Some(\"foo\"));\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and<U>(self, optb: Option<U>) -> Option<U>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(_) => optb,\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `f` with the\n /// wrapped value and returns the result.\n ///\n /// Some languages call this operation flatmap.\n ///\n /// # Examples\n ///\n /// ```\n /// fn sq_then_to_string(x: u32) -> Option<String> {\n /// x.checked_mul(x).map(|sq| sq.to_string())\n /// }\n ///\n /// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));\n /// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!\n /// assert_eq!(None.and_then(sq_then_to_string), None);\n /// ```\n ///\n /// Often used to chain fallible operations that may return [`None`].\n ///\n /// ```\n /// let arr_2d = [[\"A0\", \"A1\"], [\"B0\", \"B1\"]];\n ///\n /// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));\n /// assert_eq!(item_0_1, Some(&\"A1\"));\n ///\n /// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));\n /// assert_eq!(item_2_0, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and_then<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> Option<U>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => f(x),\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `predicate`\n /// with the wrapped value and returns:\n ///\n /// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped\n /// value), and\n /// - [`None`] if `predicate` returns `false`.\n ///\n /// This function works similar to [`Iterator::filter()`]. You can imagine\n /// the `Option<T>` being an iterator over one or zero elements. `filter()`\n /// lets you decide which elements to keep.\n ///\n /// # Examples\n ///\n /// ```rust\n /// fn is_even(n: &i32) -> bool {\n /// n % 2 == 0\n /// }\n ///\n /// assert_eq!(None.filter(is_even), None);\n /// assert_eq!(Some(3).filter(is_even), None);\n /// assert_eq!(Some(4).filter(is_even), Some(4));\n /// ```\n ///\n /// [`Some(t)`]: Some\n #[inline]\n #[stable(feature = \"option_filter\", since = \"1.27.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn filter<P>(self, predicate: P) -> Self\n where\n T: ~const Destruct,\n P: ~const FnOnce(&T) -> bool,\n P: ~const Destruct,\n {\n if let Some(x) = self {\n if predicate(&x) {\n return Some(x);\n }\n }\n None\n }\n\n /// Returns the option if it contains a value, otherwise returns `optb`.\n ///\n /// Arguments passed to `or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`or_else`], which is\n /// lazily evaluated.\n ///\n /// [`or_else`]: Option::or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y = None;\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x = None;\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(100));\n ///\n /// let x = Some(2);\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = None;\n /// assert_eq!(x.or(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => optb,\n }\n }\n\n /// Returns the option if it contains a value, otherwise calls `f` and\n /// returns the result.\n ///\n /// # Examples\n ///\n /// ```\n /// fn nobody() -> Option<&'static str> { None }\n /// fn vikings() -> Option<&'static str> { Some(\"vikings\") }\n ///\n /// assert_eq!(Some(\"barbarians\").or_else(vikings), Some(\"barbarians\"));\n /// assert_eq!(None.or_else(vikings), Some(\"vikings\"));\n /// assert_eq!(None.or_else(nobody), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or_else<F>(self, f: F) -> Option<T>\n where\n F: ~const FnOnce() -> Option<T>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => f(),\n }\n }\n\n /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x = Some(2);\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"option_xor\", since = \"1.37.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn xor(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match (self, optb) {\n (Some(a), None) => Some(a),\n (None, Some(b)) => Some(b),\n _ => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Entry-like operations to insert a value and return a reference\n /////////////////////////////////////////////////////////////////////////\n\n /// Inserts `value` into the option, then returns a mutable reference to it.\n ///\n /// If the option already contains a value, the old value is dropped.\n ///\n /// See also [`Option::get_or_insert`], which doesn't update the value if\n /// the option already contains [`Some`].\n ///\n /// # Example\n ///\n /// ```\n /// let mut opt = None;\n /// let val = opt.insert(1);\n /// assert_eq!(*val, 1);\n /// assert_eq!(opt.unwrap(), 1);\n /// let val = opt.insert(2);\n /// assert_eq!(*val, 2);\n /// *val = 3;\n /// assert_eq!(opt.unwrap(), 3);\n /// ```\n #[must_use = \"if you intended to set a value, consider assignment instead\"]\n #[inline]\n #[stable(feature = \"option_insert\", since = \"1.53.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n *self = Some(value);\n\n // SAFETY: the code above just filled the option\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts `value` into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// See also [`Option::insert`], which updates the value even if\n /// the option already contains [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert(5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n if let None = *self {\n *self = Some(value);\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts the default value into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_get_or_insert_default)]\n ///\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_default();\n /// assert_eq!(y, &0);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[unstable(feature = \"option_get_or_insert_default\", issue = \"82901\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_default(&mut self) -> &mut T\n where\n T: ~const Default,\n {\n const fn default<T: ~const Default>() -> T {\n T::default()\n }\n\n self.get_or_insert_with(default)\n }\n\n /// Inserts a value computed from `f` into the option if it is [`None`],\n /// then returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_with(|| 5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n if let None = *self {\n // the compiler isn't smart enough to know that we are not dropping a `T`\n // here and wants us to ensure `T` can be dropped at compile time.\n mem::forget(mem::replace(self, Some(f())))\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Misc\n /////////////////////////////////////////////////////////////////////////\n\n /// Takes the value out of the option, leaving a [`None`] in its place.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, Some(2));\n ///\n /// let mut x: Option<u32> = None;\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn take(&mut self) -> Option<T> {\n // FIXME replace `mem::replace` by `mem::take` when the latter is const ready\n mem::replace(self, None)\n }\n\n /// Replaces the actual value in the option by the value given in parameter,\n /// returning the old value if present,\n /// leaving a [`Some`] in its place without deinitializing either one.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let old = x.replace(5);\n /// assert_eq!(x, Some(5));\n /// assert_eq!(old, Some(2));\n ///\n /// let mut x = None;\n /// let old = x.replace(3);\n /// assert_eq!(x, Some(3));\n /// assert_eq!(old, None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"option_replace\", since = \"1.31.0\")]\n pub const fn replace(&mut self, value: T) -> Option<T> {\n mem::replace(self, Some(value))\n }\n\n /// Returns `true` if the option is a [`Some`] value containing the given value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_result_contains)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.contains(&2), true);\n ///\n /// let x: Option<u32> = Some(3);\n /// assert_eq!(x.contains(&2), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.contains(&2), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"option_result_contains\", issue = \"62358\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn contains<U>(&self, x: &U) -> bool\n where\n U: ~const PartialEq<T>,\n {\n match self {\n Some(y) => x.eq(y),\n None => false,\n }\n }\n\n /// Zips `self` with another `Option`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(1);\n /// let y = Some(\"hi\");\n /// let z = None::<u8>;\n ///\n /// assert_eq!(x.zip(y), Some((1, \"hi\")));\n /// assert_eq!(x.zip(z), None);\n /// ```\n #[stable(feature = \"option_zip_option\", since = \"1.46.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some((a, b)),\n _ => None,\n }\n }\n\n /// Zips `self` and another `Option` with function `f`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_zip)]\n ///\n /// #[derive(Debug, PartialEq)]\n /// struct Point {\n /// x: f64,\n /// y: f64,\n /// }\n ///\n /// impl Point {\n /// fn new(x: f64, y: f64) -> Self {\n /// Self { x, y }\n /// }\n /// }\n ///\n /// let x = Some(17.5);\n /// let y = Some(42.7);\n ///\n /// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));\n /// assert_eq!(x.zip_with(None, Point::new), None);\n /// ```\n #[unstable(feature = \"option_zip\", issue = \"70086\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>\n where\n F: ~const FnOnce(T, U) -> R,\n F: ~const Destruct,\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some(f(a, b)),\n _ => None,\n }\n }\n}\n\nimpl<T, U> Option<(T, U)> {\n /// Unzips an option containing a tuple of two options.\n ///\n /// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.\n /// Otherwise, `(None, None)` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(unzip_option)]\n ///\n /// let x = Some((1, \"hi\"));\n /// let y = None::<(u8, u32)>;\n ///\n /// assert_eq!(x.unzip(), (Some(1), Some(\"hi\")));\n /// assert_eq!(y.unzip(), (None, None));\n /// ```\n #[inline]\n #[unstable(feature = \"unzip_option\", issue = \"87800\", reason = \"recently added\")]\n pub const fn unzip(self) -> (Option<T>, Option<U>) {\n match self {\n Some((a, b)) => (Some(a), Some(b)),\n None => (None, None),\n }\n }\n}\n\nimpl<T> Option<&T> {\n /// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n // FIXME: this implementation, which sidesteps using `Option::map` since it's not const\n // ready yet, should be reverted when possible to avoid code repetition\n match self {\n Some(&v) => Some(v),\n None => None,\n }\n }\n\n /// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T> Option<&mut T> {\n /// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n match self {\n Some(&mut t) => Some(t),\n None => None,\n }\n }\n\n /// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(since = \"1.26.0\", feature = \"option_ref_mut_cloned\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T, E> Option<Result<T, E>> {\n /// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.\n ///\n /// [`None`] will be mapped to <code>[Ok]\\([None])</code>.\n /// <code>[Some]\\([Ok]\\(\\_))</code> and <code>[Some]\\([Err]\\(\\_))</code> will be mapped to\n /// <code>[Ok]\\([Some]\\(\\_))</code> and <code>[Err]\\(\\_)</code>.\n ///\n /// # Examples\n ///\n /// ```\n /// #[derive(Debug, Eq, PartialEq)]\n /// struct SomeErr;\n ///\n /// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));\n /// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));\n /// assert_eq!(x, y.transpose());\n /// ```\n #[inline]\n #[stable(feature = \"transpose_result\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn transpose(self) -> Result<Option<T>, E> {\n match self {\n Some(Ok(x)) => Ok(Some(x)),\n Some(Err(e)) => Err(e),\n None => Ok(None),\n }\n }\n}\n\n// This is a separate function to reduce the code size of .expect() itself.\n#[cfg_attr(not(feature = \"panic_immediate_abort\"), inline(never))]\n#[cfg_attr(feature = \"panic_immediate_abort\", inline)]\n#[cold]\n#[track_caller]\n#[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\nconst fn expect_failed(msg: &str) -> ! {\n panic_str(msg)\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Trait implementations\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_clone\", issue = \"91805\")]\nimpl<T> const Clone for Option<T>\nwhere\n T: ~const Clone + ~const Destruct,\n{\n #[inline]\n fn clone(&self) -> Self {\n match self {\n Some(x) => Some(x.clone()),\n None => None,\n }\n }\n\n #[inline]\n fn clone_from(&mut self, source: &Self) {\n match (self, source) {\n (Some(to), Some(from)) => to.clone_from(from),\n (to, from) => *to = from.clone(),\n }\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_default_impls\", issue = \"87864\")]\nimpl<T> const Default for Option<T> {\n /// Returns [`None`][Option::None].\n ///\n /// # Examples\n ///\n /// ```\n /// let opt: Option<u32> = Option::default();\n /// assert!(opt.is_none());\n /// ```\n #[inline]\n fn default() -> Option<T> {\n None\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<T> IntoIterator for Option<T> {\n type Item = T;\n type IntoIter = IntoIter<T>;\n\n /// Returns a consuming iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"string\");\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert_eq!(v, [\"string\"]);\n ///\n /// let x = None;\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert!(v.is_empty());\n /// ```\n #[inline]\n fn into_iter(self) -> IntoIter<T> {\n IntoIter { inner: Item { opt: self } }\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a Option<T> {\n type Item = &'a T;\n type IntoIter = Iter<'a, T>;\n\n fn into_iter(self) -> Iter<'a, T> {\n self.iter()\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a mut Option<T> {\n type Item = &'a mut T;\n type IntoIter = IterMut<'a, T>;\n\n fn into_iter(self) -> IterMut<'a, T> {\n self.iter_mut()\n }\n}\n\n#[stable(since = \"1.12.0\", feature = \"option_from\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const From<T> for Option<T> {\n /// Moves `val` into a new [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let o: Option<u8> = Option::from(67);\n ///\n /// assert_eq!(Some(67), o);\n /// ```\n fn from(val: T) -> Option<T> {\n Some(val)\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a Option<T>> for Option<&'a T> {\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `from` to first take an [`Option`] to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let s: Option<String> = Some(String::from(\"Hello, Rustaceans!\"));\n /// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());\n ///\n /// println!(\"Can still print s: {s:?}\");\n ///\n /// assert_eq!(o, Some(18));\n /// ```\n fn from(o: &'a Option<T>) -> Option<&'a T> {\n o.as_ref()\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {\n /// Converts from `&mut Option<T>` to `Option<&mut T>`\n ///\n /// # Examples\n ///\n /// ```\n /// let mut s = Some(String::from(\"Hello\"));\n /// let o: Option<&mut String> = Option::from(&mut s);\n ///\n /// match o {\n /// Some(t) => *t = String::from(\"Hello, Rustaceans!\"),\n /// None => (),\n /// }\n ///\n /// assert_eq!(s, Some(String::from(\"Hello, Rustaceans!\")));\n /// ```\n fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {\n o.as_mut()\n }\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// The Option Iterators\n/////////////////////////////////////////////////////////////////////////////\n\n#[derive(Clone, Debug)]\nstruct Item<A> {\n opt: Option<A>,\n}\n\nimpl<A> Iterator for Item<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.opt.take()\n }\n\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n match self.opt {\n Some(_) => (1, Some(1)),\n None => (0, Some(0)),\n }\n }\n}\n\nimpl<A> DoubleEndedIterator for Item<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.opt.take()\n }\n}\n\nimpl<A> ExactSizeIterator for Item<A> {}\nimpl<A> FusedIterator for Item<A> {}\nunsafe impl<A> TrustedLen for Item<A> {}\n\n/// An iterator over a reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct Iter<'a, A: 'a> {\n inner: Item<&'a A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for Iter<'a, A> {\n type Item = &'a A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for Iter<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for Iter<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for Iter<'_, A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for Iter<'_, A> {}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Clone for Iter<'_, A> {\n #[inline]\n fn clone(&self) -> Self {\n Iter { inner: self.inner.clone() }\n }\n}\n\n/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter_mut`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct IterMut<'a, A: 'a> {\n inner: Item<&'a mut A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for IterMut<'a, A> {\n type Item = &'a mut A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a mut A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for IterMut<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a mut A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IterMut<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IterMut<'_, A> {}\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IterMut<'_, A> {}\n\n/// An iterator over the value in [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::into_iter`] function.\n#[derive(Clone, Debug)]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct IntoIter<A> {\n inner: Item<A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Iterator for IntoIter<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> DoubleEndedIterator for IntoIter<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IntoIter<A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IntoIter<A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IntoIter<A> {}\n\n/////////////////////////////////////////////////////////////////////////////\n// FromIterator\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {\n /// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],\n /// no further elements are taken, and the [`None`][Option::None] is\n /// returned. Should no [`None`][Option::None] occur, a container of type\n /// `V` containing the values of each [`Option`] is returned.\n ///\n /// # Examples\n ///\n /// Here is an example which increments every integer in a vector.\n /// We use the checked variant of `add` that returns `None` when the\n /// calculation would result in an overflow.\n ///\n /// ```\n /// let items = vec![0_u16, 1, 2];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_add(1))\n /// .collect();\n ///\n /// assert_eq!(res, Some(vec![1, 2, 3]));\n /// ```\n ///\n /// As you can see, this will return the expected, valid items.\n ///\n /// Here is another example that tries to subtract one from another list\n /// of integers, this time checking for underflow:\n ///\n /// ```\n /// let items = vec![2_u16, 1, 0];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_sub(1))\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// ```\n ///\n /// Since the last element is zero, it would underflow. Thus, the resulting\n /// value is `None`.\n ///\n /// Here is a variation on the previous example, showing that no\n /// further elements are taken from `iter` after the first `None`.\n ///\n /// ```\n /// let items = vec![3_u16, 2, 1, 10];\n ///\n /// let mut shared = 0;\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| { shared += x; x.checked_sub(2) })\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// assert_eq!(shared, 6);\n /// ```\n ///\n /// Since the third element caused an underflow, no further elements were taken,\n /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.\n #[inline]\n fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {\n // FIXME(#11084): This could be replaced with Iterator::scan when this\n // performance bug is closed.\n\n iter::try_process(iter.into_iter(), |i| i.collect())\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::Try for Option<T> {\n type Output = T;\n type Residual = Option<convert::Infallible>;\n\n #[inline]\n fn from_output(output: Self::Output) -> Self {\n Some(output)\n }\n\n #[inline]\n fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {\n match self {\n Some(v) => ControlFlow::Continue(v),\n None => ControlFlow::Break(None),\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::FromResidual for Option<T> {\n #[inline]\n fn from_residual(residual: Option<convert::Infallible>) -> Self {\n match residual {\n None => None,\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2_yeet\", issue = \"96374\")]\nimpl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {\n #[inline]\n fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {\n None\n }\n}\n\n#[unstable(feature = \"try_trait_v2_residual\", issue = \"91285\")]\nimpl<T> ops::Residual<T> for Option<convert::Infallible> {\n type TryType = Option<T>;\n}\n\nimpl<T> Option<Option<T>> {\n /// Converts from `Option<Option<T>>` to `Option<T>`.\n ///\n /// # Examples\n ///\n /// Basic usage:\n ///\n /// ```\n /// let x: Option<Option<u32>> = Some(Some(6));\n /// assert_eq!(Some(6), x.flatten());\n ///\n /// let x: Option<Option<u32>> = Some(None);\n /// assert_eq!(None, x.flatten());\n ///\n /// let x: Option<Option<u32>> = None;\n /// assert_eq!(None, x.flatten());\n /// ```\n ///\n /// Flattening only removes one level of nesting at a time:\n ///\n /// ```\n /// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));\n /// assert_eq!(Some(Some(6)), x.flatten());\n /// assert_eq!(Some(6), x.flatten().flatten());\n /// ```\n #[inline]\n #[stable(feature = \"option_flattening\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn flatten(self) -> Option<T> {\n match self {\n Some(inner) => inner,\n None => None,\n }\n }\n}\n","uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","version":0} 17:00:16 INFO unnamed src/language_server_protocol.rs:1888 text_document_code_lens; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:command","params":["setlocal omnifunc=LanguageClient#complete"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","LanguageClient_projectRoot","/home/dick/LanguageClient-neovim"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientTextDocumentDidOpenPost"]} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"rust","text":"//! Optional values.\n//!\n//! Type [`Option`] represents an optional value: every [`Option`]\n//! is either [`Some`] and contains a value, or [`None`], and\n//! does not. [`Option`] types are very common in Rust code, as\n//! they have a number of uses:\n//!\n//! * Initial values\n//! * Return values for functions that are not defined\n//! over their entire input range (partial functions)\n//! * Return value for otherwise reporting simple errors, where [`None`] is\n//! returned on error\n//! * Optional struct fields\n//! * Struct fields that can be loaned or \"taken\"\n//! * Optional function arguments\n//! * Nullable pointers\n//! * Swapping things out of difficult situations\n//!\n//! [`Option`]s are commonly paired with pattern matching to query the presence\n//! of a value and take action, always accounting for the [`None`] case.\n//!\n//! ```\n//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {\n//! if denominator == 0.0 {\n//! None\n//! } else {\n//! Some(numerator / denominator)\n//! }\n//! }\n//!\n//! // The return value of the function is an option\n//! let result = divide(2.0, 3.0);\n//!\n//! // Pattern match to retrieve the value\n//! match result {\n//! // The division was valid\n//! Some(x) => println!(\"Result: {x}\"),\n//! // The division was invalid\n//! None => println!(\"Cannot divide by 0\"),\n//! }\n//! ```\n//!\n//\n// FIXME: Show how `Option` is used in practice, with lots of methods\n//\n//! # Options and pointers (\"nullable\" pointers)\n//!\n//! Rust's pointer types must always point to a valid location; there are\n//! no \"null\" references. Instead, Rust has *optional* pointers, like\n//! the optional owned box, <code>[Option]<[Box\\<T>]></code>.\n//!\n//! [Box\\<T>]: ../../std/boxed/struct.Box.html\n//!\n//! The following example uses [`Option`] to create an optional box of\n//! [`i32`]. Notice that in order to use the inner [`i32`] value, the\n//! `check_optional` function first needs to use pattern matching to\n//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or\n//! not ([`None`]).\n//!\n//! ```\n//! let optional = None;\n//! check_optional(optional);\n//!\n//! let optional = Some(Box::new(9000));\n//! check_optional(optional);\n//!\n//! fn check_optional(optional: Option<Box<i32>>) {\n//! match optional {\n//! Some(p) => println!(\"has value {p}\"),\n//! None => println!(\"has no value\"),\n//! }\n//! }\n//! ```\n//!\n//! # Representation\n//!\n//! Rust guarantees to optimize the following types `T` such that\n//! [`Option<T>`] has the same size as `T`:\n//!\n//! * [`Box<U>`]\n//! * `&U`\n//! * `&mut U`\n//! * `fn`, `extern \"C\" fn`[^extern_fn]\n//! * [`num::NonZero*`]\n//! * [`ptr::NonNull<U>`]\n//! * `#[repr(transparent)]` struct around one of the types in this list.\n//!\n//! [^extern_fn]: this remains true for any other ABI: `extern \"abi\" fn` (_e.g._, `extern \"system\" fn`)\n//!\n//! [`Box<U>`]: ../../std/boxed/struct.Box.html\n//! [`num::NonZero*`]: crate::num\n//! [`ptr::NonNull<U>`]: crate::ptr::NonNull\n//!\n//! This is called the \"null pointer optimization\" or NPO.\n//!\n//! It is further guaranteed that, for the cases above, one can\n//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and\n//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`\n//! is undefined behaviour).\n//!\n//! # Method overview\n//!\n//! In addition to working with pattern matching, [`Option`] provides a wide\n//! variety of different methods.\n//!\n//! ## Querying the variant\n//!\n//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]\n//! is [`Some`] or [`None`], respectively.\n//!\n//! [`is_none`]: Option::is_none\n//! [`is_some`]: Option::is_some\n//!\n//! ## Adapters for working with references\n//!\n//! * [`as_ref`] converts from <code>[&][][Option]\\<T></code> to <code>[Option]<[&]T></code>\n//! * [`as_mut`] converts from <code>[&mut] [Option]\\<T></code> to <code>[Option]<[&mut] T></code>\n//! * [`as_deref`] converts from <code>[&][][Option]\\<T></code> to\n//! <code>[Option]<[&]T::[Target]></code>\n//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\\<T></code> to\n//! <code>[Option]<[&mut] T::[Target]></code>\n//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&]T>></code>\n//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&mut] T>></code>\n//!\n//! [&]: reference \"shared reference\"\n//! [&mut]: reference \"mutable reference\"\n//! [Target]: Deref::Target \"ops::Deref::Target\"\n//! [`as_deref`]: Option::as_deref\n//! [`as_deref_mut`]: Option::as_deref_mut\n//! [`as_mut`]: Option::as_mut\n//! [`as_pin_mut`]: Option::as_pin_mut\n//! [`as_pin_ref`]: Option::as_pin_ref\n//! [`as_ref`]: Option::as_ref\n//!\n//! ## Extracting the contained value\n//!\n//! These methods extract the contained value in an [`Option<T>`] when it\n//! is the [`Some`] variant. If the [`Option`] is [`None`]:\n//!\n//! * [`expect`] panics with a provided custom message\n//! * [`unwrap`] panics with a generic message\n//! * [`unwrap_or`] returns the provided default value\n//! * [`unwrap_or_default`] returns the default value of the type `T`\n//! (which must implement the [`Default`] trait)\n//! * [`unwrap_or_else`] returns the result of evaluating the provided\n//! function\n//!\n//! [`expect`]: Option::expect\n//! [`unwrap`]: Option::unwrap\n//! [`unwrap_or`]: Option::unwrap_or\n//! [`unwrap_or_default`]: Option::unwrap_or_default\n//! [`unwrap_or_else`]: Option::unwrap_or_else\n//!\n//! ## Transforming contained values\n//!\n//! These methods transform [`Option`] to [`Result`]:\n//!\n//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! [`Err(err)`] using the provided default `err` value\n//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! a value of [`Err`] using the provided function\n//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a\n//! [`Result`] of an [`Option`]\n//!\n//! [`Err(err)`]: Err\n//! [`Ok(v)`]: Ok\n//! [`Some(v)`]: Some\n//! [`ok_or`]: Option::ok_or\n//! [`ok_or_else`]: Option::ok_or_else\n//! [`transpose`]: Option::transpose\n//!\n//! These methods transform the [`Some`] variant:\n//!\n//! * [`filter`] calls the provided predicate function on the contained\n//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]\n//! if the function returns `true`; otherwise, returns [`None`]\n//! * [`flatten`] removes one level of nesting from an\n//! [`Option<Option<T>>`]\n//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the\n//! provided function to the contained value of [`Some`] and leaving\n//! [`None`] values unchanged\n//!\n//! [`Some(t)`]: Some\n//! [`filter`]: Option::filter\n//! [`flatten`]: Option::flatten\n//! [`map`]: Option::map\n//!\n//! These methods transform [`Option<T>`] to a value of a possibly\n//! different type `U`:\n//!\n//! * [`map_or`] applies the provided function to the contained value of\n//! [`Some`], or returns the provided default value if the [`Option`] is\n//! [`None`]\n//! * [`map_or_else`] applies the provided function to the contained value\n//! of [`Some`], or returns the result of evaluating the provided\n//! fallback function if the [`Option`] is [`None`]\n//!\n//! [`map_or`]: Option::map_or\n//! [`map_or_else`]: Option::map_or_else\n//!\n//! These methods combine the [`Some`] variants of two [`Option`] values:\n//!\n//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the\n//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//! * [`zip_with`] calls the provided function `f` and returns\n//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided\n//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//!\n//! [`Some(f(s, o))`]: Some\n//! [`Some(o)`]: Some\n//! [`Some(s)`]: Some\n//! [`Some((s, o))`]: Some\n//! [`zip`]: Option::zip\n//! [`zip_with`]: Option::zip_with\n//!\n//! ## Boolean operators\n//!\n//! These methods treat the [`Option`] as a boolean value, where [`Some`]\n//! acts like [`true`] and [`None`] acts like [`false`]. There are two\n//! categories of these methods: ones that take an [`Option`] as input, and\n//! ones that take a function as input (to be lazily evaluated).\n//!\n//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as\n//! input, and produce an [`Option`] as output. Only the [`and`] method can\n//! produce an [`Option<U>`] value having a different inner type `U` than\n//! [`Option<T>`].\n//!\n//! | method | self | input | output |\n//! |---------|-----------|-----------|-----------|\n//! | [`and`] | `None` | (ignored) | `None` |\n//! | [`and`] | `Some(x)` | `None` | `None` |\n//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `None` | `None` | `None` |\n//! | [`or`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |\n//! | [`xor`] | `None` | `None` | `None` |\n//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |\n//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |\n//!\n//! [`and`]: Option::and\n//! [`or`]: Option::or\n//! [`xor`]: Option::xor\n//!\n//! The [`and_then`] and [`or_else`] methods take a function as input, and\n//! only evaluate the function when they need to produce a new value. Only\n//! the [`and_then`] method can produce an [`Option<U>`] value having a\n//! different inner type `U` than [`Option<T>`].\n//!\n//! | method | self | function input | function result | output |\n//! |--------------|-----------|----------------|-----------------|-----------|\n//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `None` | (not provided) | `None` | `None` |\n//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |\n//!\n//! [`and_then`]: Option::and_then\n//! [`or_else`]: Option::or_else\n//!\n//! This is an example of using methods like [`and_then`] and [`or`] in a\n//! pipeline of method calls. Early stages of the pipeline pass failure\n//! values ([`None`]) through unchanged, and continue processing on\n//! success values ([`Some`]). Toward the end, [`or`] substitutes an error\n//! message if it receives [`None`].\n//!\n//! ```\n//! # use std::collections::BTreeMap;\n//! let mut bt = BTreeMap::new();\n//! bt.insert(20u8, \"foo\");\n//! bt.insert(42u8, \"bar\");\n//! let res = [0u8, 1, 11, 200, 22]\n//! .into_iter()\n//! .map(|x| {\n//! // `checked_sub()` returns `None` on error\n//! x.checked_sub(1)\n//! // same with `checked_mul()`\n//! .and_then(|x| x.checked_mul(2))\n//! // `BTreeMap::get` returns `None` on error\n//! .and_then(|x| bt.get(&x))\n//! // Substitute an error message if we have `None` so far\n//! .or(Some(&\"error!\"))\n//! .copied()\n//! // Won't panic because we unconditionally used `Some` above\n//! .unwrap()\n//! })\n//! .collect::<Vec<_>>();\n//! assert_eq!(res, [\"error!\", \"error!\", \"foo\", \"error!\", \"bar\"]);\n//! ```\n//!\n//! ## Comparison operators\n//!\n//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its\n//! [`PartialOrd`] implementation. With this order, [`None`] compares as\n//! less than any [`Some`], and two [`Some`] compare the same way as their\n//! contained values would in `T`. If `T` also implements\n//! [`Ord`], then so does [`Option<T>`].\n//!\n//! ```\n//! assert!(None < Some(0));\n//! assert!(Some(0) < Some(1));\n//! ```\n//!\n//! ## Iterating over `Option`\n//!\n//! An [`Option`] can be iterated over. This can be helpful if you need an\n//! iterator that is conditionally empty. The iterator will either produce\n//! a single value (when the [`Option`] is [`Some`]), or produce no values\n//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like\n//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if\n//! the [`Option`] is [`None`].\n//!\n//! [`Some(v)`]: Some\n//! [`empty()`]: crate::iter::empty\n//! [`once(v)`]: crate::iter::once\n//!\n//! Iterators over [`Option<T>`] come in three types:\n//!\n//! * [`into_iter`] consumes the [`Option`] and produces the contained\n//! value\n//! * [`iter`] produces an immutable reference of type `&T` to the\n//! contained value\n//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the\n//! contained value\n//!\n//! [`into_iter`]: Option::into_iter\n//! [`iter`]: Option::iter\n//! [`iter_mut`]: Option::iter_mut\n//!\n//! An iterator over [`Option`] can be useful when chaining iterators, for\n//! example, to conditionally insert items. (It's not always necessary to\n//! explicitly call an iterator constructor: many [`Iterator`] methods that\n//! accept other iterators will also accept iterable types that implement\n//! [`IntoIterator`], which includes [`Option`].)\n//!\n//! ```\n//! let yep = Some(42);\n//! let nope = None;\n//! // chain() already calls into_iter(), so we don't have to do so\n//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);\n//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);\n//! ```\n//!\n//! One reason to chain iterators in this way is that a function returning\n//! `impl Iterator` must have all possible return values be of the same\n//! concrete type. Chaining an iterated [`Option`] can help with that.\n//!\n//! ```\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types matching\n//! match do_insert {\n//! true => return (0..4).chain(Some(42)).chain(4..8),\n//! false => return (0..4).chain(None).chain(4..8),\n//! }\n//! }\n//! println!(\"{:?}\", make_iter(true).collect::<Vec<_>>());\n//! println!(\"{:?}\", make_iter(false).collect::<Vec<_>>());\n//! ```\n//!\n//! If we try to do the same thing, but using [`once()`] and [`empty()`],\n//! we can't return `impl Iterator` anymore because the concrete types of\n//! the return values differ.\n//!\n//! [`empty()`]: crate::iter::empty\n//! [`once()`]: crate::iter::once\n//!\n//! ```compile_fail,E0308\n//! # use std::iter::{empty, once};\n//! // This won't compile because all possible returns from the function\n//! // must have the same concrete type.\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types not matching\n//! match do_insert {\n//! true => return (0..4).chain(once(42)).chain(4..8),\n//! false => return (0..4).chain(empty()).chain(4..8),\n//! }\n//! }\n//! ```\n//!\n//! ## Collecting into `Option`\n//!\n//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,\n//! which allows an iterator over [`Option`] values to be collected into an\n//! [`Option`] of a collection of each contained value of the original\n//! [`Option`] values, or [`None`] if any of the elements was [`None`].\n//!\n//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E\n//!\n//! ```\n//! let v = [Some(2), Some(4), None, Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, None);\n//! let v = [Some(2), Some(4), Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, Some(vec![2, 4, 8]));\n//! ```\n//!\n//! [`Option`] also implements the [`Product`][impl-Product] and\n//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values\n//! to provide the [`product`][Iterator::product] and\n//! [`sum`][Iterator::sum] methods.\n//!\n//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E\n//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E\n//!\n//! ```\n//! let v = [None, Some(1), Some(2), Some(3)];\n//! let res: Option<i32> = v.into_iter().sum();\n//! assert_eq!(res, None);\n//! let v = [Some(1), Some(2), Some(21)];\n//! let res: Option<i32> = v.into_iter().product();\n//! assert_eq!(res, Some(42));\n//! ```\n//!\n//! ## Modifying an [`Option`] in-place\n//!\n//! These methods return a mutable reference to the contained value of an\n//! [`Option<T>`]:\n//!\n//! * [`insert`] inserts a value, dropping any old contents\n//! * [`get_or_insert`] gets the current value, inserting a provided\n//! default value if it is [`None`]\n//! * [`get_or_insert_default`] gets the current value, inserting the\n//! default value of type `T` (which must implement [`Default`]) if it is\n//! [`None`]\n//! * [`get_or_insert_with`] gets the current value, inserting a default\n//! computed by the provided function if it is [`None`]\n//!\n//! [`get_or_insert`]: Option::get_or_insert\n//! [`get_or_insert_default`]: Option::get_or_insert_default\n//! [`get_or_insert_with`]: Option::get_or_insert_with\n//! [`insert`]: Option::insert\n//!\n//! These methods transfer ownership of the contained value of an\n//! [`Option`]:\n//!\n//! * [`take`] takes ownership of the contained value of an [`Option`], if\n//! any, replacing the [`Option`] with [`None`]\n//! * [`replace`] takes ownership of the contained value of an [`Option`],\n//! if any, replacing the [`Option`] with a [`Some`] containing the\n//! provided value\n//!\n//! [`replace`]: Option::replace\n//! [`take`]: Option::take\n//!\n//! # Examples\n//!\n//! Basic pattern matching on [`Option`]:\n//!\n//! ```\n//! let msg = Some(\"howdy\");\n//!\n//! // Take a reference to the contained string\n//! if let Some(m) = &msg {\n//! println!(\"{}\", *m);\n//! }\n//!\n//! // Remove the contained string, destroying the Option\n//! let unwrapped_msg = msg.unwrap_or(\"default message\");\n//! ```\n//!\n//! Initialize a result to [`None`] before a loop:\n//!\n//! ```\n//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }\n//!\n//! // A list of data to search through.\n//! let all_the_big_things = [\n//! Kingdom::Plant(250, \"redwood\"),\n//! Kingdom::Plant(230, \"noble fir\"),\n//! Kingdom::Plant(229, \"sugar pine\"),\n//! Kingdom::Animal(25, \"blue whale\"),\n//! Kingdom::Animal(19, \"fin whale\"),\n//! Kingdom::Animal(15, \"north pacific right whale\"),\n//! ];\n//!\n//! // We're going to search for the name of the biggest animal,\n//! // but to start with we've just got `None`.\n//! let mut name_of_biggest_animal = None;\n//! let mut size_of_biggest_animal = 0;\n//! for big_thing in &all_the_big_things {\n//! match *big_thing {\n//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {\n//! // Now we've found the name of some big animal\n//! size_of_biggest_animal = size;\n//! name_of_biggest_animal = Some(name);\n//! }\n//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()\n//! }\n//! }\n//!\n//! match name_of_biggest_animal {\n//! Some(name) => println!(\"the biggest animal is {name}\"),\n//! None => println!(\"there are no animals :(\"),\n//! }\n//! ```\n\n#![stable(feature = \"rust1\", since = \"1.0.0\")]\n\nuse crate::iter::{self, FromIterator, FusedIterator, TrustedLen};\nuse crate::marker::Destruct;\nuse crate::panicking::{panic, panic_str};\nuse crate::pin::Pin;\nuse crate::{\n convert, hint, mem,\n ops::{self, ControlFlow, Deref, DerefMut},\n};\n\n/// The `Option` type. See [the module level documentation](self) for more.\n#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]\n#[rustc_diagnostic_item = \"Option\"]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub enum Option<T> {\n /// No value.\n #[lang = \"None\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n None,\n /// Some value of type `T`.\n #[lang = \"Some\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n Some(#[stable(feature = \"rust1\", since = \"1.0.0\")] T),\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Type implementation\n/////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Option<T> {\n /////////////////////////////////////////////////////////////////////////\n // Querying the contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns `true` if the option is a [`Some`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some(), true);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some(), false);\n /// ```\n #[must_use = \"if you intended to assert that this has a value, consider `.unwrap()` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_some(&self) -> bool {\n matches!(*self, Some(_))\n }\n\n /// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(is_some_with)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some_and(|&x| x > 1), true);\n ///\n /// let x: Option<u32> = Some(0);\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"is_some_with\", issue = \"93050\")]\n pub fn is_some_and(&self, f: impl FnOnce(&T) -> bool) -> bool {\n matches!(self, Some(x) if f(x))\n }\n\n /// Returns `true` if the option is a [`None`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_none(), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_none(), true);\n /// ```\n #[must_use = \"if you intended to assert that this doesn't have a value, consider \\\n `.and_then(|_| panic!(\\\"`Option` had a value when expected `None`\\\"))` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_none(&self) -> bool {\n !self.is_some()\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Adapter for working with references\n /////////////////////////////////////////////////////////////////////////\n\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `as_ref` to first take an `Option` to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let text: Option<String> = Some(\"Hello, world!\".to_string());\n /// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,\n /// // then consume *that* with `map`, leaving `text` on the stack.\n /// let text_length: Option<usize> = text.as_ref().map(|s| s.len());\n /// println!(\"still can print text: {text:?}\");\n /// ```\n #[inline]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn as_ref(&self) -> Option<&T> {\n match *self {\n Some(ref x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from `&mut Option<T>` to `Option<&mut T>`.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// match x.as_mut() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn as_mut(&mut self) -> Option<&mut T> {\n match *self {\n Some(ref mut x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&]Option\\<T>></code> to <code>Option<[Pin]<[&]T>></code>.\n ///\n /// [&]: reference \"shared reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {\n match Pin::get_ref(self).as_ref() {\n // SAFETY: `x` is guaranteed to be pinned because it comes from `self`\n // which is pinned.\n Some(x) => unsafe { Some(Pin::new_unchecked(x)) },\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&mut] Option\\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.\n ///\n /// [&mut]: reference \"mutable reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {\n // SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.\n // `x` is guaranteed to be pinned because it comes from `self` which is pinned.\n unsafe {\n match Pin::get_unchecked_mut(self).as_mut() {\n Some(x) => Some(Pin::new_unchecked(x)),\n None => None,\n }\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Getting to contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// # Panics\n ///\n /// Panics if the value is a [`None`] with a custom panic message provided by\n /// `msg`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"value\");\n /// assert_eq!(x.expect(\"fruits are healthy\"), \"value\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// x.expect(\"fruits are healthy\"); // panics with `fruits are healthy`\n /// ```\n ///\n /// # Recommended Message Style\n ///\n /// We recommend that `expect` messages are used to describe the reason you\n /// _expect_ the `Option` should be `Some`.\n ///\n /// ```should_panic\n /// # let slice: &[u8] = &[];\n /// let item = slice.get(0)\n /// .expect(\"slice should not be empty\");\n /// ```\n ///\n /// **Hint**: If you're having trouble remembering how to phrase expect\n /// error messages remember to focus on the word \"should\" as in \"env\n /// variable should be set by blah\" or \"the given binary should be available\n /// and executable by the current user\".\n ///\n /// For more detail on expect message styles and the reasoning behind our\n /// recommendation please refer to the section on [\"Common Message\n /// Styles\"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn expect(self, msg: &str) -> T {\n match self {\n Some(val) => val,\n None => expect_failed(msg),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// Because this function may panic, its use is generally discouraged.\n /// Instead, prefer to use pattern matching and handle the [`None`]\n /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or\n /// [`unwrap_or_default`].\n ///\n /// [`unwrap_or`]: Option::unwrap_or\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n /// [`unwrap_or_default`]: Option::unwrap_or_default\n ///\n /// # Panics\n ///\n /// Panics if the self value equals [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(x.unwrap(), \"air\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// assert_eq!(x.unwrap(), \"air\"); // fails\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn unwrap(self) -> T {\n match self {\n Some(val) => val,\n None => panic(\"called `Option::unwrap()` on a `None` value\"),\n }\n }\n\n /// Returns the contained [`Some`] value or a provided default.\n ///\n /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`unwrap_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// assert_eq!(Some(\"car\").unwrap_or(\"bike\"), \"car\");\n /// assert_eq!(None.unwrap_or(\"bike\"), \"bike\");\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or(self, default: T) -> T\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => default,\n }\n }\n\n /// Returns the contained [`Some`] value or computes it from a closure.\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 10;\n /// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);\n /// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_else<F>(self, f: F) -> T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => f(),\n }\n }\n\n /// Returns the contained [`Some`] value or a default.\n ///\n /// Consumes the `self` argument then, if [`Some`], returns the contained\n /// value, otherwise if [`None`], returns the [default value] for that\n /// type.\n ///\n /// # Examples\n ///\n /// Converts a string to an integer, turning poorly-formed strings\n /// into 0 (the default value for integers). [`parse`] converts\n /// a string to any other type that implements [`FromStr`], returning\n /// [`None`] on error.\n ///\n /// ```\n /// let good_year_from_input = \"1909\";\n /// let bad_year_from_input = \"190blarg\";\n /// let good_year = good_year_from_input.parse().ok().unwrap_or_default();\n /// let bad_year = bad_year_from_input.parse().ok().unwrap_or_default();\n ///\n /// assert_eq!(1909, good_year);\n /// assert_eq!(0, bad_year);\n /// ```\n ///\n /// [default value]: Default::default\n /// [`parse`]: str::parse\n /// [`FromStr`]: crate::str::FromStr\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_default(self) -> T\n where\n T: ~const Default,\n {\n match self {\n Some(x) => x,\n None => Default::default(),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value,\n /// without checking that the value is not [`None`].\n ///\n /// # Safety\n ///\n /// Calling this method on [`None`] is *[undefined behavior]*.\n ///\n /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\");\n /// ```\n ///\n /// ```no_run\n /// let x: Option<&str> = None;\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\"); // Undefined behavior!\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"option_result_unwrap_unchecked\", since = \"1.58.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const unsafe fn unwrap_unchecked(self) -> T {\n debug_assert!(self.is_some());\n match self {\n Some(val) => val,\n // SAFETY: the safety contract must be upheld by the caller.\n None => unsafe { hint::unreachable_unchecked() },\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Transforming contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, consuming\n /// the original:\n ///\n /// [String]: ../../std/string/struct.String.html \"String\"\n /// ```\n /// let maybe_some_string = Some(String::from(\"Hello, World!\"));\n /// // `Option::map` takes self *by value*, consuming `maybe_some_string`\n /// let maybe_some_len = maybe_some_string.map(|s| s.len());\n ///\n /// assert_eq!(maybe_some_len, Some(13));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(f(x)),\n None => None,\n }\n }\n\n /// Calls the provided closure with a reference to the contained value (if [`Some`]).\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(result_option_inspect)]\n ///\n /// let v = vec![1, 2, 3, 4, 5];\n ///\n /// // prints \"got: 4\"\n /// let x: Option<&usize> = v.get(3).inspect(|x| println!(\"got: {x}\"));\n ///\n /// // prints nothing\n /// let x: Option<&usize> = v.get(5).inspect(|x| println!(\"got: {x}\"));\n /// ```\n #[inline]\n #[unstable(feature = \"result_option_inspect\", issue = \"91345\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn inspect<F>(self, f: F) -> Self\n where\n F: ~const FnOnce(&T),\n F: ~const Destruct,\n {\n if let Some(ref x) = self {\n f(x);\n }\n\n self\n }\n\n /// Returns the provided default result (if none),\n /// or applies a function to the contained value (if any).\n ///\n /// Arguments passed to `map_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`map_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`map_or_else`]: Option::map_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or(42, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or(42, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or<U, F>(self, default: U, f: F) -> U\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default,\n }\n }\n\n /// Computes a default function result (if none), or\n /// applies a different function to the contained value (if any).\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 21;\n ///\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U\n where\n D: ~const FnOnce() -> U,\n D: ~const Destruct,\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default(),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err)`].\n ///\n /// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`ok_or_else`], which is\n /// lazily evaluated.\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err)`]: Err\n /// [`Some(v)`]: Some\n /// [`ok_or_else`]: Option::ok_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or(0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or(0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or<E>(self, err: E) -> Result<T, E>\n where\n E: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err())`].\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err())`]: Err\n /// [`Some(v)`]: Some\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or_else(|| 0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or_else(|| 0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>\n where\n F: ~const FnOnce() -> E,\n F: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err()),\n }\n }\n\n /// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.\n ///\n /// Leaves the original Option in-place, creating a new one with a reference\n /// to the original one, additionally coercing the contents via [`Deref`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref(), Some(\"hey\"));\n ///\n /// let x: Option<String> = None;\n /// assert_eq!(x.as_deref(), None);\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref(&self) -> Option<&T::Target>\n where\n T: ~const Deref,\n {\n match self.as_ref() {\n Some(t) => Some(t.deref()),\n None => None,\n }\n }\n\n /// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.\n ///\n /// Leaves the original `Option` in-place, creating a new one containing a mutable reference to\n /// the inner type's [`Deref::Target`] type.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref_mut().map(|x| {\n /// x.make_ascii_uppercase();\n /// x\n /// }), Some(\"HEY\".to_owned().as_mut_str()));\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>\n where\n T: ~const DerefMut,\n {\n match self.as_mut() {\n Some(t) => Some(t.deref_mut()),\n None => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Iterator constructors\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns an iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(4);\n /// assert_eq!(x.iter().next(), Some(&4));\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.iter().next(), None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn iter(&self) -> Iter<'_, T> {\n Iter { inner: Item { opt: self.as_ref() } }\n }\n\n /// Returns a mutable iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(4);\n /// match x.iter_mut().next() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n ///\n /// let mut x: Option<u32> = None;\n /// assert_eq!(x.iter_mut().next(), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub fn iter_mut(&mut self) -> IterMut<'_, T> {\n IterMut { inner: Item { opt: self.as_mut() } }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Boolean operations on the values, eager and lazy\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns [`None`] if the option is [`None`], otherwise returns `optb`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), None);\n ///\n /// let x = Some(2);\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), Some(\"foo\"));\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and<U>(self, optb: Option<U>) -> Option<U>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(_) => optb,\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `f` with the\n /// wrapped value and returns the result.\n ///\n /// Some languages call this operation flatmap.\n ///\n /// # Examples\n ///\n /// ```\n /// fn sq_then_to_string(x: u32) -> Option<String> {\n /// x.checked_mul(x).map(|sq| sq.to_string())\n /// }\n ///\n /// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));\n /// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!\n /// assert_eq!(None.and_then(sq_then_to_string), None);\n /// ```\n ///\n /// Often used to chain fallible operations that may return [`None`].\n ///\n /// ```\n /// let arr_2d = [[\"A0\", \"A1\"], [\"B0\", \"B1\"]];\n ///\n /// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));\n /// assert_eq!(item_0_1, Some(&\"A1\"));\n ///\n /// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));\n /// assert_eq!(item_2_0, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and_then<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> Option<U>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => f(x),\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `predicate`\n /// with the wrapped value and returns:\n ///\n /// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped\n /// value), and\n /// - [`None`] if `predicate` returns `false`.\n ///\n /// This function works similar to [`Iterator::filter()`]. You can imagine\n /// the `Option<T>` being an iterator over one or zero elements. `filter()`\n /// lets you decide which elements to keep.\n ///\n /// # Examples\n ///\n /// ```rust\n /// fn is_even(n: &i32) -> bool {\n /// n % 2 == 0\n /// }\n ///\n /// assert_eq!(None.filter(is_even), None);\n /// assert_eq!(Some(3).filter(is_even), None);\n /// assert_eq!(Some(4).filter(is_even), Some(4));\n /// ```\n ///\n /// [`Some(t)`]: Some\n #[inline]\n #[stable(feature = \"option_filter\", since = \"1.27.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn filter<P>(self, predicate: P) -> Self\n where\n T: ~const Destruct,\n P: ~const FnOnce(&T) -> bool,\n P: ~const Destruct,\n {\n if let Some(x) = self {\n if predicate(&x) {\n return Some(x);\n }\n }\n None\n }\n\n /// Returns the option if it contains a value, otherwise returns `optb`.\n ///\n /// Arguments passed to `or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`or_else`], which is\n /// lazily evaluated.\n ///\n /// [`or_else`]: Option::or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y = None;\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x = None;\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(100));\n ///\n /// let x = Some(2);\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = None;\n /// assert_eq!(x.or(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => optb,\n }\n }\n\n /// Returns the option if it contains a value, otherwise calls `f` and\n /// returns the result.\n ///\n /// # Examples\n ///\n /// ```\n /// fn nobody() -> Option<&'static str> { None }\n /// fn vikings() -> Option<&'static str> { Some(\"vikings\") }\n ///\n /// assert_eq!(Some(\"barbarians\").or_else(vikings), Some(\"barbarians\"));\n /// assert_eq!(None.or_else(vikings), Some(\"vikings\"));\n /// assert_eq!(None.or_else(nobody), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or_else<F>(self, f: F) -> Option<T>\n where\n F: ~const FnOnce() -> Option<T>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => f(),\n }\n }\n\n /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x = Some(2);\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"option_xor\", since = \"1.37.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn xor(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match (self, optb) {\n (Some(a), None) => Some(a),\n (None, Some(b)) => Some(b),\n _ => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Entry-like operations to insert a value and return a reference\n /////////////////////////////////////////////////////////////////////////\n\n /// Inserts `value` into the option, then returns a mutable reference to it.\n ///\n /// If the option already contains a value, the old value is dropped.\n ///\n /// See also [`Option::get_or_insert`], which doesn't update the value if\n /// the option already contains [`Some`].\n ///\n /// # Example\n ///\n /// ```\n /// let mut opt = None;\n /// let val = opt.insert(1);\n /// assert_eq!(*val, 1);\n /// assert_eq!(opt.unwrap(), 1);\n /// let val = opt.insert(2);\n /// assert_eq!(*val, 2);\n /// *val = 3;\n /// assert_eq!(opt.unwrap(), 3);\n /// ```\n #[must_use = \"if you intended to set a value, consider assignment instead\"]\n #[inline]\n #[stable(feature = \"option_insert\", since = \"1.53.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n *self = Some(value);\n\n // SAFETY: the code above just filled the option\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts `value` into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// See also [`Option::insert`], which updates the value even if\n /// the option already contains [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert(5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n if let None = *self {\n *self = Some(value);\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts the default value into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_get_or_insert_default)]\n ///\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_default();\n /// assert_eq!(y, &0);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[unstable(feature = \"option_get_or_insert_default\", issue = \"82901\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_default(&mut self) -> &mut T\n where\n T: ~const Default,\n {\n const fn default<T: ~const Default>() -> T {\n T::default()\n }\n\n self.get_or_insert_with(default)\n }\n\n /// Inserts a value computed from `f` into the option if it is [`None`],\n /// then returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_with(|| 5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n if let None = *self {\n // the compiler isn't smart enough to know that we are not dropping a `T`\n // here and wants us to ensure `T` can be dropped at compile time.\n mem::forget(mem::replace(self, Some(f())))\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Misc\n /////////////////////////////////////////////////////////////////////////\n\n /// Takes the value out of the option, leaving a [`None`] in its place.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, Some(2));\n ///\n /// let mut x: Option<u32> = None;\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn take(&mut self) -> Option<T> {\n // FIXME replace `mem::replace` by `mem::take` when the latter is const ready\n mem::replace(self, None)\n }\n\n /// Replaces the actual value in the option by the value given in parameter,\n /// returning the old value if present,\n /// leaving a [`Some`] in its place without deinitializing either one.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let old = x.replace(5);\n /// assert_eq!(x, Some(5));\n /// assert_eq!(old, Some(2));\n ///\n /// let mut x = None;\n /// let old = x.replace(3);\n /// assert_eq!(x, Some(3));\n /// assert_eq!(old, None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"option_replace\", since = \"1.31.0\")]\n pub const fn replace(&mut self, value: T) -> Option<T> {\n mem::replace(self, Some(value))\n }\n\n /// Returns `true` if the option is a [`Some`] value containing the given value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_result_contains)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.contains(&2), true);\n ///\n /// let x: Option<u32> = Some(3);\n /// assert_eq!(x.contains(&2), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.contains(&2), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"option_result_contains\", issue = \"62358\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn contains<U>(&self, x: &U) -> bool\n where\n U: ~const PartialEq<T>,\n {\n match self {\n Some(y) => x.eq(y),\n None => false,\n }\n }\n\n /// Zips `self` with another `Option`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(1);\n /// let y = Some(\"hi\");\n /// let z = None::<u8>;\n ///\n /// assert_eq!(x.zip(y), Some((1, \"hi\")));\n /// assert_eq!(x.zip(z), None);\n /// ```\n #[stable(feature = \"option_zip_option\", since = \"1.46.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some((a, b)),\n _ => None,\n }\n }\n\n /// Zips `self` and another `Option` with function `f`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_zip)]\n ///\n /// #[derive(Debug, PartialEq)]\n /// struct Point {\n /// x: f64,\n /// y: f64,\n /// }\n ///\n /// impl Point {\n /// fn new(x: f64, y: f64) -> Self {\n /// Self { x, y }\n /// }\n /// }\n ///\n /// let x = Some(17.5);\n /// let y = Some(42.7);\n ///\n /// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));\n /// assert_eq!(x.zip_with(None, Point::new), None);\n /// ```\n #[unstable(feature = \"option_zip\", issue = \"70086\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>\n where\n F: ~const FnOnce(T, U) -> R,\n F: ~const Destruct,\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some(f(a, b)),\n _ => None,\n }\n }\n}\n\nimpl<T, U> Option<(T, U)> {\n /// Unzips an option containing a tuple of two options.\n ///\n /// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.\n /// Otherwise, `(None, None)` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(unzip_option)]\n ///\n /// let x = Some((1, \"hi\"));\n /// let y = None::<(u8, u32)>;\n ///\n /// assert_eq!(x.unzip(), (Some(1), Some(\"hi\")));\n /// assert_eq!(y.unzip(), (None, None));\n /// ```\n #[inline]\n #[unstable(feature = \"unzip_option\", issue = \"87800\", reason = \"recently added\")]\n pub const fn unzip(self) -> (Option<T>, Option<U>) {\n match self {\n Some((a, b)) => (Some(a), Some(b)),\n None => (None, None),\n }\n }\n}\n\nimpl<T> Option<&T> {\n /// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n // FIXME: this implementation, which sidesteps using `Option::map` since it's not const\n // ready yet, should be reverted when possible to avoid code repetition\n match self {\n Some(&v) => Some(v),\n None => None,\n }\n }\n\n /// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T> Option<&mut T> {\n /// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n match self {\n Some(&mut t) => Some(t),\n None => None,\n }\n }\n\n /// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(since = \"1.26.0\", feature = \"option_ref_mut_cloned\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T, E> Option<Result<T, E>> {\n /// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.\n ///\n /// [`None`] will be mapped to <code>[Ok]\\([None])</code>.\n /// <code>[Some]\\([Ok]\\(\\_))</code> and <code>[Some]\\([Err]\\(\\_))</code> will be mapped to\n /// <code>[Ok]\\([Some]\\(\\_))</code> and <code>[Err]\\(\\_)</code>.\n ///\n /// # Examples\n ///\n /// ```\n /// #[derive(Debug, Eq, PartialEq)]\n /// struct SomeErr;\n ///\n /// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));\n /// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));\n /// assert_eq!(x, y.transpose());\n /// ```\n #[inline]\n #[stable(feature = \"transpose_result\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn transpose(self) -> Result<Option<T>, E> {\n match self {\n Some(Ok(x)) => Ok(Some(x)),\n Some(Err(e)) => Err(e),\n None => Ok(None),\n }\n }\n}\n\n// This is a separate function to reduce the code size of .expect() itself.\n#[cfg_attr(not(feature = \"panic_immediate_abort\"), inline(never))]\n#[cfg_attr(feature = \"panic_immediate_abort\", inline)]\n#[cold]\n#[track_caller]\n#[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\nconst fn expect_failed(msg: &str) -> ! {\n panic_str(msg)\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Trait implementations\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_clone\", issue = \"91805\")]\nimpl<T> const Clone for Option<T>\nwhere\n T: ~const Clone + ~const Destruct,\n{\n #[inline]\n fn clone(&self) -> Self {\n match self {\n Some(x) => Some(x.clone()),\n None => None,\n }\n }\n\n #[inline]\n fn clone_from(&mut self, source: &Self) {\n match (self, source) {\n (Some(to), Some(from)) => to.clone_from(from),\n (to, from) => *to = from.clone(),\n }\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_default_impls\", issue = \"87864\")]\nimpl<T> const Default for Option<T> {\n /// Returns [`None`][Option::None].\n ///\n /// # Examples\n ///\n /// ```\n /// let opt: Option<u32> = Option::default();\n /// assert!(opt.is_none());\n /// ```\n #[inline]\n fn default() -> Option<T> {\n None\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<T> IntoIterator for Option<T> {\n type Item = T;\n type IntoIter = IntoIter<T>;\n\n /// Returns a consuming iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"string\");\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert_eq!(v, [\"string\"]);\n ///\n /// let x = None;\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert!(v.is_empty());\n /// ```\n #[inline]\n fn into_iter(self) -> IntoIter<T> {\n IntoIter { inner: Item { opt: self } }\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a Option<T> {\n type Item = &'a T;\n type IntoIter = Iter<'a, T>;\n\n fn into_iter(self) -> Iter<'a, T> {\n self.iter()\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a mut Option<T> {\n type Item = &'a mut T;\n type IntoIter = IterMut<'a, T>;\n\n fn into_iter(self) -> IterMut<'a, T> {\n self.iter_mut()\n }\n}\n\n#[stable(since = \"1.12.0\", feature = \"option_from\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const From<T> for Option<T> {\n /// Moves `val` into a new [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let o: Option<u8> = Option::from(67);\n ///\n /// assert_eq!(Some(67), o);\n /// ```\n fn from(val: T) -> Option<T> {\n Some(val)\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a Option<T>> for Option<&'a T> {\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `from` to first take an [`Option`] to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let s: Option<String> = Some(String::from(\"Hello, Rustaceans!\"));\n /// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());\n ///\n /// println!(\"Can still print s: {s:?}\");\n ///\n /// assert_eq!(o, Some(18));\n /// ```\n fn from(o: &'a Option<T>) -> Option<&'a T> {\n o.as_ref()\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {\n /// Converts from `&mut Option<T>` to `Option<&mut T>`\n ///\n /// # Examples\n ///\n /// ```\n /// let mut s = Some(String::from(\"Hello\"));\n /// let o: Option<&mut String> = Option::from(&mut s);\n ///\n /// match o {\n /// Some(t) => *t = String::from(\"Hello, Rustaceans!\"),\n /// None => (),\n /// }\n ///\n /// assert_eq!(s, Some(String::from(\"Hello, Rustaceans!\")));\n /// ```\n fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {\n o.as_mut()\n }\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// The Option Iterators\n/////////////////////////////////////////////////////////////////////////////\n\n#[derive(Clone, Debug)]\nstruct Item<A> {\n opt: Option<A>,\n}\n\nimpl<A> Iterator for Item<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.opt.take()\n }\n\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n match self.opt {\n Some(_) => (1, Some(1)),\n None => (0, Some(0)),\n }\n }\n}\n\nimpl<A> DoubleEndedIterator for Item<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.opt.take()\n }\n}\n\nimpl<A> ExactSizeIterator for Item<A> {}\nimpl<A> FusedIterator for Item<A> {}\nunsafe impl<A> TrustedLen for Item<A> {}\n\n/// An iterator over a reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct Iter<'a, A: 'a> {\n inner: Item<&'a A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for Iter<'a, A> {\n type Item = &'a A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for Iter<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for Iter<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for Iter<'_, A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for Iter<'_, A> {}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Clone for Iter<'_, A> {\n #[inline]\n fn clone(&self) -> Self {\n Iter { inner: self.inner.clone() }\n }\n}\n\n/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter_mut`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct IterMut<'a, A: 'a> {\n inner: Item<&'a mut A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for IterMut<'a, A> {\n type Item = &'a mut A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a mut A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for IterMut<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a mut A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IterMut<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IterMut<'_, A> {}\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IterMut<'_, A> {}\n\n/// An iterator over the value in [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::into_iter`] function.\n#[derive(Clone, Debug)]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct IntoIter<A> {\n inner: Item<A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Iterator for IntoIter<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> DoubleEndedIterator for IntoIter<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IntoIter<A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IntoIter<A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IntoIter<A> {}\n\n/////////////////////////////////////////////////////////////////////////////\n// FromIterator\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {\n /// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],\n /// no further elements are taken, and the [`None`][Option::None] is\n /// returned. Should no [`None`][Option::None] occur, a container of type\n /// `V` containing the values of each [`Option`] is returned.\n ///\n /// # Examples\n ///\n /// Here is an example which increments every integer in a vector.\n /// We use the checked variant of `add` that returns `None` when the\n /// calculation would result in an overflow.\n ///\n /// ```\n /// let items = vec![0_u16, 1, 2];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_add(1))\n /// .collect();\n ///\n /// assert_eq!(res, Some(vec![1, 2, 3]));\n /// ```\n ///\n /// As you can see, this will return the expected, valid items.\n ///\n /// Here is another example that tries to subtract one from another list\n /// of integers, this time checking for underflow:\n ///\n /// ```\n /// let items = vec![2_u16, 1, 0];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_sub(1))\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// ```\n ///\n /// Since the last element is zero, it would underflow. Thus, the resulting\n /// value is `None`.\n ///\n /// Here is a variation on the previous example, showing that no\n /// further elements are taken from `iter` after the first `None`.\n ///\n /// ```\n /// let items = vec![3_u16, 2, 1, 10];\n ///\n /// let mut shared = 0;\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| { shared += x; x.checked_sub(2) })\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// assert_eq!(shared, 6);\n /// ```\n ///\n /// Since the third element caused an underflow, no further elements were taken,\n /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.\n #[inline]\n fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {\n // FIXME(#11084): This could be replaced with Iterator::scan when this\n // performance bug is closed.\n\n iter::try_process(iter.into_iter(), |i| i.collect())\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::Try for Option<T> {\n type Output = T;\n type Residual = Option<convert::Infallible>;\n\n #[inline]\n fn from_output(output: Self::Output) -> Self {\n Some(output)\n }\n\n #[inline]\n fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {\n match self {\n Some(v) => ControlFlow::Continue(v),\n None => ControlFlow::Break(None),\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::FromResidual for Option<T> {\n #[inline]\n fn from_residual(residual: Option<convert::Infallible>) -> Self {\n match residual {\n None => None,\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2_yeet\", issue = \"96374\")]\nimpl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {\n #[inline]\n fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {\n None\n }\n}\n\n#[unstable(feature = \"try_trait_v2_residual\", issue = \"91285\")]\nimpl<T> ops::Residual<T> for Option<convert::Infallible> {\n type TryType = Option<T>;\n}\n\nimpl<T> Option<Option<T>> {\n /// Converts from `Option<Option<T>>` to `Option<T>`.\n ///\n /// # Examples\n ///\n /// Basic usage:\n ///\n /// ```\n /// let x: Option<Option<u32>> = Some(Some(6));\n /// assert_eq!(Some(6), x.flatten());\n ///\n /// let x: Option<Option<u32>> = Some(None);\n /// assert_eq!(None, x.flatten());\n ///\n /// let x: Option<Option<u32>> = None;\n /// assert_eq!(None, x.flatten());\n /// ```\n ///\n /// Flattening only removes one level of nesting at a time:\n ///\n /// ```\n /// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));\n /// assert_eq!(Some(Some(6)), x.flatten());\n /// assert_eq!(Some(6), x.flatten().flatten());\n /// ```\n #[inline]\n #[stable(feature = \"option_flattening\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn flatten(self) -> Option<T> {\n match self {\n Some(inner) => inner,\n None => None,\n }\n }\n}\n","uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","version":0}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/codeLens","params":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}},"id":3} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":3,"result":[{"range":{"start":{"line":537,"character":4},"end":{"line":554,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::is_some","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":537,"character":4},"end":{"line":554,"character":5}},"targetSelectionRange":{"start":{"line":537,"character":4},"end":{"line":554,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some","--nocapture"]}}]}},{"range":{"start":{"line":556,"character":4},"end":{"line":577,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::is_some_and","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":556,"character":4},"end":{"line":577,"character":5}},"targetSelectionRange":{"start":{"line":556,"character":4},"end":{"line":577,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some_and","--nocapture"]}}]}},{"range":{"start":{"line":579,"character":4},"end":{"line":597,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::is_none","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":579,"character":4},"end":{"line":597,"character":5}},"targetSelectionRange":{"start":{"line":579,"character":4},"end":{"line":597,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_none","--nocapture"]}}]}},{"range":{"start":{"line":603,"character":4},"end":{"line":630,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_ref","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":603,"character":4},"end":{"line":630,"character":5}},"targetSelectionRange":{"start":{"line":603,"character":4},"end":{"line":630,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_ref","--nocapture"]}}]}},{"range":{"start":{"line":632,"character":4},"end":{"line":652,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_mut","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":632,"character":4},"end":{"line":652,"character":5}},"targetSelectionRange":{"start":{"line":632,"character":4},"end":{"line":652,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_mut","--nocapture"]}}]}},{"range":{"start":{"line":692,"character":4},"end":{"line":739,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::expect","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":692,"character":4},"end":{"line":739,"character":5}},"targetSelectionRange":{"start":{"line":692,"character":4},"end":{"line":739,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::expect","--nocapture"]}}]}},{"range":{"start":{"line":741,"character":4},"end":{"line":776,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":741,"character":4},"end":{"line":776,"character":5}},"targetSelectionRange":{"start":{"line":741,"character":4},"end":{"line":776,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap","--nocapture"]}}]}},{"range":{"start":{"line":778,"character":4},"end":{"line":803,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":778,"character":4},"end":{"line":803,"character":5}},"targetSelectionRange":{"start":{"line":778,"character":4},"end":{"line":803,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or","--nocapture"]}}]}},{"range":{"start":{"line":805,"character":4},"end":{"line":826,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":805,"character":4},"end":{"line":826,"character":5}},"targetSelectionRange":{"start":{"line":805,"character":4},"end":{"line":826,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_else","--nocapture"]}}]}},{"range":{"start":{"line":828,"character":4},"end":{"line":865,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_or_default","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":828,"character":4},"end":{"line":865,"character":5}},"targetSelectionRange":{"start":{"line":828,"character":4},"end":{"line":865,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_default","--nocapture"]}}]}},{"range":{"start":{"line":867,"character":4},"end":{"line":898,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_unchecked","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":867,"character":4},"end":{"line":898,"character":5}},"targetSelectionRange":{"start":{"line":867,"character":4},"end":{"line":898,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_unchecked","--nocapture"]}}]}},{"range":{"start":{"line":904,"character":4},"end":{"line":931,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::map","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":904,"character":4},"end":{"line":931,"character":5}},"targetSelectionRange":{"start":{"line":904,"character":4},"end":{"line":931,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map","--nocapture"]}}]}},{"range":{"start":{"line":933,"character":4},"end":{"line":961,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::inspect","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":933,"character":4},"end":{"line":961,"character":5}},"targetSelectionRange":{"start":{"line":933,"character":4},"end":{"line":961,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::inspect","--nocapture"]}}]}},{"range":{"start":{"line":963,"character":4},"end":{"line":994,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::map_or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":963,"character":4},"end":{"line":994,"character":5}},"targetSelectionRange":{"start":{"line":963,"character":4},"end":{"line":994,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or","--nocapture"]}}]}},{"range":{"start":{"line":996,"character":4},"end":{"line":1024,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::map_or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":996,"character":4},"end":{"line":1024,"character":5}},"targetSelectionRange":{"start":{"line":996,"character":4},"end":{"line":1024,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or_else","--nocapture"]}}]}},{"range":{"start":{"line":1026,"character":4},"end":{"line":1058,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::ok_or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1026,"character":4},"end":{"line":1058,"character":5}},"targetSelectionRange":{"start":{"line":1026,"character":4},"end":{"line":1058,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or","--nocapture"]}}]}},{"range":{"start":{"line":1060,"character":4},"end":{"line":1088,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::ok_or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1060,"character":4},"end":{"line":1088,"character":5}},"targetSelectionRange":{"start":{"line":1060,"character":4},"end":{"line":1088,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or_else","--nocapture"]}}]}},{"range":{"start":{"line":1090,"character":4},"end":{"line":1114,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_deref","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1090,"character":4},"end":{"line":1114,"character":5}},"targetSelectionRange":{"start":{"line":1090,"character":4},"end":{"line":1114,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref","--nocapture"]}}]}},{"range":{"start":{"line":1116,"character":4},"end":{"line":1140,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_deref_mut","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1116,"character":4},"end":{"line":1140,"character":5}},"targetSelectionRange":{"start":{"line":1116,"character":4},"end":{"line":1140,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref_mut","--nocapture"]}}]}},{"range":{"start":{"line":1146,"character":4},"end":{"line":1162,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::iter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1146,"character":4},"end":{"line":1162,"character":5}},"targetSelectionRange":{"start":{"line":1146,"character":4},"end":{"line":1162,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter","--nocapture"]}}]}},{"range":{"start":{"line":1164,"character":4},"end":{"line":1183,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::iter_mut","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1164,"character":4},"end":{"line":1183,"character":5}},"targetSelectionRange":{"start":{"line":1164,"character":4},"end":{"line":1183,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter_mut","--nocapture"]}}]}},{"range":{"start":{"line":1189,"character":4},"end":{"line":1222,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::and","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1189,"character":4},"end":{"line":1222,"character":5}},"targetSelectionRange":{"start":{"line":1189,"character":4},"end":{"line":1222,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and","--nocapture"]}}]}},{"range":{"start":{"line":1224,"character":4},"end":{"line":1264,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::and_then","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1224,"character":4},"end":{"line":1264,"character":5}},"targetSelectionRange":{"start":{"line":1224,"character":4},"end":{"line":1264,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and_then","--nocapture"]}}]}},{"range":{"start":{"line":1266,"character":4},"end":{"line":1305,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::filter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1266,"character":4},"end":{"line":1305,"character":5}},"targetSelectionRange":{"start":{"line":1266,"character":4},"end":{"line":1305,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::filter","--nocapture"]}}]}},{"range":{"start":{"line":1307,"character":4},"end":{"line":1345,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1307,"character":4},"end":{"line":1345,"character":5}},"targetSelectionRange":{"start":{"line":1307,"character":4},"end":{"line":1345,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or","--nocapture"]}}]}},{"range":{"start":{"line":1347,"character":4},"end":{"line":1372,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1347,"character":4},"end":{"line":1372,"character":5}},"targetSelectionRange":{"start":{"line":1347,"character":4},"end":{"line":1372,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or_else","--nocapture"]}}]}},{"range":{"start":{"line":1374,"character":4},"end":{"line":1407,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::xor","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1374,"character":4},"end":{"line":1407,"character":5}},"targetSelectionRange":{"start":{"line":1374,"character":4},"end":{"line":1407,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::xor","--nocapture"]}}]}},{"range":{"start":{"line":1413,"character":4},"end":{"line":1444,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::insert","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1413,"character":4},"end":{"line":1444,"character":5}},"targetSelectionRange":{"start":{"line":1413,"character":4},"end":{"line":1444,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::insert","--nocapture"]}}]}},{"range":{"start":{"line":1446,"character":4},"end":{"line":1480,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::get_or_insert","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1446,"character":4},"end":{"line":1480,"character":5}},"targetSelectionRange":{"start":{"line":1446,"character":4},"end":{"line":1480,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert","--nocapture"]}}]}},{"range":{"start":{"line":1482,"character":4},"end":{"line":1513,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::get_or_insert_default","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1482,"character":4},"end":{"line":1513,"character":5}},"targetSelectionRange":{"start":{"line":1482,"character":4},"end":{"line":1513,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_default","--nocapture"]}}]}},{"range":{"start":{"line":1515,"character":4},"end":{"line":1549,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::get_or_insert_with","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1515,"character":4},"end":{"line":1549,"character":5}},"targetSelectionRange":{"start":{"line":1515,"character":4},"end":{"line":1549,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_with","--nocapture"]}}]}},{"range":{"start":{"line":1555,"character":4},"end":{"line":1576,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::take","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1555,"character":4},"end":{"line":1576,"character":5}},"targetSelectionRange":{"start":{"line":1555,"character":4},"end":{"line":1576,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::take","--nocapture"]}}]}},{"range":{"start":{"line":1578,"character":4},"end":{"line":1600,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::replace","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1578,"character":4},"end":{"line":1600,"character":5}},"targetSelectionRange":{"start":{"line":1578,"character":4},"end":{"line":1600,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::replace","--nocapture"]}}]}},{"range":{"start":{"line":1602,"character":4},"end":{"line":1630,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::contains","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1602,"character":4},"end":{"line":1630,"character":5}},"targetSelectionRange":{"start":{"line":1602,"character":4},"end":{"line":1630,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::contains","--nocapture"]}}]}},{"range":{"start":{"line":1632,"character":4},"end":{"line":1658,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::zip","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1632,"character":4},"end":{"line":1658,"character":5}},"targetSelectionRange":{"start":{"line":1632,"character":4},"end":{"line":1658,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip","--nocapture"]}}]}},{"range":{"start":{"line":1660,"character":4},"end":{"line":1701,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::zip_with","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1660,"character":4},"end":{"line":1701,"character":5}},"targetSelectionRange":{"start":{"line":1660,"character":4},"end":{"line":1701,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip_with","--nocapture"]}}]}},{"range":{"start":{"line":1705,"character":4},"end":{"line":1728,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<(T,U)>::unzip","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1705,"character":4},"end":{"line":1728,"character":5}},"targetSelectionRange":{"start":{"line":1705,"character":4},"end":{"line":1728,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<(T,U)>::unzip","--nocapture"]}}]}},{"range":{"start":{"line":1732,"character":4},"end":{"line":1757,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&T>::copied","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1732,"character":4},"end":{"line":1757,"character":5}},"targetSelectionRange":{"start":{"line":1732,"character":4},"end":{"line":1757,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::copied","--nocapture"]}}]}},{"range":{"start":{"line":1759,"character":4},"end":{"line":1782,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&T>::cloned","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1759,"character":4},"end":{"line":1782,"character":5}},"targetSelectionRange":{"start":{"line":1759,"character":4},"end":{"line":1782,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::cloned","--nocapture"]}}]}},{"range":{"start":{"line":1786,"character":4},"end":{"line":1809,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&mutT>::copied","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1786,"character":4},"end":{"line":1809,"character":5}},"targetSelectionRange":{"start":{"line":1786,"character":4},"end":{"line":1809,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::copied","--nocapture"]}}]}},{"range":{"start":{"line":1811,"character":4},"end":{"line":1834,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&mutT>::cloned","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1811,"character":4},"end":{"line":1834,"character":5}},"targetSelectionRange":{"start":{"line":1811,"character":4},"end":{"line":1834,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::cloned","--nocapture"]}}]}},{"range":{"start":{"line":1838,"character":4},"end":{"line":1863,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<Result<T,E>>::transpose","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1838,"character":4},"end":{"line":1863,"character":5}},"targetSelectionRange":{"start":{"line":1838,"character":4},"end":{"line":1863,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Result<T,E>>::transpose","--nocapture"]}}]}},{"range":{"start":{"line":1906,"character":4},"end":{"line":1917,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::default","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1906,"character":4},"end":{"line":1917,"character":5}},"targetSelectionRange":{"start":{"line":1906,"character":4},"end":{"line":1917,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::default","--nocapture"]}}]}},{"range":{"start":{"line":1925,"character":4},"end":{"line":1941,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::into_iter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1925,"character":4},"end":{"line":1941,"character":5}},"targetSelectionRange":{"start":{"line":1925,"character":4},"end":{"line":1941,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::into_iter","--nocapture"]}}]}},{"range":{"start":{"line":1967,"character":4},"end":{"line":1978,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::from","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1967,"character":4},"end":{"line":1978,"character":5}},"targetSelectionRange":{"start":{"line":1967,"character":4},"end":{"line":1978,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::from","--nocapture"]}}]}},{"range":{"start":{"line":1984,"character":4},"end":{"line":2006,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&T>::from","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1984,"character":4},"end":{"line":2006,"character":5}},"targetSelectionRange":{"start":{"line":1984,"character":4},"end":{"line":2006,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::from","--nocapture"]}}]}},{"range":{"start":{"line":2012,"character":4},"end":{"line":2029,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&mutT>::from","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":2012,"character":4},"end":{"line":2029,"character":5}},"targetSelectionRange":{"start":{"line":2012,"character":4},"end":{"line":2029,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::from","--nocapture"]}}]}},{"range":{"start":{"line":2208,"character":4},"end":{"line":2274,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<V>::from_iter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":2208,"character":4},"end":{"line":2274,"character":5}},"targetSelectionRange":{"start":{"line":2208,"character":4},"end":{"line":2274,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<V>::from_iter","--nocapture"]}}]}},{"range":{"start":{"line":2322,"character":4},"end":{"line":2354,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<Option<T>>::flatten","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":2322,"character":4},"end":{"line":2354,"character":5}},"targetSelectionRange":{"start":{"line":2322,"character":4},"end":{"line":2354,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Option<T>>::flatten","--nocapture"]}}]}},{"range":{"start":{"line":517,"character":9},"end":{"line":517,"character":15}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":517,"character":9}}}},{"range":{"start":{"line":2037,"character":7},"end":{"line":2037,"character":11}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2037,"character":7}}}},{"range":{"start":{"line":2076,"character":11},"end":{"line":2076,"character":15}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2076,"character":11}}}},{"range":{"start":{"line":2126,"character":11},"end":{"line":2126,"character":18}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2126,"character":11}}}},{"range":{"start":{"line":2167,"character":11},"end":{"line":2167,"character":19}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2167,"character":11}}}}]} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":9,"line":517},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":517},"start":{"character":9,"line":517}}},"id":4} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":4,"result":{"range":{"start":{"line":517,"character":9},"end":{"line":517,"character":15}},"command":{"title":"75 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":517,"character":9},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":532,"character":0},"end":{"line":1702,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1704,"character":0},"end":{"line":1729,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1731,"character":0},"end":{"line":1783,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1785,"character":0},"end":{"line":1835,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1837,"character":0},"end":{"line":1864,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2321,"character":0},"end":{"line":2355,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":72,"character":0},"end":{"line":77,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":79,"character":0},"end":{"line":84,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2297,"character":0},"end":{"line":2306,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2308,"character":0},"end":{"line":2314,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2206,"character":0},"end":{"line":2275,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1964,"character":0},"end":{"line":1979,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1981,"character":0},"end":{"line":2007,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2009,"character":0},"end":{"line":2030,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1880,"character":0},"end":{"line":1901,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2277,"character":0},"end":{"line":2295,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs","range":{"start":{"line":216,"character":0},"end":{"line":230,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2316,"character":0},"end":{"line":2319,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1920,"character":0},"end":{"line":1942,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1944,"character":0},"end":{"line":1952,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1954,"character":0},"end":{"line":1962,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/slice/cmp.rs","range":{"start":{"line":149,"character":0},"end":{"line":157,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs","range":{"start":{"line":189,"character":0},"end":{"line":214,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1903,"character":0},"end":{"line":1918,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs","range":{"start":{"line":175,"character":4},"end":{"line":175,"character":35}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs","range":{"start":{"line":61,"character":0},"end":{"line":96,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/arc-swap-0.4.7/src/ref_cnt.rs","range":{"start":{"line":112,"character":0},"end":{"line":127,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/future/option.rs","range":{"start":{"line":4,"character":0},"end":{"line":14,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/calls.rs","range":{"start":{"line":9,"character":0},"end":{"line":9,"character":43}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/io.rs","range":{"start":{"line":380,"character":0},"end":{"line":386,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot-0.10.2/src/util.rs","range":{"start":{"line":14,"character":0},"end":{"line":22,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot_core-0.7.2/src/util.rs","range":{"start":{"line":12,"character":0},"end":{"line":20,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/quote-1.0.7/src/to_tokens.rs","range":{"start":{"line":108,"character":0},"end":{"line":114,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/de/impls.rs","range":{"start":{"line":635,"character":0},"end":{"line":653,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/ser/impls.rs","range":{"start":{"line":98,"character":0},"end":{"line":112,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/expr.rs","range":{"start":{"line":2463,"character":4},"end":{"line":2472,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs","range":{"start":{"line":647,"character":4},"end":{"line":655,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs","range":{"start":{"line":811,"character":4},"end":{"line":819,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/ty.rs","range":{"start":{"line":1057,"character":4},"end":{"line":1065,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/parse.rs","range":{"start":{"line":1037,"character":0},"end":{"line":1045,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":517,"character":9}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":7,"line":2037},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":11,"line":2037},"start":{"character":7,"line":2037}}},"id":5} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":5,"result":{"range":{"start":{"line":2037,"character":7},"end":{"line":2037,"character":11}},"command":{"title":"7 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2037,"character":7},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2036,"character":0},"end":{"line":2036,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2041,"character":0},"end":{"line":2056,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2067,"character":0},"end":{"line":2067,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2036,"character":0},"end":{"line":2036,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2065,"character":0},"end":{"line":2065,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2066,"character":0},"end":{"line":2066,"character":36}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2058,"character":0},"end":{"line":2063,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2037,"character":7}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":11,"line":2076},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":2076},"start":{"character":11,"line":2076}}},"id":6} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":6,"result":{"range":{"start":{"line":2076,"character":11},"end":{"line":2076,"character":15}},"command":{"title":"8 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2076,"character":11},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2075,"character":0},"end":{"line":2075,"character":16}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2080,"character":0},"end":{"line":2092,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2108,"character":0},"end":{"line":2109,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2111,"character":0},"end":{"line":2117,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2102,"character":0},"end":{"line":2103,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2105,"character":0},"end":{"line":2106,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2094,"character":0},"end":{"line":2100,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/itertools-0.9.0/src/peeking_take_while.rs","range":{"start":{"line":137,"character":0},"end":{"line":137,"character":61}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2076,"character":11}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":11,"line":2126},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":18,"line":2126},"start":{"character":11,"line":2126}}},"id":7} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":7,"result":{"range":{"start":{"line":2126,"character":11},"end":{"line":2126,"character":18}},"command":{"title":"6 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2126,"character":11},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2125,"character":0},"end":{"line":2125,"character":16}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2130,"character":0},"end":{"line":2142,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2157,"character":0},"end":{"line":2158,"character":47}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2152,"character":0},"end":{"line":2153,"character":47}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2155,"character":0},"end":{"line":2156,"character":43}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2144,"character":0},"end":{"line":2150,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2126,"character":11}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":11,"line":2167},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":19,"line":2167},"start":{"character":11,"line":2167}}},"id":8} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":8,"result":{"range":{"start":{"line":2167,"character":11},"end":{"line":2167,"character":19}},"command":{"title":"7 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2167,"character":11},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2165,"character":0},"end":{"line":2165,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2171,"character":0},"end":{"line":2183,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2199,"character":0},"end":{"line":2200,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2165,"character":0},"end":{"line":2165,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2193,"character":0},"end":{"line":2194,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2196,"character":0},"end":{"line":2197,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2185,"character":0},"end":{"line":2191,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2167,"character":11}}}}} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.code_lens./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> [{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::is_some","location":{"targetRange":{"end":{"character":5,"line":554},"start":{"character":4,"line":537}},"targetSelectionRange":{"end":{"character":5,"line":554},"start":{"character":4,"line":537}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":554},"start":{"character":4,"line":537}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some_and","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::is_some_and","location":{"targetRange":{"end":{"character":5,"line":577},"start":{"character":4,"line":556}},"targetSelectionRange":{"end":{"character":5,"line":577},"start":{"character":4,"line":556}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":577},"start":{"character":4,"line":556}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_none","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::is_none","location":{"targetRange":{"end":{"character":5,"line":597},"start":{"character":4,"line":579}},"targetSelectionRange":{"end":{"character":5,"line":597},"start":{"character":4,"line":579}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":597},"start":{"character":4,"line":579}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_ref","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_ref","location":{"targetRange":{"end":{"character":5,"line":630},"start":{"character":4,"line":603}},"targetSelectionRange":{"end":{"character":5,"line":630},"start":{"character":4,"line":603}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":630},"start":{"character":4,"line":603}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_mut","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_mut","location":{"targetRange":{"end":{"character":5,"line":652},"start":{"character":4,"line":632}},"targetSelectionRange":{"end":{"character":5,"line":652},"start":{"character":4,"line":632}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":652},"start":{"character":4,"line":632}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::expect","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::expect","location":{"targetRange":{"end":{"character":5,"line":739},"start":{"character":4,"line":692}},"targetSelectionRange":{"end":{"character":5,"line":739},"start":{"character":4,"line":692}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":739},"start":{"character":4,"line":692}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap","location":{"targetRange":{"end":{"character":5,"line":776},"start":{"character":4,"line":741}},"targetSelectionRange":{"end":{"character":5,"line":776},"start":{"character":4,"line":741}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":776},"start":{"character":4,"line":741}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_or","location":{"targetRange":{"end":{"character":5,"line":803},"start":{"character":4,"line":778}},"targetSelectionRange":{"end":{"character":5,"line":803},"start":{"character":4,"line":778}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":803},"start":{"character":4,"line":778}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_or_else","location":{"targetRange":{"end":{"character":5,"line":826},"start":{"character":4,"line":805}},"targetSelectionRange":{"end":{"character":5,"line":826},"start":{"character":4,"line":805}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":826},"start":{"character":4,"line":805}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_default","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_or_default","location":{"targetRange":{"end":{"character":5,"line":865},"start":{"character":4,"line":828}},"targetSelectionRange":{"end":{"character":5,"line":865},"start":{"character":4,"line":828}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":865},"start":{"character":4,"line":828}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_unchecked","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_unchecked","location":{"targetRange":{"end":{"character":5,"line":898},"start":{"character":4,"line":867}},"targetSelectionRange":{"end":{"character":5,"line":898},"start":{"character":4,"line":867}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":898},"start":{"character":4,"line":867}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::map","location":{"targetRange":{"end":{"character":5,"line":931},"start":{"character":4,"line":904}},"targetSelectionRange":{"end":{"character":5,"line":931},"start":{"character":4,"line":904}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":931},"start":{"character":4,"line":904}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::inspect","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::inspect","location":{"targetRange":{"end":{"character":5,"line":961},"start":{"character":4,"line":933}},"targetSelectionRange":{"end":{"character":5,"line":961},"start":{"character":4,"line":933}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":961},"start":{"character":4,"line":933}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::map_or","location":{"targetRange":{"end":{"character":5,"line":994},"start":{"character":4,"line":963}},"targetSelectionRange":{"end":{"character":5,"line":994},"start":{"character":4,"line":963}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":994},"start":{"character":4,"line":963}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::map_or_else","location":{"targetRange":{"end":{"character":5,"line":1024},"start":{"character":4,"line":996}},"targetSelectionRange":{"end":{"character":5,"line":1024},"start":{"character":4,"line":996}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1024},"start":{"character":4,"line":996}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::ok_or","location":{"targetRange":{"end":{"character":5,"line":1058},"start":{"character":4,"line":1026}},"targetSelectionRange":{"end":{"character":5,"line":1058},"start":{"character":4,"line":1026}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1058},"start":{"character":4,"line":1026}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::ok_or_else","location":{"targetRange":{"end":{"character":5,"line":1088},"start":{"character":4,"line":1060}},"targetSelectionRange":{"end":{"character":5,"line":1088},"start":{"character":4,"line":1060}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1088},"start":{"character":4,"line":1060}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_deref","location":{"targetRange":{"end":{"character":5,"line":1114},"start":{"character":4,"line":1090}},"targetSelectionRange":{"end":{"character":5,"line":1114},"start":{"character":4,"line":1090}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1114},"start":{"character":4,"line":1090}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref_mut","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_deref_mut","location":{"targetRange":{"end":{"character":5,"line":1140},"start":{"character":4,"line":1116}},"targetSelectionRange":{"end":{"character":5,"line":1140},"start":{"character":4,"line":1116}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1140},"start":{"character":4,"line":1116}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::iter","location":{"targetRange":{"end":{"character":5,"line":1162},"start":{"character":4,"line":1146}},"targetSelectionRange":{"end":{"character":5,"line":1162},"start":{"character":4,"line":1146}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1162},"start":{"character":4,"line":1146}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter_mut","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::iter_mut","location":{"targetRange":{"end":{"character":5,"line":1183},"start":{"character":4,"line":1164}},"targetSelectionRange":{"end":{"character":5,"line":1183},"start":{"character":4,"line":1164}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1183},"start":{"character":4,"line":1164}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::and","location":{"targetRange":{"end":{"character":5,"line":1222},"start":{"character":4,"line":1189}},"targetSelectionRange":{"end":{"character":5,"line":1222},"start":{"character":4,"line":1189}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1222},"start":{"character":4,"line":1189}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and_then","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::and_then","location":{"targetRange":{"end":{"character":5,"line":1264},"start":{"character":4,"line":1224}},"targetSelectionRange":{"end":{"character":5,"line":1264},"start":{"character":4,"line":1224}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1264},"start":{"character":4,"line":1224}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::filter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::filter","location":{"targetRange":{"end":{"character":5,"line":1305},"start":{"character":4,"line":1266}},"targetSelectionRange":{"end":{"character":5,"line":1305},"start":{"character":4,"line":1266}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1305},"start":{"character":4,"line":1266}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::or","location":{"targetRange":{"end":{"character":5,"line":1345},"start":{"character":4,"line":1307}},"targetSelectionRange":{"end":{"character":5,"line":1345},"start":{"character":4,"line":1307}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1345},"start":{"character":4,"line":1307}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::or_else","location":{"targetRange":{"end":{"character":5,"line":1372},"start":{"character":4,"line":1347}},"targetSelectionRange":{"end":{"character":5,"line":1372},"start":{"character":4,"line":1347}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1372},"start":{"character":4,"line":1347}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::xor","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::xor","location":{"targetRange":{"end":{"character":5,"line":1407},"start":{"character":4,"line":1374}},"targetSelectionRange":{"end":{"character":5,"line":1407},"start":{"character":4,"line":1374}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1407},"start":{"character":4,"line":1374}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::insert","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::insert","location":{"targetRange":{"end":{"character":5,"line":1444},"start":{"character":4,"line":1413}},"targetSelectionRange":{"end":{"character":5,"line":1444},"start":{"character":4,"line":1413}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1444},"start":{"character":4,"line":1413}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::get_or_insert","location":{"targetRange":{"end":{"character":5,"line":1480},"start":{"character":4,"line":1446}},"targetSelectionRange":{"end":{"character":5,"line":1480},"start":{"character":4,"line":1446}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1480},"start":{"character":4,"line":1446}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_default","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::get_or_insert_default","location":{"targetRange":{"end":{"character":5,"line":1513},"start":{"character":4,"line":1482}},"targetSelectionRange":{"end":{"character":5,"line":1513},"start":{"character":4,"line":1482}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1513},"start":{"character":4,"line":1482}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_with","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::get_or_insert_with","location":{"targetRange":{"end":{"character":5,"line":1549},"start":{"character":4,"line":1515}},"targetSelectionRange":{"end":{"character":5,"line":1549},"start":{"character":4,"line":1515}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1549},"start":{"character":4,"line":1515}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::take","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::take","location":{"targetRange":{"end":{"character":5,"line":1576},"start":{"character":4,"line":1555}},"targetSelectionRange":{"end":{"character":5,"line":1576},"start":{"character":4,"line":1555}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1576},"start":{"character":4,"line":1555}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::replace","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::replace","location":{"targetRange":{"end":{"character":5,"line":1600},"start":{"character":4,"line":1578}},"targetSelectionRange":{"end":{"character":5,"line":1600},"start":{"character":4,"line":1578}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1600},"start":{"character":4,"line":1578}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::contains","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::contains","location":{"targetRange":{"end":{"character":5,"line":1630},"start":{"character":4,"line":1602}},"targetSelectionRange":{"end":{"character":5,"line":1630},"start":{"character":4,"line":1602}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1630},"start":{"character":4,"line":1602}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::zip","location":{"targetRange":{"end":{"character":5,"line":1658},"start":{"character":4,"line":1632}},"targetSelectionRange":{"end":{"character":5,"line":1658},"start":{"character":4,"line":1632}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1658},"start":{"character":4,"line":1632}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip_with","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::zip_with","location":{"targetRange":{"end":{"character":5,"line":1701},"start":{"character":4,"line":1660}},"targetSelectionRange":{"end":{"character":5,"line":1701},"start":{"character":4,"line":1660}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1701},"start":{"character":4,"line":1660}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<(T,U)>::unzip","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<(T,U)>::unzip","location":{"targetRange":{"end":{"character":5,"line":1728},"start":{"character":4,"line":1705}},"targetSelectionRange":{"end":{"character":5,"line":1728},"start":{"character":4,"line":1705}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1728},"start":{"character":4,"line":1705}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::copied","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&T>::copied","location":{"targetRange":{"end":{"character":5,"line":1757},"start":{"character":4,"line":1732}},"targetSelectionRange":{"end":{"character":5,"line":1757},"start":{"character":4,"line":1732}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1757},"start":{"character":4,"line":1732}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::cloned","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&T>::cloned","location":{"targetRange":{"end":{"character":5,"line":1782},"start":{"character":4,"line":1759}},"targetSelectionRange":{"end":{"character":5,"line":1782},"start":{"character":4,"line":1759}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1782},"start":{"character":4,"line":1759}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::copied","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&mutT>::copied","location":{"targetRange":{"end":{"character":5,"line":1809},"start":{"character":4,"line":1786}},"targetSelectionRange":{"end":{"character":5,"line":1809},"start":{"character":4,"line":1786}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1809},"start":{"character":4,"line":1786}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::cloned","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&mutT>::cloned","location":{"targetRange":{"end":{"character":5,"line":1834},"start":{"character":4,"line":1811}},"targetSelectionRange":{"end":{"character":5,"line":1834},"start":{"character":4,"line":1811}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1834},"start":{"character":4,"line":1811}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Result<T,E>>::transpose","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<Result<T,E>>::transpose","location":{"targetRange":{"end":{"character":5,"line":1863},"start":{"character":4,"line":1838}},"targetSelectionRange":{"end":{"character":5,"line":1863},"start":{"character":4,"line":1838}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1863},"start":{"character":4,"line":1838}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::default","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::default","location":{"targetRange":{"end":{"character":5,"line":1917},"start":{"character":4,"line":1906}},"targetSelectionRange":{"end":{"character":5,"line":1917},"start":{"character":4,"line":1906}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1917},"start":{"character":4,"line":1906}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::into_iter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::into_iter","location":{"targetRange":{"end":{"character":5,"line":1941},"start":{"character":4,"line":1925}},"targetSelectionRange":{"end":{"character":5,"line":1941},"start":{"character":4,"line":1925}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1941},"start":{"character":4,"line":1925}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::from","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::from","location":{"targetRange":{"end":{"character":5,"line":1978},"start":{"character":4,"line":1967}},"targetSelectionRange":{"end":{"character":5,"line":1978},"start":{"character":4,"line":1967}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1978},"start":{"character":4,"line":1967}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::from","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&T>::from","location":{"targetRange":{"end":{"character":5,"line":2006},"start":{"character":4,"line":1984}},"targetSelectionRange":{"end":{"character":5,"line":2006},"start":{"character":4,"line":1984}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2006},"start":{"character":4,"line":1984}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::from","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&mutT>::from","location":{"targetRange":{"end":{"character":5,"line":2029},"start":{"character":4,"line":2012}},"targetSelectionRange":{"end":{"character":5,"line":2029},"start":{"character":4,"line":2012}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2029},"start":{"character":4,"line":2012}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<V>::from_iter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<V>::from_iter","location":{"targetRange":{"end":{"character":5,"line":2274},"start":{"character":4,"line":2208}},"targetSelectionRange":{"end":{"character":5,"line":2274},"start":{"character":4,"line":2208}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2274},"start":{"character":4,"line":2208}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Option<T>>::flatten","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<Option<T>>::flatten","location":{"targetRange":{"end":{"character":5,"line":2354},"start":{"character":4,"line":2322}},"targetSelectionRange":{"end":{"character":5,"line":2354},"start":{"character":4,"line":2322}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2354},"start":{"character":4,"line":2322}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":9,"line":517},[{"range":{"end":{"character":1,"line":1702},"start":{"character":0,"line":532}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1729},"start":{"character":0,"line":1704}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1783},"start":{"character":0,"line":1731}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1835},"start":{"character":0,"line":1785}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1864},"start":{"character":0,"line":1837}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2355},"start":{"character":0,"line":2321}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":77},"start":{"character":0,"line":72}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":1,"line":84},"start":{"character":0,"line":79}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2306},"start":{"character":0,"line":2297}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2314},"start":{"character":0,"line":2308}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2275},"start":{"character":0,"line":2206}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1979},"start":{"character":0,"line":1964}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2007},"start":{"character":0,"line":1981}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2030},"start":{"character":0,"line":2009}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1901},"start":{"character":0,"line":1880}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2295},"start":{"character":0,"line":2277}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":230},"start":{"character":0,"line":216}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2319},"start":{"character":0,"line":2316}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1942},"start":{"character":0,"line":1920}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1952},"start":{"character":0,"line":1944}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1962},"start":{"character":0,"line":1954}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":157},"start":{"character":0,"line":149}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/slice/cmp.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":1,"line":214},"start":{"character":0,"line":189}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs"},{"range":{"end":{"character":1,"line":1918},"start":{"character":0,"line":1903}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":35,"line":175},"start":{"character":4,"line":175}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs"},{"range":{"end":{"character":1,"line":96},"start":{"character":0,"line":61}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs"},{"range":{"end":{"character":1,"line":127},"start":{"character":0,"line":112}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/arc-swap-0.4.7/src/ref_cnt.rs"},{"range":{"end":{"character":1,"line":14},"start":{"character":0,"line":4}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/future/option.rs"},{"range":{"end":{"character":43,"line":9},"start":{"character":0,"line":9}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/calls.rs"},{"range":{"end":{"character":1,"line":386},"start":{"character":0,"line":380}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/io.rs"},{"range":{"end":{"character":1,"line":22},"start":{"character":0,"line":14}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot-0.10.2/src/util.rs"},{"range":{"end":{"character":1,"line":20},"start":{"character":0,"line":12}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot_core-0.7.2/src/util.rs"},{"range":{"end":{"character":1,"line":114},"start":{"character":0,"line":108}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/quote-1.0.7/src/to_tokens.rs"},{"range":{"end":{"character":1,"line":653},"start":{"character":0,"line":635}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/de/impls.rs"},{"range":{"end":{"character":1,"line":112},"start":{"character":0,"line":98}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/ser/impls.rs"},{"range":{"end":{"character":5,"line":2472},"start":{"character":4,"line":2463}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/expr.rs"},{"range":{"end":{"character":5,"line":655},"start":{"character":4,"line":647}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs"},{"range":{"end":{"character":5,"line":819},"start":{"character":4,"line":811}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs"},{"range":{"end":{"character":5,"line":1065},"start":{"character":4,"line":1057}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/ty.rs"},{"range":{"end":{"character":1,"line":1045},"start":{"character":0,"line":1037}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/parse.rs"}]],"command":"rust-analyzer.showReferences","title":"75 implementations"},"data":{"impls":{"position":{"character":9,"line":517},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":517},"start":{"character":9,"line":517}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":7,"line":2037},[{"range":{"end":{"character":23,"line":2036},"start":{"character":0,"line":2036}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2056},"start":{"character":0,"line":2041}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2067},"start":{"character":0,"line":2067}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":23,"line":2036},"start":{"character":0,"line":2036}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2065},"start":{"character":0,"line":2065}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":36,"line":2066},"start":{"character":0,"line":2066}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2063},"start":{"character":0,"line":2058}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}]],"command":"rust-analyzer.showReferences","title":"7 implementations"},"data":{"impls":{"position":{"character":7,"line":2037},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":11,"line":2037},"start":{"character":7,"line":2037}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":11,"line":2076},[{"range":{"end":{"character":16,"line":2075},"start":{"character":0,"line":2075}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2092},"start":{"character":0,"line":2080}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2109},"start":{"character":0,"line":2108}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2117},"start":{"character":0,"line":2111}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2103},"start":{"character":0,"line":2102}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2106},"start":{"character":0,"line":2105}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2100},"start":{"character":0,"line":2094}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":61,"line":137},"start":{"character":0,"line":137}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/itertools-0.9.0/src/peeking_take_while.rs"}]],"command":"rust-analyzer.showReferences","title":"8 implementations"},"data":{"impls":{"position":{"character":11,"line":2076},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":2076},"start":{"character":11,"line":2076}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":11,"line":2126},[{"range":{"end":{"character":16,"line":2125},"start":{"character":0,"line":2125}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2142},"start":{"character":0,"line":2130}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":47,"line":2158},"start":{"character":0,"line":2157}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":47,"line":2153},"start":{"character":0,"line":2152}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":43,"line":2156},"start":{"character":0,"line":2155}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2150},"start":{"character":0,"line":2144}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}]],"command":"rust-analyzer.showReferences","title":"6 implementations"},"data":{"impls":{"position":{"character":11,"line":2126},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":18,"line":2126},"start":{"character":11,"line":2126}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":11,"line":2167},[{"range":{"end":{"character":23,"line":2165},"start":{"character":0,"line":2165}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2183},"start":{"character":0,"line":2171}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2200},"start":{"character":0,"line":2199}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":23,"line":2165},"start":{"character":0,"line":2165}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2194},"start":{"character":0,"line":2193}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2197},"start":{"character":0,"line":2196}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2191},"start":{"character":0,"line":2185}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}]],"command":"rust-analyzer.showReferences","title":"7 implementations"},"data":{"impls":{"position":{"character":11,"line":2167},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":19,"line":2167},"start":{"character":11,"line":2167}}}] 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":31} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 31, "jsonrpc": "2.0", "result": "n"} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,0,22,[]],"id":32} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 32, "jsonrpc": "2.0", "result": 0} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.inlay_hints./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> [] 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 1899, "start": 1877}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 1887}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(1887)}), "viewport": Object({"end": Number(1899), "start": Number(1877)})}) force_redraw=false 17:00:16 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 1887 17:00:16 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 1877, end: 1899 } 17:00:16 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> {"end":1899,"start":1877} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":33} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 33, "jsonrpc": "2.0", "result": 0} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.highlights./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> [] 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":34} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 34, "jsonrpc": "2.0", "result": "n"} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,1877,1899,[]],"id":35} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 35, "jsonrpc": "2.0", "result": 0} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 22, "start": 0}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 0}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:21 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) force_redraw=false 17:04:21 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 1887 ==> 0 17:04:21 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 0, end: 22 } 17:04:21 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 1877 ==> 0 17:04:21 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 1899 ==> 22 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":36} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 36, "jsonrpc": "2.0", "result": 0} 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":37} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 37, "jsonrpc": "2.0", "result": "n"} 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,0,22,[]],"id":38} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 38, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 42, "start": 20}, "languageId": "rust", "buftype": "", "position": {"character": 2, "line": 20}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:30 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(2), "line": Number(20)}), "viewport": Object({"end": Number(42), "start": Number(20)})}) force_redraw=false 17:04:30 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 0 ==> 20 17:04:30 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 20, end: 42 } 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 22 ==> 42 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 0 ==> 20 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":39} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 39, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":40} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 40, "jsonrpc": "2.0", "result": "n"} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,20,42,[]],"id":41} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 41, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 62, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 6, "line": 40}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:30 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(6), "line": Number(40)}), "viewport": Object({"end": Number(62), "start": Number(40)})}) force_redraw=false 17:04:30 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 20 ==> 40 17:04:30 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 40, end: 62 } 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 42 ==> 62 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 20 ==> 40 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":42} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 42, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":43} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 43, "jsonrpc": "2.0", "result": "n"} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,40,62,[]],"id":44} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 44, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 82, "start": 60}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 60}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:31 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(60)}), "viewport": Object({"end": Number(82), "start": Number(60)})}) force_redraw=false 17:04:31 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 40 ==> 60 17:04:31 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 60, end: 82 } 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 62 ==> 82 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 40 ==> 60 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":45} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 45, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":46} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 46, "jsonrpc": "2.0", "result": "n"} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,60,82,[]],"id":47} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 47, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 101, "start": 80}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 80}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:31 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(80)}), "viewport": Object({"end": Number(101), "start": Number(80)})}) force_redraw=false 17:04:31 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 60 ==> 80 17:04:31 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 80, end: 101 } 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 82 ==> 101 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 60 ==> 80 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":48} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 48, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":49} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 49, "jsonrpc": "2.0", "result": "n"} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,80,101,[]],"id":50} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 50, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 119, "start": 99}, "languageId": "rust", "buftype": "", "position": {"character": 2, "line": 99}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:31 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(2), "line": Number(99)}), "viewport": Object({"end": Number(119), "start": Number(99)})}) force_redraw=false 17:04:31 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 80 ==> 99 17:04:31 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 99, end: 119 } 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 101 ==> 119 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 80 ==> 99 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":51} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 51, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":52} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 52, "jsonrpc": "2.0", "result": "n"} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,99,119,[]],"id":53} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 53, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 139, "start": 117}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 117}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:32 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(117)}), "viewport": Object({"end": Number(139), "start": Number(117)})}) force_redraw=false 17:04:32 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 99 ==> 117 17:04:32 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 117, end: 139 } 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 99 ==> 117 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 119 ==> 139 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":54} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 54, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":55} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 55, "jsonrpc": "2.0", "result": "n"} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,117,139,[]],"id":56} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 56, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 159, "start": 137}, "languageId": "rust", "buftype": "", "position": {"character": 2, "line": 137}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:32 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(2), "line": Number(137)}), "viewport": Object({"end": Number(159), "start": Number(137)})}) force_redraw=false 17:04:32 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 117 ==> 137 17:04:32 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 137, end: 159 } 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 117 ==> 137 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 139 ==> 159 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":57} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 57, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":58} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 58, "jsonrpc": "2.0", "result": "n"} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,137,159,[]],"id":59} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 59, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 179, "start": 157}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 157}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:32 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(157)}), "viewport": Object({"end": Number(179), "start": Number(157)})}) force_redraw=false 17:04:32 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 137 ==> 157 17:04:32 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 157, end: 179 } 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 137 ==> 157 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 159 ==> 179 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":60} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 60, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":61} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 61, "jsonrpc": "2.0", "result": "n"} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,157,179,[]],"id":62} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 62, "jsonrpc": "2.0", "result": 0} 17:04:36 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleBufEnter", "jsonrpc": "2.0", "params": {"bufnr": 1, "languageId": "rust", "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:36 INFO unnamed src/language_server_protocol.rs:2739 handle_buf_enter; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust")}) 17:04:36 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_isServerRunning",1]} 17:04:36 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:36 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:36 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 157 ==> 49 17:04:39 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:39 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:39 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 50 17:04:39 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:39 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:39 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 51 17:04:39 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:39 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:39 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 50 17:04:40 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:40 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:40 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 49 20:30:13 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:13 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:13 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 20:30:13 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:13 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:13 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 49 20:30:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 50 20:30:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:16 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:16 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 51 20:30:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 29, "line": 52}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:16 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(29), "line": Number(52)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:16 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 52 20:30:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 52 ==> 51 20:30:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 50 20:30:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 49 20:30:18 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:18 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:18 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 20:30:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:19 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:19 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 49 22:39:14 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:14 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:14 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 50 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 51 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 50 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 49 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 22:39:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 49 22:39:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 22:39:18 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 47}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:18 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(47)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:18 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 47 22:39:18 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:18 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:18 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 47 ==> 48 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 75, "start": 57}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 57}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:19 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(57)}), "viewport": Object({"end": Number(75), "start": Number(57)})}) force_redraw=false 22:39:19 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 57 22:39:19 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 57, end: 75 } 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.start: 40 ==> 57 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.end: 59 ==> 75 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":63} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 63, "jsonrpc": "2.0", "result": 0} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":64} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 64, "jsonrpc": "2.0", "result": "n"} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,57,75,[]],"id":65} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 65, "jsonrpc": "2.0", "result": 0} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 58}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:19 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(58)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:19 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 57 ==> 58 22:39:19 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 40, end: 59 } 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.end: 75 ==> 59 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.start: 57 ==> 40 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":66} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 66, "jsonrpc": "2.0", "result": 0} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":67} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 67, "jsonrpc": "2.0", "result": "n"} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,40,59,[]],"id":68} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 68, "jsonrpc": "2.0", "result": 0} 16:45:09 INFO reader-None src/rpcclient.rs:241 reader-None terminated [-- Attachment #3: Type: text/plain, Size: 290 bytes --] This is an uncontrived, "in the wild" log file that I was C-n and C-p'ing when I discovered this "non-problem." I speculate at least half your users would consider this a regression, although perhaps not one serious enough to revert your changes. Some of them would consider this a bug. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 18:13 ` dick @ 2022-09-08 18:26 ` Gregory Heytings 2022-09-09 6:00 ` Eli Zaretskii 1 sibling, 0 replies; 54+ messages in thread From: Gregory Heytings @ 2022-09-08 18:26 UTC (permalink / raw) To: dick; +Cc: 57669 > > This is an uncontrived, "in the wild" log file that I was C-n and > C-p'ing when I discovered this "non-problem." > I'm not sure what that file is supposed to demonstrate? Yes, sometimes point moves to another column. Why is that a problem while navigating through that particular file? Is Emacs unusable? > > I speculate at least half your users would consider this a regression, > although perhaps not one serious enough to revert your changes. Some of > them would consider this a bug. > If you have ideas to improve the situation in one way or another, feel free to share them. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-08 18:13 ` dick 2022-09-08 18:26 ` Gregory Heytings @ 2022-09-09 6:00 ` Eli Zaretskii 2022-09-09 13:08 ` dick 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 6:00 UTC (permalink / raw) To: dick; +Cc: gregory, 57669 > Cc: 57669@debbugs.gnu.org > From: dick <dick.r.chiang@gmail.com> > Date: Thu, 08 Sep 2022 14:13:29 -0400 > > This is an uncontrived, "in the wild" log file that I was C-n and > C-p'ing when I discovered this "non-problem." Are you saying that this log file didn't have lines whose length is in excess of the long-line-threshold value? Then it's a bug that we would like to investigate, so please tell more details, and perhaps post an example of such a file. If the file did have such very long lines, then the question is: are your Emacs and your patience capable of coping with editing this file with the long-line optimizations disabled? If the answer is YES, all you need to do is make the value of long-line-threshold higher, or even set it to nil, and you get what Emacs did previously. C-n and C-p will work correctly. It might take them forever to do their job, but it will be done much more accurately. > I speculate at least half your users would consider this a regression, > although perhaps not one serious enough to revert your changes. Some of > them would consider this a bug. It is a regression if it happens in files with reasonable line length. It is not a regression if it happens in files with very long lines, because before the change Emacs couldn't cope with such files at all, to the degree that would cause users kill the Emacs session. Now such files _can_ be edited, but with some minor features working in sub-optimal manner. Specifically, wrt C-n/C-p, let me remind you that the line-move-visual = t operation that you say doesn't always work with very long lines, didn't exist at all before Emacs 23, so at least one solution is to turn it off, if its occasional misbehavior is unacceptable for you. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 6:00 ` Eli Zaretskii @ 2022-09-09 13:08 ` dick 2022-09-09 13:38 ` Gregory Heytings 2022-09-09 14:12 ` Eli Zaretskii 0 siblings, 2 replies; 54+ messages in thread From: dick @ 2022-09-09 13:08 UTC (permalink / raw) To: Eli Zaretskii; +Cc: gregory, 57669 > because before the change Emacs couldn't cope with such files at all Oh, I know what you're trying to do. After all Commercial Emacs's original attempt at "making the best of a bad situation" was the impetus for your own poke at the pig. When 29 goes mainstream, just be prepared to auto-reply "Does your file have a long line?" when feckless users ask, "Why did C-n go to a weird column?" And to be clear, you're going from "ineffable" performance to just "underwhelming." As of cb036a7 you still need find-file-literally for some semblance of respectability. OUTPUT: Under long-line-threshold=nil find-file 62s Under long-line-threshold=10000 find-file 27s Under long-line-threshold=nil find-file-literally 30s Under long-line-threshold=10000 find-file-literally 4s INPUT: C-n through file of alternating short and long lines. src/emacs -Q -l cl-lib --eval " \ (let ((long-line-threshold 10000) \ (file (make-temp-file \"baz\"))) \ (cl-assert (= 80 (window-width)) t) \ (with-temp-file file \ (dotimes (i 100) \ (insert (make-string (if (zerop (% i 2)) \ 200 \ (1+ long-line-threshold)) \ ?x) \"\n\"))) \ (dolist (config (list (cons nil (function find-file)) \ (cons long-line-threshold (function find-file)) \ (cons nil (function find-file-literally)) \ (cons long-line-threshold (function find-file-literally)))) \ (let* ((long-line-threshold (car config)) \ (note (format \"long-line-threshold=%s %s\" \ (car config) (cdr config))) \ (buffer (funcall (cdr config) file))) \ (with-current-buffer buffer \ (show-paren-mode -1) \ (goto-char (point-min)) \ (princ (format \"Under %s %ds\n\" note \ (fround (car (benchmark-run \ (while (condition-case nil \ (prog1 t (call-interactively \ (function next-line)) \ (redisplay)) \ (end-of-buffer))))))) \ (function external-debugging-output))) \ (kill-buffer buffer))) \ (kill-emacs))" ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 13:08 ` dick @ 2022-09-09 13:38 ` Gregory Heytings 2022-09-09 14:34 ` dick 2022-09-09 14:12 ` Eli Zaretskii 1 sibling, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 13:38 UTC (permalink / raw) To: dick; +Cc: Eli Zaretskii, 57669 > > When 29 goes mainstream, just be prepared to auto-reply "Does your file > have a long line?" when feckless users ask, "Why did C-n go to a weird > column?" > We are prepared. > > And to be clear, you're going from "ineffable" performance to just > "underwhelming." As of cb036a7 you still need find-file-literally for > some semblance of respectability. > Again your test case doesn't demonstrate anything useful, sorry. You use a buffer with 100 lines, half of which are just one character above the threshold. That's not at all representative, previous versions of Emacs (I tried 24, 25, 26, 27 and 28) can already edit such buffers fine. Try the same with a buffer with 10 lines, each of which is 10 MB long. Or with a buffer with a single 100 MB long line. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 13:38 ` Gregory Heytings @ 2022-09-09 14:34 ` dick 2022-09-09 14:39 ` Gregory Heytings 2022-09-09 15:49 ` Eli Zaretskii 0 siblings, 2 replies; 54+ messages in thread From: dick @ 2022-09-09 14:34 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 > Try the same with a buffer with 10 lines, each of which is 10 MB long. I don't have the patience for 10MB. How about 0.1MB? OUTPUT: Under long-line-threshold=nil find-file ineffable Under long-line-threshold=10000 find-file 99s Under long-line-threshold=nil find-file-literally ineffable Under long-line-threshold=10000 find-file-literally 8s INPUT: src/emacs -Q -l cl-lib --eval " \ (let ((large-file-warning-threshold (truncate 1e9)) \ (long-line-threshold 10000) \ (file (make-temp-file \"baz\"))) \ (cl-assert (= 80 (window-width)) t) \ (with-temp-file file \ (dotimes (i 10) \ (insert (make-string (truncate 1e5) ?x) \"\n\"))) \ (dolist (config (list (cons nil (function find-file)) \ (cons long-line-threshold (function find-file)) \ (cons nil (function find-file-literally)) \ (cons long-line-threshold (function find-file-literally)))) \ (let* ((long-line-threshold (car config)) \ (note (format \"long-line-threshold=%s %s\" \ (car config) (cdr config))) \ (buffer (funcall (cdr config) file))) \ (if (null (car config)) \ (princ (format \"Under %s ineffable\n\" note) \ (function external-debugging-output)) \ (with-current-buffer buffer \ (show-paren-mode -1) \ (goto-char (point-min)) \ (princ (format \"Under %s %ds\n\" note \ (fround (car (benchmark-run \ (while (condition-case nil \ (prog1 t (call-interactively \ (function next-line)) \ (redisplay)) \ (end-of-buffer))))))) \ (function external-debugging-output))) \ (kill-buffer buffer)))) \ (kill-emacs))" ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 14:34 ` dick @ 2022-09-09 14:39 ` Gregory Heytings 2022-09-09 15:06 ` dick 2022-09-09 15:49 ` Eli Zaretskii 1 sibling, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 14:39 UTC (permalink / raw) To: dick; +Cc: 57669 > > I don't have the patience for 10MB. How about 0.1MB? > > OUTPUT: > > Under long-line-threshold=nil find-file ineffable > Under long-line-threshold=10000 find-file 99s > Under long-line-threshold=nil find-file-literally ineffable > Under long-line-threshold=10000 find-file-literally 8s > And what's your conclusion now? BTW, actually calculating the time instead of writing "ineffable" because it takes too long would be useful. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 14:39 ` Gregory Heytings @ 2022-09-09 15:06 ` dick 2022-09-09 15:41 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 15:06 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 > And what's your conclusion now? The same? I'll repeat: And to be clear, you're going from "ineffable" performance to just "underwhelming." As of cb036a7 you still need find-file-literally for some semblance of respectability. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:06 ` dick @ 2022-09-09 15:41 ` Gregory Heytings 2022-09-09 16:30 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 15:41 UTC (permalink / raw) To: dick; +Cc: 57669 >> And what's your conclusion now? > > The same? I'll repeat: > > And to be clear, you're going from "ineffable" performance to just > "underwhelming." As of cb036a7 you still need find-file-literally for > some semblance of respectability. > A rather strange conclusion. Open a 1 MB file with short lines (under 80 chars) and use your benchmark on such a file. You'll see that scrolling through the whole buffer, one line at a time, takes quite some time, too. Here it takes about 20 seconds, and your benchmark (with find-file and 10 lines that are each 100K characters) takes 120 seconds. That's much better than "just underwhelming", isn't it? Not to mention that such a benchmark is itself not representative of an actual use of an editor. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:41 ` Gregory Heytings @ 2022-09-09 16:30 ` dick 2022-09-09 16:42 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 16:30 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 [-- Attachment #1: Type: text/plain, Size: 32 bytes --] > A rather strange conclusion. [-- Attachment #2: languageclient.out --] [-- Type: text/plain, Size: 584464 bytes --] ####### LanguageClient 0.1.161 ####### 16:30:46 DEBUG unnamed src/language_client.rs:108 state: null ==> {"capabilities":{},"code_lens":{},"diagnostics":{},"highlight_match_ids":[],"highlight_source":null,"highlights":{},"highlights_placed":{},"initialization_options":null,"inlay_hints":{},"last_cursor_line":0,"last_line_diagnostic":" ","logger":{"level":"DEBUG","path":"/tmp/shiz"},"namespace_ids":{},"registrations":[],"roots":{},"semantic_highlights":{},"semantic_scope_to_hl_group_table":{},"semantic_scopes":{},"stashed_code_action_actions":[],"text_documents":{},"text_documents_metadata":{},"user_handlers":{},"viewports":{}} 16:30:46 INFO unnamed src/language_server_protocol.rs:3580 settings synced 16:30:46 INFO unnamed src/language_server_protocol.rs:3607 Project root: /home/dick/LanguageClient-neovim 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:EchomsgEllipsis","params":["Project root: /home/dick/LanguageClient-neovim"]} 16:30:46 DEBUG unnamed src/language_client.rs:108 state.roots.rust: null ==> "/home/dick/LanguageClient-neovim" 16:30:46 INFO unnamed src/language_server_protocol.rs:840 initialize; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:command","params":["sign define LanguageClientWarning text= texthl=LanguageClientWarningSign","sign define LanguageClientError text= texthl=LanguageClientErrorSign","sign define LanguageClientInformation text= texthl=LanguageClientInfoSign","sign define LanguageClientHint text= texthl=LanguageClientInfoSign"]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["s:hasSnippetSupport()"],"id":3} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 3, "jsonrpc": "2.0", "result": 0} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"codeAction":{"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"colorProvider":{"dynamicRegistration":false},"completion":{"completionItem":{"insertReplaceSupport":false,"snippetSupport":false}},"declaration":{"linkSupport":true},"definition":{"linkSupport":true},"hover":{},"implementation":{"linkSupport":true},"publishDiagnostics":{"relatedInformation":true},"semanticHighlightingCapabilities":{"semanticHighlighting":true},"signatureHelp":{"signatureInformation":{"parameterInformation":{"labelOffsetSupport":true}}},"typeDefinition":{"linkSupport":true}},"workspace":{"applyEdit":true,"didChangeWatchedFiles":{"dynamicRegistration":true}}},"clientInfo":{"name":"LanguageClient-neovim","version":"0.1.161"},"processId":243451,"rootPath":"/home/dick/LanguageClient-neovim","rootUri":"file:///home/dick/LanguageClient-neovim","trace":"off"},"id":0} 16:30:46 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":0,"result":{"capabilities":{"textDocumentSync":{"openClose":true,"change":2,"save":{}},"selectionRangeProvider":true,"hoverProvider":true,"completionProvider":{"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 (8ddb8b7e8 2022-09-03)"}}} 16:30:46 DEBUG unnamed src/language_client.rs:108 state.capabilities.rust: null ==> {"capabilities":{"callHierarchyProvider":true,"codeActionProvider":{"codeActionKinds":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite"],"resolveProvider":true},"codeLensProvider":{"resolveProvider":true},"completionProvider":{"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,"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":{},"workspaceSymbolProvider":true},"serverInfo":{"name":"rust-analyzer","version":"0.0.0 (8ddb8b7e8 2022-09-03)"}} 16:30:46 INFO unnamed src/language_server_protocol.rs:567 register_cm_source; language_id="rust" result=Object({"capabilities": Object({"callHierarchyProvider": Bool(true), "codeActionProvider": Object({"codeActionKinds": Array([String(""), String("quickfix"), String("refactor"), String("refactor.extract"), String("refactor.inline"), String("refactor.rewrite")]), "resolveProvider": Bool(true)}), "codeLensProvider": Object({"resolveProvider": Bool(true)}), "completionProvider": Object({"completionItem": Object({"labelDetailsSupport": Bool(false)}), "triggerCharacters": Array([String(":"), String("."), String("'"), String("(")])}), "declarationProvider": Bool(true), "definitionProvider": Bool(true), "documentFormattingProvider": Bool(true), "documentHighlightProvider": Bool(true), "documentOnTypeFormattingProvider": Object({"firstTriggerCharacter": String("="), "moreTriggerCharacter": Array([String("."), String(">"), String("{")])}), "documentRangeFormattingProvider": Bool(false), "documentSymbolProvider": Bool(true), "experimental": Object({"externalDocs": Bool(true), "hoverRange": Bool(true), "joinLines": Bool(true), "matchingBrace": Bool(true), "moveItem": Bool(true), "onEnter": Bool(true), "openCargoToml": Bool(true), "parentModule": Bool(true), "runnables": Object({"kinds": Array([String("cargo")])}), "ssr": Bool(true), "workspaceSymbolScopeKindFiltering": Bool(true)}), "foldingRangeProvider": Bool(true), "hoverProvider": Bool(true), "implementationProvider": Bool(true), "inlayHintProvider": Object({"resolveProvider": Bool(true)}), "referencesProvider": Bool(true), "renameProvider": Object({"prepareProvider": Bool(true)}), "selectionRangeProvider": Bool(true), "semanticTokensProvider": Object({"full": Object({"delta": Bool(true)}), "legend": Object({"tokenModifiers": Array([String("documentation"), String("declaration"), String("static"), String("defaultLibrary"), String("async"), String("attribute"), String("callable"), String("constant"), String("consuming"), String("controlFlow"), String("crateRoot"), String("injected"), String("intraDocLink"), String("library"), String("mutable"), String("public"), String("reference"), String("trait"), String("unsafe")]), "tokenTypes": Array([String("comment"), String("decorator"), String("enumMember"), String("enum"), String("function"), String("interface"), String("keyword"), String("macro"), String("method"), String("namespace"), String("number"), String("operator"), String("parameter"), String("property"), String("string"), String("struct"), String("typeParameter"), String("variable"), String("angle"), String("arithmetic"), String("attribute"), String("attributeBracket"), String("bitwise"), String("boolean"), String("brace"), String("bracket"), String("builtinAttribute"), String("builtinType"), String("character"), String("colon"), String("comma"), String("comparison"), String("constParameter"), String("derive"), String("deriveHelper"), String("dot"), String("escapeSequence"), String("formatSpecifier"), String("generic"), String("label"), String("lifetime"), String("logical"), String("macroBang"), String("parenthesis"), String("punctuation"), String("selfKeyword"), String("selfTypeKeyword"), String("semicolon"), String("typeAlias"), String("toolModule"), String("union"), String("unresolvedReference")])}), "range": Bool(true)}), "signatureHelpProvider": Object({"triggerCharacters": Array([String("("), String(","), String("<")])}), "textDocumentSync": Object({"change": Number(2), "openClose": Bool(true), "save": Object({})}), "typeDefinitionProvider": Bool(true), "workspace": Object({"fileOperations": Object({"willRename": Object({"filters": Array([Object({"pattern": Object({"glob": String("**/*.rs"), "matches": String("file")}), "scheme": String("file")}), Object({"pattern": Object({"glob": String("**"), "matches": String("folder")}), "scheme": String("file")})])})})}), "workspaceSymbolProvider": Bool(true)}), "serverInfo": Object({"name": String("rust-analyzer"), "version": String("0.0.0 (8ddb8b7e8 2022-09-03)")})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["exists('g:cm_matcher')"],"id":4} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 4, "jsonrpc": "2.0", "result": 0} 16:30:46 INFO unnamed src/language_server_protocol.rs:607 register_ncm2_source; language_id="rust" result=Object({"capabilities": Object({"callHierarchyProvider": Bool(true), "codeActionProvider": Object({"codeActionKinds": Array([String(""), String("quickfix"), String("refactor"), String("refactor.extract"), String("refactor.inline"), String("refactor.rewrite")]), "resolveProvider": Bool(true)}), "codeLensProvider": Object({"resolveProvider": Bool(true)}), "completionProvider": Object({"completionItem": Object({"labelDetailsSupport": Bool(false)}), "triggerCharacters": Array([String(":"), String("."), String("'"), String("(")])}), "declarationProvider": Bool(true), "definitionProvider": Bool(true), "documentFormattingProvider": Bool(true), "documentHighlightProvider": Bool(true), "documentOnTypeFormattingProvider": Object({"firstTriggerCharacter": String("="), "moreTriggerCharacter": Array([String("."), String(">"), String("{")])}), "documentRangeFormattingProvider": Bool(false), "documentSymbolProvider": Bool(true), "experimental": Object({"externalDocs": Bool(true), "hoverRange": Bool(true), "joinLines": Bool(true), "matchingBrace": Bool(true), "moveItem": Bool(true), "onEnter": Bool(true), "openCargoToml": Bool(true), "parentModule": Bool(true), "runnables": Object({"kinds": Array([String("cargo")])}), "ssr": Bool(true), "workspaceSymbolScopeKindFiltering": Bool(true)}), "foldingRangeProvider": Bool(true), "hoverProvider": Bool(true), "implementationProvider": Bool(true), "inlayHintProvider": Object({"resolveProvider": Bool(true)}), "referencesProvider": Bool(true), "renameProvider": Object({"prepareProvider": Bool(true)}), "selectionRangeProvider": Bool(true), "semanticTokensProvider": Object({"full": Object({"delta": Bool(true)}), "legend": Object({"tokenModifiers": Array([String("documentation"), String("declaration"), String("static"), String("defaultLibrary"), String("async"), String("attribute"), String("callable"), String("constant"), String("consuming"), String("controlFlow"), String("crateRoot"), String("injected"), String("intraDocLink"), String("library"), String("mutable"), String("public"), String("reference"), String("trait"), String("unsafe")]), "tokenTypes": Array([String("comment"), String("decorator"), String("enumMember"), String("enum"), String("function"), String("interface"), String("keyword"), String("macro"), String("method"), String("namespace"), String("number"), String("operator"), String("parameter"), String("property"), String("string"), String("struct"), String("typeParameter"), String("variable"), String("angle"), String("arithmetic"), String("attribute"), String("attributeBracket"), String("bitwise"), String("boolean"), String("brace"), String("bracket"), String("builtinAttribute"), String("builtinType"), String("character"), String("colon"), String("comma"), String("comparison"), String("constParameter"), String("derive"), String("deriveHelper"), String("dot"), String("escapeSequence"), String("formatSpecifier"), String("generic"), String("label"), String("lifetime"), String("logical"), String("macroBang"), String("parenthesis"), String("punctuation"), String("selfKeyword"), String("selfTypeKeyword"), String("semicolon"), String("typeAlias"), String("toolModule"), String("union"), String("unresolvedReference")])}), "range": Bool(true)}), "signatureHelpProvider": Object({"triggerCharacters": Array([String("("), String(","), String("<")])}), "textDocumentSync": Object({"change": Number(2), "openClose": Bool(true), "save": Object({})}), "typeDefinitionProvider": Bool(true), "workspace": Object({"fileOperations": Object({"willRename": Object({"filters": Array([Object({"pattern": Object({"glob": String("**/*.rs"), "matches": String("file")}), "scheme": String("file")}), Object({"pattern": Object({"glob": String("**"), "matches": String("folder")}), "scheme": String("file")})])})})}), "workspaceSymbolProvider": Bool(true)}), "serverInfo": Object({"name": String("rust-analyzer"), "version": String("0.0.0 (8ddb8b7e8 2022-09-03)")})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["exists('g:ncm2_loaded')"],"id":5} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 5, "jsonrpc": "2.0", "result": 0} 16:30:46 INFO unnamed src/language_server_protocol.rs:647 parse_semantic_scopes; language_id="rust" result=Object({"capabilities": Object({"callHierarchyProvider": Bool(true), "codeActionProvider": Object({"codeActionKinds": Array([String(""), String("quickfix"), String("refactor"), String("refactor.extract"), String("refactor.inline"), String("refactor.rewrite")]), "resolveProvider": Bool(true)}), "codeLensProvider": Object({"resolveProvider": Bool(true)}), "completionProvider": Object({"completionItem": Object({"labelDetailsSupport": Bool(false)}), "triggerCharacters": Array([String(":"), String("."), String("'"), String("(")])}), "declarationProvider": Bool(true), "definitionProvider": Bool(true), "documentFormattingProvider": Bool(true), "documentHighlightProvider": Bool(true), "documentOnTypeFormattingProvider": Object({"firstTriggerCharacter": String("="), "moreTriggerCharacter": Array([String("."), String(">"), String("{")])}), "documentRangeFormattingProvider": Bool(false), "documentSymbolProvider": Bool(true), "experimental": Object({"externalDocs": Bool(true), "hoverRange": Bool(true), "joinLines": Bool(true), "matchingBrace": Bool(true), "moveItem": Bool(true), "onEnter": Bool(true), "openCargoToml": Bool(true), "parentModule": Bool(true), "runnables": Object({"kinds": Array([String("cargo")])}), "ssr": Bool(true), "workspaceSymbolScopeKindFiltering": Bool(true)}), "foldingRangeProvider": Bool(true), "hoverProvider": Bool(true), "implementationProvider": Bool(true), "inlayHintProvider": Object({"resolveProvider": Bool(true)}), "referencesProvider": Bool(true), "renameProvider": Object({"prepareProvider": Bool(true)}), "selectionRangeProvider": Bool(true), "semanticTokensProvider": Object({"full": Object({"delta": Bool(true)}), "legend": Object({"tokenModifiers": Array([String("documentation"), String("declaration"), String("static"), String("defaultLibrary"), String("async"), String("attribute"), String("callable"), String("constant"), String("consuming"), String("controlFlow"), String("crateRoot"), String("injected"), String("intraDocLink"), String("library"), String("mutable"), String("public"), String("reference"), String("trait"), String("unsafe")]), "tokenTypes": Array([String("comment"), String("decorator"), String("enumMember"), String("enum"), String("function"), String("interface"), String("keyword"), String("macro"), String("method"), String("namespace"), String("number"), String("operator"), String("parameter"), String("property"), String("string"), String("struct"), String("typeParameter"), String("variable"), String("angle"), String("arithmetic"), String("attribute"), String("attributeBracket"), String("bitwise"), String("boolean"), String("brace"), String("bracket"), String("builtinAttribute"), String("builtinType"), String("character"), String("colon"), String("comma"), String("comparison"), String("constParameter"), String("derive"), String("deriveHelper"), String("dot"), String("escapeSequence"), String("formatSpecifier"), String("generic"), String("label"), String("lifetime"), String("logical"), String("macroBang"), String("parenthesis"), String("punctuation"), String("selfKeyword"), String("selfTypeKeyword"), String("semicolon"), String("typeAlias"), String("toolModule"), String("union"), String("unresolvedReference")])}), "range": Bool(true)}), "signatureHelpProvider": Object({"triggerCharacters": Array([String("("), String(","), String("<")])}), "textDocumentSync": Object({"change": Number(2), "openClose": Bool(true), "save": Object({})}), "typeDefinitionProvider": Bool(true), "workspace": Object({"fileOperations": Object({"willRename": Object({"filters": Array([Object({"pattern": Object({"glob": String("**/*.rs"), "matches": String("file")}), "scheme": String("file")}), Object({"pattern": Object({"glob": String("**"), "matches": String("folder")}), "scheme": String("file")})])})})}), "workspaceSymbolProvider": Bool(true)}), "serverInfo": Object({"name": String("rust-analyzer"), "version": String("0.0.0 (8ddb8b7e8 2022-09-03)")})}) 16:30:46 INFO unnamed src/language_server_protocol.rs:1019 initialized; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 INFO unnamed src/language_server_protocol.rs:666 update_semantic_highlight_tables; language_id="rust" 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"initialized","params":{}} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":6} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 6, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:30:46 INFO unnamed src/language_server_protocol.rs:1946 text_document_did_open; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_isServerRunning",1]} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{"rust":{"all_targets":false,"build_on_save":true,"clippy_preference":"on","wait_to_build":0}}}} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientStarted"]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"LSP#text","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs"],"id":7} 16:30:46 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":0,"method":"workspace/configuration","params":{"items":[{"section":"rust-analyzer"}]}} 16:30:46 ERROR unnamed src/rpchandler.rs:27 Error handling message: Message not handled: MethodCall { jsonrpc: Some(V2), method: "workspace/configuration", params: Map({"items": Array([Object({"section": String("rust-analyzer")})])}), id: Num(0) } Message: {"jsonrpc":"2.0","method":"workspace/configuration","params":{"items":[{"section":"rust-analyzer"}]},"id":0} Error: Message not handled: MethodCall { jsonrpc: Some(V2), method: "workspace/configuration", params: Map({"items": Array([Object({"section": String("rust-analyzer")})])}), id: Num(0) } 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","error":{"code":-32603,"message":"Message not handled: MethodCall { jsonrpc: Some(V2), method: \"workspace/configuration\", params: Map({\"items\": Array([Object({\"section\": String(\"rust-analyzer\")})])}), id: Num(0) }"},"id":0} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 7, "jsonrpc": "2.0", "result": ["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};", "use anyhow::{anyhow, Result};", "use crossbeam::channel::{bounded, unbounded, Receiver, Sender};", "use log::*;", "use regex::Regex;", "use serde::{de::DeserializeOwned, Serialize};", "use std::io::Write;", "use std::str::FromStr;", "use std::{", " collections::HashMap,", " io::BufRead,", " sync::atomic::{AtomicU64, Ordering},", " thread,", " time::Duration,", "};", "", "const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;", "", "lazy_static! {", " // this regex is used to remove some additional fields that we get from some servers, namely:", " // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.", " static ref RE_REMOVE_EXTRA_FIELDS: Regex =", " Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();", "}", "", "#[derive(Serialize)]", "pub struct RpcClient {", " language_id: LanguageId,", " #[serde(skip_serializing)]", " id: AtomicU64,", " #[serde(skip_serializing)]", " writer_tx: Sender<RawMessage>,", " #[serde(skip_serializing)]", " reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,", " pub process_id: Option<u32>,", "}", "", "impl RpcClient {", " #[allow(clippy::new_ret_no_self)]", " pub fn new(", " language_id: LanguageId,", " reader: impl BufRead + Send + 'static,", " writer: impl Write + Send + 'static,", " process_id: Option<u32>,", " sink: Sender<Call>,", " on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,", " ) -> Result<Self> {", " let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();", "", " let language_id_clone = language_id.clone();", " let reader_thread_name = format!(\"reader-{:?}\", language_id);", " let on_crash_clone = on_crash.clone();", " thread::Builder::new()", " .name(reader_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {", " on_crash_clone(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);", " }", " })?;", "", " let (writer_tx, writer_rx) = unbounded();", " let writer_thread_name = format!(\"writer-{:?}\", language_id);", " let language_id_clone = language_id.clone();", " thread::Builder::new()", " .name(writer_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {", " on_crash(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);", " }", " })?;", "", " Ok(Self {", " language_id,", " id: AtomicU64::default(),", " process_id,", " reader_tx,", " writer_tx,", " })", " }", "", " pub fn call<R: DeserializeOwned>(", " &self,", " method: impl AsRef<str>,", " params: impl Serialize,", " ) -> Result<R> {", " let method = method.as_ref();", " let id = self.id.fetch_add(1, Ordering::SeqCst);", " let msg = jsonrpc_core::MethodCall {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " let (tx, rx) = bounded(1);", " self.reader_tx.send((id, tx))?;", " self.writer_tx.send(RawMessage::MethodCall(msg))?;", " // TODO: duration from config.", " match rx.recv_timeout(Duration::from_secs(60))? {", " jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),", " // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,", " // which we don't want to show to the user and should ignore, as the result of the", " // request that triggered this error has been invalidated by changes to the state", " // of the server, so we must handle this error specifically.", " jsonrpc_core::Output::Failure(err)", " if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>", " {", " Err(anyhow::Error::from(LSError::ContentModified))", " }", " jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),", " }", " }", "", " pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {", " let method = method.as_ref();", "", " let msg = jsonrpc_core::Notification {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " self.writer_tx.send(RawMessage::Notification(msg))?;", " Ok(())", " }", "", " pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {", " let output = match result {", " Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " result: serde_json::to_value(ok)?,", " }),", " Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " error: err.to_rpc_error(),", " }),", " };", "", " self.writer_tx.send(RawMessage::Output(output))?;", " Ok(())", " }", "}", "", "fn loop_read(", " reader: impl BufRead,", " reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,", " sink: &Sender<Call>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut pending_outputs = HashMap::new();", "", " // Count how many consequent empty lines.", " let mut count_empty_lines = 0;", "", " let mut reader = reader;", " let mut content_length = 0;", " loop {", " let mut message = String::new();", " let mut line = String::new();", " if language_id.is_some() {", " reader.read_line(&mut line)?;", " let line = line.trim();", " if line.is_empty() {", " count_empty_lines += 1;", " if count_empty_lines > 5 {", " return Err(anyhow!(\"Unable to read from language server\"));", " }", "", " let mut buf = vec![0; content_length];", " reader.read_exact(buf.as_mut_slice())?;", " message = String::from_utf8(buf)?;", " } else {", " count_empty_lines = 0;", " if !line.starts_with(\"Content-Length\") {", " continue;", " }", "", " let tokens: Vec<&str> = line.splitn(2, ':').collect();", " let len = tokens", " .get(1)", " .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?", " .trim();", " content_length = usize::from_str(len)?;", " }", " } else if reader.read_line(&mut message)? == 0 {", " break;", " }", "", " let message = message.trim();", " if message.is_empty() {", " continue;", " }", " debug!(\"<= {:?} {}\", language_id, message);", " // FIXME: Remove extra `meta` property from javascript-typescript-langserver and", " // `requestMethod` sent by Sorbet.", " let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let message = serde_json::from_str(&s);", " if let Err(ref err) = message {", " error!(", " \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",", " err, s, err", " );", " continue;", " }", " // TODO: cleanup.", " let message = message.unwrap();", " match message {", " RawMessage::MethodCall(method_call) => {", " sink.send(Call::MethodCall(language_id.clone(), method_call))?;", " }", " RawMessage::Notification(notification) => {", " sink.send(Call::Notification(language_id.clone(), notification))?;", " }", " RawMessage::Output(output) => {", " while let Ok((id, tx)) = reader_rx.try_recv() {", " pending_outputs.insert(id, tx);", " }", "", " if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {", " tx.send(output)", " .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;", " }", " }", " };", " }", "", " info!(\"reader-{:?} terminated\", language_id);", " Ok(())", "}", "", "fn loop_write(", " writer: impl Write,", " rx: &Receiver<RawMessage>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut writer = writer;", "", " for msg in rx.iter() {", " let s = serde_json::to_string(&msg)?;", " debug!(\"=> {:?} {}\", language_id, s);", " if language_id.is_none() {", " // Use different convention for two reasons,", " // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim", " // receives `content`.", " // 2. Without last line ending, vim output handler won't be triggered.", " write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;", " } else {", " write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;", " };", " writer.flush()?;", " }", " Ok(())", "}", "", "#[cfg(test)]", "mod test {", " use super::RE_REMOVE_EXTRA_FIELDS;", " use crate::types::RawMessage;", "", " #[test]", " // The library we're using for json-rpc doesn't accept extra fields in the structs used to", " // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so", " // the client fails to deserialize that response.", " // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is", " // suboptimal, so we now try to remove the extra fields we know of from the response.", " //", " // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892", " fn it_should_remove_extra_fields() {", " // it removes the requestMethod field from Sorbet", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " let message =", " r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " // it removes the meta field from javascript-typescript-langserver", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", " }", "}", ""]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["s:GetVar('LanguageClient_setOmnifunc', v:true)"],"id":8} 16:30:46 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 8, "jsonrpc": "2.0", "result": true} 16:30:46 DEBUG unnamed src/language_client.rs:108 state.text_documents./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> {"languageId":"rust","text":"use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};\nuse anyhow::{anyhow, Result};\nuse crossbeam::channel::{bounded, unbounded, Receiver, Sender};\nuse log::*;\nuse regex::Regex;\nuse serde::{de::DeserializeOwned, Serialize};\nuse std::io::Write;\nuse std::str::FromStr;\nuse std::{\n collections::HashMap,\n io::BufRead,\n sync::atomic::{AtomicU64, Ordering},\n thread,\n time::Duration,\n};\n\nconst CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;\n\nlazy_static! {\n // this regex is used to remove some additional fields that we get from some servers, namely:\n // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.\n static ref RE_REMOVE_EXTRA_FIELDS: Regex =\n Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();\n}\n\n#[derive(Serialize)]\npub struct RpcClient {\n language_id: LanguageId,\n #[serde(skip_serializing)]\n id: AtomicU64,\n #[serde(skip_serializing)]\n writer_tx: Sender<RawMessage>,\n #[serde(skip_serializing)]\n reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,\n pub process_id: Option<u32>,\n}\n\nimpl RpcClient {\n #[allow(clippy::new_ret_no_self)]\n pub fn new(\n language_id: LanguageId,\n reader: impl BufRead + Send + 'static,\n writer: impl Write + Send + 'static,\n process_id: Option<u32>,\n sink: Sender<Call>,\n on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,\n ) -> Result<Self> {\n let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();\n\n let language_id_clone = language_id.clone();\n let reader_thread_name = format!(\"reader-{:?}\", language_id);\n let on_crash_clone = on_crash.clone();\n thread::Builder::new()\n .name(reader_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {\n on_crash_clone(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);\n }\n })?;\n\n let (writer_tx, writer_rx) = unbounded();\n let writer_thread_name = format!(\"writer-{:?}\", language_id);\n let language_id_clone = language_id.clone();\n thread::Builder::new()\n .name(writer_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {\n on_crash(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);\n }\n })?;\n\n Ok(Self {\n language_id,\n id: AtomicU64::default(),\n process_id,\n reader_tx,\n writer_tx,\n })\n }\n\n pub fn call<R: DeserializeOwned>(\n &self,\n method: impl AsRef<str>,\n params: impl Serialize,\n ) -> Result<R> {\n let method = method.as_ref();\n let id = self.id.fetch_add(1, Ordering::SeqCst);\n let msg = jsonrpc_core::MethodCall {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n let (tx, rx) = bounded(1);\n self.reader_tx.send((id, tx))?;\n self.writer_tx.send(RawMessage::MethodCall(msg))?;\n // TODO: duration from config.\n match rx.recv_timeout(Duration::from_secs(60))? {\n jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),\n // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,\n // which we don't want to show to the user and should ignore, as the result of the\n // request that triggered this error has been invalidated by changes to the state\n // of the server, so we must handle this error specifically.\n jsonrpc_core::Output::Failure(err)\n if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>\n {\n Err(anyhow::Error::from(LSError::ContentModified))\n }\n jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),\n }\n }\n\n pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {\n let method = method.as_ref();\n\n let msg = jsonrpc_core::Notification {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n self.writer_tx.send(RawMessage::Notification(msg))?;\n Ok(())\n }\n\n pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {\n let output = match result {\n Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n result: serde_json::to_value(ok)?,\n }),\n Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n error: err.to_rpc_error(),\n }),\n };\n\n self.writer_tx.send(RawMessage::Output(output))?;\n Ok(())\n }\n}\n\nfn loop_read(\n reader: impl BufRead,\n reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,\n sink: &Sender<Call>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut pending_outputs = HashMap::new();\n\n // Count how many consequent empty lines.\n let mut count_empty_lines = 0;\n\n let mut reader = reader;\n let mut content_length = 0;\n loop {\n let mut message = String::new();\n let mut line = String::new();\n if language_id.is_some() {\n reader.read_line(&mut line)?;\n let line = line.trim();\n if line.is_empty() {\n count_empty_lines += 1;\n if count_empty_lines > 5 {\n return Err(anyhow!(\"Unable to read from language server\"));\n }\n\n let mut buf = vec![0; content_length];\n reader.read_exact(buf.as_mut_slice())?;\n message = String::from_utf8(buf)?;\n } else {\n count_empty_lines = 0;\n if !line.starts_with(\"Content-Length\") {\n continue;\n }\n\n let tokens: Vec<&str> = line.splitn(2, ':').collect();\n let len = tokens\n .get(1)\n .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?\n .trim();\n content_length = usize::from_str(len)?;\n }\n } else if reader.read_line(&mut message)? == 0 {\n break;\n }\n\n let message = message.trim();\n if message.is_empty() {\n continue;\n }\n debug!(\"<= {:?} {}\", language_id, message);\n // FIXME: Remove extra `meta` property from javascript-typescript-langserver and\n // `requestMethod` sent by Sorbet.\n let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let message = serde_json::from_str(&s);\n if let Err(ref err) = message {\n error!(\n \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",\n err, s, err\n );\n continue;\n }\n // TODO: cleanup.\n let message = message.unwrap();\n match message {\n RawMessage::MethodCall(method_call) => {\n sink.send(Call::MethodCall(language_id.clone(), method_call))?;\n }\n RawMessage::Notification(notification) => {\n sink.send(Call::Notification(language_id.clone(), notification))?;\n }\n RawMessage::Output(output) => {\n while let Ok((id, tx)) = reader_rx.try_recv() {\n pending_outputs.insert(id, tx);\n }\n\n if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {\n tx.send(output)\n .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;\n }\n }\n };\n }\n\n info!(\"reader-{:?} terminated\", language_id);\n Ok(())\n}\n\nfn loop_write(\n writer: impl Write,\n rx: &Receiver<RawMessage>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut writer = writer;\n\n for msg in rx.iter() {\n let s = serde_json::to_string(&msg)?;\n debug!(\"=> {:?} {}\", language_id, s);\n if language_id.is_none() {\n // Use different convention for two reasons,\n // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim\n // receives `content`.\n // 2. Without last line ending, vim output handler won't be triggered.\n write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;\n } else {\n write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;\n };\n writer.flush()?;\n }\n Ok(())\n}\n\n#[cfg(test)]\nmod test {\n use super::RE_REMOVE_EXTRA_FIELDS;\n use crate::types::RawMessage;\n\n #[test]\n // The library we're using for json-rpc doesn't accept extra fields in the structs used to\n // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so\n // the client fails to deserialize that response.\n // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is\n // suboptimal, so we now try to remove the extra fields we know of from the response.\n //\n // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892\n fn it_should_remove_extra_fields() {\n // it removes the requestMethod field from Sorbet\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n let message =\n r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n // it removes the meta field from javascript-typescript-langserver\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n }\n}\n","uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs","version":0} 16:30:46 INFO unnamed src/language_server_protocol.rs:1888 text_document_code_lens; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:command","params":["setlocal omnifunc=LanguageClient#complete"]} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"rust","text":"use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};\nuse anyhow::{anyhow, Result};\nuse crossbeam::channel::{bounded, unbounded, Receiver, Sender};\nuse log::*;\nuse regex::Regex;\nuse serde::{de::DeserializeOwned, Serialize};\nuse std::io::Write;\nuse std::str::FromStr;\nuse std::{\n collections::HashMap,\n io::BufRead,\n sync::atomic::{AtomicU64, Ordering},\n thread,\n time::Duration,\n};\n\nconst CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;\n\nlazy_static! {\n // this regex is used to remove some additional fields that we get from some servers, namely:\n // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.\n static ref RE_REMOVE_EXTRA_FIELDS: Regex =\n Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();\n}\n\n#[derive(Serialize)]\npub struct RpcClient {\n language_id: LanguageId,\n #[serde(skip_serializing)]\n id: AtomicU64,\n #[serde(skip_serializing)]\n writer_tx: Sender<RawMessage>,\n #[serde(skip_serializing)]\n reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,\n pub process_id: Option<u32>,\n}\n\nimpl RpcClient {\n #[allow(clippy::new_ret_no_self)]\n pub fn new(\n language_id: LanguageId,\n reader: impl BufRead + Send + 'static,\n writer: impl Write + Send + 'static,\n process_id: Option<u32>,\n sink: Sender<Call>,\n on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,\n ) -> Result<Self> {\n let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();\n\n let language_id_clone = language_id.clone();\n let reader_thread_name = format!(\"reader-{:?}\", language_id);\n let on_crash_clone = on_crash.clone();\n thread::Builder::new()\n .name(reader_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {\n on_crash_clone(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);\n }\n })?;\n\n let (writer_tx, writer_rx) = unbounded();\n let writer_thread_name = format!(\"writer-{:?}\", language_id);\n let language_id_clone = language_id.clone();\n thread::Builder::new()\n .name(writer_thread_name.clone())\n .spawn(move || {\n if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {\n match err.downcast_ref::<std::io::Error>() {\n Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {\n on_crash(&language_id_clone)\n }\n _ => {}\n }\n\n error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);\n }\n })?;\n\n Ok(Self {\n language_id,\n id: AtomicU64::default(),\n process_id,\n reader_tx,\n writer_tx,\n })\n }\n\n pub fn call<R: DeserializeOwned>(\n &self,\n method: impl AsRef<str>,\n params: impl Serialize,\n ) -> Result<R> {\n let method = method.as_ref();\n let id = self.id.fetch_add(1, Ordering::SeqCst);\n let msg = jsonrpc_core::MethodCall {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n let (tx, rx) = bounded(1);\n self.reader_tx.send((id, tx))?;\n self.writer_tx.send(RawMessage::MethodCall(msg))?;\n // TODO: duration from config.\n match rx.recv_timeout(Duration::from_secs(60))? {\n jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),\n // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,\n // which we don't want to show to the user and should ignore, as the result of the\n // request that triggered this error has been invalidated by changes to the state\n // of the server, so we must handle this error specifically.\n jsonrpc_core::Output::Failure(err)\n if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>\n {\n Err(anyhow::Error::from(LSError::ContentModified))\n }\n jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),\n }\n }\n\n pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {\n let method = method.as_ref();\n\n let msg = jsonrpc_core::Notification {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n method: method.to_owned(),\n params: params.to_params()?,\n };\n self.writer_tx.send(RawMessage::Notification(msg))?;\n Ok(())\n }\n\n pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {\n let output = match result {\n Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n result: serde_json::to_value(ok)?,\n }),\n Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {\n jsonrpc: Some(jsonrpc_core::Version::V2),\n id: jsonrpc_core::Id::Num(id),\n error: err.to_rpc_error(),\n }),\n };\n\n self.writer_tx.send(RawMessage::Output(output))?;\n Ok(())\n }\n}\n\nfn loop_read(\n reader: impl BufRead,\n reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,\n sink: &Sender<Call>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut pending_outputs = HashMap::new();\n\n // Count how many consequent empty lines.\n let mut count_empty_lines = 0;\n\n let mut reader = reader;\n let mut content_length = 0;\n loop {\n let mut message = String::new();\n let mut line = String::new();\n if language_id.is_some() {\n reader.read_line(&mut line)?;\n let line = line.trim();\n if line.is_empty() {\n count_empty_lines += 1;\n if count_empty_lines > 5 {\n return Err(anyhow!(\"Unable to read from language server\"));\n }\n\n let mut buf = vec![0; content_length];\n reader.read_exact(buf.as_mut_slice())?;\n message = String::from_utf8(buf)?;\n } else {\n count_empty_lines = 0;\n if !line.starts_with(\"Content-Length\") {\n continue;\n }\n\n let tokens: Vec<&str> = line.splitn(2, ':').collect();\n let len = tokens\n .get(1)\n .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?\n .trim();\n content_length = usize::from_str(len)?;\n }\n } else if reader.read_line(&mut message)? == 0 {\n break;\n }\n\n let message = message.trim();\n if message.is_empty() {\n continue;\n }\n debug!(\"<= {:?} {}\", language_id, message);\n // FIXME: Remove extra `meta` property from javascript-typescript-langserver and\n // `requestMethod` sent by Sorbet.\n let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let message = serde_json::from_str(&s);\n if let Err(ref err) = message {\n error!(\n \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",\n err, s, err\n );\n continue;\n }\n // TODO: cleanup.\n let message = message.unwrap();\n match message {\n RawMessage::MethodCall(method_call) => {\n sink.send(Call::MethodCall(language_id.clone(), method_call))?;\n }\n RawMessage::Notification(notification) => {\n sink.send(Call::Notification(language_id.clone(), notification))?;\n }\n RawMessage::Output(output) => {\n while let Ok((id, tx)) = reader_rx.try_recv() {\n pending_outputs.insert(id, tx);\n }\n\n if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {\n tx.send(output)\n .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;\n }\n }\n };\n }\n\n info!(\"reader-{:?} terminated\", language_id);\n Ok(())\n}\n\nfn loop_write(\n writer: impl Write,\n rx: &Receiver<RawMessage>,\n language_id: &LanguageId,\n) -> Result<()> {\n let mut writer = writer;\n\n for msg in rx.iter() {\n let s = serde_json::to_string(&msg)?;\n debug!(\"=> {:?} {}\", language_id, s);\n if language_id.is_none() {\n // Use different convention for two reasons,\n // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim\n // receives `content`.\n // 2. Without last line ending, vim output handler won't be triggered.\n write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;\n } else {\n write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;\n };\n writer.flush()?;\n }\n Ok(())\n}\n\n#[cfg(test)]\nmod test {\n use super::RE_REMOVE_EXTRA_FIELDS;\n use crate::types::RawMessage;\n\n #[test]\n // The library we're using for json-rpc doesn't accept extra fields in the structs used to\n // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so\n // the client fails to deserialize that response.\n // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is\n // suboptimal, so we now try to remove the extra fields we know of from the response.\n //\n // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892\n fn it_should_remove_extra_fields() {\n // it removes the requestMethod field from Sorbet\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n let message =\n r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n\n // it removes the meta field from javascript-typescript-langserver\n let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;\n let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");\n let result: Result<RawMessage, _> = serde_json::from_str(&message);\n assert!(result.is_ok());\n }\n}\n","uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs","version":0}}} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_projectRoot","/home/dick/LanguageClient-neovim"]} 16:30:46 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientTextDocumentDidOpenPost"]} 16:30:46 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/codeLens","params":{"textDocument":{"uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs"}},"id":1} 16:30:46 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":1,"error":{"code":-32801,"message":"waiting for cargo metadata or cargo check"}} 16:30:47 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":1,"method":"client/registerCapability","params":{"registrations":[{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}]}} 16:30:47 INFO unnamed src/language_server_protocol.rs:2489 client_register_capability; language_id="rust" params=Object({"registrations": Array([Object({"id": String("workspace/didChangeWatchedFiles"), "method": String("workspace/didChangeWatchedFiles"), "registerOptions": Object({"watchers": Array([Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/*.rs")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.toml")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.lock")})])})})])}) 16:30:47 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/*.rs 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/mod.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/server_command.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/clangd.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/gopls.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/java.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/mod.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/rust_analyzer.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_client.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_server_protocol.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/logger.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/main.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpcclient.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpchandler.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/sign.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/types.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/utils.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/viewport.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vim.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vimext.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/watcher.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-fa158a1d365cbdd8/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-4457d73fa8da0d46/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-7418c11d7db55b23/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/rls/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/libs.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/main.rs" 16:30:47 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.toml 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.toml" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.toml" 16:30:47 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.lock 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.lock" 16:30:47 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.lock" 16:30:47 DEBUG unnamed src/language_client.rs:108 state.registrations: [] ==> [{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}] 16:30:47 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","result":null,"id":1} 16:30:48 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":2,"method":"client/registerCapability","params":{"registrations":[{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}]}} 16:30:48 INFO unnamed src/language_server_protocol.rs:2489 client_register_capability; language_id="rust" params=Object({"registrations": Array([Object({"id": String("workspace/didChangeWatchedFiles"), "method": String("workspace/didChangeWatchedFiles"), "registerOptions": Object({"watchers": Array([Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/*.rs")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.toml")}), Object({"globPattern": String("/home/dick/LanguageClient-neovim/**/Cargo.lock")})])})})])}) 16:30:48 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/*.rs 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/mod.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/config/server_command.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/clangd.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/gopls.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/java.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/mod.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/extensions/rust_analyzer.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_client.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/language_server_protocol.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/logger.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/main.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpcclient.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/rpchandler.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/sign.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/types.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/utils.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/viewport.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vim.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/vimext.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/src/watcher.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/debug/build/anyhow-fa158a1d365cbdd8/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-4457d73fa8da0d46/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/release/build/anyhow-7418c11d7db55b23/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/target/rls/debug/build/anyhow-be1327a37b4de4c6/out/probe.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/libs.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/src/main.rs" 16:30:48 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.toml 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.toml" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.toml" 16:30:48 INFO unnamed src/language_server_protocol.rs:2512 Watching glob pattern: /home/dick/LanguageClient-neovim/**/Cargo.lock 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/Cargo.lock" 16:30:48 INFO unnamed src/language_server_protocol.rs:2524 Start watching path "/home/dick/LanguageClient-neovim/tests/data/sample-rs/Cargo.lock" 16:30:48 DEBUG unnamed src/language_client.rs:108 state.registrations: [{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}] ==> [{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}},{"id":"workspace/didChangeWatchedFiles","method":"workspace/didChangeWatchedFiles","registerOptions":{"watchers":[{"globPattern":"/home/dick/LanguageClient-neovim/**/*.rs"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.toml"},{"globPattern":"/home/dick/LanguageClient-neovim/**/Cargo.lock"}]}}] 16:30:48 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","result":null,"id":2} 16:31:04 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs","diagnostics":[],"version":0}} 16:31:04 INFO unnamed src/language_server_protocol.rs:2095 text_document_publish_diagnostics; params=Object({"diagnostics": Array([]), "uri": String("file:///home/dick/LanguageClient-neovim/src/rpcclient.rs"), "version": Number(0)}) 16:31:04 DEBUG unnamed src/language_client.rs:108 state.diagnostics./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> [] 16:31:04 INFO unnamed src/vim.rs:225 Begin setqflist 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setqflist","params":[[],"r"]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setqflist","params":[[],"a",{"title":"[LC]: diagnostics"}]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["bufnr('/home/dick/LanguageClient-neovim/src/rpcclient.rs')"],"id":9} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 9, "jsonrpc": "2.0", "result": 1} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_statusLineDiagnosticsCounts",{"E":0,"H":0,"I":0,"W":0}]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":10} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 10, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:31:04 DEBUG unnamed src/language_client.rs:108 state.highlights./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> [] 16:31:04 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Null force_redraw=true 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":11} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 11, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"getbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","&filetype"],"id":12} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 12, "jsonrpc": "2.0", "result": "rust"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#position()"],"id":13} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 13, "jsonrpc": "2.0", "result": {"character": 0, "line": 0}} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#viewport()"],"id":14} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 14, "jsonrpc": "2.0", "result": {"end": 20, "start": 0}} 16:31:04 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 0, end: 20 } 16:31:04 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs: null ==> {"end":20,"start":0} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":15} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 15, "jsonrpc": "2.0", "result": 0} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#filename()"],"id":16} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 16, "jsonrpc": "2.0", "result": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#viewport()"],"id":17} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 17, "jsonrpc": "2.0", "result": {"end": 20, "start": 0}} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["bufnr('/home/dick/LanguageClient-neovim/src/rpcclient.rs')"],"id":18} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 18, "jsonrpc": "2.0", "result": 1} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"nvim_create_namespace","params":["LanguageClient_VirtualText"],"id":19} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 19, "jsonrpc": "2.0", "result": 3} 16:31:04 DEBUG unnamed src/language_client.rs:108 state.namespace_ids.LanguageClient_VirtualText: null ==> 3 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":20} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 20, "jsonrpc": "2.0", "result": "c"} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,0,20,[]],"id":21} 16:31:04 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 21, "jsonrpc": "2.0", "result": 0} 16:31:04 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientDiagnosticsChanged"]} 17:00:02 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 20, "start": 0}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 1}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:00:02 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(1)}), "viewport": Object({"end": Number(20), "start": Number(0)})}) force_redraw=false 17:00:02 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:EchoEllipsis","params":[""]} 17:00:02 DEBUG unnamed src/language_client.rs:108 state.last_line_diagnostic: " " ==> "" 17:00:02 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 0 ==> 1 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 24, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:00:03 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(24), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:00:03 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 1 ==> 49 17:00:03 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 40, end: 59 } 17:00:03 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.start: 0 ==> 40 17:00:03 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.end: 20 ==> 59 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":22} 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 22, "jsonrpc": "2.0", "result": 0} 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":23} 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 23, "jsonrpc": "2.0", "result": "n"} 17:00:03 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,40,59,[]],"id":24} 17:00:03 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 24, "jsonrpc": "2.0", "result": 0} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 1, "jsonrpc": "2.0", "method": "textDocument/definition", "params": {"bufnr": 1, "character": 45, "handle": true, "languageId": "rust", "gotoCmd": null, "line": 49, "text": ["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};", "use anyhow::{anyhow, Result};", "use crossbeam::channel::{bounded, unbounded, Receiver, Sender};", "use log::*;", "use regex::Regex;", "use serde::{de::DeserializeOwned, Serialize};", "use std::io::Write;", "use std::str::FromStr;", "use std::{", " collections::HashMap,", " io::BufRead,", " sync::atomic::{AtomicU64, Ordering},", " thread,", " time::Duration,", "};", "", "const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;", "", "lazy_static! {", " // this regex is used to remove some additional fields that we get from some servers, namely:", " // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.", " static ref RE_REMOVE_EXTRA_FIELDS: Regex =", " Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();", "}", "", "#[derive(Serialize)]", "pub struct RpcClient {", " language_id: LanguageId,", " #[serde(skip_serializing)]", " id: AtomicU64,", " #[serde(skip_serializing)]", " writer_tx: Sender<RawMessage>,", " #[serde(skip_serializing)]", " reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,", " pub process_id: Option<u32>,", "}", "", "impl RpcClient {", " #[allow(clippy::new_ret_no_self)]", " pub fn new(", " language_id: LanguageId,", " reader: impl BufRead + Send + 'static,", " writer: impl Write + Send + 'static,", " process_id: Option<u32>,", " sink: Sender<Call>,", " on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,", " ) -> Result<Self> {", " let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();", "", " let language_id_clone = language_id.clone();", " let reader_thread_name = format!(\"reader-{:?}\", language_id);", " let on_crash_clone = on_crash.clone();", " thread::Builder::new()", " .name(reader_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {", " on_crash_clone(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);", " }", " })?;", "", " let (writer_tx, writer_rx) = unbounded();", " let writer_thread_name = format!(\"writer-{:?}\", language_id);", " let language_id_clone = language_id.clone();", " thread::Builder::new()", " .name(writer_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {", " on_crash(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);", " }", " })?;", "", " Ok(Self {", " language_id,", " id: AtomicU64::default(),", " process_id,", " reader_tx,", " writer_tx,", " })", " }", "", " pub fn call<R: DeserializeOwned>(", " &self,", " method: impl AsRef<str>,", " params: impl Serialize,", " ) -> Result<R> {", " let method = method.as_ref();", " let id = self.id.fetch_add(1, Ordering::SeqCst);", " let msg = jsonrpc_core::MethodCall {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " let (tx, rx) = bounded(1);", " self.reader_tx.send((id, tx))?;", " self.writer_tx.send(RawMessage::MethodCall(msg))?;", " // TODO: duration from config.", " match rx.recv_timeout(Duration::from_secs(60))? {", " jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),", " // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,", " // which we don't want to show to the user and should ignore, as the result of the", " // request that triggered this error has been invalidated by changes to the state", " // of the server, so we must handle this error specifically.", " jsonrpc_core::Output::Failure(err)", " if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>", " {", " Err(anyhow::Error::from(LSError::ContentModified))", " }", " jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),", " }", " }", "", " pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {", " let method = method.as_ref();", "", " let msg = jsonrpc_core::Notification {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " self.writer_tx.send(RawMessage::Notification(msg))?;", " Ok(())", " }", "", " pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {", " let output = match result {", " Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " result: serde_json::to_value(ok)?,", " }),", " Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " error: err.to_rpc_error(),", " }),", " };", "", " self.writer_tx.send(RawMessage::Output(output))?;", " Ok(())", " }", "}", "", "fn loop_read(", " reader: impl BufRead,", " reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,", " sink: &Sender<Call>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut pending_outputs = HashMap::new();", "", " // Count how many consequent empty lines.", " let mut count_empty_lines = 0;", "", " let mut reader = reader;", " let mut content_length = 0;", " loop {", " let mut message = String::new();", " let mut line = String::new();", " if language_id.is_some() {", " reader.read_line(&mut line)?;", " let line = line.trim();", " if line.is_empty() {", " count_empty_lines += 1;", " if count_empty_lines > 5 {", " return Err(anyhow!(\"Unable to read from language server\"));", " }", "", " let mut buf = vec![0; content_length];", " reader.read_exact(buf.as_mut_slice())?;", " message = String::from_utf8(buf)?;", " } else {", " count_empty_lines = 0;", " if !line.starts_with(\"Content-Length\") {", " continue;", " }", "", " let tokens: Vec<&str> = line.splitn(2, ':').collect();", " let len = tokens", " .get(1)", " .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?", " .trim();", " content_length = usize::from_str(len)?;", " }", " } else if reader.read_line(&mut message)? == 0 {", " break;", " }", "", " let message = message.trim();", " if message.is_empty() {", " continue;", " }", " debug!(\"<= {:?} {}\", language_id, message);", " // FIXME: Remove extra `meta` property from javascript-typescript-langserver and", " // `requestMethod` sent by Sorbet.", " let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let message = serde_json::from_str(&s);", " if let Err(ref err) = message {", " error!(", " \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",", " err, s, err", " );", " continue;", " }", " // TODO: cleanup.", " let message = message.unwrap();", " match message {", " RawMessage::MethodCall(method_call) => {", " sink.send(Call::MethodCall(language_id.clone(), method_call))?;", " }", " RawMessage::Notification(notification) => {", " sink.send(Call::Notification(language_id.clone(), notification))?;", " }", " RawMessage::Output(output) => {", " while let Ok((id, tx)) = reader_rx.try_recv() {", " pending_outputs.insert(id, tx);", " }", "", " if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {", " tx.send(output)", " .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;", " }", " }", " };", " }", "", " info!(\"reader-{:?} terminated\", language_id);", " Ok(())", "}", "", "fn loop_write(", " writer: impl Write,", " rx: &Receiver<RawMessage>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut writer = writer;", "", " for msg in rx.iter() {", " let s = serde_json::to_string(&msg)?;", " debug!(\"=> {:?} {}\", language_id, s);", " if language_id.is_none() {", " // Use different convention for two reasons,", " // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim", " // receives `content`.", " // 2. Without last line ending, vim output handler won't be triggered.", " write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;", " } else {", " write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;", " };", " writer.flush()?;", " }", " Ok(())", "}", "", "#[cfg(test)]", "mod test {", " use super::RE_REMOVE_EXTRA_FIELDS;", " use crate::types::RawMessage;", "", " #[test]", " // The library we're using for json-rpc doesn't accept extra fields in the structs used to", " // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so", " // the client fails to deserialize that response.", " // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is", " // suboptimal, so we now try to remove the extra fields we know of from the response.", " //", " // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892", " fn it_should_remove_extra_fields() {", " // it removes the requestMethod field from Sorbet", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " let message =", " r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " // it removes the meta field from javascript-typescript-langserver", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", " }", "}", ""], "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:1473 text_document_definition; params=Object({"bufnr": Number(1), "character": Number(45), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "gotoCmd": Null, "handle": Bool(true), "languageId": String("rust"), "line": Number(49), "text": Array([String("use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};"), String("use anyhow::{anyhow, Result};"), String("use crossbeam::channel::{bounded, unbounded, Receiver, Sender};"), String("use log::*;"), String("use regex::Regex;"), String("use serde::{de::DeserializeOwned, Serialize};"), String("use std::io::Write;"), String("use std::str::FromStr;"), String("use std::{"), String(" collections::HashMap,"), String(" io::BufRead,"), String(" sync::atomic::{AtomicU64, Ordering},"), String(" thread,"), String(" time::Duration,"), String("};"), String(""), String("const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;"), String(""), String("lazy_static! {"), String(" // this regex is used to remove some additional fields that we get from some servers, namely:"), String(" // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."), String(" static ref RE_REMOVE_EXTRA_FIELDS: Regex ="), String(" Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();"), String("}"), String(""), String("#[derive(Serialize)]"), String("pub struct RpcClient {"), String(" language_id: LanguageId,"), String(" #[serde(skip_serializing)]"), String(" id: AtomicU64,"), String(" #[serde(skip_serializing)]"), String(" writer_tx: Sender<RawMessage>,"), String(" #[serde(skip_serializing)]"), String(" reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"), String(" pub process_id: Option<u32>,"), String("}"), String(""), String("impl RpcClient {"), String(" #[allow(clippy::new_ret_no_self)]"), String(" pub fn new("), String(" language_id: LanguageId,"), String(" reader: impl BufRead + Send + 'static,"), String(" writer: impl Write + Send + 'static,"), String(" process_id: Option<u32>,"), String(" sink: Sender<Call>,"), String(" on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"), String(" ) -> Result<Self> {"), String(" let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();"), String(""), String(" let language_id_clone = language_id.clone();"), String(" let reader_thread_name = format!(\"reader-{:?}\", language_id);"), String(" let on_crash_clone = on_crash.clone();"), String(" thread::Builder::new()"), String(" .name(reader_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"), String(" on_crash_clone(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" let (writer_tx, writer_rx) = unbounded();"), String(" let writer_thread_name = format!(\"writer-{:?}\", language_id);"), String(" let language_id_clone = language_id.clone();"), String(" thread::Builder::new()"), String(" .name(writer_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"), String(" on_crash(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" Ok(Self {"), String(" language_id,"), String(" id: AtomicU64::default(),"), String(" process_id,"), String(" reader_tx,"), String(" writer_tx,"), String(" })"), String(" }"), String(""), String(" pub fn call<R: DeserializeOwned>("), String(" &self,"), String(" method: impl AsRef<str>,"), String(" params: impl Serialize,"), String(" ) -> Result<R> {"), String(" let method = method.as_ref();"), String(" let id = self.id.fetch_add(1, Ordering::SeqCst);"), String(" let msg = jsonrpc_core::MethodCall {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" let (tx, rx) = bounded(1);"), String(" self.reader_tx.send((id, tx))?;"), String(" self.writer_tx.send(RawMessage::MethodCall(msg))?;"), String(" // TODO: duration from config."), String(" match rx.recv_timeout(Duration::from_secs(60))? {"), String(" jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"), String(" // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"), String(" // which we don't want to show to the user and should ignore, as the result of the"), String(" // request that triggered this error has been invalidated by changes to the state"), String(" // of the server, so we must handle this error specifically."), String(" jsonrpc_core::Output::Failure(err)"), String(" if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"), String(" {"), String(" Err(anyhow::Error::from(LSError::ContentModified))"), String(" }"), String(" jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"), String(" }"), String(" }"), String(""), String(" pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"), String(" let method = method.as_ref();"), String(""), String(" let msg = jsonrpc_core::Notification {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" self.writer_tx.send(RawMessage::Notification(msg))?;"), String(" Ok(())"), String(" }"), String(""), String(" pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"), String(" let output = match result {"), String(" Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" result: serde_json::to_value(ok)?,"), String(" }),"), String(" Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" error: err.to_rpc_error(),"), String(" }),"), String(" };"), String(""), String(" self.writer_tx.send(RawMessage::Output(output))?;"), String(" Ok(())"), String(" }"), String("}"), String(""), String("fn loop_read("), String(" reader: impl BufRead,"), String(" reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"), String(" sink: &Sender<Call>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut pending_outputs = HashMap::new();"), String(""), String(" // Count how many consequent empty lines."), String(" let mut count_empty_lines = 0;"), String(""), String(" let mut reader = reader;"), String(" let mut content_length = 0;"), String(" loop {"), String(" let mut message = String::new();"), String(" let mut line = String::new();"), String(" if language_id.is_some() {"), String(" reader.read_line(&mut line)?;"), String(" let line = line.trim();"), String(" if line.is_empty() {"), String(" count_empty_lines += 1;"), String(" if count_empty_lines > 5 {"), String(" return Err(anyhow!(\"Unable to read from language server\"));"), String(" }"), String(""), String(" let mut buf = vec![0; content_length];"), String(" reader.read_exact(buf.as_mut_slice())?;"), String(" message = String::from_utf8(buf)?;"), String(" } else {"), String(" count_empty_lines = 0;"), String(" if !line.starts_with(\"Content-Length\") {"), String(" continue;"), String(" }"), String(""), String(" let tokens: Vec<&str> = line.splitn(2, ':').collect();"), String(" let len = tokens"), String(" .get(1)"), String(" .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"), String(" .trim();"), String(" content_length = usize::from_str(len)?;"), String(" }"), String(" } else if reader.read_line(&mut message)? == 0 {"), String(" break;"), String(" }"), String(""), String(" let message = message.trim();"), String(" if message.is_empty() {"), String(" continue;"), String(" }"), String(" debug!(\"<= {:?} {}\", language_id, message);"), String(" // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"), String(" // `requestMethod` sent by Sorbet."), String(" let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let message = serde_json::from_str(&s);"), String(" if let Err(ref err) = message {"), String(" error!("), String(" \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","), String(" err, s, err"), String(" );"), String(" continue;"), String(" }"), String(" // TODO: cleanup."), String(" let message = message.unwrap();"), String(" match message {"), String(" RawMessage::MethodCall(method_call) => {"), String(" sink.send(Call::MethodCall(language_id.clone(), method_call))?;"), String(" }"), String(" RawMessage::Notification(notification) => {"), String(" sink.send(Call::Notification(language_id.clone(), notification))?;"), String(" }"), String(" RawMessage::Output(output) => {"), String(" while let Ok((id, tx)) = reader_rx.try_recv() {"), String(" pending_outputs.insert(id, tx);"), String(" }"), String(""), String(" if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"), String(" tx.send(output)"), String(" .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"), String(" }"), String(" }"), String(" };"), String(" }"), String(""), String(" info!(\"reader-{:?} terminated\", language_id);"), String(" Ok(())"), String("}"), String(""), String("fn loop_write("), String(" writer: impl Write,"), String(" rx: &Receiver<RawMessage>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut writer = writer;"), String(""), String(" for msg in rx.iter() {"), String(" let s = serde_json::to_string(&msg)?;"), String(" debug!(\"=> {:?} {}\", language_id, s);"), String(" if language_id.is_none() {"), String(" // Use different convention for two reasons,"), String(" // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"), String(" // receives `content`."), String(" // 2. Without last line ending, vim output handler won't be triggered."), String(" write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"), String(" } else {"), String(" write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"), String(" };"), String(" writer.flush()?;"), String(" }"), String(" Ok(())"), String("}"), String(""), String("#[cfg(test)]"), String("mod test {"), String(" use super::RE_REMOVE_EXTRA_FIELDS;"), String(" use crate::types::RawMessage;"), String(""), String(" #[test]"), String(" // The library we're using for json-rpc doesn't accept extra fields in the structs used to"), String(" // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"), String(" // the client fails to deserialize that response."), String(" // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"), String(" // suboptimal, so we now try to remove the extra fields we know of from the response."), String(" //"), String(" // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"), String(" fn it_should_remove_extra_fields() {"), String(" // it removes the requestMethod field from Sorbet"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" let message ="), String(" r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" // it removes the meta field from javascript-typescript-langserver"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(" }"), String("}"), String("")])}) 17:00:16 INFO unnamed src/language_server_protocol.rs:1077 find_locations; params=Object({"bufnr": Number(1), "character": Number(45), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "gotoCmd": Null, "handle": Bool(true), "languageId": String("rust"), "line": Number(49), "method": String("textDocument/definition"), "text": Array([String("use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};"), String("use anyhow::{anyhow, Result};"), String("use crossbeam::channel::{bounded, unbounded, Receiver, Sender};"), String("use log::*;"), String("use regex::Regex;"), String("use serde::{de::DeserializeOwned, Serialize};"), String("use std::io::Write;"), String("use std::str::FromStr;"), String("use std::{"), String(" collections::HashMap,"), String(" io::BufRead,"), String(" sync::atomic::{AtomicU64, Ordering},"), String(" thread,"), String(" time::Duration,"), String("};"), String(""), String("const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;"), String(""), String("lazy_static! {"), String(" // this regex is used to remove some additional fields that we get from some servers, namely:"), String(" // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."), String(" static ref RE_REMOVE_EXTRA_FIELDS: Regex ="), String(" Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();"), String("}"), String(""), String("#[derive(Serialize)]"), String("pub struct RpcClient {"), String(" language_id: LanguageId,"), String(" #[serde(skip_serializing)]"), String(" id: AtomicU64,"), String(" #[serde(skip_serializing)]"), String(" writer_tx: Sender<RawMessage>,"), String(" #[serde(skip_serializing)]"), String(" reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"), String(" pub process_id: Option<u32>,"), String("}"), String(""), String("impl RpcClient {"), String(" #[allow(clippy::new_ret_no_self)]"), String(" pub fn new("), String(" language_id: LanguageId,"), String(" reader: impl BufRead + Send + 'static,"), String(" writer: impl Write + Send + 'static,"), String(" process_id: Option<u32>,"), String(" sink: Sender<Call>,"), String(" on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"), String(" ) -> Result<Self> {"), String(" let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();"), String(""), String(" let language_id_clone = language_id.clone();"), String(" let reader_thread_name = format!(\"reader-{:?}\", language_id);"), String(" let on_crash_clone = on_crash.clone();"), String(" thread::Builder::new()"), String(" .name(reader_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"), String(" on_crash_clone(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" let (writer_tx, writer_rx) = unbounded();"), String(" let writer_thread_name = format!(\"writer-{:?}\", language_id);"), String(" let language_id_clone = language_id.clone();"), String(" thread::Builder::new()"), String(" .name(writer_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"), String(" on_crash(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" Ok(Self {"), String(" language_id,"), String(" id: AtomicU64::default(),"), String(" process_id,"), String(" reader_tx,"), String(" writer_tx,"), String(" })"), String(" }"), String(""), String(" pub fn call<R: DeserializeOwned>("), String(" &self,"), String(" method: impl AsRef<str>,"), String(" params: impl Serialize,"), String(" ) -> Result<R> {"), String(" let method = method.as_ref();"), String(" let id = self.id.fetch_add(1, Ordering::SeqCst);"), String(" let msg = jsonrpc_core::MethodCall {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" let (tx, rx) = bounded(1);"), String(" self.reader_tx.send((id, tx))?;"), String(" self.writer_tx.send(RawMessage::MethodCall(msg))?;"), String(" // TODO: duration from config."), String(" match rx.recv_timeout(Duration::from_secs(60))? {"), String(" jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"), String(" // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"), String(" // which we don't want to show to the user and should ignore, as the result of the"), String(" // request that triggered this error has been invalidated by changes to the state"), String(" // of the server, so we must handle this error specifically."), String(" jsonrpc_core::Output::Failure(err)"), String(" if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"), String(" {"), String(" Err(anyhow::Error::from(LSError::ContentModified))"), String(" }"), String(" jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"), String(" }"), String(" }"), String(""), String(" pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"), String(" let method = method.as_ref();"), String(""), String(" let msg = jsonrpc_core::Notification {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" self.writer_tx.send(RawMessage::Notification(msg))?;"), String(" Ok(())"), String(" }"), String(""), String(" pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"), String(" let output = match result {"), String(" Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" result: serde_json::to_value(ok)?,"), String(" }),"), String(" Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" error: err.to_rpc_error(),"), String(" }),"), String(" };"), String(""), String(" self.writer_tx.send(RawMessage::Output(output))?;"), String(" Ok(())"), String(" }"), String("}"), String(""), String("fn loop_read("), String(" reader: impl BufRead,"), String(" reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"), String(" sink: &Sender<Call>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut pending_outputs = HashMap::new();"), String(""), String(" // Count how many consequent empty lines."), String(" let mut count_empty_lines = 0;"), String(""), String(" let mut reader = reader;"), String(" let mut content_length = 0;"), String(" loop {"), String(" let mut message = String::new();"), String(" let mut line = String::new();"), String(" if language_id.is_some() {"), String(" reader.read_line(&mut line)?;"), String(" let line = line.trim();"), String(" if line.is_empty() {"), String(" count_empty_lines += 1;"), String(" if count_empty_lines > 5 {"), String(" return Err(anyhow!(\"Unable to read from language server\"));"), String(" }"), String(""), String(" let mut buf = vec![0; content_length];"), String(" reader.read_exact(buf.as_mut_slice())?;"), String(" message = String::from_utf8(buf)?;"), String(" } else {"), String(" count_empty_lines = 0;"), String(" if !line.starts_with(\"Content-Length\") {"), String(" continue;"), String(" }"), String(""), String(" let tokens: Vec<&str> = line.splitn(2, ':').collect();"), String(" let len = tokens"), String(" .get(1)"), String(" .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"), String(" .trim();"), String(" content_length = usize::from_str(len)?;"), String(" }"), String(" } else if reader.read_line(&mut message)? == 0 {"), String(" break;"), String(" }"), String(""), String(" let message = message.trim();"), String(" if message.is_empty() {"), String(" continue;"), String(" }"), String(" debug!(\"<= {:?} {}\", language_id, message);"), String(" // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"), String(" // `requestMethod` sent by Sorbet."), String(" let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let message = serde_json::from_str(&s);"), String(" if let Err(ref err) = message {"), String(" error!("), String(" \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","), String(" err, s, err"), String(" );"), String(" continue;"), String(" }"), String(" // TODO: cleanup."), String(" let message = message.unwrap();"), String(" match message {"), String(" RawMessage::MethodCall(method_call) => {"), String(" sink.send(Call::MethodCall(language_id.clone(), method_call))?;"), String(" }"), String(" RawMessage::Notification(notification) => {"), String(" sink.send(Call::Notification(language_id.clone(), notification))?;"), String(" }"), String(" RawMessage::Output(output) => {"), String(" while let Ok((id, tx)) = reader_rx.try_recv() {"), String(" pending_outputs.insert(id, tx);"), String(" }"), String(""), String(" if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"), String(" tx.send(output)"), String(" .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"), String(" }"), String(" }"), String(" };"), String(" }"), String(""), String(" info!(\"reader-{:?} terminated\", language_id);"), String(" Ok(())"), String("}"), String(""), String("fn loop_write("), String(" writer: impl Write,"), String(" rx: &Receiver<RawMessage>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut writer = writer;"), String(""), String(" for msg in rx.iter() {"), String(" let s = serde_json::to_string(&msg)?;"), String(" debug!(\"=> {:?} {}\", language_id, s);"), String(" if language_id.is_none() {"), String(" // Use different convention for two reasons,"), String(" // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"), String(" // receives `content`."), String(" // 2. Without last line ending, vim output handler won't be triggered."), String(" write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"), String(" } else {"), String(" write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"), String(" };"), String(" writer.flush()?;"), String(" }"), String(" Ok(())"), String("}"), String(""), String("#[cfg(test)]"), String("mod test {"), String(" use super::RE_REMOVE_EXTRA_FIELDS;"), String(" use crate::types::RawMessage;"), String(""), String(" #[test]"), String(" // The library we're using for json-rpc doesn't accept extra fields in the structs used to"), String(" // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"), String(" // the client fails to deserialize that response."), String(" // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"), String(" // suboptimal, so we now try to remove the extra fields we know of from the response."), String(" //"), String(" // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"), String(" fn it_should_remove_extra_fields() {"), String(" // it removes the requestMethod field from Sorbet"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" let message ="), String(" r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" // it removes the meta field from javascript-typescript-langserver"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(" }"), String("}"), String("")])}) 17:00:16 INFO unnamed src/language_server_protocol.rs:1993 text_document_did_change; params=Object({"bufnr": Number(1), "character": Number(45), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "gotoCmd": Null, "handle": Bool(true), "languageId": String("rust"), "line": Number(49), "method": String("textDocument/definition"), "text": Array([String("use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};"), String("use anyhow::{anyhow, Result};"), String("use crossbeam::channel::{bounded, unbounded, Receiver, Sender};"), String("use log::*;"), String("use regex::Regex;"), String("use serde::{de::DeserializeOwned, Serialize};"), String("use std::io::Write;"), String("use std::str::FromStr;"), String("use std::{"), String(" collections::HashMap,"), String(" io::BufRead,"), String(" sync::atomic::{AtomicU64, Ordering},"), String(" thread,"), String(" time::Duration,"), String("};"), String(""), String("const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;"), String(""), String("lazy_static! {"), String(" // this regex is used to remove some additional fields that we get from some servers, namely:"), String(" // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."), String(" static ref RE_REMOVE_EXTRA_FIELDS: Regex ="), String(" Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();"), String("}"), String(""), String("#[derive(Serialize)]"), String("pub struct RpcClient {"), String(" language_id: LanguageId,"), String(" #[serde(skip_serializing)]"), String(" id: AtomicU64,"), String(" #[serde(skip_serializing)]"), String(" writer_tx: Sender<RawMessage>,"), String(" #[serde(skip_serializing)]"), String(" reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"), String(" pub process_id: Option<u32>,"), String("}"), String(""), String("impl RpcClient {"), String(" #[allow(clippy::new_ret_no_self)]"), String(" pub fn new("), String(" language_id: LanguageId,"), String(" reader: impl BufRead + Send + 'static,"), String(" writer: impl Write + Send + 'static,"), String(" process_id: Option<u32>,"), String(" sink: Sender<Call>,"), String(" on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"), String(" ) -> Result<Self> {"), String(" let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();"), String(""), String(" let language_id_clone = language_id.clone();"), String(" let reader_thread_name = format!(\"reader-{:?}\", language_id);"), String(" let on_crash_clone = on_crash.clone();"), String(" thread::Builder::new()"), String(" .name(reader_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"), String(" on_crash_clone(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" let (writer_tx, writer_rx) = unbounded();"), String(" let writer_thread_name = format!(\"writer-{:?}\", language_id);"), String(" let language_id_clone = language_id.clone();"), String(" thread::Builder::new()"), String(" .name(writer_thread_name.clone())"), String(" .spawn(move || {"), String(" if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"), String(" match err.downcast_ref::<std::io::Error>() {"), String(" Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"), String(" on_crash(&language_id_clone)"), String(" }"), String(" _ => {}"), String(" }"), String(""), String(" error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"), String(" }"), String(" })?;"), String(""), String(" Ok(Self {"), String(" language_id,"), String(" id: AtomicU64::default(),"), String(" process_id,"), String(" reader_tx,"), String(" writer_tx,"), String(" })"), String(" }"), String(""), String(" pub fn call<R: DeserializeOwned>("), String(" &self,"), String(" method: impl AsRef<str>,"), String(" params: impl Serialize,"), String(" ) -> Result<R> {"), String(" let method = method.as_ref();"), String(" let id = self.id.fetch_add(1, Ordering::SeqCst);"), String(" let msg = jsonrpc_core::MethodCall {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" let (tx, rx) = bounded(1);"), String(" self.reader_tx.send((id, tx))?;"), String(" self.writer_tx.send(RawMessage::MethodCall(msg))?;"), String(" // TODO: duration from config."), String(" match rx.recv_timeout(Duration::from_secs(60))? {"), String(" jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"), String(" // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"), String(" // which we don't want to show to the user and should ignore, as the result of the"), String(" // request that triggered this error has been invalidated by changes to the state"), String(" // of the server, so we must handle this error specifically."), String(" jsonrpc_core::Output::Failure(err)"), String(" if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"), String(" {"), String(" Err(anyhow::Error::from(LSError::ContentModified))"), String(" }"), String(" jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"), String(" }"), String(" }"), String(""), String(" pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"), String(" let method = method.as_ref();"), String(""), String(" let msg = jsonrpc_core::Notification {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" method: method.to_owned(),"), String(" params: params.to_params()?,"), String(" };"), String(" self.writer_tx.send(RawMessage::Notification(msg))?;"), String(" Ok(())"), String(" }"), String(""), String(" pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"), String(" let output = match result {"), String(" Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" result: serde_json::to_value(ok)?,"), String(" }),"), String(" Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"), String(" jsonrpc: Some(jsonrpc_core::Version::V2),"), String(" id: jsonrpc_core::Id::Num(id),"), String(" error: err.to_rpc_error(),"), String(" }),"), String(" };"), String(""), String(" self.writer_tx.send(RawMessage::Output(output))?;"), String(" Ok(())"), String(" }"), String("}"), String(""), String("fn loop_read("), String(" reader: impl BufRead,"), String(" reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"), String(" sink: &Sender<Call>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut pending_outputs = HashMap::new();"), String(""), String(" // Count how many consequent empty lines."), String(" let mut count_empty_lines = 0;"), String(""), String(" let mut reader = reader;"), String(" let mut content_length = 0;"), String(" loop {"), String(" let mut message = String::new();"), String(" let mut line = String::new();"), String(" if language_id.is_some() {"), String(" reader.read_line(&mut line)?;"), String(" let line = line.trim();"), String(" if line.is_empty() {"), String(" count_empty_lines += 1;"), String(" if count_empty_lines > 5 {"), String(" return Err(anyhow!(\"Unable to read from language server\"));"), String(" }"), String(""), String(" let mut buf = vec![0; content_length];"), String(" reader.read_exact(buf.as_mut_slice())?;"), String(" message = String::from_utf8(buf)?;"), String(" } else {"), String(" count_empty_lines = 0;"), String(" if !line.starts_with(\"Content-Length\") {"), String(" continue;"), String(" }"), String(""), String(" let tokens: Vec<&str> = line.splitn(2, ':').collect();"), String(" let len = tokens"), String(" .get(1)"), String(" .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"), String(" .trim();"), String(" content_length = usize::from_str(len)?;"), String(" }"), String(" } else if reader.read_line(&mut message)? == 0 {"), String(" break;"), String(" }"), String(""), String(" let message = message.trim();"), String(" if message.is_empty() {"), String(" continue;"), String(" }"), String(" debug!(\"<= {:?} {}\", language_id, message);"), String(" // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"), String(" // `requestMethod` sent by Sorbet."), String(" let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let message = serde_json::from_str(&s);"), String(" if let Err(ref err) = message {"), String(" error!("), String(" \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","), String(" err, s, err"), String(" );"), String(" continue;"), String(" }"), String(" // TODO: cleanup."), String(" let message = message.unwrap();"), String(" match message {"), String(" RawMessage::MethodCall(method_call) => {"), String(" sink.send(Call::MethodCall(language_id.clone(), method_call))?;"), String(" }"), String(" RawMessage::Notification(notification) => {"), String(" sink.send(Call::Notification(language_id.clone(), notification))?;"), String(" }"), String(" RawMessage::Output(output) => {"), String(" while let Ok((id, tx)) = reader_rx.try_recv() {"), String(" pending_outputs.insert(id, tx);"), String(" }"), String(""), String(" if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"), String(" tx.send(output)"), String(" .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"), String(" }"), String(" }"), String(" };"), String(" }"), String(""), String(" info!(\"reader-{:?} terminated\", language_id);"), String(" Ok(())"), String("}"), String(""), String("fn loop_write("), String(" writer: impl Write,"), String(" rx: &Receiver<RawMessage>,"), String(" language_id: &LanguageId,"), String(") -> Result<()> {"), String(" let mut writer = writer;"), String(""), String(" for msg in rx.iter() {"), String(" let s = serde_json::to_string(&msg)?;"), String(" debug!(\"=> {:?} {}\", language_id, s);"), String(" if language_id.is_none() {"), String(" // Use different convention for two reasons,"), String(" // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"), String(" // receives `content`."), String(" // 2. Without last line ending, vim output handler won't be triggered."), String(" write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"), String(" } else {"), String(" write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"), String(" };"), String(" writer.flush()?;"), String(" }"), String(" Ok(())"), String("}"), String(""), String("#[cfg(test)]"), String("mod test {"), String(" use super::RE_REMOVE_EXTRA_FIELDS;"), String(" use crate::types::RawMessage;"), String(""), String(" #[test]"), String(" // The library we're using for json-rpc doesn't accept extra fields in the structs used to"), String(" // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"), String(" // the client fails to deserialize that response."), String(" // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"), String(" // suboptimal, so we now try to remove the extra fields we know of from the response."), String(" //"), String(" // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"), String(" fn it_should_remove_extra_fields() {"), String(" // it removes the requestMethod field from Sorbet"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" let message ="), String(" r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(""), String(" // it removes the meta field from javascript-typescript-langserver"), String(" let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"), String(" let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"), String(" let result: Result<RawMessage, _> = serde_json::from_str(&message);"), String(" assert!(result.is_ok());"), String(" }"), String("}"), String("")])}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"LSP#text","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs"],"id":25} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 25, "jsonrpc": "2.0", "result": ["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};", "use anyhow::{anyhow, Result};", "use crossbeam::channel::{bounded, unbounded, Receiver, Sender};", "use log::*;", "use regex::Regex;", "use serde::{de::DeserializeOwned, Serialize};", "use std::io::Write;", "use std::str::FromStr;", "use std::{", " collections::HashMap,", " io::BufRead,", " sync::atomic::{AtomicU64, Ordering},", " thread,", " time::Duration,", "};", "", "const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;", "", "lazy_static! {", " // this regex is used to remove some additional fields that we get from some servers, namely:", " // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet.", " static ref RE_REMOVE_EXTRA_FIELDS: Regex =", " Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();", "}", "", "#[derive(Serialize)]", "pub struct RpcClient {", " language_id: LanguageId,", " #[serde(skip_serializing)]", " id: AtomicU64,", " #[serde(skip_serializing)]", " writer_tx: Sender<RawMessage>,", " #[serde(skip_serializing)]", " reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,", " pub process_id: Option<u32>,", "}", "", "impl RpcClient {", " #[allow(clippy::new_ret_no_self)]", " pub fn new(", " language_id: LanguageId,", " reader: impl BufRead + Send + 'static,", " writer: impl Write + Send + 'static,", " process_id: Option<u32>,", " sink: Sender<Call>,", " on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,", " ) -> Result<Self> {", " let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();", "", " let language_id_clone = language_id.clone();", " let reader_thread_name = format!(\"reader-{:?}\", language_id);", " let on_crash_clone = on_crash.clone();", " thread::Builder::new()", " .name(reader_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {", " on_crash_clone(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);", " }", " })?;", "", " let (writer_tx, writer_rx) = unbounded();", " let writer_thread_name = format!(\"writer-{:?}\", language_id);", " let language_id_clone = language_id.clone();", " thread::Builder::new()", " .name(writer_thread_name.clone())", " .spawn(move || {", " if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {", " match err.downcast_ref::<std::io::Error>() {", " Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {", " on_crash(&language_id_clone)", " }", " _ => {}", " }", "", " error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);", " }", " })?;", "", " Ok(Self {", " language_id,", " id: AtomicU64::default(),", " process_id,", " reader_tx,", " writer_tx,", " })", " }", "", " pub fn call<R: DeserializeOwned>(", " &self,", " method: impl AsRef<str>,", " params: impl Serialize,", " ) -> Result<R> {", " let method = method.as_ref();", " let id = self.id.fetch_add(1, Ordering::SeqCst);", " let msg = jsonrpc_core::MethodCall {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " let (tx, rx) = bounded(1);", " self.reader_tx.send((id, tx))?;", " self.writer_tx.send(RawMessage::MethodCall(msg))?;", " // TODO: duration from config.", " match rx.recv_timeout(Duration::from_secs(60))? {", " jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),", " // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,", " // which we don't want to show to the user and should ignore, as the result of the", " // request that triggered this error has been invalidated by changes to the state", " // of the server, so we must handle this error specifically.", " jsonrpc_core::Output::Failure(err)", " if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>", " {", " Err(anyhow::Error::from(LSError::ContentModified))", " }", " jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),", " }", " }", "", " pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {", " let method = method.as_ref();", "", " let msg = jsonrpc_core::Notification {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " method: method.to_owned(),", " params: params.to_params()?,", " };", " self.writer_tx.send(RawMessage::Notification(msg))?;", " Ok(())", " }", "", " pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {", " let output = match result {", " Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " result: serde_json::to_value(ok)?,", " }),", " Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {", " jsonrpc: Some(jsonrpc_core::Version::V2),", " id: jsonrpc_core::Id::Num(id),", " error: err.to_rpc_error(),", " }),", " };", "", " self.writer_tx.send(RawMessage::Output(output))?;", " Ok(())", " }", "}", "", "fn loop_read(", " reader: impl BufRead,", " reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,", " sink: &Sender<Call>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut pending_outputs = HashMap::new();", "", " // Count how many consequent empty lines.", " let mut count_empty_lines = 0;", "", " let mut reader = reader;", " let mut content_length = 0;", " loop {", " let mut message = String::new();", " let mut line = String::new();", " if language_id.is_some() {", " reader.read_line(&mut line)?;", " let line = line.trim();", " if line.is_empty() {", " count_empty_lines += 1;", " if count_empty_lines > 5 {", " return Err(anyhow!(\"Unable to read from language server\"));", " }", "", " let mut buf = vec![0; content_length];", " reader.read_exact(buf.as_mut_slice())?;", " message = String::from_utf8(buf)?;", " } else {", " count_empty_lines = 0;", " if !line.starts_with(\"Content-Length\") {", " continue;", " }", "", " let tokens: Vec<&str> = line.splitn(2, ':').collect();", " let len = tokens", " .get(1)", " .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?", " .trim();", " content_length = usize::from_str(len)?;", " }", " } else if reader.read_line(&mut message)? == 0 {", " break;", " }", "", " let message = message.trim();", " if message.is_empty() {", " continue;", " }", " debug!(\"<= {:?} {}\", language_id, message);", " // FIXME: Remove extra `meta` property from javascript-typescript-langserver and", " // `requestMethod` sent by Sorbet.", " let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let message = serde_json::from_str(&s);", " if let Err(ref err) = message {", " error!(", " \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\",", " err, s, err", " );", " continue;", " }", " // TODO: cleanup.", " let message = message.unwrap();", " match message {", " RawMessage::MethodCall(method_call) => {", " sink.send(Call::MethodCall(language_id.clone(), method_call))?;", " }", " RawMessage::Notification(notification) => {", " sink.send(Call::Notification(language_id.clone(), notification))?;", " }", " RawMessage::Output(output) => {", " while let Ok((id, tx)) = reader_rx.try_recv() {", " pending_outputs.insert(id, tx);", " }", "", " if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {", " tx.send(output)", " .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;", " }", " }", " };", " }", "", " info!(\"reader-{:?} terminated\", language_id);", " Ok(())", "}", "", "fn loop_write(", " writer: impl Write,", " rx: &Receiver<RawMessage>,", " language_id: &LanguageId,", ") -> Result<()> {", " let mut writer = writer;", "", " for msg in rx.iter() {", " let s = serde_json::to_string(&msg)?;", " debug!(\"=> {:?} {}\", language_id, s);", " if language_id.is_none() {", " // Use different convention for two reasons,", " // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim", " // receives `content`.", " // 2. Without last line ending, vim output handler won't be triggered.", " write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;", " } else {", " write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;", " };", " writer.flush()?;", " }", " Ok(())", "}", "", "#[cfg(test)]", "mod test {", " use super::RE_REMOVE_EXTRA_FIELDS;", " use crate::types::RawMessage;", "", " #[test]", " // The library we're using for json-rpc doesn't accept extra fields in the structs used to", " // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so", " // the client fails to deserialize that response.", " // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is", " // suboptimal, so we now try to remove the extra fields we know of from the response.", " //", " // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892", " fn it_should_remove_extra_fields() {", " // it removes the requestMethod field from Sorbet", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " let message =", " r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", "", " // it removes the meta field from javascript-typescript-langserver", " let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;", " let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");", " let result: Result<RawMessage, _> = serde_json::from_str(&message);", " assert!(result.is_ok());", " }", "}", ""]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["LSP#position()"],"id":26} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 26, "jsonrpc": "2.0", "result": {"character": 45, "line": 49}} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["expand('<cword>')"],"id":27} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 27, "jsonrpc": "2.0", "result": "clone"} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/definition","params":{"bufnr":1,"character":45,"filename":"/home/dick/LanguageClient-neovim/src/rpcclient.rs","gotoCmd":null,"handle":true,"languageId":"rust","line":49,"method":"textDocument/definition","position":{"character":45,"line":49},"text":["use crate::types::{Call, Id, LSError, LanguageId, RawMessage, ToInt, ToParams, ToRpcError};","use anyhow::{anyhow, Result};","use crossbeam::channel::{bounded, unbounded, Receiver, Sender};","use log::*;","use regex::Regex;","use serde::{de::DeserializeOwned, Serialize};","use std::io::Write;","use std::str::FromStr;","use std::{"," collections::HashMap,"," io::BufRead,"," sync::atomic::{AtomicU64, Ordering},"," thread,"," time::Duration,","};","","const CONTENT_MODIFIED_ERROR_CODE: i64 = -32801;","","lazy_static! {"," // this regex is used to remove some additional fields that we get from some servers, namely:"," // meta, sent by javascript-typescript-langserver and requestMethod, sent by Sorbet."," static ref RE_REMOVE_EXTRA_FIELDS: Regex ="," Regex::new(r#\",\\s?\"(?:meta|requestMethod)\":(?:\"\\w+(/\\w+)?\"|\\{\\})\"#).unwrap();","}","","#[derive(Serialize)]","pub struct RpcClient {"," language_id: LanguageId,"," #[serde(skip_serializing)]"," id: AtomicU64,"," #[serde(skip_serializing)]"," writer_tx: Sender<RawMessage>,"," #[serde(skip_serializing)]"," reader_tx: Sender<(Id, Sender<jsonrpc_core::Output>)>,"," pub process_id: Option<u32>,","}","","impl RpcClient {"," #[allow(clippy::new_ret_no_self)]"," pub fn new("," language_id: LanguageId,"," reader: impl BufRead + Send + 'static,"," writer: impl Write + Send + 'static,"," process_id: Option<u32>,"," sink: Sender<Call>,"," on_crash: impl Fn(&LanguageId) + Clone + Send + 'static,"," ) -> Result<Self> {"," let (reader_tx, reader_rx): (Sender<(Id, Sender<jsonrpc_core::Output>)>, _) = unbounded();",""," let language_id_clone = language_id.clone();"," let reader_thread_name = format!(\"reader-{:?}\", language_id);"," let on_crash_clone = on_crash.clone();"," thread::Builder::new()"," .name(reader_thread_name.clone())"," .spawn(move || {"," if let Err(err) = loop_read(reader, reader_rx, &sink, &language_id_clone) {"," match err.downcast_ref::<std::io::Error>() {"," Some(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => {"," on_crash_clone(&language_id_clone)"," }"," _ => {}"," }",""," error!(\"Thread {} exited with error: {:?}\", reader_thread_name, err);"," }"," })?;",""," let (writer_tx, writer_rx) = unbounded();"," let writer_thread_name = format!(\"writer-{:?}\", language_id);"," let language_id_clone = language_id.clone();"," thread::Builder::new()"," .name(writer_thread_name.clone())"," .spawn(move || {"," if let Err(err) = loop_write(writer, &writer_rx, &language_id_clone) {"," match err.downcast_ref::<std::io::Error>() {"," Some(err) if err.kind() == std::io::ErrorKind::BrokenPipe => {"," on_crash(&language_id_clone)"," }"," _ => {}"," }",""," error!(\"Thread {} exited with error: {:?}\", writer_thread_name, err);"," }"," })?;",""," Ok(Self {"," language_id,"," id: AtomicU64::default(),"," process_id,"," reader_tx,"," writer_tx,"," })"," }",""," pub fn call<R: DeserializeOwned>("," &self,"," method: impl AsRef<str>,"," params: impl Serialize,"," ) -> Result<R> {"," let method = method.as_ref();"," let id = self.id.fetch_add(1, Ordering::SeqCst);"," let msg = jsonrpc_core::MethodCall {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," id: jsonrpc_core::Id::Num(id),"," method: method.to_owned(),"," params: params.to_params()?,"," };"," let (tx, rx) = bounded(1);"," self.reader_tx.send((id, tx))?;"," self.writer_tx.send(RawMessage::MethodCall(msg))?;"," // TODO: duration from config."," match rx.recv_timeout(Duration::from_secs(60))? {"," jsonrpc_core::Output::Success(ok) => Ok(serde_json::from_value(ok.result)?),"," // NOTE: Errors with code -32801 correspond to the protocol's ContentModified error,"," // which we don't want to show to the user and should ignore, as the result of the"," // request that triggered this error has been invalidated by changes to the state"," // of the server, so we must handle this error specifically."," jsonrpc_core::Output::Failure(err)"," if err.error.code.code() == CONTENT_MODIFIED_ERROR_CODE =>"," {"," Err(anyhow::Error::from(LSError::ContentModified))"," }"," jsonrpc_core::Output::Failure(err) => Err(anyhow!(\"Error: {:?}\", err)),"," }"," }",""," pub fn notify(&self, method: impl AsRef<str>, params: impl Serialize) -> Result<()> {"," let method = method.as_ref();",""," let msg = jsonrpc_core::Notification {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," method: method.to_owned(),"," params: params.to_params()?,"," };"," self.writer_tx.send(RawMessage::Notification(msg))?;"," Ok(())"," }",""," pub fn output(&self, id: Id, result: Result<impl Serialize>) -> Result<()> {"," let output = match result {"," Ok(ok) => jsonrpc_core::Output::Success(jsonrpc_core::Success {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," id: jsonrpc_core::Id::Num(id),"," result: serde_json::to_value(ok)?,"," }),"," Err(err) => jsonrpc_core::Output::Failure(jsonrpc_core::Failure {"," jsonrpc: Some(jsonrpc_core::Version::V2),"," id: jsonrpc_core::Id::Num(id),"," error: err.to_rpc_error(),"," }),"," };",""," self.writer_tx.send(RawMessage::Output(output))?;"," Ok(())"," }","}","","fn loop_read("," reader: impl BufRead,"," reader_rx: Receiver<(Id, Sender<jsonrpc_core::Output>)>,"," sink: &Sender<Call>,"," language_id: &LanguageId,",") -> Result<()> {"," let mut pending_outputs = HashMap::new();",""," // Count how many consequent empty lines."," let mut count_empty_lines = 0;",""," let mut reader = reader;"," let mut content_length = 0;"," loop {"," let mut message = String::new();"," let mut line = String::new();"," if language_id.is_some() {"," reader.read_line(&mut line)?;"," let line = line.trim();"," if line.is_empty() {"," count_empty_lines += 1;"," if count_empty_lines > 5 {"," return Err(anyhow!(\"Unable to read from language server\"));"," }",""," let mut buf = vec![0; content_length];"," reader.read_exact(buf.as_mut_slice())?;"," message = String::from_utf8(buf)?;"," } else {"," count_empty_lines = 0;"," if !line.starts_with(\"Content-Length\") {"," continue;"," }",""," let tokens: Vec<&str> = line.splitn(2, ':').collect();"," let len = tokens"," .get(1)"," .ok_or_else(|| anyhow!(\"Failed to get length! tokens: {:?}\", tokens))?"," .trim();"," content_length = usize::from_str(len)?;"," }"," } else if reader.read_line(&mut message)? == 0 {"," break;"," }",""," let message = message.trim();"," if message.is_empty() {"," continue;"," }"," debug!(\"<= {:?} {}\", language_id, message);"," // FIXME: Remove extra `meta` property from javascript-typescript-langserver and"," // `requestMethod` sent by Sorbet."," let s = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let message = serde_json::from_str(&s);"," if let Err(ref err) = message {"," error!("," \"Failed to deserialize output: {}\\n\\n Message: {}\\n\\nError: {:?}\","," err, s, err"," );"," continue;"," }"," // TODO: cleanup."," let message = message.unwrap();"," match message {"," RawMessage::MethodCall(method_call) => {"," sink.send(Call::MethodCall(language_id.clone(), method_call))?;"," }"," RawMessage::Notification(notification) => {"," sink.send(Call::Notification(language_id.clone(), notification))?;"," }"," RawMessage::Output(output) => {"," while let Ok((id, tx)) = reader_rx.try_recv() {"," pending_outputs.insert(id, tx);"," }",""," if let Some(tx) = pending_outputs.remove(&output.id().to_int()?) {"," tx.send(output)"," .map_err(|output| anyhow!(\"Failed to send output: {:?}\", output))?;"," }"," }"," };"," }",""," info!(\"reader-{:?} terminated\", language_id);"," Ok(())","}","","fn loop_write("," writer: impl Write,"," rx: &Receiver<RawMessage>,"," language_id: &LanguageId,",") -> Result<()> {"," let mut writer = writer;",""," for msg in rx.iter() {"," let s = serde_json::to_string(&msg)?;"," debug!(\"=> {:?} {}\", language_id, s);"," if language_id.is_none() {"," // Use different convention for two reasons,"," // 1. If using '\\r\\ncontent', nvim will receive output as `\\r` + `content`, while vim"," // receives `content`."," // 2. Without last line ending, vim output handler won't be triggered."," write!(writer, \"Content-Length: {}\\n\\n{}\\n\", s.len(), s)?;"," } else {"," write!(writer, \"Content-Length: {}\\r\\n\\r\\n{}\", s.len(), s)?;"," };"," writer.flush()?;"," }"," Ok(())","}","","#[cfg(test)]","mod test {"," use super::RE_REMOVE_EXTRA_FIELDS;"," use crate::types::RawMessage;",""," #[test]"," // The library we're using for json-rpc doesn't accept extra fields in the structs used to"," // deserialize the message. Sorbet (and possibly other servers) sends an extra field in it, so"," // the client fails to deserialize that response."," // Our previous solution was to pin the dependency to jsonrpc-core to version 12, but is"," // suboptimal, so we now try to remove the extra fields we know of from the response."," //"," // See related issue: https://github.com/autozimu/LanguageClient-neovim/issues/892"," fn it_should_remove_extra_fields() {"," // it removes the requestMethod field from Sorbet"," let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"initialize\",\"result\":0}\"#;"," let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let result: Result<RawMessage, _> = serde_json::from_str(&message);"," assert!(result.is_ok());",""," let message ="," r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"requestMethod\":\"textDocument/definition\",\"result\":0}\"#;"," let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let result: Result<RawMessage, _> = serde_json::from_str(&message);"," assert!(result.is_ok());",""," // it removes the meta field from javascript-typescript-langserver"," let message = r#\"{\"jsonrpc\":\"2.0\",\"id\":1,\"meta\":{},\"result\":0}\"#;"," let message = RE_REMOVE_EXTRA_FIELDS.replace(message, \"\");"," let result: Result<RawMessage, _> = serde_json::from_str(&message);"," assert!(result.is_ok());"," }","}",""],"textDocument":{"uri":"file:///home/dick/LanguageClient-neovim/src/rpcclient.rs"}},"id":2} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":2,"result":[{"originSelectionRange":{"start":{"line":49,"character":44},"end":{"line":49,"character":49}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1886,"character":4},"end":{"line":1892,"character":5}},"targetSelectionRange":{"start":{"line":1887,"character":7},"end":{"line":1887,"character":12}}}]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:Edit","params":["edit","/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"cursor","params":[1888,8]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["expand('%')"],"id":28} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleFileType", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 22, "start": 0}, "languageId": "rust", "position": {"character": 0, "line": 0}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:2760 handle_file_type; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) 17:00:16 INFO unnamed src/language_server_protocol.rs:1946 text_document_did_open; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"LSP#text","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"],"id":29} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleBufEnter", "jsonrpc": "2.0", "params": {"bufnr": 2, "languageId": "rust", "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:2739 handle_buf_enter; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust")}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","LanguageClient_isServerRunning",1]} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 28, "jsonrpc": "2.0", "result": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:EchomsgEllipsis","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs 1888:8"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","result":[{"originSelectionRange":{"end":{"character":49,"line":49},"start":{"character":44,"line":49}},"targetRange":{"end":{"character":5,"line":1892},"start":{"character":4,"line":1886}},"targetSelectionRange":{"end":{"character":12,"line":1887},"start":{"character":7,"line":1887}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}],"id":1} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 29, "jsonrpc": "2.0", "result": ["//! Optional values.", "//!", "//! Type [`Option`] represents an optional value: every [`Option`]", "//! is either [`Some`] and contains a value, or [`None`], and", "//! does not. [`Option`] types are very common in Rust code, as", "//! they have a number of uses:", "//!", "//! * Initial values", "//! * Return values for functions that are not defined", "//! over their entire input range (partial functions)", "//! * Return value for otherwise reporting simple errors, where [`None`] is", "//! returned on error", "//! * Optional struct fields", "//! * Struct fields that can be loaned or \"taken\"", "//! * Optional function arguments", "//! * Nullable pointers", "//! * Swapping things out of difficult situations", "//!", "//! [`Option`]s are commonly paired with pattern matching to query the presence", "//! of a value and take action, always accounting for the [`None`] case.", "//!", "//! ```", "//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {", "//! if denominator == 0.0 {", "//! None", "//! } else {", "//! Some(numerator / denominator)", "//! }", "//! }", "//!", "//! // The return value of the function is an option", "//! let result = divide(2.0, 3.0);", "//!", "//! // Pattern match to retrieve the value", "//! match result {", "//! // The division was valid", "//! Some(x) => println!(\"Result: {x}\"),", "//! // The division was invalid", "//! None => println!(\"Cannot divide by 0\"),", "//! }", "//! ```", "//!", "//", "// FIXME: Show how `Option` is used in practice, with lots of methods", "//", "//! # Options and pointers (\"nullable\" pointers)", "//!", "//! Rust's pointer types must always point to a valid location; there are", "//! no \"null\" references. Instead, Rust has *optional* pointers, like", "//! the optional owned box, <code>[Option]<[Box\\<T>]></code>.", "//!", "//! [Box\\<T>]: ../../std/boxed/struct.Box.html", "//!", "//! The following example uses [`Option`] to create an optional box of", "//! [`i32`]. Notice that in order to use the inner [`i32`] value, the", "//! `check_optional` function first needs to use pattern matching to", "//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or", "//! not ([`None`]).", "//!", "//! ```", "//! let optional = None;", "//! check_optional(optional);", "//!", "//! let optional = Some(Box::new(9000));", "//! check_optional(optional);", "//!", "//! fn check_optional(optional: Option<Box<i32>>) {", "//! match optional {", "//! Some(p) => println!(\"has value {p}\"),", "//! None => println!(\"has no value\"),", "//! }", "//! }", "//! ```", "//!", "//! # Representation", "//!", "//! Rust guarantees to optimize the following types `T` such that", "//! [`Option<T>`] has the same size as `T`:", "//!", "//! * [`Box<U>`]", "//! * `&U`", "//! * `&mut U`", "//! * `fn`, `extern \"C\" fn`[^extern_fn]", "//! * [`num::NonZero*`]", "//! * [`ptr::NonNull<U>`]", "//! * `#[repr(transparent)]` struct around one of the types in this list.", "//!", "//! [^extern_fn]: this remains true for any other ABI: `extern \"abi\" fn` (_e.g._, `extern \"system\" fn`)", "//!", "//! [`Box<U>`]: ../../std/boxed/struct.Box.html", "//! [`num::NonZero*`]: crate::num", "//! [`ptr::NonNull<U>`]: crate::ptr::NonNull", "//!", "//! This is called the \"null pointer optimization\" or NPO.", "//!", "//! It is further guaranteed that, for the cases above, one can", "//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and", "//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`", "//! is undefined behaviour).", "//!", "//! # Method overview", "//!", "//! In addition to working with pattern matching, [`Option`] provides a wide", "//! variety of different methods.", "//!", "//! ## Querying the variant", "//!", "//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]", "//! is [`Some`] or [`None`], respectively.", "//!", "//! [`is_none`]: Option::is_none", "//! [`is_some`]: Option::is_some", "//!", "//! ## Adapters for working with references", "//!", "//! * [`as_ref`] converts from <code>[&][][Option]\\<T></code> to <code>[Option]<[&]T></code>", "//! * [`as_mut`] converts from <code>[&mut] [Option]\\<T></code> to <code>[Option]<[&mut] T></code>", "//! * [`as_deref`] converts from <code>[&][][Option]\\<T></code> to", "//! <code>[Option]<[&]T::[Target]></code>", "//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\\<T></code> to", "//! <code>[Option]<[&mut] T::[Target]></code>", "//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\\<T>></code> to", "//! <code>[Option]<[Pin]<[&]T>></code>", "//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\\<T>></code> to", "//! <code>[Option]<[Pin]<[&mut] T>></code>", "//!", "//! [&]: reference \"shared reference\"", "//! [&mut]: reference \"mutable reference\"", "//! [Target]: Deref::Target \"ops::Deref::Target\"", "//! [`as_deref`]: Option::as_deref", "//! [`as_deref_mut`]: Option::as_deref_mut", "//! [`as_mut`]: Option::as_mut", "//! [`as_pin_mut`]: Option::as_pin_mut", "//! [`as_pin_ref`]: Option::as_pin_ref", "//! [`as_ref`]: Option::as_ref", "//!", "//! ## Extracting the contained value", "//!", "//! These methods extract the contained value in an [`Option<T>`] when it", "//! is the [`Some`] variant. If the [`Option`] is [`None`]:", "//!", "//! * [`expect`] panics with a provided custom message", "//! * [`unwrap`] panics with a generic message", "//! * [`unwrap_or`] returns the provided default value", "//! * [`unwrap_or_default`] returns the default value of the type `T`", "//! (which must implement the [`Default`] trait)", "//! * [`unwrap_or_else`] returns the result of evaluating the provided", "//! function", "//!", "//! [`expect`]: Option::expect", "//! [`unwrap`]: Option::unwrap", "//! [`unwrap_or`]: Option::unwrap_or", "//! [`unwrap_or_default`]: Option::unwrap_or_default", "//! [`unwrap_or_else`]: Option::unwrap_or_else", "//!", "//! ## Transforming contained values", "//!", "//! These methods transform [`Option`] to [`Result`]:", "//!", "//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to", "//! [`Err(err)`] using the provided default `err` value", "//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to", "//! a value of [`Err`] using the provided function", "//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a", "//! [`Result`] of an [`Option`]", "//!", "//! [`Err(err)`]: Err", "//! [`Ok(v)`]: Ok", "//! [`Some(v)`]: Some", "//! [`ok_or`]: Option::ok_or", "//! [`ok_or_else`]: Option::ok_or_else", "//! [`transpose`]: Option::transpose", "//!", "//! These methods transform the [`Some`] variant:", "//!", "//! * [`filter`] calls the provided predicate function on the contained", "//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]", "//! if the function returns `true`; otherwise, returns [`None`]", "//! * [`flatten`] removes one level of nesting from an", "//! [`Option<Option<T>>`]", "//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the", "//! provided function to the contained value of [`Some`] and leaving", "//! [`None`] values unchanged", "//!", "//! [`Some(t)`]: Some", "//! [`filter`]: Option::filter", "//! [`flatten`]: Option::flatten", "//! [`map`]: Option::map", "//!", "//! These methods transform [`Option<T>`] to a value of a possibly", "//! different type `U`:", "//!", "//! * [`map_or`] applies the provided function to the contained value of", "//! [`Some`], or returns the provided default value if the [`Option`] is", "//! [`None`]", "//! * [`map_or_else`] applies the provided function to the contained value", "//! of [`Some`], or returns the result of evaluating the provided", "//! fallback function if the [`Option`] is [`None`]", "//!", "//! [`map_or`]: Option::map_or", "//! [`map_or_else`]: Option::map_or_else", "//!", "//! These methods combine the [`Some`] variants of two [`Option`] values:", "//!", "//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the", "//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]", "//! * [`zip_with`] calls the provided function `f` and returns", "//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided", "//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]", "//!", "//! [`Some(f(s, o))`]: Some", "//! [`Some(o)`]: Some", "//! [`Some(s)`]: Some", "//! [`Some((s, o))`]: Some", "//! [`zip`]: Option::zip", "//! [`zip_with`]: Option::zip_with", "//!", "//! ## Boolean operators", "//!", "//! These methods treat the [`Option`] as a boolean value, where [`Some`]", "//! acts like [`true`] and [`None`] acts like [`false`]. There are two", "//! categories of these methods: ones that take an [`Option`] as input, and", "//! ones that take a function as input (to be lazily evaluated).", "//!", "//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as", "//! input, and produce an [`Option`] as output. Only the [`and`] method can", "//! produce an [`Option<U>`] value having a different inner type `U` than", "//! [`Option<T>`].", "//!", "//! | method | self | input | output |", "//! |---------|-----------|-----------|-----------|", "//! | [`and`] | `None` | (ignored) | `None` |", "//! | [`and`] | `Some(x)` | `None` | `None` |", "//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |", "//! | [`or`] | `None` | `None` | `None` |", "//! | [`or`] | `None` | `Some(y)` | `Some(y)` |", "//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |", "//! | [`xor`] | `None` | `None` | `None` |", "//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |", "//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |", "//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |", "//!", "//! [`and`]: Option::and", "//! [`or`]: Option::or", "//! [`xor`]: Option::xor", "//!", "//! The [`and_then`] and [`or_else`] methods take a function as input, and", "//! only evaluate the function when they need to produce a new value. Only", "//! the [`and_then`] method can produce an [`Option<U>`] value having a", "//! different inner type `U` than [`Option<T>`].", "//!", "//! | method | self | function input | function result | output |", "//! |--------------|-----------|----------------|-----------------|-----------|", "//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |", "//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |", "//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |", "//! | [`or_else`] | `None` | (not provided) | `None` | `None` |", "//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |", "//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |", "//!", "//! [`and_then`]: Option::and_then", "//! [`or_else`]: Option::or_else", "//!", "//! This is an example of using methods like [`and_then`] and [`or`] in a", "//! pipeline of method calls. Early stages of the pipeline pass failure", "//! values ([`None`]) through unchanged, and continue processing on", "//! success values ([`Some`]). Toward the end, [`or`] substitutes an error", "//! message if it receives [`None`].", "//!", "//! ```", "//! # use std::collections::BTreeMap;", "//! let mut bt = BTreeMap::new();", "//! bt.insert(20u8, \"foo\");", "//! bt.insert(42u8, \"bar\");", "//! let res = [0u8, 1, 11, 200, 22]", "//! .into_iter()", "//! .map(|x| {", "//! // `checked_sub()` returns `None` on error", "//! x.checked_sub(1)", "//! // same with `checked_mul()`", "//! .and_then(|x| x.checked_mul(2))", "//! // `BTreeMap::get` returns `None` on error", "//! .and_then(|x| bt.get(&x))", "//! // Substitute an error message if we have `None` so far", "//! .or(Some(&\"error!\"))", "//! .copied()", "//! // Won't panic because we unconditionally used `Some` above", "//! .unwrap()", "//! })", "//! .collect::<Vec<_>>();", "//! assert_eq!(res, [\"error!\", \"error!\", \"foo\", \"error!\", \"bar\"]);", "//! ```", "//!", "//! ## Comparison operators", "//!", "//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its", "//! [`PartialOrd`] implementation. With this order, [`None`] compares as", "//! less than any [`Some`], and two [`Some`] compare the same way as their", "//! contained values would in `T`. If `T` also implements", "//! [`Ord`], then so does [`Option<T>`].", "//!", "//! ```", "//! assert!(None < Some(0));", "//! assert!(Some(0) < Some(1));", "//! ```", "//!", "//! ## Iterating over `Option`", "//!", "//! An [`Option`] can be iterated over. This can be helpful if you need an", "//! iterator that is conditionally empty. The iterator will either produce", "//! a single value (when the [`Option`] is [`Some`]), or produce no values", "//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like", "//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if", "//! the [`Option`] is [`None`].", "//!", "//! [`Some(v)`]: Some", "//! [`empty()`]: crate::iter::empty", "//! [`once(v)`]: crate::iter::once", "//!", "//! Iterators over [`Option<T>`] come in three types:", "//!", "//! * [`into_iter`] consumes the [`Option`] and produces the contained", "//! value", "//! * [`iter`] produces an immutable reference of type `&T` to the", "//! contained value", "//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the", "//! contained value", "//!", "//! [`into_iter`]: Option::into_iter", "//! [`iter`]: Option::iter", "//! [`iter_mut`]: Option::iter_mut", "//!", "//! An iterator over [`Option`] can be useful when chaining iterators, for", "//! example, to conditionally insert items. (It's not always necessary to", "//! explicitly call an iterator constructor: many [`Iterator`] methods that", "//! accept other iterators will also accept iterable types that implement", "//! [`IntoIterator`], which includes [`Option`].)", "//!", "//! ```", "//! let yep = Some(42);", "//! let nope = None;", "//! // chain() already calls into_iter(), so we don't have to do so", "//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();", "//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);", "//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();", "//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);", "//! ```", "//!", "//! One reason to chain iterators in this way is that a function returning", "//! `impl Iterator` must have all possible return values be of the same", "//! concrete type. Chaining an iterated [`Option`] can help with that.", "//!", "//! ```", "//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {", "//! // Explicit returns to illustrate return types matching", "//! match do_insert {", "//! true => return (0..4).chain(Some(42)).chain(4..8),", "//! false => return (0..4).chain(None).chain(4..8),", "//! }", "//! }", "//! println!(\"{:?}\", make_iter(true).collect::<Vec<_>>());", "//! println!(\"{:?}\", make_iter(false).collect::<Vec<_>>());", "//! ```", "//!", "//! If we try to do the same thing, but using [`once()`] and [`empty()`],", "//! we can't return `impl Iterator` anymore because the concrete types of", "//! the return values differ.", "//!", "//! [`empty()`]: crate::iter::empty", "//! [`once()`]: crate::iter::once", "//!", "//! ```compile_fail,E0308", "//! # use std::iter::{empty, once};", "//! // This won't compile because all possible returns from the function", "//! // must have the same concrete type.", "//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {", "//! // Explicit returns to illustrate return types not matching", "//! match do_insert {", "//! true => return (0..4).chain(once(42)).chain(4..8),", "//! false => return (0..4).chain(empty()).chain(4..8),", "//! }", "//! }", "//! ```", "//!", "//! ## Collecting into `Option`", "//!", "//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,", "//! which allows an iterator over [`Option`] values to be collected into an", "//! [`Option`] of a collection of each contained value of the original", "//! [`Option`] values, or [`None`] if any of the elements was [`None`].", "//!", "//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E", "//!", "//! ```", "//! let v = [Some(2), Some(4), None, Some(8)];", "//! let res: Option<Vec<_>> = v.into_iter().collect();", "//! assert_eq!(res, None);", "//! let v = [Some(2), Some(4), Some(8)];", "//! let res: Option<Vec<_>> = v.into_iter().collect();", "//! assert_eq!(res, Some(vec![2, 4, 8]));", "//! ```", "//!", "//! [`Option`] also implements the [`Product`][impl-Product] and", "//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values", "//! to provide the [`product`][Iterator::product] and", "//! [`sum`][Iterator::sum] methods.", "//!", "//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E", "//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E", "//!", "//! ```", "//! let v = [None, Some(1), Some(2), Some(3)];", "//! let res: Option<i32> = v.into_iter().sum();", "//! assert_eq!(res, None);", "//! let v = [Some(1), Some(2), Some(21)];", "//! let res: Option<i32> = v.into_iter().product();", "//! assert_eq!(res, Some(42));", "//! ```", "//!", "//! ## Modifying an [`Option`] in-place", "//!", "//! These methods return a mutable reference to the contained value of an", "//! [`Option<T>`]:", "//!", "//! * [`insert`] inserts a value, dropping any old contents", "//! * [`get_or_insert`] gets the current value, inserting a provided", "//! default value if it is [`None`]", "//! * [`get_or_insert_default`] gets the current value, inserting the", "//! default value of type `T` (which must implement [`Default`]) if it is", "//! [`None`]", "//! * [`get_or_insert_with`] gets the current value, inserting a default", "//! computed by the provided function if it is [`None`]", "//!", "//! [`get_or_insert`]: Option::get_or_insert", "//! [`get_or_insert_default`]: Option::get_or_insert_default", "//! [`get_or_insert_with`]: Option::get_or_insert_with", "//! [`insert`]: Option::insert", "//!", "//! These methods transfer ownership of the contained value of an", "//! [`Option`]:", "//!", "//! * [`take`] takes ownership of the contained value of an [`Option`], if", "//! any, replacing the [`Option`] with [`None`]", "//! * [`replace`] takes ownership of the contained value of an [`Option`],", "//! if any, replacing the [`Option`] with a [`Some`] containing the", "//! provided value", "//!", "//! [`replace`]: Option::replace", "//! [`take`]: Option::take", "//!", "//! # Examples", "//!", "//! Basic pattern matching on [`Option`]:", "//!", "//! ```", "//! let msg = Some(\"howdy\");", "//!", "//! // Take a reference to the contained string", "//! if let Some(m) = &msg {", "//! println!(\"{}\", *m);", "//! }", "//!", "//! // Remove the contained string, destroying the Option", "//! let unwrapped_msg = msg.unwrap_or(\"default message\");", "//! ```", "//!", "//! Initialize a result to [`None`] before a loop:", "//!", "//! ```", "//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }", "//!", "//! // A list of data to search through.", "//! let all_the_big_things = [", "//! Kingdom::Plant(250, \"redwood\"),", "//! Kingdom::Plant(230, \"noble fir\"),", "//! Kingdom::Plant(229, \"sugar pine\"),", "//! Kingdom::Animal(25, \"blue whale\"),", "//! Kingdom::Animal(19, \"fin whale\"),", "//! Kingdom::Animal(15, \"north pacific right whale\"),", "//! ];", "//!", "//! // We're going to search for the name of the biggest animal,", "//! // but to start with we've just got `None`.", "//! let mut name_of_biggest_animal = None;", "//! let mut size_of_biggest_animal = 0;", "//! for big_thing in &all_the_big_things {", "//! match *big_thing {", "//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {", "//! // Now we've found the name of some big animal", "//! size_of_biggest_animal = size;", "//! name_of_biggest_animal = Some(name);", "//! }", "//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()", "//! }", "//! }", "//!", "//! match name_of_biggest_animal {", "//! Some(name) => println!(\"the biggest animal is {name}\"),", "//! None => println!(\"there are no animals :(\"),", "//! }", "//! ```", "", "#![stable(feature = \"rust1\", since = \"1.0.0\")]", "", "use crate::iter::{self, FromIterator, FusedIterator, TrustedLen};", "use crate::marker::Destruct;", "use crate::panicking::{panic, panic_str};", "use crate::pin::Pin;", "use crate::{", " convert, hint, mem,", " ops::{self, ControlFlow, Deref, DerefMut},", "};", "", "/// The `Option` type. See [the module level documentation](self) for more.", "#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]", "#[rustc_diagnostic_item = \"Option\"]", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "pub enum Option<T> {", " /// No value.", " #[lang = \"None\"]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " None,", " /// Some value of type `T`.", " #[lang = \"Some\"]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " Some(#[stable(feature = \"rust1\", since = \"1.0.0\")] T),", "}", "", "/////////////////////////////////////////////////////////////////////////////", "// Type implementation", "/////////////////////////////////////////////////////////////////////////////", "", "impl<T> Option<T> {", " /////////////////////////////////////////////////////////////////////////", " // Querying the contained values", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns `true` if the option is a [`Some`] value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.is_some(), true);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.is_some(), false);", " /// ```", " #[must_use = \"if you intended to assert that this has a value, consider `.unwrap()` instead\"]", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]", " pub const fn is_some(&self) -> bool {", " matches!(*self, Some(_))", " }", "", " /// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(is_some_with)]", " ///", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.is_some_and(|&x| x > 1), true);", " ///", " /// let x: Option<u32> = Some(0);", " /// assert_eq!(x.is_some_and(|&x| x > 1), false);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.is_some_and(|&x| x > 1), false);", " /// ```", " #[must_use]", " #[inline]", " #[unstable(feature = \"is_some_with\", issue = \"93050\")]", " pub fn is_some_and(&self, f: impl FnOnce(&T) -> bool) -> bool {", " matches!(self, Some(x) if f(x))", " }", "", " /// Returns `true` if the option is a [`None`] value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.is_none(), false);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.is_none(), true);", " /// ```", " #[must_use = \"if you intended to assert that this doesn't have a value, consider \\", " `.and_then(|_| panic!(\\\"`Option` had a value when expected `None`\\\"))` instead\"]", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]", " pub const fn is_none(&self) -> bool {", " !self.is_some()", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Adapter for working with references", " /////////////////////////////////////////////////////////////////////////", "", " /// Converts from `&Option<T>` to `Option<&T>`.", " ///", " /// # Examples", " ///", " /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, preserving", " /// the original. The [`map`] method takes the `self` argument by value, consuming the original,", " /// so this technique uses `as_ref` to first take an `Option` to a reference", " /// to the value inside the original.", " ///", " /// [`map`]: Option::map", " /// [String]: ../../std/string/struct.String.html \"String\"", " ///", " /// ```", " /// let text: Option<String> = Some(\"Hello, world!\".to_string());", " /// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,", " /// // then consume *that* with `map`, leaving `text` on the stack.", " /// let text_length: Option<usize> = text.as_ref().map(|s| s.len());", " /// println!(\"still can print text: {text:?}\");", " /// ```", " #[inline]", " #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " pub const fn as_ref(&self) -> Option<&T> {", " match *self {", " Some(ref x) => Some(x),", " None => None,", " }", " }", "", " /// Converts from `&mut Option<T>` to `Option<&mut T>`.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(2);", " /// match x.as_mut() {", " /// Some(v) => *v = 42,", " /// None => {},", " /// }", " /// assert_eq!(x, Some(42));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn as_mut(&mut self) -> Option<&mut T> {", " match *self {", " Some(ref mut x) => Some(x),", " None => None,", " }", " }", "", " /// Converts from <code>[Pin]<[&]Option\\<T>></code> to <code>Option<[Pin]<[&]T>></code>.", " ///", " /// [&]: reference \"shared reference\"", " #[inline]", " #[must_use]", " #[stable(feature = \"pin\", since = \"1.33.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {", " match Pin::get_ref(self).as_ref() {", " // SAFETY: `x` is guaranteed to be pinned because it comes from `self`", " // which is pinned.", " Some(x) => unsafe { Some(Pin::new_unchecked(x)) },", " None => None,", " }", " }", "", " /// Converts from <code>[Pin]<[&mut] Option\\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.", " ///", " /// [&mut]: reference \"mutable reference\"", " #[inline]", " #[must_use]", " #[stable(feature = \"pin\", since = \"1.33.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {", " // SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.", " // `x` is guaranteed to be pinned because it comes from `self` which is pinned.", " unsafe {", " match Pin::get_unchecked_mut(self).as_mut() {", " Some(x) => Some(Pin::new_unchecked(x)),", " None => None,", " }", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Getting to contained values", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns the contained [`Some`] value, consuming the `self` value.", " ///", " /// # Panics", " ///", " /// Panics if the value is a [`None`] with a custom panic message provided by", " /// `msg`.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"value\");", " /// assert_eq!(x.expect(\"fruits are healthy\"), \"value\");", " /// ```", " ///", " /// ```should_panic", " /// let x: Option<&str> = None;", " /// x.expect(\"fruits are healthy\"); // panics with `fruits are healthy`", " /// ```", " ///", " /// # Recommended Message Style", " ///", " /// We recommend that `expect` messages are used to describe the reason you", " /// _expect_ the `Option` should be `Some`.", " ///", " /// ```should_panic", " /// # let slice: &[u8] = &[];", " /// let item = slice.get(0)", " /// .expect(\"slice should not be empty\");", " /// ```", " ///", " /// **Hint**: If you're having trouble remembering how to phrase expect", " /// error messages remember to focus on the word \"should\" as in \"env", " /// variable should be set by blah\" or \"the given binary should be available", " /// and executable by the current user\".", " ///", " /// For more detail on expect message styles and the reasoning behind our", " /// recommendation please refer to the section on [\"Common Message", " /// Styles\"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.", " #[inline]", " #[track_caller]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn expect(self, msg: &str) -> T {", " match self {", " Some(val) => val,", " None => expect_failed(msg),", " }", " }", "", " /// Returns the contained [`Some`] value, consuming the `self` value.", " ///", " /// Because this function may panic, its use is generally discouraged.", " /// Instead, prefer to use pattern matching and handle the [`None`]", " /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or", " /// [`unwrap_or_default`].", " ///", " /// [`unwrap_or`]: Option::unwrap_or", " /// [`unwrap_or_else`]: Option::unwrap_or_else", " /// [`unwrap_or_default`]: Option::unwrap_or_default", " ///", " /// # Panics", " ///", " /// Panics if the self value equals [`None`].", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"air\");", " /// assert_eq!(x.unwrap(), \"air\");", " /// ```", " ///", " /// ```should_panic", " /// let x: Option<&str> = None;", " /// assert_eq!(x.unwrap(), \"air\"); // fails", " /// ```", " #[inline]", " #[track_caller]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn unwrap(self) -> T {", " match self {", " Some(val) => val,", " None => panic(\"called `Option::unwrap()` on a `None` value\"),", " }", " }", "", " /// Returns the contained [`Some`] value or a provided default.", " ///", " /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing", " /// the result of a function call, it is recommended to use [`unwrap_or_else`],", " /// which is lazily evaluated.", " ///", " /// [`unwrap_or_else`]: Option::unwrap_or_else", " ///", " /// # Examples", " ///", " /// ```", " /// assert_eq!(Some(\"car\").unwrap_or(\"bike\"), \"car\");", " /// assert_eq!(None.unwrap_or(\"bike\"), \"bike\");", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn unwrap_or(self, default: T) -> T", " where", " T: ~const Destruct,", " {", " match self {", " Some(x) => x,", " None => default,", " }", " }", "", " /// Returns the contained [`Some`] value or computes it from a closure.", " ///", " /// # Examples", " ///", " /// ```", " /// let k = 10;", " /// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);", " /// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn unwrap_or_else<F>(self, f: F) -> T", " where", " F: ~const FnOnce() -> T,", " F: ~const Destruct,", " {", " match self {", " Some(x) => x,", " None => f(),", " }", " }", "", " /// Returns the contained [`Some`] value or a default.", " ///", " /// Consumes the `self` argument then, if [`Some`], returns the contained", " /// value, otherwise if [`None`], returns the [default value] for that", " /// type.", " ///", " /// # Examples", " ///", " /// Converts a string to an integer, turning poorly-formed strings", " /// into 0 (the default value for integers). [`parse`] converts", " /// a string to any other type that implements [`FromStr`], returning", " /// [`None`] on error.", " ///", " /// ```", " /// let good_year_from_input = \"1909\";", " /// let bad_year_from_input = \"190blarg\";", " /// let good_year = good_year_from_input.parse().ok().unwrap_or_default();", " /// let bad_year = bad_year_from_input.parse().ok().unwrap_or_default();", " ///", " /// assert_eq!(1909, good_year);", " /// assert_eq!(0, bad_year);", " /// ```", " ///", " /// [default value]: Default::default", " /// [`parse`]: str::parse", " /// [`FromStr`]: crate::str::FromStr", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn unwrap_or_default(self) -> T", " where", " T: ~const Default,", " {", " match self {", " Some(x) => x,", " None => Default::default(),", " }", " }", "", " /// Returns the contained [`Some`] value, consuming the `self` value,", " /// without checking that the value is not [`None`].", " ///", " /// # Safety", " ///", " /// Calling this method on [`None`] is *[undefined behavior]*.", " ///", " /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"air\");", " /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\");", " /// ```", " ///", " /// ```no_run", " /// let x: Option<&str> = None;", " /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\"); // Undefined behavior!", " /// ```", " #[inline]", " #[track_caller]", " #[stable(feature = \"option_result_unwrap_unchecked\", since = \"1.58.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const unsafe fn unwrap_unchecked(self) -> T {", " debug_assert!(self.is_some());", " match self {", " Some(val) => val,", " // SAFETY: the safety contract must be upheld by the caller.", " None => unsafe { hint::unreachable_unchecked() },", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Transforming contained values", " /////////////////////////////////////////////////////////////////////////", "", " /// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.", " ///", " /// # Examples", " ///", " /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, consuming", " /// the original:", " ///", " /// [String]: ../../std/string/struct.String.html \"String\"", " /// ```", " /// let maybe_some_string = Some(String::from(\"Hello, World!\"));", " /// // `Option::map` takes self *by value*, consuming `maybe_some_string`", " /// let maybe_some_len = maybe_some_string.map(|s| s.len());", " ///", " /// assert_eq!(maybe_some_len, Some(13));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn map<U, F>(self, f: F) -> Option<U>", " where", " F: ~const FnOnce(T) -> U,", " F: ~const Destruct,", " {", " match self {", " Some(x) => Some(f(x)),", " None => None,", " }", " }", "", " /// Calls the provided closure with a reference to the contained value (if [`Some`]).", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(result_option_inspect)]", " ///", " /// let v = vec![1, 2, 3, 4, 5];", " ///", " /// // prints \"got: 4\"", " /// let x: Option<&usize> = v.get(3).inspect(|x| println!(\"got: {x}\"));", " ///", " /// // prints nothing", " /// let x: Option<&usize> = v.get(5).inspect(|x| println!(\"got: {x}\"));", " /// ```", " #[inline]", " #[unstable(feature = \"result_option_inspect\", issue = \"91345\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn inspect<F>(self, f: F) -> Self", " where", " F: ~const FnOnce(&T),", " F: ~const Destruct,", " {", " if let Some(ref x) = self {", " f(x);", " }", "", " self", " }", "", " /// Returns the provided default result (if none),", " /// or applies a function to the contained value (if any).", " ///", " /// Arguments passed to `map_or` are eagerly evaluated; if you are passing", " /// the result of a function call, it is recommended to use [`map_or_else`],", " /// which is lazily evaluated.", " ///", " /// [`map_or_else`]: Option::map_or_else", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"foo\");", " /// assert_eq!(x.map_or(42, |v| v.len()), 3);", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.map_or(42, |v| v.len()), 42);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn map_or<U, F>(self, default: U, f: F) -> U", " where", " F: ~const FnOnce(T) -> U,", " F: ~const Destruct,", " U: ~const Destruct,", " {", " match self {", " Some(t) => f(t),", " None => default,", " }", " }", "", " /// Computes a default function result (if none), or", " /// applies a different function to the contained value (if any).", " ///", " /// # Examples", " ///", " /// ```", " /// let k = 21;", " ///", " /// let x = Some(\"foo\");", " /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U", " where", " D: ~const FnOnce() -> U,", " D: ~const Destruct,", " F: ~const FnOnce(T) -> U,", " F: ~const Destruct,", " {", " match self {", " Some(t) => f(t),", " None => default(),", " }", " }", "", " /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to", " /// [`Ok(v)`] and [`None`] to [`Err(err)`].", " ///", " /// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the", " /// result of a function call, it is recommended to use [`ok_or_else`], which is", " /// lazily evaluated.", " ///", " /// [`Ok(v)`]: Ok", " /// [`Err(err)`]: Err", " /// [`Some(v)`]: Some", " /// [`ok_or_else`]: Option::ok_or_else", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"foo\");", " /// assert_eq!(x.ok_or(0), Ok(\"foo\"));", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.ok_or(0), Err(0));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn ok_or<E>(self, err: E) -> Result<T, E>", " where", " E: ~const Destruct,", " {", " match self {", " Some(v) => Ok(v),", " None => Err(err),", " }", " }", "", " /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to", " /// [`Ok(v)`] and [`None`] to [`Err(err())`].", " ///", " /// [`Ok(v)`]: Ok", " /// [`Err(err())`]: Err", " /// [`Some(v)`]: Some", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"foo\");", " /// assert_eq!(x.ok_or_else(|| 0), Ok(\"foo\"));", " ///", " /// let x: Option<&str> = None;", " /// assert_eq!(x.ok_or_else(|| 0), Err(0));", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>", " where", " F: ~const FnOnce() -> E,", " F: ~const Destruct,", " {", " match self {", " Some(v) => Ok(v),", " None => Err(err()),", " }", " }", "", " /// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.", " ///", " /// Leaves the original Option in-place, creating a new one with a reference", " /// to the original one, additionally coercing the contents via [`Deref`].", " ///", " /// # Examples", " ///", " /// ```", " /// let x: Option<String> = Some(\"hey\".to_owned());", " /// assert_eq!(x.as_deref(), Some(\"hey\"));", " ///", " /// let x: Option<String> = None;", " /// assert_eq!(x.as_deref(), None);", " /// ```", " #[stable(feature = \"option_deref\", since = \"1.40.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_deref(&self) -> Option<&T::Target>", " where", " T: ~const Deref,", " {", " match self.as_ref() {", " Some(t) => Some(t.deref()),", " None => None,", " }", " }", "", " /// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.", " ///", " /// Leaves the original `Option` in-place, creating a new one containing a mutable reference to", " /// the inner type's [`Deref::Target`] type.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x: Option<String> = Some(\"hey\".to_owned());", " /// assert_eq!(x.as_deref_mut().map(|x| {", " /// x.make_ascii_uppercase();", " /// x", " /// }), Some(\"HEY\".to_owned().as_mut_str()));", " /// ```", " #[stable(feature = \"option_deref\", since = \"1.40.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>", " where", " T: ~const DerefMut,", " {", " match self.as_mut() {", " Some(t) => Some(t.deref_mut()),", " None => None,", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Iterator constructors", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns an iterator over the possibly contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(4);", " /// assert_eq!(x.iter().next(), Some(&4));", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.iter().next(), None);", " /// ```", " #[inline]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " pub const fn iter(&self) -> Iter<'_, T> {", " Iter { inner: Item { opt: self.as_ref() } }", " }", "", " /// Returns a mutable iterator over the possibly contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(4);", " /// match x.iter_mut().next() {", " /// Some(v) => *v = 42,", " /// None => {},", " /// }", " /// assert_eq!(x, Some(42));", " ///", " /// let mut x: Option<u32> = None;", " /// assert_eq!(x.iter_mut().next(), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " pub fn iter_mut(&mut self) -> IterMut<'_, T> {", " IterMut { inner: Item { opt: self.as_mut() } }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Boolean operations on the values, eager and lazy", " /////////////////////////////////////////////////////////////////////////", "", " /// Returns [`None`] if the option is [`None`], otherwise returns `optb`.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(2);", " /// let y: Option<&str> = None;", " /// assert_eq!(x.and(y), None);", " ///", " /// let x: Option<u32> = None;", " /// let y = Some(\"foo\");", " /// assert_eq!(x.and(y), None);", " ///", " /// let x = Some(2);", " /// let y = Some(\"foo\");", " /// assert_eq!(x.and(y), Some(\"foo\"));", " ///", " /// let x: Option<u32> = None;", " /// let y: Option<&str> = None;", " /// assert_eq!(x.and(y), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn and<U>(self, optb: Option<U>) -> Option<U>", " where", " T: ~const Destruct,", " U: ~const Destruct,", " {", " match self {", " Some(_) => optb,", " None => None,", " }", " }", "", " /// Returns [`None`] if the option is [`None`], otherwise calls `f` with the", " /// wrapped value and returns the result.", " ///", " /// Some languages call this operation flatmap.", " ///", " /// # Examples", " ///", " /// ```", " /// fn sq_then_to_string(x: u32) -> Option<String> {", " /// x.checked_mul(x).map(|sq| sq.to_string())", " /// }", " ///", " /// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));", " /// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!", " /// assert_eq!(None.and_then(sq_then_to_string), None);", " /// ```", " ///", " /// Often used to chain fallible operations that may return [`None`].", " ///", " /// ```", " /// let arr_2d = [[\"A0\", \"A1\"], [\"B0\", \"B1\"]];", " ///", " /// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));", " /// assert_eq!(item_0_1, Some(&\"A1\"));", " ///", " /// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));", " /// assert_eq!(item_2_0, None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn and_then<U, F>(self, f: F) -> Option<U>", " where", " F: ~const FnOnce(T) -> Option<U>,", " F: ~const Destruct,", " {", " match self {", " Some(x) => f(x),", " None => None,", " }", " }", "", " /// Returns [`None`] if the option is [`None`], otherwise calls `predicate`", " /// with the wrapped value and returns:", " ///", " /// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped", " /// value), and", " /// - [`None`] if `predicate` returns `false`.", " ///", " /// This function works similar to [`Iterator::filter()`]. You can imagine", " /// the `Option<T>` being an iterator over one or zero elements. `filter()`", " /// lets you decide which elements to keep.", " ///", " /// # Examples", " ///", " /// ```rust", " /// fn is_even(n: &i32) -> bool {", " /// n % 2 == 0", " /// }", " ///", " /// assert_eq!(None.filter(is_even), None);", " /// assert_eq!(Some(3).filter(is_even), None);", " /// assert_eq!(Some(4).filter(is_even), Some(4));", " /// ```", " ///", " /// [`Some(t)`]: Some", " #[inline]", " #[stable(feature = \"option_filter\", since = \"1.27.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn filter<P>(self, predicate: P) -> Self", " where", " T: ~const Destruct,", " P: ~const FnOnce(&T) -> bool,", " P: ~const Destruct,", " {", " if let Some(x) = self {", " if predicate(&x) {", " return Some(x);", " }", " }", " None", " }", "", " /// Returns the option if it contains a value, otherwise returns `optb`.", " ///", " /// Arguments passed to `or` are eagerly evaluated; if you are passing the", " /// result of a function call, it is recommended to use [`or_else`], which is", " /// lazily evaluated.", " ///", " /// [`or_else`]: Option::or_else", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(2);", " /// let y = None;", " /// assert_eq!(x.or(y), Some(2));", " ///", " /// let x = None;", " /// let y = Some(100);", " /// assert_eq!(x.or(y), Some(100));", " ///", " /// let x = Some(2);", " /// let y = Some(100);", " /// assert_eq!(x.or(y), Some(2));", " ///", " /// let x: Option<u32> = None;", " /// let y = None;", " /// assert_eq!(x.or(y), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn or(self, optb: Option<T>) -> Option<T>", " where", " T: ~const Destruct,", " {", " match self {", " Some(x) => Some(x),", " None => optb,", " }", " }", "", " /// Returns the option if it contains a value, otherwise calls `f` and", " /// returns the result.", " ///", " /// # Examples", " ///", " /// ```", " /// fn nobody() -> Option<&'static str> { None }", " /// fn vikings() -> Option<&'static str> { Some(\"vikings\") }", " ///", " /// assert_eq!(Some(\"barbarians\").or_else(vikings), Some(\"barbarians\"));", " /// assert_eq!(None.or_else(vikings), Some(\"vikings\"));", " /// assert_eq!(None.or_else(nobody), None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn or_else<F>(self, f: F) -> Option<T>", " where", " F: ~const FnOnce() -> Option<T>,", " F: ~const Destruct,", " {", " match self {", " Some(x) => Some(x),", " None => f(),", " }", " }", "", " /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(2);", " /// let y: Option<u32> = None;", " /// assert_eq!(x.xor(y), Some(2));", " ///", " /// let x: Option<u32> = None;", " /// let y = Some(2);", " /// assert_eq!(x.xor(y), Some(2));", " ///", " /// let x = Some(2);", " /// let y = Some(2);", " /// assert_eq!(x.xor(y), None);", " ///", " /// let x: Option<u32> = None;", " /// let y: Option<u32> = None;", " /// assert_eq!(x.xor(y), None);", " /// ```", " #[inline]", " #[stable(feature = \"option_xor\", since = \"1.37.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn xor(self, optb: Option<T>) -> Option<T>", " where", " T: ~const Destruct,", " {", " match (self, optb) {", " (Some(a), None) => Some(a),", " (None, Some(b)) => Some(b),", " _ => None,", " }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Entry-like operations to insert a value and return a reference", " /////////////////////////////////////////////////////////////////////////", "", " /// Inserts `value` into the option, then returns a mutable reference to it.", " ///", " /// If the option already contains a value, the old value is dropped.", " ///", " /// See also [`Option::get_or_insert`], which doesn't update the value if", " /// the option already contains [`Some`].", " ///", " /// # Example", " ///", " /// ```", " /// let mut opt = None;", " /// let val = opt.insert(1);", " /// assert_eq!(*val, 1);", " /// assert_eq!(opt.unwrap(), 1);", " /// let val = opt.insert(2);", " /// assert_eq!(*val, 2);", " /// *val = 3;", " /// assert_eq!(opt.unwrap(), 3);", " /// ```", " #[must_use = \"if you intended to set a value, consider assignment instead\"]", " #[inline]", " #[stable(feature = \"option_insert\", since = \"1.53.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn insert(&mut self, value: T) -> &mut T", " where", " T: ~const Destruct,", " {", " *self = Some(value);", "", " // SAFETY: the code above just filled the option", " unsafe { self.as_mut().unwrap_unchecked() }", " }", "", " /// Inserts `value` into the option if it is [`None`], then", " /// returns a mutable reference to the contained value.", " ///", " /// See also [`Option::insert`], which updates the value even if", " /// the option already contains [`Some`].", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = None;", " ///", " /// {", " /// let y: &mut u32 = x.get_or_insert(5);", " /// assert_eq!(y, &5);", " ///", " /// *y = 7;", " /// }", " ///", " /// assert_eq!(x, Some(7));", " /// ```", " #[inline]", " #[stable(feature = \"option_entry\", since = \"1.20.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn get_or_insert(&mut self, value: T) -> &mut T", " where", " T: ~const Destruct,", " {", " if let None = *self {", " *self = Some(value);", " }", "", " // SAFETY: a `None` variant for `self` would have been replaced by a `Some`", " // variant in the code above.", " unsafe { self.as_mut().unwrap_unchecked() }", " }", "", " /// Inserts the default value into the option if it is [`None`], then", " /// returns a mutable reference to the contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(option_get_or_insert_default)]", " ///", " /// let mut x = None;", " ///", " /// {", " /// let y: &mut u32 = x.get_or_insert_default();", " /// assert_eq!(y, &0);", " ///", " /// *y = 7;", " /// }", " ///", " /// assert_eq!(x, Some(7));", " /// ```", " #[inline]", " #[unstable(feature = \"option_get_or_insert_default\", issue = \"82901\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn get_or_insert_default(&mut self) -> &mut T", " where", " T: ~const Default,", " {", " const fn default<T: ~const Default>() -> T {", " T::default()", " }", "", " self.get_or_insert_with(default)", " }", "", " /// Inserts a value computed from `f` into the option if it is [`None`],", " /// then returns a mutable reference to the contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = None;", " ///", " /// {", " /// let y: &mut u32 = x.get_or_insert_with(|| 5);", " /// assert_eq!(y, &5);", " ///", " /// *y = 7;", " /// }", " ///", " /// assert_eq!(x, Some(7));", " /// ```", " #[inline]", " #[stable(feature = \"option_entry\", since = \"1.20.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T", " where", " F: ~const FnOnce() -> T,", " F: ~const Destruct,", " {", " if let None = *self {", " // the compiler isn't smart enough to know that we are not dropping a `T`", " // here and wants us to ensure `T` can be dropped at compile time.", " mem::forget(mem::replace(self, Some(f())))", " }", "", " // SAFETY: a `None` variant for `self` would have been replaced by a `Some`", " // variant in the code above.", " unsafe { self.as_mut().unwrap_unchecked() }", " }", "", " /////////////////////////////////////////////////////////////////////////", " // Misc", " /////////////////////////////////////////////////////////////////////////", "", " /// Takes the value out of the option, leaving a [`None`] in its place.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(2);", " /// let y = x.take();", " /// assert_eq!(x, None);", " /// assert_eq!(y, Some(2));", " ///", " /// let mut x: Option<u32> = None;", " /// let y = x.take();", " /// assert_eq!(x, None);", " /// assert_eq!(y, None);", " /// ```", " #[inline]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn take(&mut self) -> Option<T> {", " // FIXME replace `mem::replace` by `mem::take` when the latter is const ready", " mem::replace(self, None)", " }", "", " /// Replaces the actual value in the option by the value given in parameter,", " /// returning the old value if present,", " /// leaving a [`Some`] in its place without deinitializing either one.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = Some(2);", " /// let old = x.replace(5);", " /// assert_eq!(x, Some(5));", " /// assert_eq!(old, Some(2));", " ///", " /// let mut x = None;", " /// let old = x.replace(3);", " /// assert_eq!(x, Some(3));", " /// assert_eq!(old, None);", " /// ```", " #[inline]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " #[stable(feature = \"option_replace\", since = \"1.31.0\")]", " pub const fn replace(&mut self, value: T) -> Option<T> {", " mem::replace(self, Some(value))", " }", "", " /// Returns `true` if the option is a [`Some`] value containing the given value.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(option_result_contains)]", " ///", " /// let x: Option<u32> = Some(2);", " /// assert_eq!(x.contains(&2), true);", " ///", " /// let x: Option<u32> = Some(3);", " /// assert_eq!(x.contains(&2), false);", " ///", " /// let x: Option<u32> = None;", " /// assert_eq!(x.contains(&2), false);", " /// ```", " #[must_use]", " #[inline]", " #[unstable(feature = \"option_result_contains\", issue = \"62358\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn contains<U>(&self, x: &U) -> bool", " where", " U: ~const PartialEq<T>,", " {", " match self {", " Some(y) => x.eq(y),", " None => false,", " }", " }", "", " /// Zips `self` with another `Option`.", " ///", " /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.", " /// Otherwise, `None` is returned.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(1);", " /// let y = Some(\"hi\");", " /// let z = None::<u8>;", " ///", " /// assert_eq!(x.zip(y), Some((1, \"hi\")));", " /// assert_eq!(x.zip(z), None);", " /// ```", " #[stable(feature = \"option_zip_option\", since = \"1.46.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>", " where", " T: ~const Destruct,", " U: ~const Destruct,", " {", " match (self, other) {", " (Some(a), Some(b)) => Some((a, b)),", " _ => None,", " }", " }", "", " /// Zips `self` and another `Option` with function `f`.", " ///", " /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.", " /// Otherwise, `None` is returned.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(option_zip)]", " ///", " /// #[derive(Debug, PartialEq)]", " /// struct Point {", " /// x: f64,", " /// y: f64,", " /// }", " ///", " /// impl Point {", " /// fn new(x: f64, y: f64) -> Self {", " /// Self { x, y }", " /// }", " /// }", " ///", " /// let x = Some(17.5);", " /// let y = Some(42.7);", " ///", " /// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));", " /// assert_eq!(x.zip_with(None, Point::new), None);", " /// ```", " #[unstable(feature = \"option_zip\", issue = \"70086\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>", " where", " F: ~const FnOnce(T, U) -> R,", " F: ~const Destruct,", " T: ~const Destruct,", " U: ~const Destruct,", " {", " match (self, other) {", " (Some(a), Some(b)) => Some(f(a, b)),", " _ => None,", " }", " }", "}", "", "impl<T, U> Option<(T, U)> {", " /// Unzips an option containing a tuple of two options.", " ///", " /// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.", " /// Otherwise, `(None, None)` is returned.", " ///", " /// # Examples", " ///", " /// ```", " /// #![feature(unzip_option)]", " ///", " /// let x = Some((1, \"hi\"));", " /// let y = None::<(u8, u32)>;", " ///", " /// assert_eq!(x.unzip(), (Some(1), Some(\"hi\")));", " /// assert_eq!(y.unzip(), (None, None));", " /// ```", " #[inline]", " #[unstable(feature = \"unzip_option\", issue = \"87800\", reason = \"recently added\")]", " pub const fn unzip(self) -> (Option<T>, Option<U>) {", " match self {", " Some((a, b)) => (Some(a), Some(b)),", " None => (None, None),", " }", " }", "}", "", "impl<T> Option<&T> {", " /// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = 12;", " /// let opt_x = Some(&x);", " /// assert_eq!(opt_x, Some(&12));", " /// let copied = opt_x.copied();", " /// assert_eq!(copied, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(feature = \"copied\", since = \"1.35.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn copied(self) -> Option<T>", " where", " T: Copy,", " {", " // FIXME: this implementation, which sidesteps using `Option::map` since it's not const", " // ready yet, should be reverted when possible to avoid code repetition", " match self {", " Some(&v) => Some(v),", " None => None,", " }", " }", "", " /// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = 12;", " /// let opt_x = Some(&x);", " /// assert_eq!(opt_x, Some(&12));", " /// let cloned = opt_x.cloned();", " /// assert_eq!(cloned, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(feature = \"rust1\", since = \"1.0.0\")]", " #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]", " pub const fn cloned(self) -> Option<T>", " where", " T: ~const Clone,", " {", " match self {", " Some(t) => Some(t.clone()),", " None => None,", " }", " }", "}", "", "impl<T> Option<&mut T> {", " /// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = 12;", " /// let opt_x = Some(&mut x);", " /// assert_eq!(opt_x, Some(&mut 12));", " /// let copied = opt_x.copied();", " /// assert_eq!(copied, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(feature = \"copied\", since = \"1.35.0\")]", " #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]", " pub const fn copied(self) -> Option<T>", " where", " T: Copy,", " {", " match self {", " Some(&mut t) => Some(t),", " None => None,", " }", " }", "", " /// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the", " /// option.", " ///", " /// # Examples", " ///", " /// ```", " /// let mut x = 12;", " /// let opt_x = Some(&mut x);", " /// assert_eq!(opt_x, Some(&mut 12));", " /// let cloned = opt_x.cloned();", " /// assert_eq!(cloned, Some(12));", " /// ```", " #[must_use = \"`self` will be dropped if the result is not used\"]", " #[stable(since = \"1.26.0\", feature = \"option_ref_mut_cloned\")]", " #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]", " pub const fn cloned(self) -> Option<T>", " where", " T: ~const Clone,", " {", " match self {", " Some(t) => Some(t.clone()),", " None => None,", " }", " }", "}", "", "impl<T, E> Option<Result<T, E>> {", " /// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.", " ///", " /// [`None`] will be mapped to <code>[Ok]\\([None])</code>.", " /// <code>[Some]\\([Ok]\\(\\_))</code> and <code>[Some]\\([Err]\\(\\_))</code> will be mapped to", " /// <code>[Ok]\\([Some]\\(\\_))</code> and <code>[Err]\\(\\_)</code>.", " ///", " /// # Examples", " ///", " /// ```", " /// #[derive(Debug, Eq, PartialEq)]", " /// struct SomeErr;", " ///", " /// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));", " /// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));", " /// assert_eq!(x, y.transpose());", " /// ```", " #[inline]", " #[stable(feature = \"transpose_result\", since = \"1.33.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn transpose(self) -> Result<Option<T>, E> {", " match self {", " Some(Ok(x)) => Ok(Some(x)),", " Some(Err(e)) => Err(e),", " None => Ok(None),", " }", " }", "}", "", "// This is a separate function to reduce the code size of .expect() itself.", "#[cfg_attr(not(feature = \"panic_immediate_abort\"), inline(never))]", "#[cfg_attr(feature = \"panic_immediate_abort\", inline)]", "#[cold]", "#[track_caller]", "#[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", "const fn expect_failed(msg: &str) -> ! {", " panic_str(msg)", "}", "", "/////////////////////////////////////////////////////////////////////////////", "// Trait implementations", "/////////////////////////////////////////////////////////////////////////////", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[rustc_const_unstable(feature = \"const_clone\", issue = \"91805\")]", "impl<T> const Clone for Option<T>", "where", " T: ~const Clone + ~const Destruct,", "{", " #[inline]", " fn clone(&self) -> Self {", " match self {", " Some(x) => Some(x.clone()),", " None => None,", " }", " }", "", " #[inline]", " fn clone_from(&mut self, source: &Self) {", " match (self, source) {", " (Some(to), Some(from)) => to.clone_from(from),", " (to, from) => *to = from.clone(),", " }", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[rustc_const_unstable(feature = \"const_default_impls\", issue = \"87864\")]", "impl<T> const Default for Option<T> {", " /// Returns [`None`][Option::None].", " ///", " /// # Examples", " ///", " /// ```", " /// let opt: Option<u32> = Option::default();", " /// assert!(opt.is_none());", " /// ```", " #[inline]", " fn default() -> Option<T> {", " None", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<T> IntoIterator for Option<T> {", " type Item = T;", " type IntoIter = IntoIter<T>;", "", " /// Returns a consuming iterator over the possibly contained value.", " ///", " /// # Examples", " ///", " /// ```", " /// let x = Some(\"string\");", " /// let v: Vec<&str> = x.into_iter().collect();", " /// assert_eq!(v, [\"string\"]);", " ///", " /// let x = None;", " /// let v: Vec<&str> = x.into_iter().collect();", " /// assert!(v.is_empty());", " /// ```", " #[inline]", " fn into_iter(self) -> IntoIter<T> {", " IntoIter { inner: Item { opt: self } }", " }", "}", "", "#[stable(since = \"1.4.0\", feature = \"option_iter\")]", "impl<'a, T> IntoIterator for &'a Option<T> {", " type Item = &'a T;", " type IntoIter = Iter<'a, T>;", "", " fn into_iter(self) -> Iter<'a, T> {", " self.iter()", " }", "}", "", "#[stable(since = \"1.4.0\", feature = \"option_iter\")]", "impl<'a, T> IntoIterator for &'a mut Option<T> {", " type Item = &'a mut T;", " type IntoIter = IterMut<'a, T>;", "", " fn into_iter(self) -> IterMut<'a, T> {", " self.iter_mut()", " }", "}", "", "#[stable(since = \"1.12.0\", feature = \"option_from\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<T> const From<T> for Option<T> {", " /// Moves `val` into a new [`Some`].", " ///", " /// # Examples", " ///", " /// ```", " /// let o: Option<u8> = Option::from(67);", " ///", " /// assert_eq!(Some(67), o);", " /// ```", " fn from(val: T) -> Option<T> {", " Some(val)", " }", "}", "", "#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<'a, T> const From<&'a Option<T>> for Option<&'a T> {", " /// Converts from `&Option<T>` to `Option<&T>`.", " ///", " /// # Examples", " ///", " /// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving", " /// the original. The [`map`] method takes the `self` argument by value, consuming the original,", " /// so this technique uses `from` to first take an [`Option`] to a reference", " /// to the value inside the original.", " ///", " /// [`map`]: Option::map", " /// [String]: ../../std/string/struct.String.html \"String\"", " ///", " /// ```", " /// let s: Option<String> = Some(String::from(\"Hello, Rustaceans!\"));", " /// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());", " ///", " /// println!(\"Can still print s: {s:?}\");", " ///", " /// assert_eq!(o, Some(18));", " /// ```", " fn from(o: &'a Option<T>) -> Option<&'a T> {", " o.as_ref()", " }", "}", "", "#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {", " /// Converts from `&mut Option<T>` to `Option<&mut T>`", " ///", " /// # Examples", " ///", " /// ```", " /// let mut s = Some(String::from(\"Hello\"));", " /// let o: Option<&mut String> = Option::from(&mut s);", " ///", " /// match o {", " /// Some(t) => *t = String::from(\"Hello, Rustaceans!\"),", " /// None => (),", " /// }", " ///", " /// assert_eq!(s, Some(String::from(\"Hello, Rustaceans!\")));", " /// ```", " fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {", " o.as_mut()", " }", "}", "", "/////////////////////////////////////////////////////////////////////////////", "// The Option Iterators", "/////////////////////////////////////////////////////////////////////////////", "", "#[derive(Clone, Debug)]", "struct Item<A> {", " opt: Option<A>,", "}", "", "impl<A> Iterator for Item<A> {", " type Item = A;", "", " #[inline]", " fn next(&mut self) -> Option<A> {", " self.opt.take()", " }", "", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " match self.opt {", " Some(_) => (1, Some(1)),", " None => (0, Some(0)),", " }", " }", "}", "", "impl<A> DoubleEndedIterator for Item<A> {", " #[inline]", " fn next_back(&mut self) -> Option<A> {", " self.opt.take()", " }", "}", "", "impl<A> ExactSizeIterator for Item<A> {}", "impl<A> FusedIterator for Item<A> {}", "unsafe impl<A> TrustedLen for Item<A> {}", "", "/// An iterator over a reference to the [`Some`] variant of an [`Option`].", "///", "/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.", "///", "/// This `struct` is created by the [`Option::iter`] function.", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[derive(Debug)]", "pub struct Iter<'a, A: 'a> {", " inner: Item<&'a A>,", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> Iterator for Iter<'a, A> {", " type Item = &'a A;", "", " #[inline]", " fn next(&mut self) -> Option<&'a A> {", " self.inner.next()", " }", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " self.inner.size_hint()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> DoubleEndedIterator for Iter<'a, A> {", " #[inline]", " fn next_back(&mut self) -> Option<&'a A> {", " self.inner.next_back()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> ExactSizeIterator for Iter<'_, A> {}", "", "#[stable(feature = \"fused\", since = \"1.26.0\")]", "impl<A> FusedIterator for Iter<'_, A> {}", "", "#[unstable(feature = \"trusted_len\", issue = \"37572\")]", "unsafe impl<A> TrustedLen for Iter<'_, A> {}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> Clone for Iter<'_, A> {", " #[inline]", " fn clone(&self) -> Self {", " Iter { inner: self.inner.clone() }", " }", "}", "", "/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].", "///", "/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.", "///", "/// This `struct` is created by the [`Option::iter_mut`] function.", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "#[derive(Debug)]", "pub struct IterMut<'a, A: 'a> {", " inner: Item<&'a mut A>,", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> Iterator for IterMut<'a, A> {", " type Item = &'a mut A;", "", " #[inline]", " fn next(&mut self) -> Option<&'a mut A> {", " self.inner.next()", " }", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " self.inner.size_hint()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<'a, A> DoubleEndedIterator for IterMut<'a, A> {", " #[inline]", " fn next_back(&mut self) -> Option<&'a mut A> {", " self.inner.next_back()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> ExactSizeIterator for IterMut<'_, A> {}", "", "#[stable(feature = \"fused\", since = \"1.26.0\")]", "impl<A> FusedIterator for IterMut<'_, A> {}", "#[unstable(feature = \"trusted_len\", issue = \"37572\")]", "unsafe impl<A> TrustedLen for IterMut<'_, A> {}", "", "/// An iterator over the value in [`Some`] variant of an [`Option`].", "///", "/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.", "///", "/// This `struct` is created by the [`Option::into_iter`] function.", "#[derive(Clone, Debug)]", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "pub struct IntoIter<A> {", " inner: Item<A>,", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> Iterator for IntoIter<A> {", " type Item = A;", "", " #[inline]", " fn next(&mut self) -> Option<A> {", " self.inner.next()", " }", " #[inline]", " fn size_hint(&self) -> (usize, Option<usize>) {", " self.inner.size_hint()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> DoubleEndedIterator for IntoIter<A> {", " #[inline]", " fn next_back(&mut self) -> Option<A> {", " self.inner.next_back()", " }", "}", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A> ExactSizeIterator for IntoIter<A> {}", "", "#[stable(feature = \"fused\", since = \"1.26.0\")]", "impl<A> FusedIterator for IntoIter<A> {}", "", "#[unstable(feature = \"trusted_len\", issue = \"37572\")]", "unsafe impl<A> TrustedLen for IntoIter<A> {}", "", "/////////////////////////////////////////////////////////////////////////////", "// FromIterator", "/////////////////////////////////////////////////////////////////////////////", "", "#[stable(feature = \"rust1\", since = \"1.0.0\")]", "impl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {", " /// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],", " /// no further elements are taken, and the [`None`][Option::None] is", " /// returned. Should no [`None`][Option::None] occur, a container of type", " /// `V` containing the values of each [`Option`] is returned.", " ///", " /// # Examples", " ///", " /// Here is an example which increments every integer in a vector.", " /// We use the checked variant of `add` that returns `None` when the", " /// calculation would result in an overflow.", " ///", " /// ```", " /// let items = vec![0_u16, 1, 2];", " ///", " /// let res: Option<Vec<u16>> = items", " /// .iter()", " /// .map(|x| x.checked_add(1))", " /// .collect();", " ///", " /// assert_eq!(res, Some(vec![1, 2, 3]));", " /// ```", " ///", " /// As you can see, this will return the expected, valid items.", " ///", " /// Here is another example that tries to subtract one from another list", " /// of integers, this time checking for underflow:", " ///", " /// ```", " /// let items = vec![2_u16, 1, 0];", " ///", " /// let res: Option<Vec<u16>> = items", " /// .iter()", " /// .map(|x| x.checked_sub(1))", " /// .collect();", " ///", " /// assert_eq!(res, None);", " /// ```", " ///", " /// Since the last element is zero, it would underflow. Thus, the resulting", " /// value is `None`.", " ///", " /// Here is a variation on the previous example, showing that no", " /// further elements are taken from `iter` after the first `None`.", " ///", " /// ```", " /// let items = vec![3_u16, 2, 1, 10];", " ///", " /// let mut shared = 0;", " ///", " /// let res: Option<Vec<u16>> = items", " /// .iter()", " /// .map(|x| { shared += x; x.checked_sub(2) })", " /// .collect();", " ///", " /// assert_eq!(res, None);", " /// assert_eq!(shared, 6);", " /// ```", " ///", " /// Since the third element caused an underflow, no further elements were taken,", " /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.", " #[inline]", " fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {", " // FIXME(#11084): This could be replaced with Iterator::scan when this", " // performance bug is closed.", "", " iter::try_process(iter.into_iter(), |i| i.collect())", " }", "}", "", "#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<T> const ops::Try for Option<T> {", " type Output = T;", " type Residual = Option<convert::Infallible>;", "", " #[inline]", " fn from_output(output: Self::Output) -> Self {", " Some(output)", " }", "", " #[inline]", " fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {", " match self {", " Some(v) => ControlFlow::Continue(v),", " None => ControlFlow::Break(None),", " }", " }", "}", "", "#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]", "#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]", "impl<T> const ops::FromResidual for Option<T> {", " #[inline]", " fn from_residual(residual: Option<convert::Infallible>) -> Self {", " match residual {", " None => None,", " }", " }", "}", "", "#[unstable(feature = \"try_trait_v2_yeet\", issue = \"96374\")]", "impl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {", " #[inline]", " fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {", " None", " }", "}", "", "#[unstable(feature = \"try_trait_v2_residual\", issue = \"91285\")]", "impl<T> ops::Residual<T> for Option<convert::Infallible> {", " type TryType = Option<T>;", "}", "", "impl<T> Option<Option<T>> {", " /// Converts from `Option<Option<T>>` to `Option<T>`.", " ///", " /// # Examples", " ///", " /// Basic usage:", " ///", " /// ```", " /// let x: Option<Option<u32>> = Some(Some(6));", " /// assert_eq!(Some(6), x.flatten());", " ///", " /// let x: Option<Option<u32>> = Some(None);", " /// assert_eq!(None, x.flatten());", " ///", " /// let x: Option<Option<u32>> = None;", " /// assert_eq!(None, x.flatten());", " /// ```", " ///", " /// Flattening only removes one level of nesting at a time:", " ///", " /// ```", " /// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));", " /// assert_eq!(Some(Some(6)), x.flatten());", " /// assert_eq!(Some(6), x.flatten().flatten());", " /// ```", " #[inline]", " #[stable(feature = \"option_flattening\", since = \"1.40.0\")]", " #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]", " pub const fn flatten(self) -> Option<T> {", " match self {", " Some(inner) => inner,", " None => None,", " }", " }", "}", ""]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"eval","params":["s:GetVar('LanguageClient_setOmnifunc', v:true)"],"id":30} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 30, "jsonrpc": "2.0", "result": true} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.text_documents./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> {"languageId":"rust","text":"//! Optional values.\n//!\n//! Type [`Option`] represents an optional value: every [`Option`]\n//! is either [`Some`] and contains a value, or [`None`], and\n//! does not. [`Option`] types are very common in Rust code, as\n//! they have a number of uses:\n//!\n//! * Initial values\n//! * Return values for functions that are not defined\n//! over their entire input range (partial functions)\n//! * Return value for otherwise reporting simple errors, where [`None`] is\n//! returned on error\n//! * Optional struct fields\n//! * Struct fields that can be loaned or \"taken\"\n//! * Optional function arguments\n//! * Nullable pointers\n//! * Swapping things out of difficult situations\n//!\n//! [`Option`]s are commonly paired with pattern matching to query the presence\n//! of a value and take action, always accounting for the [`None`] case.\n//!\n//! ```\n//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {\n//! if denominator == 0.0 {\n//! None\n//! } else {\n//! Some(numerator / denominator)\n//! }\n//! }\n//!\n//! // The return value of the function is an option\n//! let result = divide(2.0, 3.0);\n//!\n//! // Pattern match to retrieve the value\n//! match result {\n//! // The division was valid\n//! Some(x) => println!(\"Result: {x}\"),\n//! // The division was invalid\n//! None => println!(\"Cannot divide by 0\"),\n//! }\n//! ```\n//!\n//\n// FIXME: Show how `Option` is used in practice, with lots of methods\n//\n//! # Options and pointers (\"nullable\" pointers)\n//!\n//! Rust's pointer types must always point to a valid location; there are\n//! no \"null\" references. Instead, Rust has *optional* pointers, like\n//! the optional owned box, <code>[Option]<[Box\\<T>]></code>.\n//!\n//! [Box\\<T>]: ../../std/boxed/struct.Box.html\n//!\n//! The following example uses [`Option`] to create an optional box of\n//! [`i32`]. Notice that in order to use the inner [`i32`] value, the\n//! `check_optional` function first needs to use pattern matching to\n//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or\n//! not ([`None`]).\n//!\n//! ```\n//! let optional = None;\n//! check_optional(optional);\n//!\n//! let optional = Some(Box::new(9000));\n//! check_optional(optional);\n//!\n//! fn check_optional(optional: Option<Box<i32>>) {\n//! match optional {\n//! Some(p) => println!(\"has value {p}\"),\n//! None => println!(\"has no value\"),\n//! }\n//! }\n//! ```\n//!\n//! # Representation\n//!\n//! Rust guarantees to optimize the following types `T` such that\n//! [`Option<T>`] has the same size as `T`:\n//!\n//! * [`Box<U>`]\n//! * `&U`\n//! * `&mut U`\n//! * `fn`, `extern \"C\" fn`[^extern_fn]\n//! * [`num::NonZero*`]\n//! * [`ptr::NonNull<U>`]\n//! * `#[repr(transparent)]` struct around one of the types in this list.\n//!\n//! [^extern_fn]: this remains true for any other ABI: `extern \"abi\" fn` (_e.g._, `extern \"system\" fn`)\n//!\n//! [`Box<U>`]: ../../std/boxed/struct.Box.html\n//! [`num::NonZero*`]: crate::num\n//! [`ptr::NonNull<U>`]: crate::ptr::NonNull\n//!\n//! This is called the \"null pointer optimization\" or NPO.\n//!\n//! It is further guaranteed that, for the cases above, one can\n//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and\n//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`\n//! is undefined behaviour).\n//!\n//! # Method overview\n//!\n//! In addition to working with pattern matching, [`Option`] provides a wide\n//! variety of different methods.\n//!\n//! ## Querying the variant\n//!\n//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]\n//! is [`Some`] or [`None`], respectively.\n//!\n//! [`is_none`]: Option::is_none\n//! [`is_some`]: Option::is_some\n//!\n//! ## Adapters for working with references\n//!\n//! * [`as_ref`] converts from <code>[&][][Option]\\<T></code> to <code>[Option]<[&]T></code>\n//! * [`as_mut`] converts from <code>[&mut] [Option]\\<T></code> to <code>[Option]<[&mut] T></code>\n//! * [`as_deref`] converts from <code>[&][][Option]\\<T></code> to\n//! <code>[Option]<[&]T::[Target]></code>\n//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\\<T></code> to\n//! <code>[Option]<[&mut] T::[Target]></code>\n//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&]T>></code>\n//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&mut] T>></code>\n//!\n//! [&]: reference \"shared reference\"\n//! [&mut]: reference \"mutable reference\"\n//! [Target]: Deref::Target \"ops::Deref::Target\"\n//! [`as_deref`]: Option::as_deref\n//! [`as_deref_mut`]: Option::as_deref_mut\n//! [`as_mut`]: Option::as_mut\n//! [`as_pin_mut`]: Option::as_pin_mut\n//! [`as_pin_ref`]: Option::as_pin_ref\n//! [`as_ref`]: Option::as_ref\n//!\n//! ## Extracting the contained value\n//!\n//! These methods extract the contained value in an [`Option<T>`] when it\n//! is the [`Some`] variant. If the [`Option`] is [`None`]:\n//!\n//! * [`expect`] panics with a provided custom message\n//! * [`unwrap`] panics with a generic message\n//! * [`unwrap_or`] returns the provided default value\n//! * [`unwrap_or_default`] returns the default value of the type `T`\n//! (which must implement the [`Default`] trait)\n//! * [`unwrap_or_else`] returns the result of evaluating the provided\n//! function\n//!\n//! [`expect`]: Option::expect\n//! [`unwrap`]: Option::unwrap\n//! [`unwrap_or`]: Option::unwrap_or\n//! [`unwrap_or_default`]: Option::unwrap_or_default\n//! [`unwrap_or_else`]: Option::unwrap_or_else\n//!\n//! ## Transforming contained values\n//!\n//! These methods transform [`Option`] to [`Result`]:\n//!\n//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! [`Err(err)`] using the provided default `err` value\n//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! a value of [`Err`] using the provided function\n//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a\n//! [`Result`] of an [`Option`]\n//!\n//! [`Err(err)`]: Err\n//! [`Ok(v)`]: Ok\n//! [`Some(v)`]: Some\n//! [`ok_or`]: Option::ok_or\n//! [`ok_or_else`]: Option::ok_or_else\n//! [`transpose`]: Option::transpose\n//!\n//! These methods transform the [`Some`] variant:\n//!\n//! * [`filter`] calls the provided predicate function on the contained\n//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]\n//! if the function returns `true`; otherwise, returns [`None`]\n//! * [`flatten`] removes one level of nesting from an\n//! [`Option<Option<T>>`]\n//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the\n//! provided function to the contained value of [`Some`] and leaving\n//! [`None`] values unchanged\n//!\n//! [`Some(t)`]: Some\n//! [`filter`]: Option::filter\n//! [`flatten`]: Option::flatten\n//! [`map`]: Option::map\n//!\n//! These methods transform [`Option<T>`] to a value of a possibly\n//! different type `U`:\n//!\n//! * [`map_or`] applies the provided function to the contained value of\n//! [`Some`], or returns the provided default value if the [`Option`] is\n//! [`None`]\n//! * [`map_or_else`] applies the provided function to the contained value\n//! of [`Some`], or returns the result of evaluating the provided\n//! fallback function if the [`Option`] is [`None`]\n//!\n//! [`map_or`]: Option::map_or\n//! [`map_or_else`]: Option::map_or_else\n//!\n//! These methods combine the [`Some`] variants of two [`Option`] values:\n//!\n//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the\n//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//! * [`zip_with`] calls the provided function `f` and returns\n//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided\n//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//!\n//! [`Some(f(s, o))`]: Some\n//! [`Some(o)`]: Some\n//! [`Some(s)`]: Some\n//! [`Some((s, o))`]: Some\n//! [`zip`]: Option::zip\n//! [`zip_with`]: Option::zip_with\n//!\n//! ## Boolean operators\n//!\n//! These methods treat the [`Option`] as a boolean value, where [`Some`]\n//! acts like [`true`] and [`None`] acts like [`false`]. There are two\n//! categories of these methods: ones that take an [`Option`] as input, and\n//! ones that take a function as input (to be lazily evaluated).\n//!\n//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as\n//! input, and produce an [`Option`] as output. Only the [`and`] method can\n//! produce an [`Option<U>`] value having a different inner type `U` than\n//! [`Option<T>`].\n//!\n//! | method | self | input | output |\n//! |---------|-----------|-----------|-----------|\n//! | [`and`] | `None` | (ignored) | `None` |\n//! | [`and`] | `Some(x)` | `None` | `None` |\n//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `None` | `None` | `None` |\n//! | [`or`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |\n//! | [`xor`] | `None` | `None` | `None` |\n//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |\n//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |\n//!\n//! [`and`]: Option::and\n//! [`or`]: Option::or\n//! [`xor`]: Option::xor\n//!\n//! The [`and_then`] and [`or_else`] methods take a function as input, and\n//! only evaluate the function when they need to produce a new value. Only\n//! the [`and_then`] method can produce an [`Option<U>`] value having a\n//! different inner type `U` than [`Option<T>`].\n//!\n//! | method | self | function input | function result | output |\n//! |--------------|-----------|----------------|-----------------|-----------|\n//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `None` | (not provided) | `None` | `None` |\n//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |\n//!\n//! [`and_then`]: Option::and_then\n//! [`or_else`]: Option::or_else\n//!\n//! This is an example of using methods like [`and_then`] and [`or`] in a\n//! pipeline of method calls. Early stages of the pipeline pass failure\n//! values ([`None`]) through unchanged, and continue processing on\n//! success values ([`Some`]). Toward the end, [`or`] substitutes an error\n//! message if it receives [`None`].\n//!\n//! ```\n//! # use std::collections::BTreeMap;\n//! let mut bt = BTreeMap::new();\n//! bt.insert(20u8, \"foo\");\n//! bt.insert(42u8, \"bar\");\n//! let res = [0u8, 1, 11, 200, 22]\n//! .into_iter()\n//! .map(|x| {\n//! // `checked_sub()` returns `None` on error\n//! x.checked_sub(1)\n//! // same with `checked_mul()`\n//! .and_then(|x| x.checked_mul(2))\n//! // `BTreeMap::get` returns `None` on error\n//! .and_then(|x| bt.get(&x))\n//! // Substitute an error message if we have `None` so far\n//! .or(Some(&\"error!\"))\n//! .copied()\n//! // Won't panic because we unconditionally used `Some` above\n//! .unwrap()\n//! })\n//! .collect::<Vec<_>>();\n//! assert_eq!(res, [\"error!\", \"error!\", \"foo\", \"error!\", \"bar\"]);\n//! ```\n//!\n//! ## Comparison operators\n//!\n//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its\n//! [`PartialOrd`] implementation. With this order, [`None`] compares as\n//! less than any [`Some`], and two [`Some`] compare the same way as their\n//! contained values would in `T`. If `T` also implements\n//! [`Ord`], then so does [`Option<T>`].\n//!\n//! ```\n//! assert!(None < Some(0));\n//! assert!(Some(0) < Some(1));\n//! ```\n//!\n//! ## Iterating over `Option`\n//!\n//! An [`Option`] can be iterated over. This can be helpful if you need an\n//! iterator that is conditionally empty. The iterator will either produce\n//! a single value (when the [`Option`] is [`Some`]), or produce no values\n//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like\n//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if\n//! the [`Option`] is [`None`].\n//!\n//! [`Some(v)`]: Some\n//! [`empty()`]: crate::iter::empty\n//! [`once(v)`]: crate::iter::once\n//!\n//! Iterators over [`Option<T>`] come in three types:\n//!\n//! * [`into_iter`] consumes the [`Option`] and produces the contained\n//! value\n//! * [`iter`] produces an immutable reference of type `&T` to the\n//! contained value\n//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the\n//! contained value\n//!\n//! [`into_iter`]: Option::into_iter\n//! [`iter`]: Option::iter\n//! [`iter_mut`]: Option::iter_mut\n//!\n//! An iterator over [`Option`] can be useful when chaining iterators, for\n//! example, to conditionally insert items. (It's not always necessary to\n//! explicitly call an iterator constructor: many [`Iterator`] methods that\n//! accept other iterators will also accept iterable types that implement\n//! [`IntoIterator`], which includes [`Option`].)\n//!\n//! ```\n//! let yep = Some(42);\n//! let nope = None;\n//! // chain() already calls into_iter(), so we don't have to do so\n//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);\n//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);\n//! ```\n//!\n//! One reason to chain iterators in this way is that a function returning\n//! `impl Iterator` must have all possible return values be of the same\n//! concrete type. Chaining an iterated [`Option`] can help with that.\n//!\n//! ```\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types matching\n//! match do_insert {\n//! true => return (0..4).chain(Some(42)).chain(4..8),\n//! false => return (0..4).chain(None).chain(4..8),\n//! }\n//! }\n//! println!(\"{:?}\", make_iter(true).collect::<Vec<_>>());\n//! println!(\"{:?}\", make_iter(false).collect::<Vec<_>>());\n//! ```\n//!\n//! If we try to do the same thing, but using [`once()`] and [`empty()`],\n//! we can't return `impl Iterator` anymore because the concrete types of\n//! the return values differ.\n//!\n//! [`empty()`]: crate::iter::empty\n//! [`once()`]: crate::iter::once\n//!\n//! ```compile_fail,E0308\n//! # use std::iter::{empty, once};\n//! // This won't compile because all possible returns from the function\n//! // must have the same concrete type.\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types not matching\n//! match do_insert {\n//! true => return (0..4).chain(once(42)).chain(4..8),\n//! false => return (0..4).chain(empty()).chain(4..8),\n//! }\n//! }\n//! ```\n//!\n//! ## Collecting into `Option`\n//!\n//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,\n//! which allows an iterator over [`Option`] values to be collected into an\n//! [`Option`] of a collection of each contained value of the original\n//! [`Option`] values, or [`None`] if any of the elements was [`None`].\n//!\n//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E\n//!\n//! ```\n//! let v = [Some(2), Some(4), None, Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, None);\n//! let v = [Some(2), Some(4), Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, Some(vec![2, 4, 8]));\n//! ```\n//!\n//! [`Option`] also implements the [`Product`][impl-Product] and\n//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values\n//! to provide the [`product`][Iterator::product] and\n//! [`sum`][Iterator::sum] methods.\n//!\n//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E\n//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E\n//!\n//! ```\n//! let v = [None, Some(1), Some(2), Some(3)];\n//! let res: Option<i32> = v.into_iter().sum();\n//! assert_eq!(res, None);\n//! let v = [Some(1), Some(2), Some(21)];\n//! let res: Option<i32> = v.into_iter().product();\n//! assert_eq!(res, Some(42));\n//! ```\n//!\n//! ## Modifying an [`Option`] in-place\n//!\n//! These methods return a mutable reference to the contained value of an\n//! [`Option<T>`]:\n//!\n//! * [`insert`] inserts a value, dropping any old contents\n//! * [`get_or_insert`] gets the current value, inserting a provided\n//! default value if it is [`None`]\n//! * [`get_or_insert_default`] gets the current value, inserting the\n//! default value of type `T` (which must implement [`Default`]) if it is\n//! [`None`]\n//! * [`get_or_insert_with`] gets the current value, inserting a default\n//! computed by the provided function if it is [`None`]\n//!\n//! [`get_or_insert`]: Option::get_or_insert\n//! [`get_or_insert_default`]: Option::get_or_insert_default\n//! [`get_or_insert_with`]: Option::get_or_insert_with\n//! [`insert`]: Option::insert\n//!\n//! These methods transfer ownership of the contained value of an\n//! [`Option`]:\n//!\n//! * [`take`] takes ownership of the contained value of an [`Option`], if\n//! any, replacing the [`Option`] with [`None`]\n//! * [`replace`] takes ownership of the contained value of an [`Option`],\n//! if any, replacing the [`Option`] with a [`Some`] containing the\n//! provided value\n//!\n//! [`replace`]: Option::replace\n//! [`take`]: Option::take\n//!\n//! # Examples\n//!\n//! Basic pattern matching on [`Option`]:\n//!\n//! ```\n//! let msg = Some(\"howdy\");\n//!\n//! // Take a reference to the contained string\n//! if let Some(m) = &msg {\n//! println!(\"{}\", *m);\n//! }\n//!\n//! // Remove the contained string, destroying the Option\n//! let unwrapped_msg = msg.unwrap_or(\"default message\");\n//! ```\n//!\n//! Initialize a result to [`None`] before a loop:\n//!\n//! ```\n//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }\n//!\n//! // A list of data to search through.\n//! let all_the_big_things = [\n//! Kingdom::Plant(250, \"redwood\"),\n//! Kingdom::Plant(230, \"noble fir\"),\n//! Kingdom::Plant(229, \"sugar pine\"),\n//! Kingdom::Animal(25, \"blue whale\"),\n//! Kingdom::Animal(19, \"fin whale\"),\n//! Kingdom::Animal(15, \"north pacific right whale\"),\n//! ];\n//!\n//! // We're going to search for the name of the biggest animal,\n//! // but to start with we've just got `None`.\n//! let mut name_of_biggest_animal = None;\n//! let mut size_of_biggest_animal = 0;\n//! for big_thing in &all_the_big_things {\n//! match *big_thing {\n//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {\n//! // Now we've found the name of some big animal\n//! size_of_biggest_animal = size;\n//! name_of_biggest_animal = Some(name);\n//! }\n//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()\n//! }\n//! }\n//!\n//! match name_of_biggest_animal {\n//! Some(name) => println!(\"the biggest animal is {name}\"),\n//! None => println!(\"there are no animals :(\"),\n//! }\n//! ```\n\n#![stable(feature = \"rust1\", since = \"1.0.0\")]\n\nuse crate::iter::{self, FromIterator, FusedIterator, TrustedLen};\nuse crate::marker::Destruct;\nuse crate::panicking::{panic, panic_str};\nuse crate::pin::Pin;\nuse crate::{\n convert, hint, mem,\n ops::{self, ControlFlow, Deref, DerefMut},\n};\n\n/// The `Option` type. See [the module level documentation](self) for more.\n#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]\n#[rustc_diagnostic_item = \"Option\"]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub enum Option<T> {\n /// No value.\n #[lang = \"None\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n None,\n /// Some value of type `T`.\n #[lang = \"Some\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n Some(#[stable(feature = \"rust1\", since = \"1.0.0\")] T),\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Type implementation\n/////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Option<T> {\n /////////////////////////////////////////////////////////////////////////\n // Querying the contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns `true` if the option is a [`Some`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some(), true);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some(), false);\n /// ```\n #[must_use = \"if you intended to assert that this has a value, consider `.unwrap()` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_some(&self) -> bool {\n matches!(*self, Some(_))\n }\n\n /// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(is_some_with)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some_and(|&x| x > 1), true);\n ///\n /// let x: Option<u32> = Some(0);\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"is_some_with\", issue = \"93050\")]\n pub fn is_some_and(&self, f: impl FnOnce(&T) -> bool) -> bool {\n matches!(self, Some(x) if f(x))\n }\n\n /// Returns `true` if the option is a [`None`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_none(), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_none(), true);\n /// ```\n #[must_use = \"if you intended to assert that this doesn't have a value, consider \\\n `.and_then(|_| panic!(\\\"`Option` had a value when expected `None`\\\"))` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_none(&self) -> bool {\n !self.is_some()\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Adapter for working with references\n /////////////////////////////////////////////////////////////////////////\n\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `as_ref` to first take an `Option` to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let text: Option<String> = Some(\"Hello, world!\".to_string());\n /// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,\n /// // then consume *that* with `map`, leaving `text` on the stack.\n /// let text_length: Option<usize> = text.as_ref().map(|s| s.len());\n /// println!(\"still can print text: {text:?}\");\n /// ```\n #[inline]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn as_ref(&self) -> Option<&T> {\n match *self {\n Some(ref x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from `&mut Option<T>` to `Option<&mut T>`.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// match x.as_mut() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn as_mut(&mut self) -> Option<&mut T> {\n match *self {\n Some(ref mut x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&]Option\\<T>></code> to <code>Option<[Pin]<[&]T>></code>.\n ///\n /// [&]: reference \"shared reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {\n match Pin::get_ref(self).as_ref() {\n // SAFETY: `x` is guaranteed to be pinned because it comes from `self`\n // which is pinned.\n Some(x) => unsafe { Some(Pin::new_unchecked(x)) },\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&mut] Option\\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.\n ///\n /// [&mut]: reference \"mutable reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {\n // SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.\n // `x` is guaranteed to be pinned because it comes from `self` which is pinned.\n unsafe {\n match Pin::get_unchecked_mut(self).as_mut() {\n Some(x) => Some(Pin::new_unchecked(x)),\n None => None,\n }\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Getting to contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// # Panics\n ///\n /// Panics if the value is a [`None`] with a custom panic message provided by\n /// `msg`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"value\");\n /// assert_eq!(x.expect(\"fruits are healthy\"), \"value\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// x.expect(\"fruits are healthy\"); // panics with `fruits are healthy`\n /// ```\n ///\n /// # Recommended Message Style\n ///\n /// We recommend that `expect` messages are used to describe the reason you\n /// _expect_ the `Option` should be `Some`.\n ///\n /// ```should_panic\n /// # let slice: &[u8] = &[];\n /// let item = slice.get(0)\n /// .expect(\"slice should not be empty\");\n /// ```\n ///\n /// **Hint**: If you're having trouble remembering how to phrase expect\n /// error messages remember to focus on the word \"should\" as in \"env\n /// variable should be set by blah\" or \"the given binary should be available\n /// and executable by the current user\".\n ///\n /// For more detail on expect message styles and the reasoning behind our\n /// recommendation please refer to the section on [\"Common Message\n /// Styles\"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn expect(self, msg: &str) -> T {\n match self {\n Some(val) => val,\n None => expect_failed(msg),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// Because this function may panic, its use is generally discouraged.\n /// Instead, prefer to use pattern matching and handle the [`None`]\n /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or\n /// [`unwrap_or_default`].\n ///\n /// [`unwrap_or`]: Option::unwrap_or\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n /// [`unwrap_or_default`]: Option::unwrap_or_default\n ///\n /// # Panics\n ///\n /// Panics if the self value equals [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(x.unwrap(), \"air\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// assert_eq!(x.unwrap(), \"air\"); // fails\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn unwrap(self) -> T {\n match self {\n Some(val) => val,\n None => panic(\"called `Option::unwrap()` on a `None` value\"),\n }\n }\n\n /// Returns the contained [`Some`] value or a provided default.\n ///\n /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`unwrap_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// assert_eq!(Some(\"car\").unwrap_or(\"bike\"), \"car\");\n /// assert_eq!(None.unwrap_or(\"bike\"), \"bike\");\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or(self, default: T) -> T\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => default,\n }\n }\n\n /// Returns the contained [`Some`] value or computes it from a closure.\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 10;\n /// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);\n /// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_else<F>(self, f: F) -> T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => f(),\n }\n }\n\n /// Returns the contained [`Some`] value or a default.\n ///\n /// Consumes the `self` argument then, if [`Some`], returns the contained\n /// value, otherwise if [`None`], returns the [default value] for that\n /// type.\n ///\n /// # Examples\n ///\n /// Converts a string to an integer, turning poorly-formed strings\n /// into 0 (the default value for integers). [`parse`] converts\n /// a string to any other type that implements [`FromStr`], returning\n /// [`None`] on error.\n ///\n /// ```\n /// let good_year_from_input = \"1909\";\n /// let bad_year_from_input = \"190blarg\";\n /// let good_year = good_year_from_input.parse().ok().unwrap_or_default();\n /// let bad_year = bad_year_from_input.parse().ok().unwrap_or_default();\n ///\n /// assert_eq!(1909, good_year);\n /// assert_eq!(0, bad_year);\n /// ```\n ///\n /// [default value]: Default::default\n /// [`parse`]: str::parse\n /// [`FromStr`]: crate::str::FromStr\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_default(self) -> T\n where\n T: ~const Default,\n {\n match self {\n Some(x) => x,\n None => Default::default(),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value,\n /// without checking that the value is not [`None`].\n ///\n /// # Safety\n ///\n /// Calling this method on [`None`] is *[undefined behavior]*.\n ///\n /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\");\n /// ```\n ///\n /// ```no_run\n /// let x: Option<&str> = None;\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\"); // Undefined behavior!\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"option_result_unwrap_unchecked\", since = \"1.58.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const unsafe fn unwrap_unchecked(self) -> T {\n debug_assert!(self.is_some());\n match self {\n Some(val) => val,\n // SAFETY: the safety contract must be upheld by the caller.\n None => unsafe { hint::unreachable_unchecked() },\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Transforming contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, consuming\n /// the original:\n ///\n /// [String]: ../../std/string/struct.String.html \"String\"\n /// ```\n /// let maybe_some_string = Some(String::from(\"Hello, World!\"));\n /// // `Option::map` takes self *by value*, consuming `maybe_some_string`\n /// let maybe_some_len = maybe_some_string.map(|s| s.len());\n ///\n /// assert_eq!(maybe_some_len, Some(13));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(f(x)),\n None => None,\n }\n }\n\n /// Calls the provided closure with a reference to the contained value (if [`Some`]).\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(result_option_inspect)]\n ///\n /// let v = vec![1, 2, 3, 4, 5];\n ///\n /// // prints \"got: 4\"\n /// let x: Option<&usize> = v.get(3).inspect(|x| println!(\"got: {x}\"));\n ///\n /// // prints nothing\n /// let x: Option<&usize> = v.get(5).inspect(|x| println!(\"got: {x}\"));\n /// ```\n #[inline]\n #[unstable(feature = \"result_option_inspect\", issue = \"91345\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn inspect<F>(self, f: F) -> Self\n where\n F: ~const FnOnce(&T),\n F: ~const Destruct,\n {\n if let Some(ref x) = self {\n f(x);\n }\n\n self\n }\n\n /// Returns the provided default result (if none),\n /// or applies a function to the contained value (if any).\n ///\n /// Arguments passed to `map_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`map_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`map_or_else`]: Option::map_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or(42, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or(42, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or<U, F>(self, default: U, f: F) -> U\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default,\n }\n }\n\n /// Computes a default function result (if none), or\n /// applies a different function to the contained value (if any).\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 21;\n ///\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U\n where\n D: ~const FnOnce() -> U,\n D: ~const Destruct,\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default(),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err)`].\n ///\n /// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`ok_or_else`], which is\n /// lazily evaluated.\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err)`]: Err\n /// [`Some(v)`]: Some\n /// [`ok_or_else`]: Option::ok_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or(0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or(0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or<E>(self, err: E) -> Result<T, E>\n where\n E: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err())`].\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err())`]: Err\n /// [`Some(v)`]: Some\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or_else(|| 0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or_else(|| 0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>\n where\n F: ~const FnOnce() -> E,\n F: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err()),\n }\n }\n\n /// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.\n ///\n /// Leaves the original Option in-place, creating a new one with a reference\n /// to the original one, additionally coercing the contents via [`Deref`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref(), Some(\"hey\"));\n ///\n /// let x: Option<String> = None;\n /// assert_eq!(x.as_deref(), None);\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref(&self) -> Option<&T::Target>\n where\n T: ~const Deref,\n {\n match self.as_ref() {\n Some(t) => Some(t.deref()),\n None => None,\n }\n }\n\n /// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.\n ///\n /// Leaves the original `Option` in-place, creating a new one containing a mutable reference to\n /// the inner type's [`Deref::Target`] type.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref_mut().map(|x| {\n /// x.make_ascii_uppercase();\n /// x\n /// }), Some(\"HEY\".to_owned().as_mut_str()));\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>\n where\n T: ~const DerefMut,\n {\n match self.as_mut() {\n Some(t) => Some(t.deref_mut()),\n None => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Iterator constructors\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns an iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(4);\n /// assert_eq!(x.iter().next(), Some(&4));\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.iter().next(), None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn iter(&self) -> Iter<'_, T> {\n Iter { inner: Item { opt: self.as_ref() } }\n }\n\n /// Returns a mutable iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(4);\n /// match x.iter_mut().next() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n ///\n /// let mut x: Option<u32> = None;\n /// assert_eq!(x.iter_mut().next(), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub fn iter_mut(&mut self) -> IterMut<'_, T> {\n IterMut { inner: Item { opt: self.as_mut() } }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Boolean operations on the values, eager and lazy\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns [`None`] if the option is [`None`], otherwise returns `optb`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), None);\n ///\n /// let x = Some(2);\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), Some(\"foo\"));\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and<U>(self, optb: Option<U>) -> Option<U>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(_) => optb,\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `f` with the\n /// wrapped value and returns the result.\n ///\n /// Some languages call this operation flatmap.\n ///\n /// # Examples\n ///\n /// ```\n /// fn sq_then_to_string(x: u32) -> Option<String> {\n /// x.checked_mul(x).map(|sq| sq.to_string())\n /// }\n ///\n /// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));\n /// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!\n /// assert_eq!(None.and_then(sq_then_to_string), None);\n /// ```\n ///\n /// Often used to chain fallible operations that may return [`None`].\n ///\n /// ```\n /// let arr_2d = [[\"A0\", \"A1\"], [\"B0\", \"B1\"]];\n ///\n /// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));\n /// assert_eq!(item_0_1, Some(&\"A1\"));\n ///\n /// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));\n /// assert_eq!(item_2_0, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and_then<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> Option<U>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => f(x),\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `predicate`\n /// with the wrapped value and returns:\n ///\n /// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped\n /// value), and\n /// - [`None`] if `predicate` returns `false`.\n ///\n /// This function works similar to [`Iterator::filter()`]. You can imagine\n /// the `Option<T>` being an iterator over one or zero elements. `filter()`\n /// lets you decide which elements to keep.\n ///\n /// # Examples\n ///\n /// ```rust\n /// fn is_even(n: &i32) -> bool {\n /// n % 2 == 0\n /// }\n ///\n /// assert_eq!(None.filter(is_even), None);\n /// assert_eq!(Some(3).filter(is_even), None);\n /// assert_eq!(Some(4).filter(is_even), Some(4));\n /// ```\n ///\n /// [`Some(t)`]: Some\n #[inline]\n #[stable(feature = \"option_filter\", since = \"1.27.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn filter<P>(self, predicate: P) -> Self\n where\n T: ~const Destruct,\n P: ~const FnOnce(&T) -> bool,\n P: ~const Destruct,\n {\n if let Some(x) = self {\n if predicate(&x) {\n return Some(x);\n }\n }\n None\n }\n\n /// Returns the option if it contains a value, otherwise returns `optb`.\n ///\n /// Arguments passed to `or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`or_else`], which is\n /// lazily evaluated.\n ///\n /// [`or_else`]: Option::or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y = None;\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x = None;\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(100));\n ///\n /// let x = Some(2);\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = None;\n /// assert_eq!(x.or(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => optb,\n }\n }\n\n /// Returns the option if it contains a value, otherwise calls `f` and\n /// returns the result.\n ///\n /// # Examples\n ///\n /// ```\n /// fn nobody() -> Option<&'static str> { None }\n /// fn vikings() -> Option<&'static str> { Some(\"vikings\") }\n ///\n /// assert_eq!(Some(\"barbarians\").or_else(vikings), Some(\"barbarians\"));\n /// assert_eq!(None.or_else(vikings), Some(\"vikings\"));\n /// assert_eq!(None.or_else(nobody), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or_else<F>(self, f: F) -> Option<T>\n where\n F: ~const FnOnce() -> Option<T>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => f(),\n }\n }\n\n /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x = Some(2);\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"option_xor\", since = \"1.37.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn xor(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match (self, optb) {\n (Some(a), None) => Some(a),\n (None, Some(b)) => Some(b),\n _ => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Entry-like operations to insert a value and return a reference\n /////////////////////////////////////////////////////////////////////////\n\n /// Inserts `value` into the option, then returns a mutable reference to it.\n ///\n /// If the option already contains a value, the old value is dropped.\n ///\n /// See also [`Option::get_or_insert`], which doesn't update the value if\n /// the option already contains [`Some`].\n ///\n /// # Example\n ///\n /// ```\n /// let mut opt = None;\n /// let val = opt.insert(1);\n /// assert_eq!(*val, 1);\n /// assert_eq!(opt.unwrap(), 1);\n /// let val = opt.insert(2);\n /// assert_eq!(*val, 2);\n /// *val = 3;\n /// assert_eq!(opt.unwrap(), 3);\n /// ```\n #[must_use = \"if you intended to set a value, consider assignment instead\"]\n #[inline]\n #[stable(feature = \"option_insert\", since = \"1.53.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n *self = Some(value);\n\n // SAFETY: the code above just filled the option\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts `value` into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// See also [`Option::insert`], which updates the value even if\n /// the option already contains [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert(5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n if let None = *self {\n *self = Some(value);\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts the default value into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_get_or_insert_default)]\n ///\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_default();\n /// assert_eq!(y, &0);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[unstable(feature = \"option_get_or_insert_default\", issue = \"82901\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_default(&mut self) -> &mut T\n where\n T: ~const Default,\n {\n const fn default<T: ~const Default>() -> T {\n T::default()\n }\n\n self.get_or_insert_with(default)\n }\n\n /// Inserts a value computed from `f` into the option if it is [`None`],\n /// then returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_with(|| 5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n if let None = *self {\n // the compiler isn't smart enough to know that we are not dropping a `T`\n // here and wants us to ensure `T` can be dropped at compile time.\n mem::forget(mem::replace(self, Some(f())))\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Misc\n /////////////////////////////////////////////////////////////////////////\n\n /// Takes the value out of the option, leaving a [`None`] in its place.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, Some(2));\n ///\n /// let mut x: Option<u32> = None;\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn take(&mut self) -> Option<T> {\n // FIXME replace `mem::replace` by `mem::take` when the latter is const ready\n mem::replace(self, None)\n }\n\n /// Replaces the actual value in the option by the value given in parameter,\n /// returning the old value if present,\n /// leaving a [`Some`] in its place without deinitializing either one.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let old = x.replace(5);\n /// assert_eq!(x, Some(5));\n /// assert_eq!(old, Some(2));\n ///\n /// let mut x = None;\n /// let old = x.replace(3);\n /// assert_eq!(x, Some(3));\n /// assert_eq!(old, None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"option_replace\", since = \"1.31.0\")]\n pub const fn replace(&mut self, value: T) -> Option<T> {\n mem::replace(self, Some(value))\n }\n\n /// Returns `true` if the option is a [`Some`] value containing the given value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_result_contains)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.contains(&2), true);\n ///\n /// let x: Option<u32> = Some(3);\n /// assert_eq!(x.contains(&2), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.contains(&2), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"option_result_contains\", issue = \"62358\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn contains<U>(&self, x: &U) -> bool\n where\n U: ~const PartialEq<T>,\n {\n match self {\n Some(y) => x.eq(y),\n None => false,\n }\n }\n\n /// Zips `self` with another `Option`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(1);\n /// let y = Some(\"hi\");\n /// let z = None::<u8>;\n ///\n /// assert_eq!(x.zip(y), Some((1, \"hi\")));\n /// assert_eq!(x.zip(z), None);\n /// ```\n #[stable(feature = \"option_zip_option\", since = \"1.46.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some((a, b)),\n _ => None,\n }\n }\n\n /// Zips `self` and another `Option` with function `f`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_zip)]\n ///\n /// #[derive(Debug, PartialEq)]\n /// struct Point {\n /// x: f64,\n /// y: f64,\n /// }\n ///\n /// impl Point {\n /// fn new(x: f64, y: f64) -> Self {\n /// Self { x, y }\n /// }\n /// }\n ///\n /// let x = Some(17.5);\n /// let y = Some(42.7);\n ///\n /// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));\n /// assert_eq!(x.zip_with(None, Point::new), None);\n /// ```\n #[unstable(feature = \"option_zip\", issue = \"70086\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>\n where\n F: ~const FnOnce(T, U) -> R,\n F: ~const Destruct,\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some(f(a, b)),\n _ => None,\n }\n }\n}\n\nimpl<T, U> Option<(T, U)> {\n /// Unzips an option containing a tuple of two options.\n ///\n /// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.\n /// Otherwise, `(None, None)` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(unzip_option)]\n ///\n /// let x = Some((1, \"hi\"));\n /// let y = None::<(u8, u32)>;\n ///\n /// assert_eq!(x.unzip(), (Some(1), Some(\"hi\")));\n /// assert_eq!(y.unzip(), (None, None));\n /// ```\n #[inline]\n #[unstable(feature = \"unzip_option\", issue = \"87800\", reason = \"recently added\")]\n pub const fn unzip(self) -> (Option<T>, Option<U>) {\n match self {\n Some((a, b)) => (Some(a), Some(b)),\n None => (None, None),\n }\n }\n}\n\nimpl<T> Option<&T> {\n /// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n // FIXME: this implementation, which sidesteps using `Option::map` since it's not const\n // ready yet, should be reverted when possible to avoid code repetition\n match self {\n Some(&v) => Some(v),\n None => None,\n }\n }\n\n /// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T> Option<&mut T> {\n /// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n match self {\n Some(&mut t) => Some(t),\n None => None,\n }\n }\n\n /// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(since = \"1.26.0\", feature = \"option_ref_mut_cloned\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T, E> Option<Result<T, E>> {\n /// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.\n ///\n /// [`None`] will be mapped to <code>[Ok]\\([None])</code>.\n /// <code>[Some]\\([Ok]\\(\\_))</code> and <code>[Some]\\([Err]\\(\\_))</code> will be mapped to\n /// <code>[Ok]\\([Some]\\(\\_))</code> and <code>[Err]\\(\\_)</code>.\n ///\n /// # Examples\n ///\n /// ```\n /// #[derive(Debug, Eq, PartialEq)]\n /// struct SomeErr;\n ///\n /// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));\n /// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));\n /// assert_eq!(x, y.transpose());\n /// ```\n #[inline]\n #[stable(feature = \"transpose_result\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn transpose(self) -> Result<Option<T>, E> {\n match self {\n Some(Ok(x)) => Ok(Some(x)),\n Some(Err(e)) => Err(e),\n None => Ok(None),\n }\n }\n}\n\n// This is a separate function to reduce the code size of .expect() itself.\n#[cfg_attr(not(feature = \"panic_immediate_abort\"), inline(never))]\n#[cfg_attr(feature = \"panic_immediate_abort\", inline)]\n#[cold]\n#[track_caller]\n#[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\nconst fn expect_failed(msg: &str) -> ! {\n panic_str(msg)\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Trait implementations\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_clone\", issue = \"91805\")]\nimpl<T> const Clone for Option<T>\nwhere\n T: ~const Clone + ~const Destruct,\n{\n #[inline]\n fn clone(&self) -> Self {\n match self {\n Some(x) => Some(x.clone()),\n None => None,\n }\n }\n\n #[inline]\n fn clone_from(&mut self, source: &Self) {\n match (self, source) {\n (Some(to), Some(from)) => to.clone_from(from),\n (to, from) => *to = from.clone(),\n }\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_default_impls\", issue = \"87864\")]\nimpl<T> const Default for Option<T> {\n /// Returns [`None`][Option::None].\n ///\n /// # Examples\n ///\n /// ```\n /// let opt: Option<u32> = Option::default();\n /// assert!(opt.is_none());\n /// ```\n #[inline]\n fn default() -> Option<T> {\n None\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<T> IntoIterator for Option<T> {\n type Item = T;\n type IntoIter = IntoIter<T>;\n\n /// Returns a consuming iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"string\");\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert_eq!(v, [\"string\"]);\n ///\n /// let x = None;\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert!(v.is_empty());\n /// ```\n #[inline]\n fn into_iter(self) -> IntoIter<T> {\n IntoIter { inner: Item { opt: self } }\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a Option<T> {\n type Item = &'a T;\n type IntoIter = Iter<'a, T>;\n\n fn into_iter(self) -> Iter<'a, T> {\n self.iter()\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a mut Option<T> {\n type Item = &'a mut T;\n type IntoIter = IterMut<'a, T>;\n\n fn into_iter(self) -> IterMut<'a, T> {\n self.iter_mut()\n }\n}\n\n#[stable(since = \"1.12.0\", feature = \"option_from\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const From<T> for Option<T> {\n /// Moves `val` into a new [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let o: Option<u8> = Option::from(67);\n ///\n /// assert_eq!(Some(67), o);\n /// ```\n fn from(val: T) -> Option<T> {\n Some(val)\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a Option<T>> for Option<&'a T> {\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `from` to first take an [`Option`] to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let s: Option<String> = Some(String::from(\"Hello, Rustaceans!\"));\n /// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());\n ///\n /// println!(\"Can still print s: {s:?}\");\n ///\n /// assert_eq!(o, Some(18));\n /// ```\n fn from(o: &'a Option<T>) -> Option<&'a T> {\n o.as_ref()\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {\n /// Converts from `&mut Option<T>` to `Option<&mut T>`\n ///\n /// # Examples\n ///\n /// ```\n /// let mut s = Some(String::from(\"Hello\"));\n /// let o: Option<&mut String> = Option::from(&mut s);\n ///\n /// match o {\n /// Some(t) => *t = String::from(\"Hello, Rustaceans!\"),\n /// None => (),\n /// }\n ///\n /// assert_eq!(s, Some(String::from(\"Hello, Rustaceans!\")));\n /// ```\n fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {\n o.as_mut()\n }\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// The Option Iterators\n/////////////////////////////////////////////////////////////////////////////\n\n#[derive(Clone, Debug)]\nstruct Item<A> {\n opt: Option<A>,\n}\n\nimpl<A> Iterator for Item<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.opt.take()\n }\n\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n match self.opt {\n Some(_) => (1, Some(1)),\n None => (0, Some(0)),\n }\n }\n}\n\nimpl<A> DoubleEndedIterator for Item<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.opt.take()\n }\n}\n\nimpl<A> ExactSizeIterator for Item<A> {}\nimpl<A> FusedIterator for Item<A> {}\nunsafe impl<A> TrustedLen for Item<A> {}\n\n/// An iterator over a reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct Iter<'a, A: 'a> {\n inner: Item<&'a A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for Iter<'a, A> {\n type Item = &'a A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for Iter<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for Iter<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for Iter<'_, A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for Iter<'_, A> {}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Clone for Iter<'_, A> {\n #[inline]\n fn clone(&self) -> Self {\n Iter { inner: self.inner.clone() }\n }\n}\n\n/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter_mut`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct IterMut<'a, A: 'a> {\n inner: Item<&'a mut A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for IterMut<'a, A> {\n type Item = &'a mut A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a mut A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for IterMut<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a mut A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IterMut<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IterMut<'_, A> {}\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IterMut<'_, A> {}\n\n/// An iterator over the value in [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::into_iter`] function.\n#[derive(Clone, Debug)]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct IntoIter<A> {\n inner: Item<A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Iterator for IntoIter<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> DoubleEndedIterator for IntoIter<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IntoIter<A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IntoIter<A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IntoIter<A> {}\n\n/////////////////////////////////////////////////////////////////////////////\n// FromIterator\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {\n /// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],\n /// no further elements are taken, and the [`None`][Option::None] is\n /// returned. Should no [`None`][Option::None] occur, a container of type\n /// `V` containing the values of each [`Option`] is returned.\n ///\n /// # Examples\n ///\n /// Here is an example which increments every integer in a vector.\n /// We use the checked variant of `add` that returns `None` when the\n /// calculation would result in an overflow.\n ///\n /// ```\n /// let items = vec![0_u16, 1, 2];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_add(1))\n /// .collect();\n ///\n /// assert_eq!(res, Some(vec![1, 2, 3]));\n /// ```\n ///\n /// As you can see, this will return the expected, valid items.\n ///\n /// Here is another example that tries to subtract one from another list\n /// of integers, this time checking for underflow:\n ///\n /// ```\n /// let items = vec![2_u16, 1, 0];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_sub(1))\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// ```\n ///\n /// Since the last element is zero, it would underflow. Thus, the resulting\n /// value is `None`.\n ///\n /// Here is a variation on the previous example, showing that no\n /// further elements are taken from `iter` after the first `None`.\n ///\n /// ```\n /// let items = vec![3_u16, 2, 1, 10];\n ///\n /// let mut shared = 0;\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| { shared += x; x.checked_sub(2) })\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// assert_eq!(shared, 6);\n /// ```\n ///\n /// Since the third element caused an underflow, no further elements were taken,\n /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.\n #[inline]\n fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {\n // FIXME(#11084): This could be replaced with Iterator::scan when this\n // performance bug is closed.\n\n iter::try_process(iter.into_iter(), |i| i.collect())\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::Try for Option<T> {\n type Output = T;\n type Residual = Option<convert::Infallible>;\n\n #[inline]\n fn from_output(output: Self::Output) -> Self {\n Some(output)\n }\n\n #[inline]\n fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {\n match self {\n Some(v) => ControlFlow::Continue(v),\n None => ControlFlow::Break(None),\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::FromResidual for Option<T> {\n #[inline]\n fn from_residual(residual: Option<convert::Infallible>) -> Self {\n match residual {\n None => None,\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2_yeet\", issue = \"96374\")]\nimpl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {\n #[inline]\n fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {\n None\n }\n}\n\n#[unstable(feature = \"try_trait_v2_residual\", issue = \"91285\")]\nimpl<T> ops::Residual<T> for Option<convert::Infallible> {\n type TryType = Option<T>;\n}\n\nimpl<T> Option<Option<T>> {\n /// Converts from `Option<Option<T>>` to `Option<T>`.\n ///\n /// # Examples\n ///\n /// Basic usage:\n ///\n /// ```\n /// let x: Option<Option<u32>> = Some(Some(6));\n /// assert_eq!(Some(6), x.flatten());\n ///\n /// let x: Option<Option<u32>> = Some(None);\n /// assert_eq!(None, x.flatten());\n ///\n /// let x: Option<Option<u32>> = None;\n /// assert_eq!(None, x.flatten());\n /// ```\n ///\n /// Flattening only removes one level of nesting at a time:\n ///\n /// ```\n /// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));\n /// assert_eq!(Some(Some(6)), x.flatten());\n /// assert_eq!(Some(6), x.flatten().flatten());\n /// ```\n #[inline]\n #[stable(feature = \"option_flattening\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn flatten(self) -> Option<T> {\n match self {\n Some(inner) => inner,\n None => None,\n }\n }\n}\n","uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","version":0} 17:00:16 INFO unnamed src/language_server_protocol.rs:1888 text_document_code_lens; params=Object({"bufnr": Number(2), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:command","params":["setlocal omnifunc=LanguageClient#complete"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","LanguageClient_projectRoot","/home/dick/LanguageClient-neovim"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ExecuteAutocmd","params":["LanguageClientTextDocumentDidOpenPost"]} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"rust","text":"//! Optional values.\n//!\n//! Type [`Option`] represents an optional value: every [`Option`]\n//! is either [`Some`] and contains a value, or [`None`], and\n//! does not. [`Option`] types are very common in Rust code, as\n//! they have a number of uses:\n//!\n//! * Initial values\n//! * Return values for functions that are not defined\n//! over their entire input range (partial functions)\n//! * Return value for otherwise reporting simple errors, where [`None`] is\n//! returned on error\n//! * Optional struct fields\n//! * Struct fields that can be loaned or \"taken\"\n//! * Optional function arguments\n//! * Nullable pointers\n//! * Swapping things out of difficult situations\n//!\n//! [`Option`]s are commonly paired with pattern matching to query the presence\n//! of a value and take action, always accounting for the [`None`] case.\n//!\n//! ```\n//! fn divide(numerator: f64, denominator: f64) -> Option<f64> {\n//! if denominator == 0.0 {\n//! None\n//! } else {\n//! Some(numerator / denominator)\n//! }\n//! }\n//!\n//! // The return value of the function is an option\n//! let result = divide(2.0, 3.0);\n//!\n//! // Pattern match to retrieve the value\n//! match result {\n//! // The division was valid\n//! Some(x) => println!(\"Result: {x}\"),\n//! // The division was invalid\n//! None => println!(\"Cannot divide by 0\"),\n//! }\n//! ```\n//!\n//\n// FIXME: Show how `Option` is used in practice, with lots of methods\n//\n//! # Options and pointers (\"nullable\" pointers)\n//!\n//! Rust's pointer types must always point to a valid location; there are\n//! no \"null\" references. Instead, Rust has *optional* pointers, like\n//! the optional owned box, <code>[Option]<[Box\\<T>]></code>.\n//!\n//! [Box\\<T>]: ../../std/boxed/struct.Box.html\n//!\n//! The following example uses [`Option`] to create an optional box of\n//! [`i32`]. Notice that in order to use the inner [`i32`] value, the\n//! `check_optional` function first needs to use pattern matching to\n//! determine whether the box has a value (i.e., it is [`Some(...)`][`Some`]) or\n//! not ([`None`]).\n//!\n//! ```\n//! let optional = None;\n//! check_optional(optional);\n//!\n//! let optional = Some(Box::new(9000));\n//! check_optional(optional);\n//!\n//! fn check_optional(optional: Option<Box<i32>>) {\n//! match optional {\n//! Some(p) => println!(\"has value {p}\"),\n//! None => println!(\"has no value\"),\n//! }\n//! }\n//! ```\n//!\n//! # Representation\n//!\n//! Rust guarantees to optimize the following types `T` such that\n//! [`Option<T>`] has the same size as `T`:\n//!\n//! * [`Box<U>`]\n//! * `&U`\n//! * `&mut U`\n//! * `fn`, `extern \"C\" fn`[^extern_fn]\n//! * [`num::NonZero*`]\n//! * [`ptr::NonNull<U>`]\n//! * `#[repr(transparent)]` struct around one of the types in this list.\n//!\n//! [^extern_fn]: this remains true for any other ABI: `extern \"abi\" fn` (_e.g._, `extern \"system\" fn`)\n//!\n//! [`Box<U>`]: ../../std/boxed/struct.Box.html\n//! [`num::NonZero*`]: crate::num\n//! [`ptr::NonNull<U>`]: crate::ptr::NonNull\n//!\n//! This is called the \"null pointer optimization\" or NPO.\n//!\n//! It is further guaranteed that, for the cases above, one can\n//! [`mem::transmute`] from all valid values of `T` to `Option<T>` and\n//! from `Some::<T>(_)` to `T` (but transmuting `None::<T>` to `T`\n//! is undefined behaviour).\n//!\n//! # Method overview\n//!\n//! In addition to working with pattern matching, [`Option`] provides a wide\n//! variety of different methods.\n//!\n//! ## Querying the variant\n//!\n//! The [`is_some`] and [`is_none`] methods return [`true`] if the [`Option`]\n//! is [`Some`] or [`None`], respectively.\n//!\n//! [`is_none`]: Option::is_none\n//! [`is_some`]: Option::is_some\n//!\n//! ## Adapters for working with references\n//!\n//! * [`as_ref`] converts from <code>[&][][Option]\\<T></code> to <code>[Option]<[&]T></code>\n//! * [`as_mut`] converts from <code>[&mut] [Option]\\<T></code> to <code>[Option]<[&mut] T></code>\n//! * [`as_deref`] converts from <code>[&][][Option]\\<T></code> to\n//! <code>[Option]<[&]T::[Target]></code>\n//! * [`as_deref_mut`] converts from <code>[&mut] [Option]\\<T></code> to\n//! <code>[Option]<[&mut] T::[Target]></code>\n//! * [`as_pin_ref`] converts from <code>[Pin]<[&][][Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&]T>></code>\n//! * [`as_pin_mut`] converts from <code>[Pin]<[&mut] [Option]\\<T>></code> to\n//! <code>[Option]<[Pin]<[&mut] T>></code>\n//!\n//! [&]: reference \"shared reference\"\n//! [&mut]: reference \"mutable reference\"\n//! [Target]: Deref::Target \"ops::Deref::Target\"\n//! [`as_deref`]: Option::as_deref\n//! [`as_deref_mut`]: Option::as_deref_mut\n//! [`as_mut`]: Option::as_mut\n//! [`as_pin_mut`]: Option::as_pin_mut\n//! [`as_pin_ref`]: Option::as_pin_ref\n//! [`as_ref`]: Option::as_ref\n//!\n//! ## Extracting the contained value\n//!\n//! These methods extract the contained value in an [`Option<T>`] when it\n//! is the [`Some`] variant. If the [`Option`] is [`None`]:\n//!\n//! * [`expect`] panics with a provided custom message\n//! * [`unwrap`] panics with a generic message\n//! * [`unwrap_or`] returns the provided default value\n//! * [`unwrap_or_default`] returns the default value of the type `T`\n//! (which must implement the [`Default`] trait)\n//! * [`unwrap_or_else`] returns the result of evaluating the provided\n//! function\n//!\n//! [`expect`]: Option::expect\n//! [`unwrap`]: Option::unwrap\n//! [`unwrap_or`]: Option::unwrap_or\n//! [`unwrap_or_default`]: Option::unwrap_or_default\n//! [`unwrap_or_else`]: Option::unwrap_or_else\n//!\n//! ## Transforming contained values\n//!\n//! These methods transform [`Option`] to [`Result`]:\n//!\n//! * [`ok_or`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! [`Err(err)`] using the provided default `err` value\n//! * [`ok_or_else`] transforms [`Some(v)`] to [`Ok(v)`], and [`None`] to\n//! a value of [`Err`] using the provided function\n//! * [`transpose`] transposes an [`Option`] of a [`Result`] into a\n//! [`Result`] of an [`Option`]\n//!\n//! [`Err(err)`]: Err\n//! [`Ok(v)`]: Ok\n//! [`Some(v)`]: Some\n//! [`ok_or`]: Option::ok_or\n//! [`ok_or_else`]: Option::ok_or_else\n//! [`transpose`]: Option::transpose\n//!\n//! These methods transform the [`Some`] variant:\n//!\n//! * [`filter`] calls the provided predicate function on the contained\n//! value `t` if the [`Option`] is [`Some(t)`], and returns [`Some(t)`]\n//! if the function returns `true`; otherwise, returns [`None`]\n//! * [`flatten`] removes one level of nesting from an\n//! [`Option<Option<T>>`]\n//! * [`map`] transforms [`Option<T>`] to [`Option<U>`] by applying the\n//! provided function to the contained value of [`Some`] and leaving\n//! [`None`] values unchanged\n//!\n//! [`Some(t)`]: Some\n//! [`filter`]: Option::filter\n//! [`flatten`]: Option::flatten\n//! [`map`]: Option::map\n//!\n//! These methods transform [`Option<T>`] to a value of a possibly\n//! different type `U`:\n//!\n//! * [`map_or`] applies the provided function to the contained value of\n//! [`Some`], or returns the provided default value if the [`Option`] is\n//! [`None`]\n//! * [`map_or_else`] applies the provided function to the contained value\n//! of [`Some`], or returns the result of evaluating the provided\n//! fallback function if the [`Option`] is [`None`]\n//!\n//! [`map_or`]: Option::map_or\n//! [`map_or_else`]: Option::map_or_else\n//!\n//! These methods combine the [`Some`] variants of two [`Option`] values:\n//!\n//! * [`zip`] returns [`Some((s, o))`] if `self` is [`Some(s)`] and the\n//! provided [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//! * [`zip_with`] calls the provided function `f` and returns\n//! [`Some(f(s, o))`] if `self` is [`Some(s)`] and the provided\n//! [`Option`] value is [`Some(o)`]; otherwise, returns [`None`]\n//!\n//! [`Some(f(s, o))`]: Some\n//! [`Some(o)`]: Some\n//! [`Some(s)`]: Some\n//! [`Some((s, o))`]: Some\n//! [`zip`]: Option::zip\n//! [`zip_with`]: Option::zip_with\n//!\n//! ## Boolean operators\n//!\n//! These methods treat the [`Option`] as a boolean value, where [`Some`]\n//! acts like [`true`] and [`None`] acts like [`false`]. There are two\n//! categories of these methods: ones that take an [`Option`] as input, and\n//! ones that take a function as input (to be lazily evaluated).\n//!\n//! The [`and`], [`or`], and [`xor`] methods take another [`Option`] as\n//! input, and produce an [`Option`] as output. Only the [`and`] method can\n//! produce an [`Option<U>`] value having a different inner type `U` than\n//! [`Option<T>`].\n//!\n//! | method | self | input | output |\n//! |---------|-----------|-----------|-----------|\n//! | [`and`] | `None` | (ignored) | `None` |\n//! | [`and`] | `Some(x)` | `None` | `None` |\n//! | [`and`] | `Some(x)` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `None` | `None` | `None` |\n//! | [`or`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`or`] | `Some(x)` | (ignored) | `Some(x)` |\n//! | [`xor`] | `None` | `None` | `None` |\n//! | [`xor`] | `None` | `Some(y)` | `Some(y)` |\n//! | [`xor`] | `Some(x)` | `None` | `Some(x)` |\n//! | [`xor`] | `Some(x)` | `Some(y)` | `None` |\n//!\n//! [`and`]: Option::and\n//! [`or`]: Option::or\n//! [`xor`]: Option::xor\n//!\n//! The [`and_then`] and [`or_else`] methods take a function as input, and\n//! only evaluate the function when they need to produce a new value. Only\n//! the [`and_then`] method can produce an [`Option<U>`] value having a\n//! different inner type `U` than [`Option<T>`].\n//!\n//! | method | self | function input | function result | output |\n//! |--------------|-----------|----------------|-----------------|-----------|\n//! | [`and_then`] | `None` | (not provided) | (not evaluated) | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `None` | `None` |\n//! | [`and_then`] | `Some(x)` | `x` | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `None` | (not provided) | `None` | `None` |\n//! | [`or_else`] | `None` | (not provided) | `Some(y)` | `Some(y)` |\n//! | [`or_else`] | `Some(x)` | (not provided) | (not evaluated) | `Some(x)` |\n//!\n//! [`and_then`]: Option::and_then\n//! [`or_else`]: Option::or_else\n//!\n//! This is an example of using methods like [`and_then`] and [`or`] in a\n//! pipeline of method calls. Early stages of the pipeline pass failure\n//! values ([`None`]) through unchanged, and continue processing on\n//! success values ([`Some`]). Toward the end, [`or`] substitutes an error\n//! message if it receives [`None`].\n//!\n//! ```\n//! # use std::collections::BTreeMap;\n//! let mut bt = BTreeMap::new();\n//! bt.insert(20u8, \"foo\");\n//! bt.insert(42u8, \"bar\");\n//! let res = [0u8, 1, 11, 200, 22]\n//! .into_iter()\n//! .map(|x| {\n//! // `checked_sub()` returns `None` on error\n//! x.checked_sub(1)\n//! // same with `checked_mul()`\n//! .and_then(|x| x.checked_mul(2))\n//! // `BTreeMap::get` returns `None` on error\n//! .and_then(|x| bt.get(&x))\n//! // Substitute an error message if we have `None` so far\n//! .or(Some(&\"error!\"))\n//! .copied()\n//! // Won't panic because we unconditionally used `Some` above\n//! .unwrap()\n//! })\n//! .collect::<Vec<_>>();\n//! assert_eq!(res, [\"error!\", \"error!\", \"foo\", \"error!\", \"bar\"]);\n//! ```\n//!\n//! ## Comparison operators\n//!\n//! If `T` implements [`PartialOrd`] then [`Option<T>`] will derive its\n//! [`PartialOrd`] implementation. With this order, [`None`] compares as\n//! less than any [`Some`], and two [`Some`] compare the same way as their\n//! contained values would in `T`. If `T` also implements\n//! [`Ord`], then so does [`Option<T>`].\n//!\n//! ```\n//! assert!(None < Some(0));\n//! assert!(Some(0) < Some(1));\n//! ```\n//!\n//! ## Iterating over `Option`\n//!\n//! An [`Option`] can be iterated over. This can be helpful if you need an\n//! iterator that is conditionally empty. The iterator will either produce\n//! a single value (when the [`Option`] is [`Some`]), or produce no values\n//! (when the [`Option`] is [`None`]). For example, [`into_iter`] acts like\n//! [`once(v)`] if the [`Option`] is [`Some(v)`], and like [`empty()`] if\n//! the [`Option`] is [`None`].\n//!\n//! [`Some(v)`]: Some\n//! [`empty()`]: crate::iter::empty\n//! [`once(v)`]: crate::iter::once\n//!\n//! Iterators over [`Option<T>`] come in three types:\n//!\n//! * [`into_iter`] consumes the [`Option`] and produces the contained\n//! value\n//! * [`iter`] produces an immutable reference of type `&T` to the\n//! contained value\n//! * [`iter_mut`] produces a mutable reference of type `&mut T` to the\n//! contained value\n//!\n//! [`into_iter`]: Option::into_iter\n//! [`iter`]: Option::iter\n//! [`iter_mut`]: Option::iter_mut\n//!\n//! An iterator over [`Option`] can be useful when chaining iterators, for\n//! example, to conditionally insert items. (It's not always necessary to\n//! explicitly call an iterator constructor: many [`Iterator`] methods that\n//! accept other iterators will also accept iterable types that implement\n//! [`IntoIterator`], which includes [`Option`].)\n//!\n//! ```\n//! let yep = Some(42);\n//! let nope = None;\n//! // chain() already calls into_iter(), so we don't have to do so\n//! let nums: Vec<i32> = (0..4).chain(yep).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 42, 4, 5, 6, 7]);\n//! let nums: Vec<i32> = (0..4).chain(nope).chain(4..8).collect();\n//! assert_eq!(nums, [0, 1, 2, 3, 4, 5, 6, 7]);\n//! ```\n//!\n//! One reason to chain iterators in this way is that a function returning\n//! `impl Iterator` must have all possible return values be of the same\n//! concrete type. Chaining an iterated [`Option`] can help with that.\n//!\n//! ```\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types matching\n//! match do_insert {\n//! true => return (0..4).chain(Some(42)).chain(4..8),\n//! false => return (0..4).chain(None).chain(4..8),\n//! }\n//! }\n//! println!(\"{:?}\", make_iter(true).collect::<Vec<_>>());\n//! println!(\"{:?}\", make_iter(false).collect::<Vec<_>>());\n//! ```\n//!\n//! If we try to do the same thing, but using [`once()`] and [`empty()`],\n//! we can't return `impl Iterator` anymore because the concrete types of\n//! the return values differ.\n//!\n//! [`empty()`]: crate::iter::empty\n//! [`once()`]: crate::iter::once\n//!\n//! ```compile_fail,E0308\n//! # use std::iter::{empty, once};\n//! // This won't compile because all possible returns from the function\n//! // must have the same concrete type.\n//! fn make_iter(do_insert: bool) -> impl Iterator<Item = i32> {\n//! // Explicit returns to illustrate return types not matching\n//! match do_insert {\n//! true => return (0..4).chain(once(42)).chain(4..8),\n//! false => return (0..4).chain(empty()).chain(4..8),\n//! }\n//! }\n//! ```\n//!\n//! ## Collecting into `Option`\n//!\n//! [`Option`] implements the [`FromIterator`][impl-FromIterator] trait,\n//! which allows an iterator over [`Option`] values to be collected into an\n//! [`Option`] of a collection of each contained value of the original\n//! [`Option`] values, or [`None`] if any of the elements was [`None`].\n//!\n//! [impl-FromIterator]: Option#impl-FromIterator%3COption%3CA%3E%3E\n//!\n//! ```\n//! let v = [Some(2), Some(4), None, Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, None);\n//! let v = [Some(2), Some(4), Some(8)];\n//! let res: Option<Vec<_>> = v.into_iter().collect();\n//! assert_eq!(res, Some(vec![2, 4, 8]));\n//! ```\n//!\n//! [`Option`] also implements the [`Product`][impl-Product] and\n//! [`Sum`][impl-Sum] traits, allowing an iterator over [`Option`] values\n//! to provide the [`product`][Iterator::product] and\n//! [`sum`][Iterator::sum] methods.\n//!\n//! [impl-Product]: Option#impl-Product%3COption%3CU%3E%3E\n//! [impl-Sum]: Option#impl-Sum%3COption%3CU%3E%3E\n//!\n//! ```\n//! let v = [None, Some(1), Some(2), Some(3)];\n//! let res: Option<i32> = v.into_iter().sum();\n//! assert_eq!(res, None);\n//! let v = [Some(1), Some(2), Some(21)];\n//! let res: Option<i32> = v.into_iter().product();\n//! assert_eq!(res, Some(42));\n//! ```\n//!\n//! ## Modifying an [`Option`] in-place\n//!\n//! These methods return a mutable reference to the contained value of an\n//! [`Option<T>`]:\n//!\n//! * [`insert`] inserts a value, dropping any old contents\n//! * [`get_or_insert`] gets the current value, inserting a provided\n//! default value if it is [`None`]\n//! * [`get_or_insert_default`] gets the current value, inserting the\n//! default value of type `T` (which must implement [`Default`]) if it is\n//! [`None`]\n//! * [`get_or_insert_with`] gets the current value, inserting a default\n//! computed by the provided function if it is [`None`]\n//!\n//! [`get_or_insert`]: Option::get_or_insert\n//! [`get_or_insert_default`]: Option::get_or_insert_default\n//! [`get_or_insert_with`]: Option::get_or_insert_with\n//! [`insert`]: Option::insert\n//!\n//! These methods transfer ownership of the contained value of an\n//! [`Option`]:\n//!\n//! * [`take`] takes ownership of the contained value of an [`Option`], if\n//! any, replacing the [`Option`] with [`None`]\n//! * [`replace`] takes ownership of the contained value of an [`Option`],\n//! if any, replacing the [`Option`] with a [`Some`] containing the\n//! provided value\n//!\n//! [`replace`]: Option::replace\n//! [`take`]: Option::take\n//!\n//! # Examples\n//!\n//! Basic pattern matching on [`Option`]:\n//!\n//! ```\n//! let msg = Some(\"howdy\");\n//!\n//! // Take a reference to the contained string\n//! if let Some(m) = &msg {\n//! println!(\"{}\", *m);\n//! }\n//!\n//! // Remove the contained string, destroying the Option\n//! let unwrapped_msg = msg.unwrap_or(\"default message\");\n//! ```\n//!\n//! Initialize a result to [`None`] before a loop:\n//!\n//! ```\n//! enum Kingdom { Plant(u32, &'static str), Animal(u32, &'static str) }\n//!\n//! // A list of data to search through.\n//! let all_the_big_things = [\n//! Kingdom::Plant(250, \"redwood\"),\n//! Kingdom::Plant(230, \"noble fir\"),\n//! Kingdom::Plant(229, \"sugar pine\"),\n//! Kingdom::Animal(25, \"blue whale\"),\n//! Kingdom::Animal(19, \"fin whale\"),\n//! Kingdom::Animal(15, \"north pacific right whale\"),\n//! ];\n//!\n//! // We're going to search for the name of the biggest animal,\n//! // but to start with we've just got `None`.\n//! let mut name_of_biggest_animal = None;\n//! let mut size_of_biggest_animal = 0;\n//! for big_thing in &all_the_big_things {\n//! match *big_thing {\n//! Kingdom::Animal(size, name) if size > size_of_biggest_animal => {\n//! // Now we've found the name of some big animal\n//! size_of_biggest_animal = size;\n//! name_of_biggest_animal = Some(name);\n//! }\n//! Kingdom::Animal(..) | Kingdom::Plant(..) => ()\n//! }\n//! }\n//!\n//! match name_of_biggest_animal {\n//! Some(name) => println!(\"the biggest animal is {name}\"),\n//! None => println!(\"there are no animals :(\"),\n//! }\n//! ```\n\n#![stable(feature = \"rust1\", since = \"1.0.0\")]\n\nuse crate::iter::{self, FromIterator, FusedIterator, TrustedLen};\nuse crate::marker::Destruct;\nuse crate::panicking::{panic, panic_str};\nuse crate::pin::Pin;\nuse crate::{\n convert, hint, mem,\n ops::{self, ControlFlow, Deref, DerefMut},\n};\n\n/// The `Option` type. See [the module level documentation](self) for more.\n#[derive(Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]\n#[rustc_diagnostic_item = \"Option\"]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub enum Option<T> {\n /// No value.\n #[lang = \"None\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n None,\n /// Some value of type `T`.\n #[lang = \"Some\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n Some(#[stable(feature = \"rust1\", since = \"1.0.0\")] T),\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Type implementation\n/////////////////////////////////////////////////////////////////////////////\n\nimpl<T> Option<T> {\n /////////////////////////////////////////////////////////////////////////\n // Querying the contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns `true` if the option is a [`Some`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some(), true);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some(), false);\n /// ```\n #[must_use = \"if you intended to assert that this has a value, consider `.unwrap()` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_some(&self) -> bool {\n matches!(*self, Some(_))\n }\n\n /// Returns `true` if the option is a [`Some`] and the value inside of it matches a predicate.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(is_some_with)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_some_and(|&x| x > 1), true);\n ///\n /// let x: Option<u32> = Some(0);\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_some_and(|&x| x > 1), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"is_some_with\", issue = \"93050\")]\n pub fn is_some_and(&self, f: impl FnOnce(&T) -> bool) -> bool {\n matches!(self, Some(x) if f(x))\n }\n\n /// Returns `true` if the option is a [`None`] value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.is_none(), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.is_none(), true);\n /// ```\n #[must_use = \"if you intended to assert that this doesn't have a value, consider \\\n `.and_then(|_| panic!(\\\"`Option` had a value when expected `None`\\\"))` instead\"]\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n pub const fn is_none(&self) -> bool {\n !self.is_some()\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Adapter for working with references\n /////////////////////////////////////////////////////////////////////////\n\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `as_ref` to first take an `Option` to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let text: Option<String> = Some(\"Hello, world!\".to_string());\n /// // First, cast `Option<String>` to `Option<&String>` with `as_ref`,\n /// // then consume *that* with `map`, leaving `text` on the stack.\n /// let text_length: Option<usize> = text.as_ref().map(|s| s.len());\n /// println!(\"still can print text: {text:?}\");\n /// ```\n #[inline]\n #[rustc_const_stable(feature = \"const_option_basics\", since = \"1.48.0\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn as_ref(&self) -> Option<&T> {\n match *self {\n Some(ref x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from `&mut Option<T>` to `Option<&mut T>`.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// match x.as_mut() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn as_mut(&mut self) -> Option<&mut T> {\n match *self {\n Some(ref mut x) => Some(x),\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&]Option\\<T>></code> to <code>Option<[Pin]<[&]T>></code>.\n ///\n /// [&]: reference \"shared reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_ref(self: Pin<&Self>) -> Option<Pin<&T>> {\n match Pin::get_ref(self).as_ref() {\n // SAFETY: `x` is guaranteed to be pinned because it comes from `self`\n // which is pinned.\n Some(x) => unsafe { Some(Pin::new_unchecked(x)) },\n None => None,\n }\n }\n\n /// Converts from <code>[Pin]<[&mut] Option\\<T>></code> to <code>Option<[Pin]<[&mut] T>></code>.\n ///\n /// [&mut]: reference \"mutable reference\"\n #[inline]\n #[must_use]\n #[stable(feature = \"pin\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_pin_mut(self: Pin<&mut Self>) -> Option<Pin<&mut T>> {\n // SAFETY: `get_unchecked_mut` is never used to move the `Option` inside `self`.\n // `x` is guaranteed to be pinned because it comes from `self` which is pinned.\n unsafe {\n match Pin::get_unchecked_mut(self).as_mut() {\n Some(x) => Some(Pin::new_unchecked(x)),\n None => None,\n }\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Getting to contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// # Panics\n ///\n /// Panics if the value is a [`None`] with a custom panic message provided by\n /// `msg`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"value\");\n /// assert_eq!(x.expect(\"fruits are healthy\"), \"value\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// x.expect(\"fruits are healthy\"); // panics with `fruits are healthy`\n /// ```\n ///\n /// # Recommended Message Style\n ///\n /// We recommend that `expect` messages are used to describe the reason you\n /// _expect_ the `Option` should be `Some`.\n ///\n /// ```should_panic\n /// # let slice: &[u8] = &[];\n /// let item = slice.get(0)\n /// .expect(\"slice should not be empty\");\n /// ```\n ///\n /// **Hint**: If you're having trouble remembering how to phrase expect\n /// error messages remember to focus on the word \"should\" as in \"env\n /// variable should be set by blah\" or \"the given binary should be available\n /// and executable by the current user\".\n ///\n /// For more detail on expect message styles and the reasoning behind our\n /// recommendation please refer to the section on [\"Common Message\n /// Styles\"](../../std/error/index.html#common-message-styles) in the [`std::error`](../../std/error/index.html) module docs.\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn expect(self, msg: &str) -> T {\n match self {\n Some(val) => val,\n None => expect_failed(msg),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value.\n ///\n /// Because this function may panic, its use is generally discouraged.\n /// Instead, prefer to use pattern matching and handle the [`None`]\n /// case explicitly, or call [`unwrap_or`], [`unwrap_or_else`], or\n /// [`unwrap_or_default`].\n ///\n /// [`unwrap_or`]: Option::unwrap_or\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n /// [`unwrap_or_default`]: Option::unwrap_or_default\n ///\n /// # Panics\n ///\n /// Panics if the self value equals [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(x.unwrap(), \"air\");\n /// ```\n ///\n /// ```should_panic\n /// let x: Option<&str> = None;\n /// assert_eq!(x.unwrap(), \"air\"); // fails\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn unwrap(self) -> T {\n match self {\n Some(val) => val,\n None => panic(\"called `Option::unwrap()` on a `None` value\"),\n }\n }\n\n /// Returns the contained [`Some`] value or a provided default.\n ///\n /// Arguments passed to `unwrap_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`unwrap_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`unwrap_or_else`]: Option::unwrap_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// assert_eq!(Some(\"car\").unwrap_or(\"bike\"), \"car\");\n /// assert_eq!(None.unwrap_or(\"bike\"), \"bike\");\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or(self, default: T) -> T\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => default,\n }\n }\n\n /// Returns the contained [`Some`] value or computes it from a closure.\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 10;\n /// assert_eq!(Some(4).unwrap_or_else(|| 2 * k), 4);\n /// assert_eq!(None.unwrap_or_else(|| 2 * k), 20);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_else<F>(self, f: F) -> T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n match self {\n Some(x) => x,\n None => f(),\n }\n }\n\n /// Returns the contained [`Some`] value or a default.\n ///\n /// Consumes the `self` argument then, if [`Some`], returns the contained\n /// value, otherwise if [`None`], returns the [default value] for that\n /// type.\n ///\n /// # Examples\n ///\n /// Converts a string to an integer, turning poorly-formed strings\n /// into 0 (the default value for integers). [`parse`] converts\n /// a string to any other type that implements [`FromStr`], returning\n /// [`None`] on error.\n ///\n /// ```\n /// let good_year_from_input = \"1909\";\n /// let bad_year_from_input = \"190blarg\";\n /// let good_year = good_year_from_input.parse().ok().unwrap_or_default();\n /// let bad_year = bad_year_from_input.parse().ok().unwrap_or_default();\n ///\n /// assert_eq!(1909, good_year);\n /// assert_eq!(0, bad_year);\n /// ```\n ///\n /// [default value]: Default::default\n /// [`parse`]: str::parse\n /// [`FromStr`]: crate::str::FromStr\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn unwrap_or_default(self) -> T\n where\n T: ~const Default,\n {\n match self {\n Some(x) => x,\n None => Default::default(),\n }\n }\n\n /// Returns the contained [`Some`] value, consuming the `self` value,\n /// without checking that the value is not [`None`].\n ///\n /// # Safety\n ///\n /// Calling this method on [`None`] is *[undefined behavior]*.\n ///\n /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"air\");\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\");\n /// ```\n ///\n /// ```no_run\n /// let x: Option<&str> = None;\n /// assert_eq!(unsafe { x.unwrap_unchecked() }, \"air\"); // Undefined behavior!\n /// ```\n #[inline]\n #[track_caller]\n #[stable(feature = \"option_result_unwrap_unchecked\", since = \"1.58.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const unsafe fn unwrap_unchecked(self) -> T {\n debug_assert!(self.is_some());\n match self {\n Some(val) => val,\n // SAFETY: the safety contract must be upheld by the caller.\n None => unsafe { hint::unreachable_unchecked() },\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Transforming contained values\n /////////////////////////////////////////////////////////////////////////\n\n /// Maps an `Option<T>` to `Option<U>` by applying a function to a contained value.\n ///\n /// # Examples\n ///\n /// Converts an <code>Option<[String]></code> into an <code>Option<[usize]></code>, consuming\n /// the original:\n ///\n /// [String]: ../../std/string/struct.String.html \"String\"\n /// ```\n /// let maybe_some_string = Some(String::from(\"Hello, World!\"));\n /// // `Option::map` takes self *by value*, consuming `maybe_some_string`\n /// let maybe_some_len = maybe_some_string.map(|s| s.len());\n ///\n /// assert_eq!(maybe_some_len, Some(13));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(f(x)),\n None => None,\n }\n }\n\n /// Calls the provided closure with a reference to the contained value (if [`Some`]).\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(result_option_inspect)]\n ///\n /// let v = vec![1, 2, 3, 4, 5];\n ///\n /// // prints \"got: 4\"\n /// let x: Option<&usize> = v.get(3).inspect(|x| println!(\"got: {x}\"));\n ///\n /// // prints nothing\n /// let x: Option<&usize> = v.get(5).inspect(|x| println!(\"got: {x}\"));\n /// ```\n #[inline]\n #[unstable(feature = \"result_option_inspect\", issue = \"91345\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn inspect<F>(self, f: F) -> Self\n where\n F: ~const FnOnce(&T),\n F: ~const Destruct,\n {\n if let Some(ref x) = self {\n f(x);\n }\n\n self\n }\n\n /// Returns the provided default result (if none),\n /// or applies a function to the contained value (if any).\n ///\n /// Arguments passed to `map_or` are eagerly evaluated; if you are passing\n /// the result of a function call, it is recommended to use [`map_or_else`],\n /// which is lazily evaluated.\n ///\n /// [`map_or_else`]: Option::map_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or(42, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or(42, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or<U, F>(self, default: U, f: F) -> U\n where\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default,\n }\n }\n\n /// Computes a default function result (if none), or\n /// applies a different function to the contained value (if any).\n ///\n /// # Examples\n ///\n /// ```\n /// let k = 21;\n ///\n /// let x = Some(\"foo\");\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 3);\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.map_or_else(|| 2 * k, |v| v.len()), 42);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn map_or_else<U, D, F>(self, default: D, f: F) -> U\n where\n D: ~const FnOnce() -> U,\n D: ~const Destruct,\n F: ~const FnOnce(T) -> U,\n F: ~const Destruct,\n {\n match self {\n Some(t) => f(t),\n None => default(),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err)`].\n ///\n /// Arguments passed to `ok_or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`ok_or_else`], which is\n /// lazily evaluated.\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err)`]: Err\n /// [`Some(v)`]: Some\n /// [`ok_or_else`]: Option::ok_or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or(0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or(0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or<E>(self, err: E) -> Result<T, E>\n where\n E: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err),\n }\n }\n\n /// Transforms the `Option<T>` into a [`Result<T, E>`], mapping [`Some(v)`] to\n /// [`Ok(v)`] and [`None`] to [`Err(err())`].\n ///\n /// [`Ok(v)`]: Ok\n /// [`Err(err())`]: Err\n /// [`Some(v)`]: Some\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"foo\");\n /// assert_eq!(x.ok_or_else(|| 0), Ok(\"foo\"));\n ///\n /// let x: Option<&str> = None;\n /// assert_eq!(x.ok_or_else(|| 0), Err(0));\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn ok_or_else<E, F>(self, err: F) -> Result<T, E>\n where\n F: ~const FnOnce() -> E,\n F: ~const Destruct,\n {\n match self {\n Some(v) => Ok(v),\n None => Err(err()),\n }\n }\n\n /// Converts from `Option<T>` (or `&Option<T>`) to `Option<&T::Target>`.\n ///\n /// Leaves the original Option in-place, creating a new one with a reference\n /// to the original one, additionally coercing the contents via [`Deref`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref(), Some(\"hey\"));\n ///\n /// let x: Option<String> = None;\n /// assert_eq!(x.as_deref(), None);\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref(&self) -> Option<&T::Target>\n where\n T: ~const Deref,\n {\n match self.as_ref() {\n Some(t) => Some(t.deref()),\n None => None,\n }\n }\n\n /// Converts from `Option<T>` (or `&mut Option<T>`) to `Option<&mut T::Target>`.\n ///\n /// Leaves the original `Option` in-place, creating a new one containing a mutable reference to\n /// the inner type's [`Deref::Target`] type.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x: Option<String> = Some(\"hey\".to_owned());\n /// assert_eq!(x.as_deref_mut().map(|x| {\n /// x.make_ascii_uppercase();\n /// x\n /// }), Some(\"HEY\".to_owned().as_mut_str()));\n /// ```\n #[stable(feature = \"option_deref\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn as_deref_mut(&mut self) -> Option<&mut T::Target>\n where\n T: ~const DerefMut,\n {\n match self.as_mut() {\n Some(t) => Some(t.deref_mut()),\n None => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Iterator constructors\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns an iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(4);\n /// assert_eq!(x.iter().next(), Some(&4));\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.iter().next(), None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub const fn iter(&self) -> Iter<'_, T> {\n Iter { inner: Item { opt: self.as_ref() } }\n }\n\n /// Returns a mutable iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(4);\n /// match x.iter_mut().next() {\n /// Some(v) => *v = 42,\n /// None => {},\n /// }\n /// assert_eq!(x, Some(42));\n ///\n /// let mut x: Option<u32> = None;\n /// assert_eq!(x.iter_mut().next(), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n pub fn iter_mut(&mut self) -> IterMut<'_, T> {\n IterMut { inner: Item { opt: self.as_mut() } }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Boolean operations on the values, eager and lazy\n /////////////////////////////////////////////////////////////////////////\n\n /// Returns [`None`] if the option is [`None`], otherwise returns `optb`.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), None);\n ///\n /// let x = Some(2);\n /// let y = Some(\"foo\");\n /// assert_eq!(x.and(y), Some(\"foo\"));\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<&str> = None;\n /// assert_eq!(x.and(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and<U>(self, optb: Option<U>) -> Option<U>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match self {\n Some(_) => optb,\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `f` with the\n /// wrapped value and returns the result.\n ///\n /// Some languages call this operation flatmap.\n ///\n /// # Examples\n ///\n /// ```\n /// fn sq_then_to_string(x: u32) -> Option<String> {\n /// x.checked_mul(x).map(|sq| sq.to_string())\n /// }\n ///\n /// assert_eq!(Some(2).and_then(sq_then_to_string), Some(4.to_string()));\n /// assert_eq!(Some(1_000_000).and_then(sq_then_to_string), None); // overflowed!\n /// assert_eq!(None.and_then(sq_then_to_string), None);\n /// ```\n ///\n /// Often used to chain fallible operations that may return [`None`].\n ///\n /// ```\n /// let arr_2d = [[\"A0\", \"A1\"], [\"B0\", \"B1\"]];\n ///\n /// let item_0_1 = arr_2d.get(0).and_then(|row| row.get(1));\n /// assert_eq!(item_0_1, Some(&\"A1\"));\n ///\n /// let item_2_0 = arr_2d.get(2).and_then(|row| row.get(0));\n /// assert_eq!(item_2_0, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn and_then<U, F>(self, f: F) -> Option<U>\n where\n F: ~const FnOnce(T) -> Option<U>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => f(x),\n None => None,\n }\n }\n\n /// Returns [`None`] if the option is [`None`], otherwise calls `predicate`\n /// with the wrapped value and returns:\n ///\n /// - [`Some(t)`] if `predicate` returns `true` (where `t` is the wrapped\n /// value), and\n /// - [`None`] if `predicate` returns `false`.\n ///\n /// This function works similar to [`Iterator::filter()`]. You can imagine\n /// the `Option<T>` being an iterator over one or zero elements. `filter()`\n /// lets you decide which elements to keep.\n ///\n /// # Examples\n ///\n /// ```rust\n /// fn is_even(n: &i32) -> bool {\n /// n % 2 == 0\n /// }\n ///\n /// assert_eq!(None.filter(is_even), None);\n /// assert_eq!(Some(3).filter(is_even), None);\n /// assert_eq!(Some(4).filter(is_even), Some(4));\n /// ```\n ///\n /// [`Some(t)`]: Some\n #[inline]\n #[stable(feature = \"option_filter\", since = \"1.27.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn filter<P>(self, predicate: P) -> Self\n where\n T: ~const Destruct,\n P: ~const FnOnce(&T) -> bool,\n P: ~const Destruct,\n {\n if let Some(x) = self {\n if predicate(&x) {\n return Some(x);\n }\n }\n None\n }\n\n /// Returns the option if it contains a value, otherwise returns `optb`.\n ///\n /// Arguments passed to `or` are eagerly evaluated; if you are passing the\n /// result of a function call, it is recommended to use [`or_else`], which is\n /// lazily evaluated.\n ///\n /// [`or_else`]: Option::or_else\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y = None;\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x = None;\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(100));\n ///\n /// let x = Some(2);\n /// let y = Some(100);\n /// assert_eq!(x.or(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = None;\n /// assert_eq!(x.or(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => optb,\n }\n }\n\n /// Returns the option if it contains a value, otherwise calls `f` and\n /// returns the result.\n ///\n /// # Examples\n ///\n /// ```\n /// fn nobody() -> Option<&'static str> { None }\n /// fn vikings() -> Option<&'static str> { Some(\"vikings\") }\n ///\n /// assert_eq!(Some(\"barbarians\").or_else(vikings), Some(\"barbarians\"));\n /// assert_eq!(None.or_else(vikings), Some(\"vikings\"));\n /// assert_eq!(None.or_else(nobody), None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn or_else<F>(self, f: F) -> Option<T>\n where\n F: ~const FnOnce() -> Option<T>,\n F: ~const Destruct,\n {\n match self {\n Some(x) => Some(x),\n None => f(),\n }\n }\n\n /// Returns [`Some`] if exactly one of `self`, `optb` is [`Some`], otherwise returns [`None`].\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(2);\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x: Option<u32> = None;\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), Some(2));\n ///\n /// let x = Some(2);\n /// let y = Some(2);\n /// assert_eq!(x.xor(y), None);\n ///\n /// let x: Option<u32> = None;\n /// let y: Option<u32> = None;\n /// assert_eq!(x.xor(y), None);\n /// ```\n #[inline]\n #[stable(feature = \"option_xor\", since = \"1.37.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn xor(self, optb: Option<T>) -> Option<T>\n where\n T: ~const Destruct,\n {\n match (self, optb) {\n (Some(a), None) => Some(a),\n (None, Some(b)) => Some(b),\n _ => None,\n }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Entry-like operations to insert a value and return a reference\n /////////////////////////////////////////////////////////////////////////\n\n /// Inserts `value` into the option, then returns a mutable reference to it.\n ///\n /// If the option already contains a value, the old value is dropped.\n ///\n /// See also [`Option::get_or_insert`], which doesn't update the value if\n /// the option already contains [`Some`].\n ///\n /// # Example\n ///\n /// ```\n /// let mut opt = None;\n /// let val = opt.insert(1);\n /// assert_eq!(*val, 1);\n /// assert_eq!(opt.unwrap(), 1);\n /// let val = opt.insert(2);\n /// assert_eq!(*val, 2);\n /// *val = 3;\n /// assert_eq!(opt.unwrap(), 3);\n /// ```\n #[must_use = \"if you intended to set a value, consider assignment instead\"]\n #[inline]\n #[stable(feature = \"option_insert\", since = \"1.53.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n *self = Some(value);\n\n // SAFETY: the code above just filled the option\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts `value` into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// See also [`Option::insert`], which updates the value even if\n /// the option already contains [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert(5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert(&mut self, value: T) -> &mut T\n where\n T: ~const Destruct,\n {\n if let None = *self {\n *self = Some(value);\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /// Inserts the default value into the option if it is [`None`], then\n /// returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_get_or_insert_default)]\n ///\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_default();\n /// assert_eq!(y, &0);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[unstable(feature = \"option_get_or_insert_default\", issue = \"82901\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_default(&mut self) -> &mut T\n where\n T: ~const Default,\n {\n const fn default<T: ~const Default>() -> T {\n T::default()\n }\n\n self.get_or_insert_with(default)\n }\n\n /// Inserts a value computed from `f` into the option if it is [`None`],\n /// then returns a mutable reference to the contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = None;\n ///\n /// {\n /// let y: &mut u32 = x.get_or_insert_with(|| 5);\n /// assert_eq!(y, &5);\n ///\n /// *y = 7;\n /// }\n ///\n /// assert_eq!(x, Some(7));\n /// ```\n #[inline]\n #[stable(feature = \"option_entry\", since = \"1.20.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn get_or_insert_with<F>(&mut self, f: F) -> &mut T\n where\n F: ~const FnOnce() -> T,\n F: ~const Destruct,\n {\n if let None = *self {\n // the compiler isn't smart enough to know that we are not dropping a `T`\n // here and wants us to ensure `T` can be dropped at compile time.\n mem::forget(mem::replace(self, Some(f())))\n }\n\n // SAFETY: a `None` variant for `self` would have been replaced by a `Some`\n // variant in the code above.\n unsafe { self.as_mut().unwrap_unchecked() }\n }\n\n /////////////////////////////////////////////////////////////////////////\n // Misc\n /////////////////////////////////////////////////////////////////////////\n\n /// Takes the value out of the option, leaving a [`None`] in its place.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, Some(2));\n ///\n /// let mut x: Option<u32> = None;\n /// let y = x.take();\n /// assert_eq!(x, None);\n /// assert_eq!(y, None);\n /// ```\n #[inline]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn take(&mut self) -> Option<T> {\n // FIXME replace `mem::replace` by `mem::take` when the latter is const ready\n mem::replace(self, None)\n }\n\n /// Replaces the actual value in the option by the value given in parameter,\n /// returning the old value if present,\n /// leaving a [`Some`] in its place without deinitializing either one.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = Some(2);\n /// let old = x.replace(5);\n /// assert_eq!(x, Some(5));\n /// assert_eq!(old, Some(2));\n ///\n /// let mut x = None;\n /// let old = x.replace(3);\n /// assert_eq!(x, Some(3));\n /// assert_eq!(old, None);\n /// ```\n #[inline]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n #[stable(feature = \"option_replace\", since = \"1.31.0\")]\n pub const fn replace(&mut self, value: T) -> Option<T> {\n mem::replace(self, Some(value))\n }\n\n /// Returns `true` if the option is a [`Some`] value containing the given value.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_result_contains)]\n ///\n /// let x: Option<u32> = Some(2);\n /// assert_eq!(x.contains(&2), true);\n ///\n /// let x: Option<u32> = Some(3);\n /// assert_eq!(x.contains(&2), false);\n ///\n /// let x: Option<u32> = None;\n /// assert_eq!(x.contains(&2), false);\n /// ```\n #[must_use]\n #[inline]\n #[unstable(feature = \"option_result_contains\", issue = \"62358\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn contains<U>(&self, x: &U) -> bool\n where\n U: ~const PartialEq<T>,\n {\n match self {\n Some(y) => x.eq(y),\n None => false,\n }\n }\n\n /// Zips `self` with another `Option`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some((s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(1);\n /// let y = Some(\"hi\");\n /// let z = None::<u8>;\n ///\n /// assert_eq!(x.zip(y), Some((1, \"hi\")));\n /// assert_eq!(x.zip(z), None);\n /// ```\n #[stable(feature = \"option_zip_option\", since = \"1.46.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip<U>(self, other: Option<U>) -> Option<(T, U)>\n where\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some((a, b)),\n _ => None,\n }\n }\n\n /// Zips `self` and another `Option` with function `f`.\n ///\n /// If `self` is `Some(s)` and `other` is `Some(o)`, this method returns `Some(f(s, o))`.\n /// Otherwise, `None` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(option_zip)]\n ///\n /// #[derive(Debug, PartialEq)]\n /// struct Point {\n /// x: f64,\n /// y: f64,\n /// }\n ///\n /// impl Point {\n /// fn new(x: f64, y: f64) -> Self {\n /// Self { x, y }\n /// }\n /// }\n ///\n /// let x = Some(17.5);\n /// let y = Some(42.7);\n ///\n /// assert_eq!(x.zip_with(y, Point::new), Some(Point { x: 17.5, y: 42.7 }));\n /// assert_eq!(x.zip_with(None, Point::new), None);\n /// ```\n #[unstable(feature = \"option_zip\", issue = \"70086\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn zip_with<U, F, R>(self, other: Option<U>, f: F) -> Option<R>\n where\n F: ~const FnOnce(T, U) -> R,\n F: ~const Destruct,\n T: ~const Destruct,\n U: ~const Destruct,\n {\n match (self, other) {\n (Some(a), Some(b)) => Some(f(a, b)),\n _ => None,\n }\n }\n}\n\nimpl<T, U> Option<(T, U)> {\n /// Unzips an option containing a tuple of two options.\n ///\n /// If `self` is `Some((a, b))` this method returns `(Some(a), Some(b))`.\n /// Otherwise, `(None, None)` is returned.\n ///\n /// # Examples\n ///\n /// ```\n /// #![feature(unzip_option)]\n ///\n /// let x = Some((1, \"hi\"));\n /// let y = None::<(u8, u32)>;\n ///\n /// assert_eq!(x.unzip(), (Some(1), Some(\"hi\")));\n /// assert_eq!(y.unzip(), (None, None));\n /// ```\n #[inline]\n #[unstable(feature = \"unzip_option\", issue = \"87800\", reason = \"recently added\")]\n pub const fn unzip(self) -> (Option<T>, Option<U>) {\n match self {\n Some((a, b)) => (Some(a), Some(b)),\n None => (None, None),\n }\n }\n}\n\nimpl<T> Option<&T> {\n /// Maps an `Option<&T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n // FIXME: this implementation, which sidesteps using `Option::map` since it's not const\n // ready yet, should be reverted when possible to avoid code repetition\n match self {\n Some(&v) => Some(v),\n None => None,\n }\n }\n\n /// Maps an `Option<&T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = 12;\n /// let opt_x = Some(&x);\n /// assert_eq!(opt_x, Some(&12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"rust1\", since = \"1.0.0\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T> Option<&mut T> {\n /// Maps an `Option<&mut T>` to an `Option<T>` by copying the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let copied = opt_x.copied();\n /// assert_eq!(copied, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(feature = \"copied\", since = \"1.35.0\")]\n #[rustc_const_unstable(feature = \"const_option_ext\", issue = \"91930\")]\n pub const fn copied(self) -> Option<T>\n where\n T: Copy,\n {\n match self {\n Some(&mut t) => Some(t),\n None => None,\n }\n }\n\n /// Maps an `Option<&mut T>` to an `Option<T>` by cloning the contents of the\n /// option.\n ///\n /// # Examples\n ///\n /// ```\n /// let mut x = 12;\n /// let opt_x = Some(&mut x);\n /// assert_eq!(opt_x, Some(&mut 12));\n /// let cloned = opt_x.cloned();\n /// assert_eq!(cloned, Some(12));\n /// ```\n #[must_use = \"`self` will be dropped if the result is not used\"]\n #[stable(since = \"1.26.0\", feature = \"option_ref_mut_cloned\")]\n #[rustc_const_unstable(feature = \"const_option_cloned\", issue = \"91582\")]\n pub const fn cloned(self) -> Option<T>\n where\n T: ~const Clone,\n {\n match self {\n Some(t) => Some(t.clone()),\n None => None,\n }\n }\n}\n\nimpl<T, E> Option<Result<T, E>> {\n /// Transposes an `Option` of a [`Result`] into a [`Result`] of an `Option`.\n ///\n /// [`None`] will be mapped to <code>[Ok]\\([None])</code>.\n /// <code>[Some]\\([Ok]\\(\\_))</code> and <code>[Some]\\([Err]\\(\\_))</code> will be mapped to\n /// <code>[Ok]\\([Some]\\(\\_))</code> and <code>[Err]\\(\\_)</code>.\n ///\n /// # Examples\n ///\n /// ```\n /// #[derive(Debug, Eq, PartialEq)]\n /// struct SomeErr;\n ///\n /// let x: Result<Option<i32>, SomeErr> = Ok(Some(5));\n /// let y: Option<Result<i32, SomeErr>> = Some(Ok(5));\n /// assert_eq!(x, y.transpose());\n /// ```\n #[inline]\n #[stable(feature = \"transpose_result\", since = \"1.33.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn transpose(self) -> Result<Option<T>, E> {\n match self {\n Some(Ok(x)) => Ok(Some(x)),\n Some(Err(e)) => Err(e),\n None => Ok(None),\n }\n }\n}\n\n// This is a separate function to reduce the code size of .expect() itself.\n#[cfg_attr(not(feature = \"panic_immediate_abort\"), inline(never))]\n#[cfg_attr(feature = \"panic_immediate_abort\", inline)]\n#[cold]\n#[track_caller]\n#[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\nconst fn expect_failed(msg: &str) -> ! {\n panic_str(msg)\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// Trait implementations\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_clone\", issue = \"91805\")]\nimpl<T> const Clone for Option<T>\nwhere\n T: ~const Clone + ~const Destruct,\n{\n #[inline]\n fn clone(&self) -> Self {\n match self {\n Some(x) => Some(x.clone()),\n None => None,\n }\n }\n\n #[inline]\n fn clone_from(&mut self, source: &Self) {\n match (self, source) {\n (Some(to), Some(from)) => to.clone_from(from),\n (to, from) => *to = from.clone(),\n }\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[rustc_const_unstable(feature = \"const_default_impls\", issue = \"87864\")]\nimpl<T> const Default for Option<T> {\n /// Returns [`None`][Option::None].\n ///\n /// # Examples\n ///\n /// ```\n /// let opt: Option<u32> = Option::default();\n /// assert!(opt.is_none());\n /// ```\n #[inline]\n fn default() -> Option<T> {\n None\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<T> IntoIterator for Option<T> {\n type Item = T;\n type IntoIter = IntoIter<T>;\n\n /// Returns a consuming iterator over the possibly contained value.\n ///\n /// # Examples\n ///\n /// ```\n /// let x = Some(\"string\");\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert_eq!(v, [\"string\"]);\n ///\n /// let x = None;\n /// let v: Vec<&str> = x.into_iter().collect();\n /// assert!(v.is_empty());\n /// ```\n #[inline]\n fn into_iter(self) -> IntoIter<T> {\n IntoIter { inner: Item { opt: self } }\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a Option<T> {\n type Item = &'a T;\n type IntoIter = Iter<'a, T>;\n\n fn into_iter(self) -> Iter<'a, T> {\n self.iter()\n }\n}\n\n#[stable(since = \"1.4.0\", feature = \"option_iter\")]\nimpl<'a, T> IntoIterator for &'a mut Option<T> {\n type Item = &'a mut T;\n type IntoIter = IterMut<'a, T>;\n\n fn into_iter(self) -> IterMut<'a, T> {\n self.iter_mut()\n }\n}\n\n#[stable(since = \"1.12.0\", feature = \"option_from\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const From<T> for Option<T> {\n /// Moves `val` into a new [`Some`].\n ///\n /// # Examples\n ///\n /// ```\n /// let o: Option<u8> = Option::from(67);\n ///\n /// assert_eq!(Some(67), o);\n /// ```\n fn from(val: T) -> Option<T> {\n Some(val)\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a Option<T>> for Option<&'a T> {\n /// Converts from `&Option<T>` to `Option<&T>`.\n ///\n /// # Examples\n ///\n /// Converts an <code>[Option]<[String]></code> into an <code>[Option]<[usize]></code>, preserving\n /// the original. The [`map`] method takes the `self` argument by value, consuming the original,\n /// so this technique uses `from` to first take an [`Option`] to a reference\n /// to the value inside the original.\n ///\n /// [`map`]: Option::map\n /// [String]: ../../std/string/struct.String.html \"String\"\n ///\n /// ```\n /// let s: Option<String> = Some(String::from(\"Hello, Rustaceans!\"));\n /// let o: Option<usize> = Option::from(&s).map(|ss: &String| ss.len());\n ///\n /// println!(\"Can still print s: {s:?}\");\n ///\n /// assert_eq!(o, Some(18));\n /// ```\n fn from(o: &'a Option<T>) -> Option<&'a T> {\n o.as_ref()\n }\n}\n\n#[stable(feature = \"option_ref_from_ref_option\", since = \"1.30.0\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<'a, T> const From<&'a mut Option<T>> for Option<&'a mut T> {\n /// Converts from `&mut Option<T>` to `Option<&mut T>`\n ///\n /// # Examples\n ///\n /// ```\n /// let mut s = Some(String::from(\"Hello\"));\n /// let o: Option<&mut String> = Option::from(&mut s);\n ///\n /// match o {\n /// Some(t) => *t = String::from(\"Hello, Rustaceans!\"),\n /// None => (),\n /// }\n ///\n /// assert_eq!(s, Some(String::from(\"Hello, Rustaceans!\")));\n /// ```\n fn from(o: &'a mut Option<T>) -> Option<&'a mut T> {\n o.as_mut()\n }\n}\n\n/////////////////////////////////////////////////////////////////////////////\n// The Option Iterators\n/////////////////////////////////////////////////////////////////////////////\n\n#[derive(Clone, Debug)]\nstruct Item<A> {\n opt: Option<A>,\n}\n\nimpl<A> Iterator for Item<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.opt.take()\n }\n\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n match self.opt {\n Some(_) => (1, Some(1)),\n None => (0, Some(0)),\n }\n }\n}\n\nimpl<A> DoubleEndedIterator for Item<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.opt.take()\n }\n}\n\nimpl<A> ExactSizeIterator for Item<A> {}\nimpl<A> FusedIterator for Item<A> {}\nunsafe impl<A> TrustedLen for Item<A> {}\n\n/// An iterator over a reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct Iter<'a, A: 'a> {\n inner: Item<&'a A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for Iter<'a, A> {\n type Item = &'a A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for Iter<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for Iter<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for Iter<'_, A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for Iter<'_, A> {}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Clone for Iter<'_, A> {\n #[inline]\n fn clone(&self) -> Self {\n Iter { inner: self.inner.clone() }\n }\n}\n\n/// An iterator over a mutable reference to the [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::iter_mut`] function.\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\n#[derive(Debug)]\npub struct IterMut<'a, A: 'a> {\n inner: Item<&'a mut A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> Iterator for IterMut<'a, A> {\n type Item = &'a mut A;\n\n #[inline]\n fn next(&mut self) -> Option<&'a mut A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<'a, A> DoubleEndedIterator for IterMut<'a, A> {\n #[inline]\n fn next_back(&mut self) -> Option<&'a mut A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IterMut<'_, A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IterMut<'_, A> {}\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IterMut<'_, A> {}\n\n/// An iterator over the value in [`Some`] variant of an [`Option`].\n///\n/// The iterator yields one value if the [`Option`] is a [`Some`], otherwise none.\n///\n/// This `struct` is created by the [`Option::into_iter`] function.\n#[derive(Clone, Debug)]\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\npub struct IntoIter<A> {\n inner: Item<A>,\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> Iterator for IntoIter<A> {\n type Item = A;\n\n #[inline]\n fn next(&mut self) -> Option<A> {\n self.inner.next()\n }\n #[inline]\n fn size_hint(&self) -> (usize, Option<usize>) {\n self.inner.size_hint()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> DoubleEndedIterator for IntoIter<A> {\n #[inline]\n fn next_back(&mut self) -> Option<A> {\n self.inner.next_back()\n }\n}\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A> ExactSizeIterator for IntoIter<A> {}\n\n#[stable(feature = \"fused\", since = \"1.26.0\")]\nimpl<A> FusedIterator for IntoIter<A> {}\n\n#[unstable(feature = \"trusted_len\", issue = \"37572\")]\nunsafe impl<A> TrustedLen for IntoIter<A> {}\n\n/////////////////////////////////////////////////////////////////////////////\n// FromIterator\n/////////////////////////////////////////////////////////////////////////////\n\n#[stable(feature = \"rust1\", since = \"1.0.0\")]\nimpl<A, V: FromIterator<A>> FromIterator<Option<A>> for Option<V> {\n /// Takes each element in the [`Iterator`]: if it is [`None`][Option::None],\n /// no further elements are taken, and the [`None`][Option::None] is\n /// returned. Should no [`None`][Option::None] occur, a container of type\n /// `V` containing the values of each [`Option`] is returned.\n ///\n /// # Examples\n ///\n /// Here is an example which increments every integer in a vector.\n /// We use the checked variant of `add` that returns `None` when the\n /// calculation would result in an overflow.\n ///\n /// ```\n /// let items = vec![0_u16, 1, 2];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_add(1))\n /// .collect();\n ///\n /// assert_eq!(res, Some(vec![1, 2, 3]));\n /// ```\n ///\n /// As you can see, this will return the expected, valid items.\n ///\n /// Here is another example that tries to subtract one from another list\n /// of integers, this time checking for underflow:\n ///\n /// ```\n /// let items = vec![2_u16, 1, 0];\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| x.checked_sub(1))\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// ```\n ///\n /// Since the last element is zero, it would underflow. Thus, the resulting\n /// value is `None`.\n ///\n /// Here is a variation on the previous example, showing that no\n /// further elements are taken from `iter` after the first `None`.\n ///\n /// ```\n /// let items = vec![3_u16, 2, 1, 10];\n ///\n /// let mut shared = 0;\n ///\n /// let res: Option<Vec<u16>> = items\n /// .iter()\n /// .map(|x| { shared += x; x.checked_sub(2) })\n /// .collect();\n ///\n /// assert_eq!(res, None);\n /// assert_eq!(shared, 6);\n /// ```\n ///\n /// Since the third element caused an underflow, no further elements were taken,\n /// so the final value of `shared` is 6 (= `3 + 2 + 1`), not 16.\n #[inline]\n fn from_iter<I: IntoIterator<Item = Option<A>>>(iter: I) -> Option<V> {\n // FIXME(#11084): This could be replaced with Iterator::scan when this\n // performance bug is closed.\n\n iter::try_process(iter.into_iter(), |i| i.collect())\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::Try for Option<T> {\n type Output = T;\n type Residual = Option<convert::Infallible>;\n\n #[inline]\n fn from_output(output: Self::Output) -> Self {\n Some(output)\n }\n\n #[inline]\n fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {\n match self {\n Some(v) => ControlFlow::Continue(v),\n None => ControlFlow::Break(None),\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2\", issue = \"84277\")]\n#[rustc_const_unstable(feature = \"const_convert\", issue = \"88674\")]\nimpl<T> const ops::FromResidual for Option<T> {\n #[inline]\n fn from_residual(residual: Option<convert::Infallible>) -> Self {\n match residual {\n None => None,\n }\n }\n}\n\n#[unstable(feature = \"try_trait_v2_yeet\", issue = \"96374\")]\nimpl<T> ops::FromResidual<ops::Yeet<()>> for Option<T> {\n #[inline]\n fn from_residual(ops::Yeet(()): ops::Yeet<()>) -> Self {\n None\n }\n}\n\n#[unstable(feature = \"try_trait_v2_residual\", issue = \"91285\")]\nimpl<T> ops::Residual<T> for Option<convert::Infallible> {\n type TryType = Option<T>;\n}\n\nimpl<T> Option<Option<T>> {\n /// Converts from `Option<Option<T>>` to `Option<T>`.\n ///\n /// # Examples\n ///\n /// Basic usage:\n ///\n /// ```\n /// let x: Option<Option<u32>> = Some(Some(6));\n /// assert_eq!(Some(6), x.flatten());\n ///\n /// let x: Option<Option<u32>> = Some(None);\n /// assert_eq!(None, x.flatten());\n ///\n /// let x: Option<Option<u32>> = None;\n /// assert_eq!(None, x.flatten());\n /// ```\n ///\n /// Flattening only removes one level of nesting at a time:\n ///\n /// ```\n /// let x: Option<Option<Option<u32>>> = Some(Some(Some(6)));\n /// assert_eq!(Some(Some(6)), x.flatten());\n /// assert_eq!(Some(6), x.flatten().flatten());\n /// ```\n #[inline]\n #[stable(feature = \"option_flattening\", since = \"1.40.0\")]\n #[rustc_const_unstable(feature = \"const_option\", issue = \"67441\")]\n pub const fn flatten(self) -> Option<T> {\n match self {\n Some(inner) => inner,\n None => None,\n }\n }\n}\n","uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","version":0}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"textDocument/codeLens","params":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}},"id":3} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":3,"result":[{"range":{"start":{"line":537,"character":4},"end":{"line":554,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::is_some","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":537,"character":4},"end":{"line":554,"character":5}},"targetSelectionRange":{"start":{"line":537,"character":4},"end":{"line":554,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some","--nocapture"]}}]}},{"range":{"start":{"line":556,"character":4},"end":{"line":577,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::is_some_and","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":556,"character":4},"end":{"line":577,"character":5}},"targetSelectionRange":{"start":{"line":556,"character":4},"end":{"line":577,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some_and","--nocapture"]}}]}},{"range":{"start":{"line":579,"character":4},"end":{"line":597,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::is_none","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":579,"character":4},"end":{"line":597,"character":5}},"targetSelectionRange":{"start":{"line":579,"character":4},"end":{"line":597,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_none","--nocapture"]}}]}},{"range":{"start":{"line":603,"character":4},"end":{"line":630,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_ref","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":603,"character":4},"end":{"line":630,"character":5}},"targetSelectionRange":{"start":{"line":603,"character":4},"end":{"line":630,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_ref","--nocapture"]}}]}},{"range":{"start":{"line":632,"character":4},"end":{"line":652,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_mut","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":632,"character":4},"end":{"line":652,"character":5}},"targetSelectionRange":{"start":{"line":632,"character":4},"end":{"line":652,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_mut","--nocapture"]}}]}},{"range":{"start":{"line":692,"character":4},"end":{"line":739,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::expect","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":692,"character":4},"end":{"line":739,"character":5}},"targetSelectionRange":{"start":{"line":692,"character":4},"end":{"line":739,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::expect","--nocapture"]}}]}},{"range":{"start":{"line":741,"character":4},"end":{"line":776,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":741,"character":4},"end":{"line":776,"character":5}},"targetSelectionRange":{"start":{"line":741,"character":4},"end":{"line":776,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap","--nocapture"]}}]}},{"range":{"start":{"line":778,"character":4},"end":{"line":803,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":778,"character":4},"end":{"line":803,"character":5}},"targetSelectionRange":{"start":{"line":778,"character":4},"end":{"line":803,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or","--nocapture"]}}]}},{"range":{"start":{"line":805,"character":4},"end":{"line":826,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":805,"character":4},"end":{"line":826,"character":5}},"targetSelectionRange":{"start":{"line":805,"character":4},"end":{"line":826,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_else","--nocapture"]}}]}},{"range":{"start":{"line":828,"character":4},"end":{"line":865,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_or_default","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":828,"character":4},"end":{"line":865,"character":5}},"targetSelectionRange":{"start":{"line":828,"character":4},"end":{"line":865,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_default","--nocapture"]}}]}},{"range":{"start":{"line":867,"character":4},"end":{"line":898,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::unwrap_unchecked","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":867,"character":4},"end":{"line":898,"character":5}},"targetSelectionRange":{"start":{"line":867,"character":4},"end":{"line":898,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_unchecked","--nocapture"]}}]}},{"range":{"start":{"line":904,"character":4},"end":{"line":931,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::map","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":904,"character":4},"end":{"line":931,"character":5}},"targetSelectionRange":{"start":{"line":904,"character":4},"end":{"line":931,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map","--nocapture"]}}]}},{"range":{"start":{"line":933,"character":4},"end":{"line":961,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::inspect","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":933,"character":4},"end":{"line":961,"character":5}},"targetSelectionRange":{"start":{"line":933,"character":4},"end":{"line":961,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::inspect","--nocapture"]}}]}},{"range":{"start":{"line":963,"character":4},"end":{"line":994,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::map_or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":963,"character":4},"end":{"line":994,"character":5}},"targetSelectionRange":{"start":{"line":963,"character":4},"end":{"line":994,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or","--nocapture"]}}]}},{"range":{"start":{"line":996,"character":4},"end":{"line":1024,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::map_or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":996,"character":4},"end":{"line":1024,"character":5}},"targetSelectionRange":{"start":{"line":996,"character":4},"end":{"line":1024,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or_else","--nocapture"]}}]}},{"range":{"start":{"line":1026,"character":4},"end":{"line":1058,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::ok_or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1026,"character":4},"end":{"line":1058,"character":5}},"targetSelectionRange":{"start":{"line":1026,"character":4},"end":{"line":1058,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or","--nocapture"]}}]}},{"range":{"start":{"line":1060,"character":4},"end":{"line":1088,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::ok_or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1060,"character":4},"end":{"line":1088,"character":5}},"targetSelectionRange":{"start":{"line":1060,"character":4},"end":{"line":1088,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or_else","--nocapture"]}}]}},{"range":{"start":{"line":1090,"character":4},"end":{"line":1114,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_deref","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1090,"character":4},"end":{"line":1114,"character":5}},"targetSelectionRange":{"start":{"line":1090,"character":4},"end":{"line":1114,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref","--nocapture"]}}]}},{"range":{"start":{"line":1116,"character":4},"end":{"line":1140,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::as_deref_mut","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1116,"character":4},"end":{"line":1140,"character":5}},"targetSelectionRange":{"start":{"line":1116,"character":4},"end":{"line":1140,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref_mut","--nocapture"]}}]}},{"range":{"start":{"line":1146,"character":4},"end":{"line":1162,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::iter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1146,"character":4},"end":{"line":1162,"character":5}},"targetSelectionRange":{"start":{"line":1146,"character":4},"end":{"line":1162,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter","--nocapture"]}}]}},{"range":{"start":{"line":1164,"character":4},"end":{"line":1183,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::iter_mut","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1164,"character":4},"end":{"line":1183,"character":5}},"targetSelectionRange":{"start":{"line":1164,"character":4},"end":{"line":1183,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter_mut","--nocapture"]}}]}},{"range":{"start":{"line":1189,"character":4},"end":{"line":1222,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::and","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1189,"character":4},"end":{"line":1222,"character":5}},"targetSelectionRange":{"start":{"line":1189,"character":4},"end":{"line":1222,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and","--nocapture"]}}]}},{"range":{"start":{"line":1224,"character":4},"end":{"line":1264,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::and_then","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1224,"character":4},"end":{"line":1264,"character":5}},"targetSelectionRange":{"start":{"line":1224,"character":4},"end":{"line":1264,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and_then","--nocapture"]}}]}},{"range":{"start":{"line":1266,"character":4},"end":{"line":1305,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::filter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1266,"character":4},"end":{"line":1305,"character":5}},"targetSelectionRange":{"start":{"line":1266,"character":4},"end":{"line":1305,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::filter","--nocapture"]}}]}},{"range":{"start":{"line":1307,"character":4},"end":{"line":1345,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::or","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1307,"character":4},"end":{"line":1345,"character":5}},"targetSelectionRange":{"start":{"line":1307,"character":4},"end":{"line":1345,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or","--nocapture"]}}]}},{"range":{"start":{"line":1347,"character":4},"end":{"line":1372,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::or_else","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1347,"character":4},"end":{"line":1372,"character":5}},"targetSelectionRange":{"start":{"line":1347,"character":4},"end":{"line":1372,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or_else","--nocapture"]}}]}},{"range":{"start":{"line":1374,"character":4},"end":{"line":1407,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::xor","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1374,"character":4},"end":{"line":1407,"character":5}},"targetSelectionRange":{"start":{"line":1374,"character":4},"end":{"line":1407,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::xor","--nocapture"]}}]}},{"range":{"start":{"line":1413,"character":4},"end":{"line":1444,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::insert","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1413,"character":4},"end":{"line":1444,"character":5}},"targetSelectionRange":{"start":{"line":1413,"character":4},"end":{"line":1444,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::insert","--nocapture"]}}]}},{"range":{"start":{"line":1446,"character":4},"end":{"line":1480,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::get_or_insert","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1446,"character":4},"end":{"line":1480,"character":5}},"targetSelectionRange":{"start":{"line":1446,"character":4},"end":{"line":1480,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert","--nocapture"]}}]}},{"range":{"start":{"line":1482,"character":4},"end":{"line":1513,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::get_or_insert_default","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1482,"character":4},"end":{"line":1513,"character":5}},"targetSelectionRange":{"start":{"line":1482,"character":4},"end":{"line":1513,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_default","--nocapture"]}}]}},{"range":{"start":{"line":1515,"character":4},"end":{"line":1549,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::get_or_insert_with","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1515,"character":4},"end":{"line":1549,"character":5}},"targetSelectionRange":{"start":{"line":1515,"character":4},"end":{"line":1549,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_with","--nocapture"]}}]}},{"range":{"start":{"line":1555,"character":4},"end":{"line":1576,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::take","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1555,"character":4},"end":{"line":1576,"character":5}},"targetSelectionRange":{"start":{"line":1555,"character":4},"end":{"line":1576,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::take","--nocapture"]}}]}},{"range":{"start":{"line":1578,"character":4},"end":{"line":1600,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::replace","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1578,"character":4},"end":{"line":1600,"character":5}},"targetSelectionRange":{"start":{"line":1578,"character":4},"end":{"line":1600,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::replace","--nocapture"]}}]}},{"range":{"start":{"line":1602,"character":4},"end":{"line":1630,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::contains","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1602,"character":4},"end":{"line":1630,"character":5}},"targetSelectionRange":{"start":{"line":1602,"character":4},"end":{"line":1630,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::contains","--nocapture"]}}]}},{"range":{"start":{"line":1632,"character":4},"end":{"line":1658,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::zip","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1632,"character":4},"end":{"line":1658,"character":5}},"targetSelectionRange":{"start":{"line":1632,"character":4},"end":{"line":1658,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip","--nocapture"]}}]}},{"range":{"start":{"line":1660,"character":4},"end":{"line":1701,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::zip_with","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1660,"character":4},"end":{"line":1701,"character":5}},"targetSelectionRange":{"start":{"line":1660,"character":4},"end":{"line":1701,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip_with","--nocapture"]}}]}},{"range":{"start":{"line":1705,"character":4},"end":{"line":1728,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<(T,U)>::unzip","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1705,"character":4},"end":{"line":1728,"character":5}},"targetSelectionRange":{"start":{"line":1705,"character":4},"end":{"line":1728,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<(T,U)>::unzip","--nocapture"]}}]}},{"range":{"start":{"line":1732,"character":4},"end":{"line":1757,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&T>::copied","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1732,"character":4},"end":{"line":1757,"character":5}},"targetSelectionRange":{"start":{"line":1732,"character":4},"end":{"line":1757,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::copied","--nocapture"]}}]}},{"range":{"start":{"line":1759,"character":4},"end":{"line":1782,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&T>::cloned","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1759,"character":4},"end":{"line":1782,"character":5}},"targetSelectionRange":{"start":{"line":1759,"character":4},"end":{"line":1782,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::cloned","--nocapture"]}}]}},{"range":{"start":{"line":1786,"character":4},"end":{"line":1809,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&mutT>::copied","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1786,"character":4},"end":{"line":1809,"character":5}},"targetSelectionRange":{"start":{"line":1786,"character":4},"end":{"line":1809,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::copied","--nocapture"]}}]}},{"range":{"start":{"line":1811,"character":4},"end":{"line":1834,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&mutT>::cloned","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1811,"character":4},"end":{"line":1834,"character":5}},"targetSelectionRange":{"start":{"line":1811,"character":4},"end":{"line":1834,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::cloned","--nocapture"]}}]}},{"range":{"start":{"line":1838,"character":4},"end":{"line":1863,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<Result<T,E>>::transpose","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1838,"character":4},"end":{"line":1863,"character":5}},"targetSelectionRange":{"start":{"line":1838,"character":4},"end":{"line":1863,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Result<T,E>>::transpose","--nocapture"]}}]}},{"range":{"start":{"line":1906,"character":4},"end":{"line":1917,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::default","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1906,"character":4},"end":{"line":1917,"character":5}},"targetSelectionRange":{"start":{"line":1906,"character":4},"end":{"line":1917,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::default","--nocapture"]}}]}},{"range":{"start":{"line":1925,"character":4},"end":{"line":1941,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::into_iter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1925,"character":4},"end":{"line":1941,"character":5}},"targetSelectionRange":{"start":{"line":1925,"character":4},"end":{"line":1941,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::into_iter","--nocapture"]}}]}},{"range":{"start":{"line":1967,"character":4},"end":{"line":1978,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<T>::from","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1967,"character":4},"end":{"line":1978,"character":5}},"targetSelectionRange":{"start":{"line":1967,"character":4},"end":{"line":1978,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::from","--nocapture"]}}]}},{"range":{"start":{"line":1984,"character":4},"end":{"line":2006,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&T>::from","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":1984,"character":4},"end":{"line":2006,"character":5}},"targetSelectionRange":{"start":{"line":1984,"character":4},"end":{"line":2006,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::from","--nocapture"]}}]}},{"range":{"start":{"line":2012,"character":4},"end":{"line":2029,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<&mutT>::from","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":2012,"character":4},"end":{"line":2029,"character":5}},"targetSelectionRange":{"start":{"line":2012,"character":4},"end":{"line":2029,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::from","--nocapture"]}}]}},{"range":{"start":{"line":2208,"character":4},"end":{"line":2274,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<V>::from_iter","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":2208,"character":4},"end":{"line":2274,"character":5}},"targetSelectionRange":{"start":{"line":2208,"character":4},"end":{"line":2274,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<V>::from_iter","--nocapture"]}}]}},{"range":{"start":{"line":2322,"character":4},"end":{"line":2354,"character":5}},"command":{"title":"▶︎ Run Doctest","command":"rust-analyzer.runSingle","arguments":[{"label":"doctest option::Option<Option<T>>::flatten","location":{"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","targetRange":{"start":{"line":2322,"character":4},"end":{"line":2354,"character":5}},"targetSelectionRange":{"start":{"line":2322,"character":4},"end":{"line":2354,"character":5}}},"kind":"cargo","args":{"overrideCargo":null,"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Option<T>>::flatten","--nocapture"]}}]}},{"range":{"start":{"line":517,"character":9},"end":{"line":517,"character":15}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":517,"character":9}}}},{"range":{"start":{"line":2037,"character":7},"end":{"line":2037,"character":11}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2037,"character":7}}}},{"range":{"start":{"line":2076,"character":11},"end":{"line":2076,"character":15}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2076,"character":11}}}},{"range":{"start":{"line":2126,"character":11},"end":{"line":2126,"character":18}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2126,"character":11}}}},{"range":{"start":{"line":2167,"character":11},"end":{"line":2167,"character":19}},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2167,"character":11}}}}]} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":9,"line":517},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":517},"start":{"character":9,"line":517}}},"id":4} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":4,"result":{"range":{"start":{"line":517,"character":9},"end":{"line":517,"character":15}},"command":{"title":"75 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":517,"character":9},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":532,"character":0},"end":{"line":1702,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1704,"character":0},"end":{"line":1729,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1731,"character":0},"end":{"line":1783,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1785,"character":0},"end":{"line":1835,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1837,"character":0},"end":{"line":1864,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2321,"character":0},"end":{"line":2355,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":72,"character":0},"end":{"line":77,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":79,"character":0},"end":{"line":84,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs","range":{"start":{"line":104,"character":0},"end":{"line":117,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2297,"character":0},"end":{"line":2306,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2308,"character":0},"end":{"line":2314,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2206,"character":0},"end":{"line":2275,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1964,"character":0},"end":{"line":1979,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1981,"character":0},"end":{"line":2007,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2009,"character":0},"end":{"line":2030,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1880,"character":0},"end":{"line":1901,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2277,"character":0},"end":{"line":2295,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs","range":{"start":{"line":216,"character":0},"end":{"line":230,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2316,"character":0},"end":{"line":2319,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1920,"character":0},"end":{"line":1942,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1944,"character":0},"end":{"line":1952,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1954,"character":0},"end":{"line":1962,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/slice/cmp.rs","range":{"start":{"line":149,"character":0},"end":{"line":157,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs","range":{"start":{"line":198,"character":0},"end":{"line":215,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs","range":{"start":{"line":189,"character":0},"end":{"line":214,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":1903,"character":0},"end":{"line":1918,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":514,"character":0},"end":{"line":514,"character":60}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs","range":{"start":{"line":421,"character":0},"end":{"line":426,"character":2}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs","range":{"start":{"line":175,"character":4},"end":{"line":175,"character":35}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs","range":{"start":{"line":61,"character":0},"end":{"line":96,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/arc-swap-0.4.7/src/ref_cnt.rs","range":{"start":{"line":112,"character":0},"end":{"line":127,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/future/option.rs","range":{"start":{"line":4,"character":0},"end":{"line":14,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/calls.rs","range":{"start":{"line":9,"character":0},"end":{"line":9,"character":43}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/io.rs","range":{"start":{"line":380,"character":0},"end":{"line":386,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot-0.10.2/src/util.rs","range":{"start":{"line":14,"character":0},"end":{"line":22,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot_core-0.7.2/src/util.rs","range":{"start":{"line":12,"character":0},"end":{"line":20,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/quote-1.0.7/src/to_tokens.rs","range":{"start":{"line":108,"character":0},"end":{"line":114,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/de/impls.rs","range":{"start":{"line":635,"character":0},"end":{"line":653,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/ser/impls.rs","range":{"start":{"line":98,"character":0},"end":{"line":112,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/expr.rs","range":{"start":{"line":2463,"character":4},"end":{"line":2472,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs","range":{"start":{"line":647,"character":4},"end":{"line":655,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs","range":{"start":{"line":811,"character":4},"end":{"line":819,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/ty.rs","range":{"start":{"line":1057,"character":4},"end":{"line":1065,"character":5}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/parse.rs","range":{"start":{"line":1037,"character":0},"end":{"line":1045,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":517,"character":9}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":7,"line":2037},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":11,"line":2037},"start":{"character":7,"line":2037}}},"id":5} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":5,"result":{"range":{"start":{"line":2037,"character":7},"end":{"line":2037,"character":11}},"command":{"title":"7 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2037,"character":7},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2036,"character":0},"end":{"line":2036,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2041,"character":0},"end":{"line":2056,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2067,"character":0},"end":{"line":2067,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2036,"character":0},"end":{"line":2036,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2065,"character":0},"end":{"line":2065,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2066,"character":0},"end":{"line":2066,"character":36}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2058,"character":0},"end":{"line":2063,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2037,"character":7}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":11,"line":2076},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":2076},"start":{"character":11,"line":2076}}},"id":6} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":6,"result":{"range":{"start":{"line":2076,"character":11},"end":{"line":2076,"character":15}},"command":{"title":"8 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2076,"character":11},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2075,"character":0},"end":{"line":2075,"character":16}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2080,"character":0},"end":{"line":2092,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2108,"character":0},"end":{"line":2109,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2111,"character":0},"end":{"line":2117,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2102,"character":0},"end":{"line":2103,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2105,"character":0},"end":{"line":2106,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2094,"character":0},"end":{"line":2100,"character":1}}},{"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/itertools-0.9.0/src/peeking_take_while.rs","range":{"start":{"line":137,"character":0},"end":{"line":137,"character":61}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2076,"character":11}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":11,"line":2126},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":18,"line":2126},"start":{"character":11,"line":2126}}},"id":7} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":7,"result":{"range":{"start":{"line":2126,"character":11},"end":{"line":2126,"character":18}},"command":{"title":"6 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2126,"character":11},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2125,"character":0},"end":{"line":2125,"character":16}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2130,"character":0},"end":{"line":2142,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2157,"character":0},"end":{"line":2158,"character":47}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2152,"character":0},"end":{"line":2153,"character":47}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2155,"character":0},"end":{"line":2156,"character":43}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2144,"character":0},"end":{"line":2150,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2126,"character":11}}}}} 17:00:16 DEBUG writer-Some("rust") src/rpcclient.rs:254 => Some("rust") {"jsonrpc":"2.0","method":"codeLens/resolve","params":{"data":{"impls":{"position":{"character":11,"line":2167},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":19,"line":2167},"start":{"character":11,"line":2167}}},"id":8} 17:00:16 DEBUG reader-Some("rust") src/rpcclient.rs:207 <= Some("rust") {"jsonrpc":"2.0","id":8,"result":{"range":{"start":{"line":2167,"character":11},"end":{"line":2167,"character":19}},"command":{"title":"7 implementations","command":"rust-analyzer.showReferences","arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"line":2167,"character":11},[{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2165,"character":0},"end":{"line":2165,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2171,"character":0},"end":{"line":2183,"character":1}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2199,"character":0},"end":{"line":2200,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2165,"character":0},"end":{"line":2165,"character":23}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2193,"character":0},"end":{"line":2194,"character":44}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2196,"character":0},"end":{"line":2197,"character":40}}},{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs","range":{"start":{"line":2185,"character":0},"end":{"line":2191,"character":1}}}]]},"data":{"impls":{"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},"position":{"line":2167,"character":11}}}}} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.code_lens./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> [{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::is_some","location":{"targetRange":{"end":{"character":5,"line":554},"start":{"character":4,"line":537}},"targetSelectionRange":{"end":{"character":5,"line":554},"start":{"character":4,"line":537}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":554},"start":{"character":4,"line":537}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_some_and","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::is_some_and","location":{"targetRange":{"end":{"character":5,"line":577},"start":{"character":4,"line":556}},"targetSelectionRange":{"end":{"character":5,"line":577},"start":{"character":4,"line":556}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":577},"start":{"character":4,"line":556}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::is_none","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::is_none","location":{"targetRange":{"end":{"character":5,"line":597},"start":{"character":4,"line":579}},"targetSelectionRange":{"end":{"character":5,"line":597},"start":{"character":4,"line":579}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":597},"start":{"character":4,"line":579}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_ref","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_ref","location":{"targetRange":{"end":{"character":5,"line":630},"start":{"character":4,"line":603}},"targetSelectionRange":{"end":{"character":5,"line":630},"start":{"character":4,"line":603}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":630},"start":{"character":4,"line":603}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_mut","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_mut","location":{"targetRange":{"end":{"character":5,"line":652},"start":{"character":4,"line":632}},"targetSelectionRange":{"end":{"character":5,"line":652},"start":{"character":4,"line":632}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":652},"start":{"character":4,"line":632}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::expect","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::expect","location":{"targetRange":{"end":{"character":5,"line":739},"start":{"character":4,"line":692}},"targetSelectionRange":{"end":{"character":5,"line":739},"start":{"character":4,"line":692}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":739},"start":{"character":4,"line":692}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap","location":{"targetRange":{"end":{"character":5,"line":776},"start":{"character":4,"line":741}},"targetSelectionRange":{"end":{"character":5,"line":776},"start":{"character":4,"line":741}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":776},"start":{"character":4,"line":741}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_or","location":{"targetRange":{"end":{"character":5,"line":803},"start":{"character":4,"line":778}},"targetSelectionRange":{"end":{"character":5,"line":803},"start":{"character":4,"line":778}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":803},"start":{"character":4,"line":778}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_or_else","location":{"targetRange":{"end":{"character":5,"line":826},"start":{"character":4,"line":805}},"targetSelectionRange":{"end":{"character":5,"line":826},"start":{"character":4,"line":805}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":826},"start":{"character":4,"line":805}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_or_default","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_or_default","location":{"targetRange":{"end":{"character":5,"line":865},"start":{"character":4,"line":828}},"targetSelectionRange":{"end":{"character":5,"line":865},"start":{"character":4,"line":828}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":865},"start":{"character":4,"line":828}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::unwrap_unchecked","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::unwrap_unchecked","location":{"targetRange":{"end":{"character":5,"line":898},"start":{"character":4,"line":867}},"targetSelectionRange":{"end":{"character":5,"line":898},"start":{"character":4,"line":867}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":898},"start":{"character":4,"line":867}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::map","location":{"targetRange":{"end":{"character":5,"line":931},"start":{"character":4,"line":904}},"targetSelectionRange":{"end":{"character":5,"line":931},"start":{"character":4,"line":904}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":931},"start":{"character":4,"line":904}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::inspect","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::inspect","location":{"targetRange":{"end":{"character":5,"line":961},"start":{"character":4,"line":933}},"targetSelectionRange":{"end":{"character":5,"line":961},"start":{"character":4,"line":933}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":961},"start":{"character":4,"line":933}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::map_or","location":{"targetRange":{"end":{"character":5,"line":994},"start":{"character":4,"line":963}},"targetSelectionRange":{"end":{"character":5,"line":994},"start":{"character":4,"line":963}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":994},"start":{"character":4,"line":963}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::map_or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::map_or_else","location":{"targetRange":{"end":{"character":5,"line":1024},"start":{"character":4,"line":996}},"targetSelectionRange":{"end":{"character":5,"line":1024},"start":{"character":4,"line":996}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1024},"start":{"character":4,"line":996}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::ok_or","location":{"targetRange":{"end":{"character":5,"line":1058},"start":{"character":4,"line":1026}},"targetSelectionRange":{"end":{"character":5,"line":1058},"start":{"character":4,"line":1026}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1058},"start":{"character":4,"line":1026}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::ok_or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::ok_or_else","location":{"targetRange":{"end":{"character":5,"line":1088},"start":{"character":4,"line":1060}},"targetSelectionRange":{"end":{"character":5,"line":1088},"start":{"character":4,"line":1060}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1088},"start":{"character":4,"line":1060}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_deref","location":{"targetRange":{"end":{"character":5,"line":1114},"start":{"character":4,"line":1090}},"targetSelectionRange":{"end":{"character":5,"line":1114},"start":{"character":4,"line":1090}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1114},"start":{"character":4,"line":1090}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::as_deref_mut","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::as_deref_mut","location":{"targetRange":{"end":{"character":5,"line":1140},"start":{"character":4,"line":1116}},"targetSelectionRange":{"end":{"character":5,"line":1140},"start":{"character":4,"line":1116}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1140},"start":{"character":4,"line":1116}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::iter","location":{"targetRange":{"end":{"character":5,"line":1162},"start":{"character":4,"line":1146}},"targetSelectionRange":{"end":{"character":5,"line":1162},"start":{"character":4,"line":1146}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1162},"start":{"character":4,"line":1146}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::iter_mut","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::iter_mut","location":{"targetRange":{"end":{"character":5,"line":1183},"start":{"character":4,"line":1164}},"targetSelectionRange":{"end":{"character":5,"line":1183},"start":{"character":4,"line":1164}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1183},"start":{"character":4,"line":1164}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::and","location":{"targetRange":{"end":{"character":5,"line":1222},"start":{"character":4,"line":1189}},"targetSelectionRange":{"end":{"character":5,"line":1222},"start":{"character":4,"line":1189}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1222},"start":{"character":4,"line":1189}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::and_then","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::and_then","location":{"targetRange":{"end":{"character":5,"line":1264},"start":{"character":4,"line":1224}},"targetSelectionRange":{"end":{"character":5,"line":1264},"start":{"character":4,"line":1224}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1264},"start":{"character":4,"line":1224}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::filter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::filter","location":{"targetRange":{"end":{"character":5,"line":1305},"start":{"character":4,"line":1266}},"targetSelectionRange":{"end":{"character":5,"line":1305},"start":{"character":4,"line":1266}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1305},"start":{"character":4,"line":1266}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::or","location":{"targetRange":{"end":{"character":5,"line":1345},"start":{"character":4,"line":1307}},"targetSelectionRange":{"end":{"character":5,"line":1345},"start":{"character":4,"line":1307}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1345},"start":{"character":4,"line":1307}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::or_else","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::or_else","location":{"targetRange":{"end":{"character":5,"line":1372},"start":{"character":4,"line":1347}},"targetSelectionRange":{"end":{"character":5,"line":1372},"start":{"character":4,"line":1347}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1372},"start":{"character":4,"line":1347}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::xor","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::xor","location":{"targetRange":{"end":{"character":5,"line":1407},"start":{"character":4,"line":1374}},"targetSelectionRange":{"end":{"character":5,"line":1407},"start":{"character":4,"line":1374}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1407},"start":{"character":4,"line":1374}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::insert","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::insert","location":{"targetRange":{"end":{"character":5,"line":1444},"start":{"character":4,"line":1413}},"targetSelectionRange":{"end":{"character":5,"line":1444},"start":{"character":4,"line":1413}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1444},"start":{"character":4,"line":1413}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::get_or_insert","location":{"targetRange":{"end":{"character":5,"line":1480},"start":{"character":4,"line":1446}},"targetSelectionRange":{"end":{"character":5,"line":1480},"start":{"character":4,"line":1446}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1480},"start":{"character":4,"line":1446}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_default","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::get_or_insert_default","location":{"targetRange":{"end":{"character":5,"line":1513},"start":{"character":4,"line":1482}},"targetSelectionRange":{"end":{"character":5,"line":1513},"start":{"character":4,"line":1482}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1513},"start":{"character":4,"line":1482}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::get_or_insert_with","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::get_or_insert_with","location":{"targetRange":{"end":{"character":5,"line":1549},"start":{"character":4,"line":1515}},"targetSelectionRange":{"end":{"character":5,"line":1549},"start":{"character":4,"line":1515}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1549},"start":{"character":4,"line":1515}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::take","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::take","location":{"targetRange":{"end":{"character":5,"line":1576},"start":{"character":4,"line":1555}},"targetSelectionRange":{"end":{"character":5,"line":1576},"start":{"character":4,"line":1555}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1576},"start":{"character":4,"line":1555}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::replace","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::replace","location":{"targetRange":{"end":{"character":5,"line":1600},"start":{"character":4,"line":1578}},"targetSelectionRange":{"end":{"character":5,"line":1600},"start":{"character":4,"line":1578}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1600},"start":{"character":4,"line":1578}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::contains","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::contains","location":{"targetRange":{"end":{"character":5,"line":1630},"start":{"character":4,"line":1602}},"targetSelectionRange":{"end":{"character":5,"line":1630},"start":{"character":4,"line":1602}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1630},"start":{"character":4,"line":1602}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::zip","location":{"targetRange":{"end":{"character":5,"line":1658},"start":{"character":4,"line":1632}},"targetSelectionRange":{"end":{"character":5,"line":1658},"start":{"character":4,"line":1632}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1658},"start":{"character":4,"line":1632}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::zip_with","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::zip_with","location":{"targetRange":{"end":{"character":5,"line":1701},"start":{"character":4,"line":1660}},"targetSelectionRange":{"end":{"character":5,"line":1701},"start":{"character":4,"line":1660}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1701},"start":{"character":4,"line":1660}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<(T,U)>::unzip","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<(T,U)>::unzip","location":{"targetRange":{"end":{"character":5,"line":1728},"start":{"character":4,"line":1705}},"targetSelectionRange":{"end":{"character":5,"line":1728},"start":{"character":4,"line":1705}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1728},"start":{"character":4,"line":1705}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::copied","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&T>::copied","location":{"targetRange":{"end":{"character":5,"line":1757},"start":{"character":4,"line":1732}},"targetSelectionRange":{"end":{"character":5,"line":1757},"start":{"character":4,"line":1732}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1757},"start":{"character":4,"line":1732}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::cloned","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&T>::cloned","location":{"targetRange":{"end":{"character":5,"line":1782},"start":{"character":4,"line":1759}},"targetSelectionRange":{"end":{"character":5,"line":1782},"start":{"character":4,"line":1759}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1782},"start":{"character":4,"line":1759}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::copied","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&mutT>::copied","location":{"targetRange":{"end":{"character":5,"line":1809},"start":{"character":4,"line":1786}},"targetSelectionRange":{"end":{"character":5,"line":1809},"start":{"character":4,"line":1786}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1809},"start":{"character":4,"line":1786}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::cloned","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&mutT>::cloned","location":{"targetRange":{"end":{"character":5,"line":1834},"start":{"character":4,"line":1811}},"targetSelectionRange":{"end":{"character":5,"line":1834},"start":{"character":4,"line":1811}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1834},"start":{"character":4,"line":1811}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Result<T,E>>::transpose","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<Result<T,E>>::transpose","location":{"targetRange":{"end":{"character":5,"line":1863},"start":{"character":4,"line":1838}},"targetSelectionRange":{"end":{"character":5,"line":1863},"start":{"character":4,"line":1838}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1863},"start":{"character":4,"line":1838}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::default","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::default","location":{"targetRange":{"end":{"character":5,"line":1917},"start":{"character":4,"line":1906}},"targetSelectionRange":{"end":{"character":5,"line":1917},"start":{"character":4,"line":1906}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1917},"start":{"character":4,"line":1906}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::into_iter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::into_iter","location":{"targetRange":{"end":{"character":5,"line":1941},"start":{"character":4,"line":1925}},"targetSelectionRange":{"end":{"character":5,"line":1941},"start":{"character":4,"line":1925}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1941},"start":{"character":4,"line":1925}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<T>::from","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<T>::from","location":{"targetRange":{"end":{"character":5,"line":1978},"start":{"character":4,"line":1967}},"targetSelectionRange":{"end":{"character":5,"line":1978},"start":{"character":4,"line":1967}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":1978},"start":{"character":4,"line":1967}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&T>::from","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&T>::from","location":{"targetRange":{"end":{"character":5,"line":2006},"start":{"character":4,"line":1984}},"targetSelectionRange":{"end":{"character":5,"line":2006},"start":{"character":4,"line":1984}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2006},"start":{"character":4,"line":1984}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<&mutT>::from","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<&mutT>::from","location":{"targetRange":{"end":{"character":5,"line":2029},"start":{"character":4,"line":2012}},"targetSelectionRange":{"end":{"character":5,"line":2029},"start":{"character":4,"line":2012}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2029},"start":{"character":4,"line":2012}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<V>::from_iter","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<V>::from_iter","location":{"targetRange":{"end":{"character":5,"line":2274},"start":{"character":4,"line":2208}},"targetSelectionRange":{"end":{"character":5,"line":2274},"start":{"character":4,"line":2208}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2274},"start":{"character":4,"line":2208}}},{"command":{"arguments":[{"args":{"cargoArgs":["test","--doc"],"cargoExtraArgs":[],"executableArgs":["option::Option<Option<T>>::flatten","--nocapture"],"overrideCargo":null},"kind":"cargo","label":"doctest option::Option<Option<T>>::flatten","location":{"targetRange":{"end":{"character":5,"line":2354},"start":{"character":4,"line":2322}},"targetSelectionRange":{"end":{"character":5,"line":2354},"start":{"character":4,"line":2322}},"targetUri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}],"command":"rust-analyzer.runSingle","title":"▶︎ Run Doctest"},"range":{"end":{"character":5,"line":2354},"start":{"character":4,"line":2322}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":9,"line":517},[{"range":{"end":{"character":1,"line":1702},"start":{"character":0,"line":532}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1729},"start":{"character":0,"line":1704}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1783},"start":{"character":0,"line":1731}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1835},"start":{"character":0,"line":1785}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1864},"start":{"character":0,"line":1837}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2355},"start":{"character":0,"line":2321}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":77},"start":{"character":0,"line":72}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":1,"line":84},"start":{"character":0,"line":79}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":2,"line":117},"start":{"character":0,"line":104}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/is_zero.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2306},"start":{"character":0,"line":2297}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2314},"start":{"character":0,"line":2308}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2275},"start":{"character":0,"line":2206}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1979},"start":{"character":0,"line":1964}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2007},"start":{"character":0,"line":1981}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2030},"start":{"character":0,"line":2009}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1901},"start":{"character":0,"line":1880}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2295},"start":{"character":0,"line":2277}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":230},"start":{"character":0,"line":216}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2319},"start":{"character":0,"line":2316}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1942},"start":{"character":0,"line":1920}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1952},"start":{"character":0,"line":1944}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":1962},"start":{"character":0,"line":1954}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":157},"start":{"character":0,"line":149}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/slice/cmp.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":2,"line":215},"start":{"character":0,"line":198}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/array/equality.rs"},{"range":{"end":{"character":1,"line":214},"start":{"character":0,"line":189}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/accum.rs"},{"range":{"end":{"character":1,"line":1918},"start":{"character":0,"line":1903}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":60,"line":514},"start":{"character":0,"line":514}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":2,"line":426},"start":{"character":0,"line":421}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/proc_macro/src/bridge/mod.rs"},{"range":{"end":{"character":35,"line":175},"start":{"character":4,"line":175}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs"},{"range":{"end":{"character":1,"line":96},"start":{"character":0,"line":61}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/anyhow-1.0.32/src/context.rs"},{"range":{"end":{"character":1,"line":127},"start":{"character":0,"line":112}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/arc-swap-0.4.7/src/ref_cnt.rs"},{"range":{"end":{"character":1,"line":14},"start":{"character":0,"line":4}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/futures-0.1.29/src/future/option.rs"},{"range":{"end":{"character":43,"line":9},"start":{"character":0,"line":9}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/calls.rs"},{"range":{"end":{"character":1,"line":386},"start":{"character":0,"line":380}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/jsonrpc-core-15.1.0/src/io.rs"},{"range":{"end":{"character":1,"line":22},"start":{"character":0,"line":14}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot-0.10.2/src/util.rs"},{"range":{"end":{"character":1,"line":20},"start":{"character":0,"line":12}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/parking_lot_core-0.7.2/src/util.rs"},{"range":{"end":{"character":1,"line":114},"start":{"character":0,"line":108}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/quote-1.0.7/src/to_tokens.rs"},{"range":{"end":{"character":1,"line":653},"start":{"character":0,"line":635}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/de/impls.rs"},{"range":{"end":{"character":1,"line":112},"start":{"character":0,"line":98}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/serde-1.0.114/src/ser/impls.rs"},{"range":{"end":{"character":5,"line":2472},"start":{"character":4,"line":2463}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/expr.rs"},{"range":{"end":{"character":5,"line":655},"start":{"character":4,"line":647}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs"},{"range":{"end":{"character":5,"line":819},"start":{"character":4,"line":811}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/generics.rs"},{"range":{"end":{"character":5,"line":1065},"start":{"character":4,"line":1057}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/ty.rs"},{"range":{"end":{"character":1,"line":1045},"start":{"character":0,"line":1037}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/syn-1.0.35/src/parse.rs"}]],"command":"rust-analyzer.showReferences","title":"75 implementations"},"data":{"impls":{"position":{"character":9,"line":517},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":517},"start":{"character":9,"line":517}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":7,"line":2037},[{"range":{"end":{"character":23,"line":2036},"start":{"character":0,"line":2036}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2056},"start":{"character":0,"line":2041}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2067},"start":{"character":0,"line":2067}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":23,"line":2036},"start":{"character":0,"line":2036}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2065},"start":{"character":0,"line":2065}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":36,"line":2066},"start":{"character":0,"line":2066}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2063},"start":{"character":0,"line":2058}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}]],"command":"rust-analyzer.showReferences","title":"7 implementations"},"data":{"impls":{"position":{"character":7,"line":2037},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":11,"line":2037},"start":{"character":7,"line":2037}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":11,"line":2076},[{"range":{"end":{"character":16,"line":2075},"start":{"character":0,"line":2075}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2092},"start":{"character":0,"line":2080}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2109},"start":{"character":0,"line":2108}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2117},"start":{"character":0,"line":2111}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2103},"start":{"character":0,"line":2102}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2106},"start":{"character":0,"line":2105}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2100},"start":{"character":0,"line":2094}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":61,"line":137},"start":{"character":0,"line":137}},"uri":"file:///home/dick/.cargo/registry/src/github.com-1ecc6299db9ec823/itertools-0.9.0/src/peeking_take_while.rs"}]],"command":"rust-analyzer.showReferences","title":"8 implementations"},"data":{"impls":{"position":{"character":11,"line":2076},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":15,"line":2076},"start":{"character":11,"line":2076}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":11,"line":2126},[{"range":{"end":{"character":16,"line":2125},"start":{"character":0,"line":2125}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2142},"start":{"character":0,"line":2130}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":47,"line":2158},"start":{"character":0,"line":2157}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":47,"line":2153},"start":{"character":0,"line":2152}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":43,"line":2156},"start":{"character":0,"line":2155}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2150},"start":{"character":0,"line":2144}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}]],"command":"rust-analyzer.showReferences","title":"6 implementations"},"data":{"impls":{"position":{"character":11,"line":2126},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":18,"line":2126},"start":{"character":11,"line":2126}}},{"command":{"arguments":["file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",{"character":11,"line":2167},[{"range":{"end":{"character":23,"line":2165},"start":{"character":0,"line":2165}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2183},"start":{"character":0,"line":2171}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2200},"start":{"character":0,"line":2199}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":23,"line":2165},"start":{"character":0,"line":2165}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":44,"line":2194},"start":{"character":0,"line":2193}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":40,"line":2197},"start":{"character":0,"line":2196}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"},{"range":{"end":{"character":1,"line":2191},"start":{"character":0,"line":2185}},"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}]],"command":"rust-analyzer.showReferences","title":"7 implementations"},"data":{"impls":{"position":{"character":11,"line":2167},"textDocument":{"uri":"file:///home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}}},"range":{"end":{"character":19,"line":2167},"start":{"character":11,"line":2167}}}] 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":31} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 31, "jsonrpc": "2.0", "result": "n"} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,0,22,[]],"id":32} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 32, "jsonrpc": "2.0", "result": 0} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.inlay_hints./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> [] 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 1899, "start": 1877}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 1887}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:00:16 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(1887)}), "viewport": Object({"end": Number(1899), "start": Number(1877)})}) force_redraw=false 17:00:16 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 1887 17:00:16 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 1877, end: 1899 } 17:00:16 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> {"end":1899,"start":1877} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":33} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 33, "jsonrpc": "2.0", "result": 0} 17:00:16 DEBUG unnamed src/language_client.rs:108 state.highlights./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs: null ==> [] 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":34} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 34, "jsonrpc": "2.0", "result": "n"} 17:00:16 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,1877,1899,[]],"id":35} 17:00:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 35, "jsonrpc": "2.0", "result": 0} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 22, "start": 0}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 0}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:21 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(0)}), "viewport": Object({"end": Number(22), "start": Number(0)})}) force_redraw=false 17:04:21 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 1887 ==> 0 17:04:21 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 0, end: 22 } 17:04:21 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 1877 ==> 0 17:04:21 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 1899 ==> 22 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":36} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 36, "jsonrpc": "2.0", "result": 0} 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":37} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 37, "jsonrpc": "2.0", "result": "n"} 17:04:21 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,0,22,[]],"id":38} 17:04:21 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 38, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 42, "start": 20}, "languageId": "rust", "buftype": "", "position": {"character": 2, "line": 20}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:30 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(2), "line": Number(20)}), "viewport": Object({"end": Number(42), "start": Number(20)})}) force_redraw=false 17:04:30 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 0 ==> 20 17:04:30 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 20, end: 42 } 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 22 ==> 42 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 0 ==> 20 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":39} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 39, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":40} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 40, "jsonrpc": "2.0", "result": "n"} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,20,42,[]],"id":41} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 41, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 62, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 6, "line": 40}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:30 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(6), "line": Number(40)}), "viewport": Object({"end": Number(62), "start": Number(40)})}) force_redraw=false 17:04:30 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 20 ==> 40 17:04:30 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 40, end: 62 } 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 42 ==> 62 17:04:30 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 20 ==> 40 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":42} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 42, "jsonrpc": "2.0", "result": 0} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":43} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 43, "jsonrpc": "2.0", "result": "n"} 17:04:30 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,40,62,[]],"id":44} 17:04:30 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 44, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 82, "start": 60}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 60}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:31 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(60)}), "viewport": Object({"end": Number(82), "start": Number(60)})}) force_redraw=false 17:04:31 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 40 ==> 60 17:04:31 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 60, end: 82 } 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 62 ==> 82 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 40 ==> 60 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":45} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 45, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":46} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 46, "jsonrpc": "2.0", "result": "n"} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,60,82,[]],"id":47} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 47, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 101, "start": 80}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 80}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:31 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(80)}), "viewport": Object({"end": Number(101), "start": Number(80)})}) force_redraw=false 17:04:31 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 60 ==> 80 17:04:31 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 80, end: 101 } 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 82 ==> 101 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 60 ==> 80 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":48} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 48, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":49} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 49, "jsonrpc": "2.0", "result": "n"} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,80,101,[]],"id":50} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 50, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 119, "start": 99}, "languageId": "rust", "buftype": "", "position": {"character": 2, "line": 99}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:31 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(2), "line": Number(99)}), "viewport": Object({"end": Number(119), "start": Number(99)})}) force_redraw=false 17:04:31 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 80 ==> 99 17:04:31 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 99, end: 119 } 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 101 ==> 119 17:04:31 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 80 ==> 99 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":51} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 51, "jsonrpc": "2.0", "result": 0} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":52} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 52, "jsonrpc": "2.0", "result": "n"} 17:04:31 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,99,119,[]],"id":53} 17:04:31 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 53, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 139, "start": 117}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 117}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:32 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(117)}), "viewport": Object({"end": Number(139), "start": Number(117)})}) force_redraw=false 17:04:32 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 99 ==> 117 17:04:32 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 117, end: 139 } 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 99 ==> 117 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 119 ==> 139 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":54} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 54, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":55} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 55, "jsonrpc": "2.0", "result": "n"} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,117,139,[]],"id":56} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 56, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 159, "start": 137}, "languageId": "rust", "buftype": "", "position": {"character": 2, "line": 137}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:32 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(2), "line": Number(137)}), "viewport": Object({"end": Number(159), "start": Number(137)})}) force_redraw=false 17:04:32 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 117 ==> 137 17:04:32 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 137, end: 159 } 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 117 ==> 137 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 139 ==> 159 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":57} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 57, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":58} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 58, "jsonrpc": "2.0", "result": "n"} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,137,159,[]],"id":59} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 59, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 2, "viewport": {"end": 179, "start": 157}, "languageId": "rust", "buftype": "", "position": {"character": 7, "line": 157}, "filename": "/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"}} 17:04:32 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(2), "buftype": String(""), "filename": String("/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs"), "languageId": String("rust"), "position": Object({"character": Number(7), "line": Number(157)}), "viewport": Object({"end": Number(179), "start": Number(157)})}) force_redraw=false 17:04:32 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 137 ==> 157 17:04:32 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs" viewport=Viewport { start: 157, end: 179 } 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.start: 137 ==> 157 17:04:32 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs.end: 159 ==> 179 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs",[]],"id":60} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 60, "jsonrpc": "2.0", "result": 0} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":61} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 61, "jsonrpc": "2.0", "result": "n"} 17:04:32 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[2,3,157,179,[]],"id":62} 17:04:32 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 62, "jsonrpc": "2.0", "result": 0} 17:04:36 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleBufEnter", "jsonrpc": "2.0", "params": {"bufnr": 1, "languageId": "rust", "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:36 INFO unnamed src/language_server_protocol.rs:2739 handle_buf_enter; params=Object({"bufnr": Number(1), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust")}) 17:04:36 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"setbufvar","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs","LanguageClient_isServerRunning",1]} 17:04:36 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:36 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:36 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 157 ==> 49 17:04:39 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:39 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:39 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 50 17:04:39 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:39 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:39 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 51 17:04:39 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:39 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:39 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 50 17:04:40 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 17:04:40 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 17:04:40 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 49 20:30:13 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:13 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:13 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 20:30:13 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:13 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:13 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 49 20:30:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 50 20:30:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:16 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:16 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 51 20:30:16 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 29, "line": 52}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:16 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(29), "line": Number(52)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:16 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 52 20:30:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 52 ==> 51 20:30:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 50 20:30:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 49 20:30:18 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:18 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:18 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 20:30:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 20:30:19 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 20:30:19 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 49 22:39:14 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:14 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:14 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 50 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 51}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(51)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 51 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 50}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(50)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 51 ==> 50 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 50 ==> 49 22:39:15 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:15 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:15 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 22:39:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 49}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(49)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 49 22:39:17 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:17 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:17 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 49 ==> 48 22:39:18 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 47}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:18 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(47)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:18 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 47 22:39:18 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 0, "line": 48}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:18 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(0), "line": Number(48)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:18 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 47 ==> 48 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 75, "start": 57}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 57}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:19 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(57)}), "viewport": Object({"end": Number(75), "start": Number(57)})}) force_redraw=false 22:39:19 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 48 ==> 57 22:39:19 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 57, end: 75 } 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.start: 40 ==> 57 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.end: 59 ==> 75 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":63} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 63, "jsonrpc": "2.0", "result": 0} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":64} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 64, "jsonrpc": "2.0", "result": "n"} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,57,75,[]],"id":65} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 65, "jsonrpc": "2.0", "result": 0} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"method": "languageClient/handleCursorMoved", "jsonrpc": "2.0", "params": {"bufnr": 1, "viewport": {"end": 59, "start": 40}, "languageId": "rust", "buftype": "", "position": {"character": 45, "line": 58}, "filename": "/home/dick/LanguageClient-neovim/src/rpcclient.rs"}} 22:39:19 INFO unnamed src/language_server_protocol.rs:2873 handle_cursor_moved; params=Object({"bufnr": Number(1), "buftype": String(""), "filename": String("/home/dick/LanguageClient-neovim/src/rpcclient.rs"), "languageId": String("rust"), "position": Object({"character": Number(45), "line": Number(58)}), "viewport": Object({"end": Number(59), "start": Number(40)})}) force_redraw=false 22:39:19 DEBUG unnamed src/language_client.rs:108 state.last_cursor_line: 57 ==> 58 22:39:19 INFO unnamed src/language_server_protocol.rs:2847 get_signs_to_display; filename="/home/dick/LanguageClient-neovim/src/rpcclient.rs" viewport=Viewport { start: 40, end: 59 } 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.end: 75 ==> 59 22:39:19 DEBUG unnamed src/language_client.rs:108 state.viewports./home/dick/LanguageClient-neovim/src/rpcclient.rs.start: 57 ==> 40 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_signs","params":["/home/dick/LanguageClient-neovim/src/rpcclient.rs",[]],"id":66} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 66, "jsonrpc": "2.0", "result": 0} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:ClearHighlights","params":["__LCN_DIAGNOSTIC_HIGHLIGHT__"]} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"mode","params":[],"id":67} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 67, "jsonrpc": "2.0", "result": "n"} 22:39:19 DEBUG writer-None src/rpcclient.rs:254 => None {"jsonrpc":"2.0","method":"s:set_virtual_texts","params":[1,3,40,59,[]],"id":68} 22:39:19 DEBUG reader-None src/rpcclient.rs:207 <= None {"id": 68, "jsonrpc": "2.0", "result": 0} 16:45:09 INFO reader-None src/rpcclient.rs:241 reader-None terminated [-- Attachment #3: Type: text/plain, Size: 591 bytes --] I'm standing by my underwhelming characterization. C-n'ing through a real-world logfile languageclient.out, which I attach again here, chops up at around line 44. This led me to write contrived tests, which of course are frowned upon in your school of measurement, whose modus operandi is interminable catechism between a complainant who laboriously and imprecisely describes slowness, and an inquisitor auto-replying "doesn't happen here." To your credit, underwhelming is far better than ineffable, so I've largely been dismissive of the objections by the usual suspects in Bug#56393. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 16:30 ` dick @ 2022-09-09 16:42 ` Gregory Heytings 2022-09-09 17:11 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 16:42 UTC (permalink / raw) To: dick; +Cc: 57669 > > C-n'ing through a real-world logfile languageclient.out, which I attach > again here, chops up at around line 44. > That line has lots of brackets. Try M-: (setq bidi-inhibit-bpa t) RET. > > This led me to write contrived tests, which of course are frowned upon > in your school of measurement, whose modus operandi is interminable > catechism between a complainant who laboriously and imprecisely > describes slowness, and an inquisitor auto-replying "doesn't happen > here." > What is on master does not claim to make Emacs equally fast in all circumstances, which is simply impossible. Emacs remains responive, but yes, it is still (a bit) slow in some cases, and that seems unavoidable (without e.g. turning the BPA algorithm off unconditionally, which would be unwise). ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 16:42 ` Gregory Heytings @ 2022-09-09 17:11 ` dick 2022-09-09 18:09 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 17:11 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 > That line has lots of brackets. Try M-: (setq bidi-inhibit-bpa t) > RET. I'd rather find-file-literally, which does that and more. But "No!", you say, that's throwing the baby out the bathwater. The baby in question is usually misshapen demon spawn, i.e, minified json or logfile. Much has been made of the so-called full solution, one that doesn't crimp on syntax highlighting and other niceties. I think it's a mistake to complicate the code for max preservation, and more cynically, I think it's the peanut gallery not wanting to crown a giant slayer. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 17:11 ` dick @ 2022-09-09 18:09 ` Gregory Heytings 0 siblings, 0 replies; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 18:09 UTC (permalink / raw) To: dick; +Cc: 57669 [-- Attachment #1: Type: text/plain, Size: 598 bytes --] >> That line has lots of brackets. Try M-: (setq bidi-inhibit-bpa t) RET. > > I'd rather find-file-literally, which does that and more. > The problem is that find-file-literally does too much. > > But "No!", you say, that's throwing the baby out the bathwater. > No, IMO the main problem is that doing that is not in any way a graceful degradation. > > The baby in question is usually misshapen demon spawn, i.e, minified > json or logfile. > Even in that case, it seems reasonable to believe that seeing "你好" is way better than seeing "\344\275\240\345\245\275". ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 14:34 ` dick 2022-09-09 14:39 ` Gregory Heytings @ 2022-09-09 15:49 ` Eli Zaretskii 2022-09-09 15:58 ` Gregory Heytings 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 15:49 UTC (permalink / raw) To: dick; +Cc: gregory, 57669 > Cc: 57669@debbugs.gnu.org > From: dick <dick.r.chiang@gmail.com> > Date: Fri, 09 Sep 2022 10:34:28 -0400 > > > Try the same with a buffer with 10 lines, each of which is 10 MB long. > > I don't have the patience for 10MB. How about 0.1MB? > > OUTPUT: > > Under long-line-threshold=nil find-file ineffable > Under long-line-threshold=10000 find-file 99s This means on average 1 sec per C-n. Which is tolerable. > Under long-line-threshold=nil find-file-literally ineffable > Under long-line-threshold=10000 find-file-literally 8s We know that visiting a file literally makes this much faster, but it also loses a lot of features that we prefer not to lose. Like display of non-ASCII characters, for example. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:49 ` Eli Zaretskii @ 2022-09-09 15:58 ` Gregory Heytings 2022-09-09 16:04 ` Eli Zaretskii 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 15:58 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669, dick >> Under long-line-threshold=10000 find-file 99s > > This means on average 1 sec per C-n. Which is tolerable. > The buffer contains ten lines each of which is 100K long, so C-n is called much more than 100 times, it is called ~10000 times. So that's actually ~10 ms per C-n. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:58 ` Gregory Heytings @ 2022-09-09 16:04 ` Eli Zaretskii 0 siblings, 0 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 16:04 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669, dick.r.chiang > Date: Fri, 09 Sep 2022 15:58:50 +0000 > From: Gregory Heytings <gregory@heytings.org> > cc: dick <dick.r.chiang@gmail.com>, 57669@debbugs.gnu.org > > > >> Under long-line-threshold=10000 find-file 99s > > > > This means on average 1 sec per C-n. Which is tolerable. > > > > The buffer contains ten lines each of which is 100K long, so C-n is called > much more than 100 times, it is called ~10000 times. So that's actually > ~10 ms per C-n. Even better. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 13:08 ` dick 2022-09-09 13:38 ` Gregory Heytings @ 2022-09-09 14:12 ` Eli Zaretskii 2022-09-09 15:04 ` dick 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 14:12 UTC (permalink / raw) To: dick; +Cc: gregory, 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: gregory@heytings.org, 57669@debbugs.gnu.org > Date: Fri, 09 Sep 2022 09:08:46 -0400 > > After all Commercial Emacs's original attempt at "making the best of > a bad situation" was the impetus for your own poke at the pig. This has NIH written all over it. > And to be clear, you're going from "ineffable" performance to just > "underwhelming." As of cb036a7 you still need find-file-literally for > some semblance of respectability. > > OUTPUT: > > Under long-line-threshold=nil find-file 62s > Under long-line-threshold=10000 find-file 27s > Under long-line-threshold=nil find-file-literally 30s > Under long-line-threshold=10000 find-file-literally 4s It should be clear that comparing performance for 10000-character lines with performance for 10001-character lines will produce only mild speedups (but two-fold speedup is not to be ignored). In the wild we see files with much longer lines, like tens of MBs. So if you want to be fair, measure the performance when lines are much longer than the threshold. For even more insight, see what happens to performance as function of line length. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 14:12 ` Eli Zaretskii @ 2022-09-09 15:04 ` dick 2022-09-09 15:19 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 15:04 UTC (permalink / raw) To: Eli Zaretskii; +Cc: gregory, 57669 > This has NIH written all over it. You mean GNU Emacs suffers from NIH, or Commercial Emacs? The Commercial Emacs long lines fix *preceded* GNU's by about six months (and I might add, did so without resorting to the blunt instrument of narrowing). The proposer of the GNU Emacs fix even paraphrased Commercial Emacs when he said: Perfect is the enemy of good. Emacs users have been plagued for decades by this bug.[1] See [2],[3] from where his words might have found inspiration. To be clear, I'm not aggrieved. I just want everyone to understand that NIH is too unmeditated an accusation. [1] https://debbugs.gnu.org/cgi/bugreport.cgi?msg=119;bug=56393 [2] https://youtu.be/5C3wB3xiMmU?t=80 [3] https://youtu.be/5C3wB3xiMmU?t=290 ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:04 ` dick @ 2022-09-09 15:19 ` Gregory Heytings 2022-09-09 15:52 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 15:19 UTC (permalink / raw) To: dick; +Cc: Eli Zaretskii, 57669 > > The Commercial Emacs long lines fix *preceded* GNU's by about six months > (and I might add, did so without resorting to the blunt instrument of > narrowing). > As I told you yesterday (privately), Commercial Emacs performs much worse than what is now on master with respect to that bug. > > The proposer of the GNU Emacs fix even paraphrased Commercial Emacs > ??? I did not even know that a proposed fix existed in "Commercial Emacs". And how could your proposed fix have been an inspiration in any way? As you yourself write two lines above you "do not resort to the blunt instrument of narrowing". > > To be clear, I'm not aggrieved. > To be clear, you seem to be. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:19 ` Gregory Heytings @ 2022-09-09 15:52 ` dick 2022-09-09 16:03 ` Eli Zaretskii 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 15:52 UTC (permalink / raw) To: Gregory Heytings; +Cc: Eli Zaretskii, 57669 > Commercial Emacs performs much worse I dunno. As of 103caad, Commercial runs through the 100-line test in 3s, about the same as GNU with find-file-literally and non-nil long-lines-threshold. I never said your method was inspired by mine, merely your words in describing the long lines situation, and your motivation to even tackle the problem. I would have never thought to bring to bear a seemingly unrelated thing like narrowing. I was impressed, although the impedance mismatch of your creative solution is becoming more obvious. You're right, though. Boy, am I am hopping mad. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 15:52 ` dick @ 2022-09-09 16:03 ` Eli Zaretskii 2022-09-09 16:06 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 16:03 UTC (permalink / raw) To: dick; +Cc: gregory, 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: Eli Zaretskii <eliz@gnu.org>, 57669@debbugs.gnu.org > Date: Fri, 09 Sep 2022 11:52:00 -0400 > > > Commercial Emacs performs much worse > > I dunno. As of 103caad, Commercial runs through the 100-line test in > 3s, about the same as GNU with find-file-literally and non-nil > long-lines-threshold. I'm aware of your "solution", and it is unacceptable. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 16:03 ` Eli Zaretskii @ 2022-09-09 16:06 ` Gregory Heytings 2022-09-09 16:19 ` Eli Zaretskii 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 16:06 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669, dick >>> Commercial Emacs performs much worse >> >> I dunno. As of 103caad, Commercial runs through the 100-line test in >> 3s, about the same as GNU with find-file-literally and non-nil >> long-lines-threshold. > > I'm aware of your "solution", and it is unacceptable. > I'm not, I asked him a few pointers, and he replied with the hash of a commit which disables what exists on master. Perhaps there's something useful in his solution, even if it is unacceptable? If you already know what it is, can you perhaps describe it in a few words? ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 16:06 ` Gregory Heytings @ 2022-09-09 16:19 ` Eli Zaretskii 2022-09-09 16:25 ` Gregory Heytings 2022-09-09 17:44 ` dick 0 siblings, 2 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 16:19 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669, dick.r.chiang > Date: Fri, 09 Sep 2022 16:06:57 +0000 > From: Gregory Heytings <gregory@heytings.org> > cc: dick <dick.r.chiang@gmail.com>, 57669@debbugs.gnu.org > > > I'm aware of your "solution", and it is unacceptable. > > I'm not, I asked him a few pointers, and he replied with the hash of a > commit which disables what exists on master. The code is there, you can read it. Don't just rely on my conclusions, because I may be wrong. > Perhaps there's something useful in his solution, even if it is > unacceptable? If you already know what it is, can you perhaps > describe it in a few words? In a nutshell, his changes disable too many features of the GUI display (the ones that make the Emacs display slow with long lines), and they disable those features _always_, not just when the lines are long. And that is _after_ you factor out changes that are plain wrong, because he simply didn't understand what the code does well enough. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 16:19 ` Eli Zaretskii @ 2022-09-09 16:25 ` Gregory Heytings 2022-09-09 17:44 ` dick 1 sibling, 0 replies; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 16:25 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669, dick.r.chiang >> I'm not, I asked him a few pointers, and he replied with the hash of a >> commit which disables what exists on master. > > The code is there, you can read it. > I confess I don't have the patience to do that. I already don't have as much free time as I'd like to devote to Emacs, so I'd better spend it wisely. > > In a nutshell, his changes disable too many features of the GUI display > (the ones that make the Emacs display slow with long lines), and they > disable those features _always_, not just when the lines are long. > Okay, that's not the right way to do it, indeed. Dick, if you feel the above doesn't do justice to your code, feel free to elaborate on your chosen strategy, either here or privately. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 16:19 ` Eli Zaretskii 2022-09-09 16:25 ` Gregory Heytings @ 2022-09-09 17:44 ` dick 2022-09-09 18:06 ` Eli Zaretskii 1 sibling, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 17:44 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > and they disable those features _always_, not just lines are long. Must be nice having the title of "Maintainer." People just take your word for things. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 17:44 ` dick @ 2022-09-09 18:06 ` Eli Zaretskii 2022-09-09 18:22 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 18:06 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Fri, 09 Sep 2022 13:44:16 -0400 > > > and they disable those features _always_, not just lines are long. > > Must be nice having the title of "Maintainer." People just take your > word for things. They don't have to. The code is available for studying. And if you think your code does something different from what I said, feel free to describe what your code actually does, with enough details for me and others to understand where I'm wrong. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 18:06 ` Eli Zaretskii @ 2022-09-09 18:22 ` dick 2022-09-09 18:57 ` Eli Zaretskii 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 18:22 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > feel free to describe what your code actually does, with enough > details for me and others to understand where I'm wrong. I find it asymmetric you can denigrate Commercial Emacs on a public forum without doing the research or showing a minimal reproducible example, and that I must go out of my way to fight a presumption of guilt. Then again, I'm constantly slamming you for incompetence, so I guess all's fair in this sad, pathetic war over not money, not fame, but being right on the internet (cue xkcd cartoon). ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 18:22 ` dick @ 2022-09-09 18:57 ` Eli Zaretskii 2022-09-09 19:28 ` dick 2022-09-09 19:55 ` dick 0 siblings, 2 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 18:57 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Fri, 09 Sep 2022 14:22:32 -0400 > > > feel free to describe what your code actually does, with enough > > details for me and others to understand where I'm wrong. > > I find it asymmetric you can denigrate Commercial Emacs on a public > forum without doing the research or showing a minimal reproducible > example, and that I must go out of my way to fight a presumption of > guilt. I did the research. As long as you keep waving slogans, instead of showing your code that deals with very long lines and explaining how it solves that, I will maintain that my conclusions from studying your changes are accurate. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 18:57 ` Eli Zaretskii @ 2022-09-09 19:28 ` dick 2022-09-09 19:38 ` Eli Zaretskii 2022-09-09 19:55 ` dick 1 sibling, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 19:28 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > I did the research. Good, I believe you. Given it took me six weeks to make those changes, I suspect your research took at least a few hours. So it'd be an additional hour of your copious time (you're a trust fund kid like me, right?) to present a minimum reproducible example of Commercial Emacs being guilty of, and I quote, "disabling those features _always_, not just when lines are long." Sheesh, I even made a goshdarn youtube video explaining my approach. You want proof? Okay: src/emacs -Q src/xdisp.c I trust you'll find no gui features missing between it and GNU Emacs. I would further show that my changes do not include ones which, and I quote, "are plain wrong," but it's much harder to prove the non-existence of bugs (wouldn't that be nice) than it is for you to prove their existence. I was being facetious earlier about being hopping mad. Now not as much. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 19:28 ` dick @ 2022-09-09 19:38 ` Eli Zaretskii 0 siblings, 0 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-09 19:38 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Fri, 09 Sep 2022 15:28:47 -0400 > > You want proof? Okay: > > src/emacs -Q src/xdisp.c Sure, showing off display of a pure-ASCII file that uses a single font proves your case! (It actually proves mine.) > I trust you'll find no gui features missing between it and GNU Emacs. I > would further show that my changes do not include ones which, and I > quote, "are plain wrong," but it's much harder to prove the > non-existence of bugs (wouldn't that be nice) than it is for you to > prove their existence. Once again, and for the last time: show your code which deals with long lines; explain what it does and how. Then this discussion may have some value. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 18:57 ` Eli Zaretskii 2022-09-09 19:28 ` dick @ 2022-09-09 19:55 ` dick 2022-09-09 21:28 ` Gregory Heytings 2022-09-10 7:45 ` Eli Zaretskii 1 sibling, 2 replies; 54+ messages in thread From: dick @ 2022-09-09 19:55 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > showing your code that deals with very long lines and explaining how > it solves that I can't believe I'm dignifying this. All line references from commit beb489e. xdisp.c[9319,9369]: Calculates dy algebraically without char-by-char. xdisp.c[9537,9577]: Calculates CAPPED to limit char-by-char scan for moving backwards (Blandy and Moellmann wrote xdisp like a singly linked list -- fast and precise forwards, much less so going backwards). A high-level description (which I understand is worthless to you, since you're all about code not talk) can be found on YouTube. Cover the right half of the screen if misshapen faces aggravate a heart condition. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 19:55 ` dick @ 2022-09-09 21:28 ` Gregory Heytings 2022-09-09 22:00 ` dick 2022-09-10 7:45 ` Eli Zaretskii 1 sibling, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 21:28 UTC (permalink / raw) To: dick; +Cc: Eli Zaretskii, 57669 > > xdisp.c[9319,9369]: Calculates dy algebraically without char-by-char. > > xdisp.c[9537,9577]: Calculates CAPPED to limit char-by-char scan for > moving backwards (Blandy and Moellmann wrote xdisp like a singly linked > list -- fast and precise forwards, much less so going backwards). > Thanks, finally we get an indication of what your code does and where. I looked at it briefly, and the first thing I saw does not seem promising. Your algebraic calculations are enabled when behaved_p, which depends on buffer->text->monospace. That field is set (unconditionally) to true in Fget_buffer_create, and reset only in only one place, in add_properties. Can you please elaborate a bit and explain why doing that would be TRT? ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 21:28 ` Gregory Heytings @ 2022-09-09 22:00 ` dick 2022-09-09 22:44 ` Gregory Heytings 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-09 22:00 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 In add_properties, if I see anything that betrays monospaceness, like an image or a so-called display-string, I revert to character-by-character scanning, that is the buffer is no longer "behaved." ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 22:00 ` dick @ 2022-09-09 22:44 ` Gregory Heytings 2022-09-09 23:27 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Gregory Heytings @ 2022-09-09 22:44 UTC (permalink / raw) To: dick; +Cc: 57669 > > In add_properties, if I see anything that betrays monospaceness, like an > image or a so-called display-string, I revert to character-by-character > scanning, that is the buffer is no longer "behaved." > Yes, I understood that part of your reasoning. What I'm asking is why you believe that doing that is enough. Aren't there other reasons besides properties that "betray monospaceness"? ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 22:44 ` Gregory Heytings @ 2022-09-09 23:27 ` dick 2022-09-10 8:32 ` Eli Zaretskii 2022-09-10 10:26 ` Gregory Heytings 0 siblings, 2 replies; 54+ messages in thread From: dick @ 2022-09-09 23:27 UTC (permalink / raw) To: Gregory Heytings; +Cc: 57669 There might be. I don't have enough user (that's right: I wasn't presumptuous enough to use the plural) to know. My immediate response however is your own, "I bet that we won't have a single bug report about this." First you would need to construct a pathological case, like lots of Urdu and Hindi, then you would need the geometries to be sufficiently extreme that a user would notice that the page didn't quite scroll up or down the full page. Then you'd need me to renege on "perfect is the enemy of the good." I would add that unless you're seriously considering replacing narrowing with my first-principles scheme (doubtful given how many hours you've invested in narrowing), this is all an academic exercise in oneupsmanship, which mind you, I am definitely game for. If that suggests I believe I dealt with long lines better than you, you'd be correct. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 23:27 ` dick @ 2022-09-10 8:32 ` Eli Zaretskii 2022-09-10 12:51 ` dick 2022-09-10 10:26 ` Gregory Heytings 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 8:32 UTC (permalink / raw) To: dick; +Cc: gregory, 57669 > Cc: 57669@debbugs.gnu.org > From: dick <dick.r.chiang@gmail.com> > Date: Fri, 09 Sep 2022 19:27:13 -0400 > > First you would need to construct a pathological case, like lots of Urdu > and Hindi There's nothing pathological about Hindi text. In fact, the JSON and XML files with very long lines, which we are using for this work, quite frequently have non-ASCII text from various scripts, including R2L scripts. At least one of them I think went as far as showing strings in every supported script. > I would add that unless you're seriously considering replacing narrowing > with my first-principles scheme (doubtful given how many hours you've > invested in narrowing), this is all an academic exercise in > oneupsmanship, which mind you, I am definitely game for. If that > suggests I believe I dealt with long lines better than you, you'd be > correct. This is not a pissing contest, at least not on our part. We are keenly interested in using any ideas that are correct, can be implemented without too many complications, and provide significant speedups, especially for very long lines. For example, if the behaved_p idea, when implemented correctly (i.e. when it takes into considerations _all_ the factors that violate the monospace-ness assumption), can significantly speed up redisplay in some situations, we would like to use it, at least when the long_line_optimizations_p flag is set, if not always. However, both the correct conditions for behaved_p and the actual speedups still need to be coded and measured, before we can make that decision. One fundamental problem with the behaved_p idea is that the conditions it should test, when implemented correctly, can change at any buffer position, and at least for some of them (e.g., when a character is displayed by glyphs from a display-table), we don't have any way of knowing that in advance, except by examining every character, which basically annuls any advantages of this idea. So I'm not sure if this idea is usable in a way that doesn't introduce subtle bugs. But maybe such bugs could be tolerable when lines are very long (which means the relevant optimizations should only be taken when the long_line_optimizations_p flag is set)? ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 8:32 ` Eli Zaretskii @ 2022-09-10 12:51 ` dick 2022-09-10 13:09 ` Eli Zaretskii 2022-09-10 13:22 ` Eli Zaretskii 0 siblings, 2 replies; 54+ messages in thread From: dick @ 2022-09-10 12:51 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 monospace-p I agree is an heuristic like narrowing. In the majority of cases of long lines, it applies the algebraic shortcut when it thinks it can get away with it. What if it's wrong? Then it won't scroll up or down the full page. What if it scrolls zero on a C-n? That'd be a degenerate case, one which I'd have a hard time contriving, but that would only make it as culpable as 29.0.50 which we already know can scroll zero on C-n. But until Commercial can gather a following, my sanguinity is all pissing-contest speculation. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 12:51 ` dick @ 2022-09-10 13:09 ` Eli Zaretskii 2022-09-10 13:29 ` Eli Zaretskii 2022-09-10 13:22 ` Eli Zaretskii 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 13:09 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Sat, 10 Sep 2022 08:51:50 -0400 > > monospace-p I agree is an heuristic like narrowing. In the majority of > cases of long lines, it applies the algebraic shortcut when it thinks it > can get away with it. My guess is that it disables the shortcut in any buffer that has font-lock turned on. Turning off font-lock is known to speed up things significantly, even without the shortcut, but we thought that turning it off would be asking too much. Thus, a satisfactory solution must work in the presence of faces and in the presence of different fonts, because the real-life use cases where we see very long lines use both. So I think we can only apply such shortcuts when lines are very long, in which case the resulting inaccuracies in layout calculations could be perhaps tolerated. I don't think it's feasible to apply them always, because once we make behaved_p accurate enough (if that is at all feasible), it will probably lose its attractiveness. The other question is: if we apply these shortcuts when lines are very long, what do we gain? If performance becomes significantly better, it would perhaps mean we can enlarge long-line-threshold's value, or make the default narrowing region larger. But I don't think we can avoid the narrowing completely, because anything else will still scale at least linearly with the line length, and so will at some point become unbearably slow. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 13:09 ` Eli Zaretskii @ 2022-09-10 13:29 ` Eli Zaretskii 0 siblings, 0 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 13:29 UTC (permalink / raw) To: dick.r.chiang; +Cc: 57669 > Cc: 57669@debbugs.gnu.org > Date: Sat, 10 Sep 2022 16:09:04 +0300 > From: Eli Zaretskii <eliz@gnu.org> > > > From: dick <dick.r.chiang@gmail.com> > > Cc: 57669@debbugs.gnu.org > > Date: Sat, 10 Sep 2022 08:51:50 -0400 > > > > monospace-p I agree is an heuristic like narrowing. In the majority of > > cases of long lines, it applies the algebraic shortcut when it thinks it > > can get away with it. > > My guess is that it disables the shortcut in any buffer that has > font-lock turned on. I thought one thing, but wrote something that implies another. What I meant was "any buffer that has font-lock turned on and uses non-default fonts for the font-lock faces" -- the last part was missing. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 12:51 ` dick 2022-09-10 13:09 ` Eli Zaretskii @ 2022-09-10 13:22 ` Eli Zaretskii 2022-09-10 14:03 ` dick 1 sibling, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 13:22 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Sat, 10 Sep 2022 08:51:50 -0400 > > monospace-p I agree is an heuristic like narrowing. In the majority of > cases of long lines, it applies the algebraic shortcut when it thinks it > can get away with it. Btw, the way you reset the monospace flag in add_text_properties is also problematic: the code is looking only at the specific face that is the value of the property. But Emacs applies faces by merging them with other sources of face information, not just by using the single face named by the property. As the simplest example, consider a face whose only non-unspecified attribute is :inherit -- in that case, AFAIU your code will not reset the monospace flag, but when Emacs will actually use the face for rendering, it will follow the inheritance chain and might find there one of the face attributes your code does care about. Also, I don't see the monospace flag being reset if the face's font is not a fixed-pitch one. Did I miss something? ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 13:22 ` Eli Zaretskii @ 2022-09-10 14:03 ` dick 2022-09-10 14:20 ` Eli Zaretskii 0 siblings, 1 reply; 54+ messages in thread From: dick @ 2022-09-10 14:03 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 You've identified the weakest point and you continue to squeeze. Fortunately my weakest point is monospace_p, an heuristic, one which I feel makes the right compromises. I wouldn't be surprised if "heuristic" didn't surface in your self-study of programming. The narrowing in 29.0.50 is also an "heuristic." > As the simplest example, consider a face whose only non-unspecified Like you, I largely dismiss prose but will begrudgingly run a minimum reproducible example. If it's so simple, please follow your own bug-reporting advice: Please describe exactly what actions triggered the bug... If you can, give a recipe starting from 'emacs -Q' You'll find that I *always* do this in epic arguments of this scale. You, I noticed, traffic in hand-wavy refrains like "I've been doing this for years," "If you read the code, you'd know why," "He simply doesn't understand the code." ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 14:03 ` dick @ 2022-09-10 14:20 ` Eli Zaretskii 2022-09-10 14:52 ` dick 0 siblings, 1 reply; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 14:20 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Sat, 10 Sep 2022 10:03:55 -0400 > > Like you, I largely dismiss prose but will begrudgingly run a minimum > reproducible example. If it's so simple, please follow your own > bug-reporting advice: > > Please describe exactly what actions triggered the bug... > If you can, give a recipe starting from 'emacs -Q' I'm not interested in reporting bugs for a fork of Emacs. I _am_ interested in discussing ideas for making display of long lines in Emacs better, so if you are interested as well, you will respond in kind. Otherwise, I guess this discussion has exhausted itself, at least as far as your participation is concerned. Fortunately, you are not the only participant, and others might be interested in what I have to say. > You'll find that I *always* do this in epic arguments of this scale. > You, I noticed, traffic in hand-wavy refrains like "I've been doing this > for years," "If you read the code, you'd know why," "He simply doesn't > understand the code." This kind of ad hominem usually means you've run out of real arguments. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 14:20 ` Eli Zaretskii @ 2022-09-10 14:52 ` dick 0 siblings, 0 replies; 54+ messages in thread From: dick @ 2022-09-10 14:52 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > This kind of ad hominem usually means you've run out of real > arguments. Took the words right out of my mouth: Bug#57212 If you'd read the code guarded by that flag and understand what it does, you wouldn't have made such nonsensical proposals. Bug#57669 And that is _after_ you factor out changes that are plain wrong, because he simply didn't understand what the code does well enough. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 23:27 ` dick 2022-09-10 8:32 ` Eli Zaretskii @ 2022-09-10 10:26 ` Gregory Heytings 1 sibling, 0 replies; 54+ messages in thread From: Gregory Heytings @ 2022-09-10 10:26 UTC (permalink / raw) To: dick; +Cc: 57669 > > I would add that unless you're seriously considering replacing narrowing > with my first-principles scheme (doubtful given how many hours you've > invested in narrowing), this is all an academic exercise in > oneupsmanship, which mind you, I am definitely game for. > My sole aim here is to improve Emacs, which is why I'm interested in all good ideas. If it turned out that your scheme gives better results in some cases, I don't see why it couldn't be included in Emacs. And if (but that seems less likely) it turned out that your scheme gives better results in all cases, I don't see why it wouldn't replace what is on master. > > If that suggests I believe I dealt with long lines better than you, > you'd be correct. > From what I see, you are a competent programmer. I find it regrettable that you turn this (and other discussions) into an ego quarrel. As I already said, your contributions and ideas are welcome. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-09 19:55 ` dick 2022-09-09 21:28 ` Gregory Heytings @ 2022-09-10 7:45 ` Eli Zaretskii 2022-09-10 12:07 ` dick 2022-09-10 16:55 ` Gregory Heytings 1 sibling, 2 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 7:45 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Fri, 09 Sep 2022 15:55:07 -0400 > > > showing your code that deals with very long lines and explaining how > > it solves that > > I can't believe I'm dignifying this. All line references from commit > beb489e. > > xdisp.c[9319,9369]: Calculates dy algebraically without char-by-char. This uses state variables from 'struct it' which are _local_ and _momentary_, i.e. they can change as result of processing any buffer position, and reflect only the latest change, forgetting what was before. Specifically, it->method is such a state variable. So making global conclusions, such as that "all characters will have the same metrics on display", based on it->method is fundamentally wrong, and can only be true in very simple situations. The buffer->text->monospace flag is likewise implemented based on simplistic assumptions: that only text properties could violate the "monospace-ness" attribute. Here's why this is simplistic: . faces can be applied by overlays as well . faces can be applied directly by C code . faces can be applied by using glyphs from display-tables . even if we only have the default face, fonts used for various non-ASCII characters can have different metrics from the default face's font, and in some cases they can even be variable-pitch fonts . portions of display can be made invisible by selective-display, not just by 'invisible' properties (I'm not claiming that the above is the exhaustive list of all the reasons that the assumptions in behaved_p could be violated; there could be more of them.) > xdisp.c[9537,9577]: Calculates CAPPED to limit char-by-char scan for > moving backwards (Blandy and Moellmann wrote xdisp like a singly linked > list -- fast and precise forwards, much less so going backwards). I cannot see how the above description is related to the actual code in that part of xdisp.c: there's no char-by-char movement back in the corresponding parts of our code; instead, we move back by lines, then move forward by characters -- and that's what the code there does as well. So I think this part of the code is equivalent to what we do, in back_to_previous_visible_line_start, and should have the same performance. But maybe I'm missing something -- was this change profiled, and if so, what were the results? And if this code is significantly faster, which of its changes is responsible for the speedups? And in which kind of files under what major modes were these speedups measured? In any case, the replacement code uses behaved_p, whose problematic assumptions I already explained above. To comment on the above description: in general, moving the iterator backwards needs to consider all the changes in the state variables of 'struct it' that eventually affect the metrics and the layout calculations. It is _not_ the same as moving back by characters, and the reason is that the state changes of 'struct it' are defined (in set_iterator_to_next, get_next_display_element, and their subroutines) only for moving forward, not for moving back. That is why all move_it_* functions cannot move back, except by going to a preceding newline and then coming forward. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 7:45 ` Eli Zaretskii @ 2022-09-10 12:07 ` dick 2022-09-10 12:20 ` dick 2022-09-10 12:24 ` Eli Zaretskii 2022-09-10 16:55 ` Gregory Heytings 1 sibling, 2 replies; 54+ messages in thread From: dick @ 2022-09-10 12:07 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 EZ> So I think this part of the code is equivalent to what we do, in EZ> back_to_previous_visible_line_start I'm glad you noticed! It means you're actually reading the code! One difference is I gate line scanning (as opposed to character scanning) with behaved_p, whereas GNU crosses its fingers and hopes its POS_LIMIT estimate is far enough. So oddly enough, for all my cavailier assumptions, at least this part of the code [xdisp.c 9537:9577] is *more* conservative than GNU. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 12:07 ` dick @ 2022-09-10 12:20 ` dick 2022-09-10 12:24 ` Eli Zaretskii 1 sibling, 0 replies; 54+ messages in thread From: dick @ 2022-09-10 12:20 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669 > [xdisp.c 9537:9577] is *more* conservative than GNU. Ah, I'm wrong about this. My bad. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 12:07 ` dick 2022-09-10 12:20 ` dick @ 2022-09-10 12:24 ` Eli Zaretskii 1 sibling, 0 replies; 54+ messages in thread From: Eli Zaretskii @ 2022-09-10 12:24 UTC (permalink / raw) To: dick; +Cc: 57669 > From: dick <dick.r.chiang@gmail.com> > Cc: 57669@debbugs.gnu.org > Date: Sat, 10 Sep 2022 08:07:24 -0400 > > EZ> So I think this part of the code is equivalent to what we do, in > EZ> back_to_previous_visible_line_start > > I'm glad you noticed! It means you're actually reading the code! You cannot say anything of an essence without ad-hominem, can you? > One difference is I gate line scanning (as opposed to character > scanning) with behaved_p, whereas GNU crosses its fingers and hopes its > POS_LIMIT estimate is far enough. So oddly enough, for all my cavailier > assumptions, at least this part of the code [xdisp.c 9537:9577] is > *more* conservative than GNU. But since behaved_p is actually inaccurate at best, that doesn't really matter, does it? It just trades one class of cases where the shortcut doesn't work for another. You simply haven't yet met the situations where those problems happen, most probably because you tested only simple cases, like all-ASCII files which use a single fixed-pitch font. The code on master went through much more testing, by more users, during several years. ^ permalink raw reply [flat|nested] 54+ messages in thread
* bug#57669: 29.0.50; C-n, C-p off under long lines 2022-09-10 7:45 ` Eli Zaretskii 2022-09-10 12:07 ` dick @ 2022-09-10 16:55 ` Gregory Heytings 1 sibling, 0 replies; 54+ messages in thread From: Gregory Heytings @ 2022-09-10 16:55 UTC (permalink / raw) To: Eli Zaretskii; +Cc: 57669, dick > > The buffer->text->monospace flag is likewise implemented based on > simplistic assumptions: that only text properties could violate the > "monospace-ness" attribute. Here's why this is simplistic: > > . faces can be applied by overlays as well > > . faces can be applied directly by C code > > . faces can be applied by using glyphs from display-tables > > . even if we only have the default face, fonts used for various > non-ASCII characters can have different metrics from the default face's > font, and in some cases they can even be variable-pitch fonts > > . portions of display can be made invisible by selective-display, not > just by 'invisible' properties > > (I'm not claiming that the above is the exhaustive list of all the > reasons that the assumptions in behaved_p could be violated; there could > be more of them.) > FWIW, the simplest recipe for the fourth point above is to create a buffer with a long line (with say C-u 10000 a) and to insert, somewhere in the middle of that line, characters which have a width equal to zero (e.g. C-x 8 RET zero width space RET) and characters which have a width equal to two (e.g. C-x 8 RET e i s s a). You'll see that your algebraic calculations do not work anymore. ^ permalink raw reply [flat|nested] 54+ messages in thread
end of thread, other threads:[~2022-09-10 16:55 UTC | newest] Thread overview: 54+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-09-08 5:40 bug#57669: 29.0.50; C-n, C-p off under long lines dick.r.chiang 2022-09-08 7:38 ` Gregory Heytings 2022-09-08 8:17 ` Eli Zaretskii 2022-09-08 12:02 ` dick 2022-09-08 17:12 ` Gregory Heytings 2022-09-08 18:13 ` dick 2022-09-08 18:26 ` Gregory Heytings 2022-09-09 6:00 ` Eli Zaretskii 2022-09-09 13:08 ` dick 2022-09-09 13:38 ` Gregory Heytings 2022-09-09 14:34 ` dick 2022-09-09 14:39 ` Gregory Heytings 2022-09-09 15:06 ` dick 2022-09-09 15:41 ` Gregory Heytings 2022-09-09 16:30 ` dick 2022-09-09 16:42 ` Gregory Heytings 2022-09-09 17:11 ` dick 2022-09-09 18:09 ` Gregory Heytings 2022-09-09 15:49 ` Eli Zaretskii 2022-09-09 15:58 ` Gregory Heytings 2022-09-09 16:04 ` Eli Zaretskii 2022-09-09 14:12 ` Eli Zaretskii 2022-09-09 15:04 ` dick 2022-09-09 15:19 ` Gregory Heytings 2022-09-09 15:52 ` dick 2022-09-09 16:03 ` Eli Zaretskii 2022-09-09 16:06 ` Gregory Heytings 2022-09-09 16:19 ` Eli Zaretskii 2022-09-09 16:25 ` Gregory Heytings 2022-09-09 17:44 ` dick 2022-09-09 18:06 ` Eli Zaretskii 2022-09-09 18:22 ` dick 2022-09-09 18:57 ` Eli Zaretskii 2022-09-09 19:28 ` dick 2022-09-09 19:38 ` Eli Zaretskii 2022-09-09 19:55 ` dick 2022-09-09 21:28 ` Gregory Heytings 2022-09-09 22:00 ` dick 2022-09-09 22:44 ` Gregory Heytings 2022-09-09 23:27 ` dick 2022-09-10 8:32 ` Eli Zaretskii 2022-09-10 12:51 ` dick 2022-09-10 13:09 ` Eli Zaretskii 2022-09-10 13:29 ` Eli Zaretskii 2022-09-10 13:22 ` Eli Zaretskii 2022-09-10 14:03 ` dick 2022-09-10 14:20 ` Eli Zaretskii 2022-09-10 14:52 ` dick 2022-09-10 10:26 ` Gregory Heytings 2022-09-10 7:45 ` Eli Zaretskii 2022-09-10 12:07 ` dick 2022-09-10 12:20 ` dick 2022-09-10 12:24 ` Eli Zaretskii 2022-09-10 16:55 ` Gregory Heytings
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).