joaotavora / eglot

A client for Language Server Protocol servers
GNU General Public License v3.0
2.28k stars 200 forks source link

eglot commands don't work unless reconnect #1051

Open eth0rnhill opened 2 years ago

eth0rnhill commented 2 years ago

My problem is that whenever I try to use two eglot commands (rename, code action, etc.) consecutively, the first one succeeds, but the second one does not, unless I run eglot-reconnect in between.

LSP transcript - M-x eglot-events-buffer (mandatory unless Emacs inoperable)

[internal] Tue Sep 20 19:44:32 2022:
(:message "Running language server: (haskell-language-server-wrapper --lsp)")
[client-request] (id:1) Tue Sep 20 19:44:32 2022:
(:jsonrpc "2.0" :id 1 :method "initialize" :params
      (:processId 284747 :rootPath "/home/lukacsf/code/haskellcatthy/" :rootUri "file:///home/lukacsf/code/haskellcatthy" :initializationOptions #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                                                                                   ())
              :capabilities
              (:workspace
               (:applyEdit t :executeCommand
                   (:dynamicRegistration :json-false)
                   :workspaceEdit
                   (:documentChanges t)
                   :didChangeWatchedFiles
                   (:dynamicRegistration t)
                   :symbol
                   (:dynamicRegistration :json-false)
                   :configuration t :workspaceFolders t)
               :textDocument
               (:synchronization
            (:dynamicRegistration :json-false :willSave t :willSaveWaitUntil t :didSave t)
            :completion
            (:dynamicRegistration :json-false :completionItem
                          (:snippetSupport :json-false :deprecatedSupport t :tagSupport
                                   (:valueSet
                                [1]))
                          :contextSupport t)
            :hover
            (:dynamicRegistration :json-false :contentFormat
                          ["markdown" "plaintext"])
            :signatureHelp
            (:dynamicRegistration :json-false :signatureInformation
                          (:parameterInformation
                           (:labelOffsetSupport t)
                           :activeParameterSupport t))
            :references
            (:dynamicRegistration :json-false)
            :definition
            (:dynamicRegistration :json-false :linkSupport t)
            :declaration
            (:dynamicRegistration :json-false :linkSupport t)
            :implementation
            (:dynamicRegistration :json-false :linkSupport t)
            :typeDefinition
            (:dynamicRegistration :json-false :linkSupport t)
            :documentSymbol
            (:dynamicRegistration :json-false :hierarchicalDocumentSymbolSupport t :symbolKind
                          (:valueSet
                           [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26]))
            :documentHighlight
            (:dynamicRegistration :json-false)
            :codeAction
            (:dynamicRegistration :json-false :codeActionLiteralSupport
                          (:codeActionKind
                           (:valueSet
                        ["quickfix" "refactor" "refactor.extract" "refactor.inline" "refactor.rewrite" "source" "source.organizeImports"]))
                          :isPreferredSupport t)
            :formatting
            (:dynamicRegistration :json-false)
            :rangeFormatting
            (:dynamicRegistration :json-false)
            :rename
            (:dynamicRegistration :json-false)
            :publishDiagnostics
            (:relatedInformation :json-false :codeDescriptionSupport :json-false :tagSupport
                         (:valueSet
                          [1 2])))
               :experimental #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                           ()))
              :workspaceFolders
              [(:uri "file:///home/lukacsf/code/haskellcatthy" :name "~/code/haskellcatthy/")]))
[stderr] nil
[stderr] No 'hie.yaml' found. Try to discover the project type!
[stderr] Run entered for haskell-language-server-wrapper(haskell-language-server-wrapper) Version 1.7.0.0 x86_64 ghc-9.0.2
[stderr] Current directory: /home/lukacsf/code/haskellcatthy
[stderr] Operating system: linux
[stderr] Arguments: ["--lsp"]
[stderr] Cradle directory: /home/lukacsf/code/haskellcatthy
[stderr] Cradle type: Default
[stderr] 
[stderr] 
[stderr] Tool versions found on the $PATH
[stderr] cabal:     Not found
[stderr] stack:     Not found
[stderr] ghc:       9.0.2
[stderr] 
[stderr] 
[stderr] Consulting the cradle to get project GHC version...
[stderr] Project GHC version: 9.0.2
[stderr] haskell-language-server exe candidates: ["haskell-language-server-9.0.2","haskell-language-server"]
[stderr] Launching haskell-language-server exe at:/run/current-system/sw/bin/haskell-language-server-9.0.2
[stderr] nil
[stderr] 2022-09-20T17:44:32.898131Z | Info | No log file specified; using stderr.
[stderr] 2022-09-20T17:44:32.898462Z | Info | haskell-language-server version: 1.7.0.0 (GHC: 9.0.2) (PATH: /nix/store/v4rc5ddym0lsmczl07yiqsa8pnid32j4-haskell-language-server-1.7.0.0/bin/haskell-language-server)
[stderr] 2022-09-20T17:44:32.899045Z | Info | Directory: /home/lukacsf/code/haskellcatthy
[stderr] 2022-09-20T17:44:32.899293Z | Info | Starting (haskell-language-server) LSP server...
[stderr]   GhcideArguments {argsCommand = LSP, argsCwd = Nothing, argsShakeProfiling = Nothing, argsTesting = False, argsExamplePlugin = False, argsDebugOn = False, argsLogFile = Nothing, argsThreads = 0, argsProjectGhcVersion = False}
[stderr]   PluginIds: [ pragmas
[stderr]              , floskell
[stderr]              , fourmolu
[stderr]              , ormolu
[stderr]              , rename
[stderr]              , retrie
[stderr]              , callHierarchy
[stderr]              , class
[stderr]              , haddockComments
[stderr]              , eval
[stderr]              , importLens
[stderr]              , qualifyImportedNames
[stderr]              , refineImports
[stderr]              , moduleName
[stderr]              , hlint
[stderr]              , splice
[stderr]              , alternateNumberFormat
[stderr]              , selectionRange
[stderr]              , changeTypeSignature
[stderr]              , ghcide-hover-and-symbols
[stderr]              , ghcide-code-actions-imports-exports
[stderr]              , ghcide-code-actions-type-signatures
[stderr]              , ghcide-code-actions-bindings
[stderr]              , ghcide-code-actions-fill-holes
[stderr]              , ghcide-completions
[stderr]              , ghcide-type-lenses
[stderr]              , ghcide-core
[stderr]              , LSPRecorderCallback ]
[stderr] 2022-09-20T17:44:32.902528Z | Info | Logging heap statistics every 60.00s
[stderr]  2022-09-20T17:44:32.905043Z | Info | Staring LSP server...
[stderr] If you are seeing this in a terminal, you probably should have run WITHOUT the --lsp option!
[stderr] 2022-09-20T17:44:32.906779Z | Info | Started LSP server in 0.00s
[stderr] 2022-09-20T17:44:32.972362Z | Warning | Currently, HLS supports GHC 9 only partially. See [issue #297](https://github.com/haskell/haskell-language-server/issues/297) for more detail.
[server-reply] (id:1) Tue Sep 20 19:44:32 2022:
(:id 1 :jsonrpc "2.0" :result
     (:capabilities
      (:callHierarchyProvider t :codeActionProvider t :codeLensProvider
                  (:resolveProvider :json-false :workDoneProgress :json-false)
                  :colorProvider :json-false :completionProvider
                  (:resolveProvider :json-false :triggerCharacters
                        ["."])
                  :declarationProvider :json-false :definitionProvider t :documentFormattingProvider t :documentHighlightProvider t :documentRangeFormattingProvider t :documentSymbolProvider t :executeCommandProvider
                  (:commands
                   ["285533:retrie:retrieCommand" "285533:class:addMinimalMethodPlaceholders" "285533:eval:evalCommand" "285533:importLens:ImportLensCommand" "285533:refineImports:RefineImportLensCommand" "285533:moduleName:updateModuleName" "285533:hlint:applyOne" "285533:hlint:applyAll" "285533:splice:expandTHSpliceInplace" "285533:ghcide-completions:extendImport" "285533:ghcide-type-lenses:typesignature.add"])
                  :foldingRangeProvider :json-false :hoverProvider t :implementationProvider :json-false :referencesProvider t :renameProvider t :selectionRangeProvider t :semanticTokensProvider
                  (:legend
                   (:tokenModifiers
                ["declaration" "definition" "readonly" "static" "deprecated" "abstract" "async" "modification" "documentation" "defaultLibrary"]
                :tokenTypes
                ["type" "class" "enum" "interface" "struct" "typeParameter" "parameter" "variable" "property" "enumMember" "event" "function" "method" "macro" "keyword" "modifier" "comment" "string" "number" "regexp" "operator"]))
                  :textDocumentSync
                  (:change 2 :openClose t :save nil)
                  :typeDefinitionProvider t :workspace
                  (:workspaceFolders
                   (:changeNotifications t :supported t))
                  :workspaceSymbolProvider t)))
[client-notification] Tue Sep 20 19:44:32 2022:
(:jsonrpc "2.0" :method "initialized" :params #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                                ()))
[client-notification] Tue Sep 20 19:44:32 2022:
(:jsonrpc "2.0" :method "textDocument/didOpen" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0 :languageId "haskell" :text "{-# LANGUAGE GADTs #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TupleSections #-}\n\n-- Ends and Coends\n\nclass Profunctor f where\n  dimap :: (a' -> a) -> (b -> b') -> (f a b -> f a' b')\n\ninstance Profunctor (->) where\n  dimap f g h = g . h . f\n\n-- We want to be able to compose profunctors\n-- Composition in this case means the following. Given two profunctors P and\n-- Q, the set P<a,b> is the proposition that a and b are related via P. Similarly\n-- for Q. Consequently, the set (PQ)(<a,b>) means that a and b are related via the\n-- two profunctors. So basically we are dealing with composition of relations.\n-- Now given two relations, P and Q, we have a(PQ)b iff there exists an x such\n-- that aPxQb.\n\n-- This is an existential type, meaning that in fact we are looking for an x st.\n-- q a x and p x b make sense, i.e. the types are nonempty\ndata Procompose p q a b where\n  -- To construct the composite, we need witness that the aforementioned x exists.\n  Procompose :: q a x -> p x b -> Procompose p q a b\n\n-- This is indeed results in a Profunctor\ninstance (Profunctor q, Profunctor p) => Profunctor (Procompose p q) where\n  dimap l r (Procompose qax pxb) = Procompose (dimap l id qax) (dimap id r pxb)\n\n-- This is similar to the mapOut function of the sum type: there we needed a\n-- function for each member of the sum, then a finite amount. Here, the situation\n-- is the same, but for infinitely many members.\nmapOut :: (forall x. q a x -> p x b -> c) -> (Procompose p q a b -> c)\nmapOut f (Procompose qax pxb) = f qax pxb\n\ndata Coend p where\n  Coend :: p x x -> Coend p\n\n-- Ex. 12.2.1.\nnewtype ProPair q p a b x y = ProPair (q a y, p x b)\n\ninstance (Profunctor p, Profunctor q) => Profunctor (ProPair q p a b) where\n  dimap l r (ProPair (qay, pxb)) = ProPair (dimap id r qay, dimap l id pxb)\n\n-- Ex. 17.2.2.\nnewtype CoEndCompose p q a b = CoEndCompose (Coend (ProPair q p a b))\n\ninstance (Profunctor p, Profunctor q) => Profunctor (CoEndCompose p q) where\n  -- Coend (ProPair q p a b) = ProPair q p a b x x = ProPair (q a x, p x b)\n  dimap l r (CoEndCompose (Coend (ProPair (qax, pxb)))) =\n    CoEndCompose $ Coend $ ProPair (dimap l id qax, dimap id r pxb)\n\n-- Ends\n\ntype End p = forall x. p x x\n\nnewtype ProF f g a b = ProF (f a -> g b)\n\ninstance (Functor f, Functor g) => Profunctor (ProF f g) where\n  dimap l r (ProF h) = ProF $ fmap r . h . fmap l\n\n-- This is in fact category theoretically correct:\n-- myHead :: End (ProF [] Maybe)\n-- myHead [] = Nothing\n-- myHead (x : xs) = Just x\n\nnewtype Yo f a x y = Yo ((a -> x) -> f y)\n\nyoneda :: Functor f => End (Yo f a) -> f a\nyoneda (Yo alpha) = alpha id\n\nyonedaInv :: Functor f => f a -> End (Yo f a)\nyonedaInv fa = Yo (\\h -> fmap h fa)\n\ndata CoY f a x y = CoY (x -> a) (f y)\n\ncoyoneda :: Functor f => Coend (CoY f a) -> f a\ncoyoneda (Coend (CoY g fa)) = fmap g fa\n\ncoyonedaInv :: Functor f => f a -> Coend (CoY f a)\ncoyonedaInv fa = Coend (CoY id fa)\n\n-- Ex 17.7.1.\ndata Day f g x where\n  Day :: ((a, b) -> x) -> f a -> g b -> Day f g x\n\ninstance (Functor f, Functor g) => Functor (Day f g) where\n  fmap f (Day h fa gb) = Day (f . h) fa gb\n\n-- Free Applicatives\n\ndata FreeA f x where\n  DoneA :: x -> FreeA f x\n  MoreA :: ((a, b) -> x) -> f a -> FreeA f b -> FreeA f x\n\nclass Monoidal f where\n  unit :: f ()\n  (>*<) :: f a -> f b -> f (a, b)\n\ninstance Functor f => Monoidal (FreeA f) where\n  unit = DoneA ()\n  (DoneA x) >*< fry = fmap (x,) fry\n  (MoreA abx fa frb) >*< fry = MoreA (reassoc abx) fa (frb >*< fry)\n\nreassoc :: ((a, b) -> x) -> (a, (b, y)) -> (x, y)\nreassoc abx (a, (b, y)) = (abx (a, b), y)\n\ninstance Functor f => Applicative (FreeA f) where\n  pure = DoneA\n  ff <*> fx = fmap app (ff >*< fx)\n\napp :: (a -> b, a) -> b\napp (f, x) = f x\n\ninstance Functor f => Functor (FreeA f) where\n  fmap f (DoneA x) = DoneA $ f x\n  fmap f (MoreA abx fa frb) = MoreA (f . abx) fa frb\n\n-- Monads in the bicategory of profunctors\nclass Profunctor p => PreArrow p where\n  (>>>) :: p a x -> p x b -> p a b\n  arr :: (a -> b) -> p a b\n\n-- Lenses\n\ndata Lens' s a where\n  Lens' :: (s -> (c, a), (c, a) -> s) -> Lens' s a\n\ntoGet' :: Lens' s a -> (s -> a)\ntoGet' (Lens' (l, r)) = snd . l\n\ntoSet' :: Lens' s a -> (s -> a -> s)\ntoSet' (Lens' (l, r)) s a = r (fst $ l s, a)\n\n-- Type-changing lens\ndata Lens s t a b where\n  Lens :: (s -> (c, a)) -> ((c, b) -> t) -> Lens s t a b\n\ntoGet :: Lens s t a b -> (s -> a)\ntoGet (Lens l r) = snd . l\n\ntoSet :: Lens s t a b -> (s -> b -> t)\ntoSet (Lens l r) s b = r (fst $ l s, b)\n\nprodLens :: Lens (c, a) (c, b) a b\nprodLens = Lens id id\n\ncompLens :: Lens a b a' b' -> Lens s t a b -> Lens s t a' b'\ncompLens (Lens l1 r1) (Lens l2 r2) = Lens l3 r3\n  where\n    l3 = assoc' . bimap id l1 . l2\n    r3 = r2 . bimap id r1 . assoc\n\n-- The associators of the product functor\nassoc :: ((c, c'), b') -> (c, (c', b'))\nassoc ((c, c'), b') = (c, (c', b'))\n\nassoc' :: (c, (c', a')) -> ((c, c'), a')\nassoc' (c, (c', a')) = ((c, c'), a')\n\nclass Bifunctor f where\n  bimap :: (a -> a') -> (b -> b') -> f a b -> f a' b'\n\ninstance Bifunctor (,) where\n  bimap f g (a, b) = (f a, g b)\n\ndata MyList a = Empty | Cons a (MyList a)\n\nfromList :: forall a. [a] -> MyList a\nfromList = foldr Cons Empty\n\nvalami :: (a -> b) -> [a] -> MyList b\nvalami f = fromList . (fmap f)\n")))
[client-notification] Tue Sep 20 19:44:32 2022:
(:jsonrpc "2.0" :method "workspace/didChangeConfiguration" :params
      (:settings #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                   ())))
[stderr] 2022-09-20T17:44:32.972866Z | Info | Registering IDE configuration: IdeConfiguration {workspaceFolders = fromList [NormalizedUri (-2564608804569318620) "file:///home/lukacsf/code/haskellcatthy"], clientSettings = hashed (Just (Object (fromList [])))}
[stderr] 2022-09-20T17:44:32.983430Z | Info | Cradle path: ends-coends.hs
[stderr] 2022-09-20T17:44:32.983564Z | Warning | No [cradle](https://github.com/mpickering/hie-bios#hie-bios) found for ends-coends.hs.
[stderr] Proceeding with [implicit cradle](https://hackage.haskell.org/package/implicit-hie).
[stderr] You should ignore this message, unless you see a 'Multi Cradle: No prefixes matched' error.
[server-request] (id:0) Tue Sep 20 19:44:33 2022:
(:id 0 :jsonrpc "2.0" :method "client/registerCapability" :params
     (:registrations
      [(:id "globalFileWatches" :method "workspace/didChangeWatchedFiles" :registerOptions
        (:watchers
         [(:globPattern "**/*.hs" :kind 7)
          (:globPattern "**/*.hs-boot" :kind 7)
          (:globPattern "**/*.lhs" :kind 7)
          (:globPattern "**/*.lhs-boot" :kind 7)]))]))
[client-reply] (id:0) Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :id 0 :result nil)
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "haskell-language-server version: 1.7.0.0 (GHC: 9.0.2) (PATH: /nix/store/v4rc5ddym0lsmczl07yiqsa8pnid32j4-haskell-language-server-1.7.0.0/bin/haskell-language-server)" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Directory: /home/lukacsf/code/haskellcatthy" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Starting (haskell-language-server) LSP server...\n  GhcideArguments {argsCommand = LSP, argsCwd = Nothing, argsShakeProfiling = Nothing, argsTesting = False, argsExamplePlugin = False, argsDebugOn = False, argsLogFile = Nothing, argsThreads = 0, argsProjectGhcVersion = False}\n  PluginIds: [ pragmas\n             , floskell\n             , fourmolu\n             , ormolu\n             , rename\n             , retrie\n             , callHierarchy\n             , class\n             , haddockComments\n             , eval\n             , importLens\n             , qualifyImportedNames\n             , refineImports\n             , moduleName\n             , hlint\n             , splice\n             , alternateNumberFormat\n             , selectionRange\n             , changeTypeSignature\n             , ghcide-hover-and-symbols\n             , ghcide-code-actions-imports-exports\n             , ghcide-code-actions-type-signatures\n             , ghcide-code-actions-bindings\n             , ghcide-code-actions-fill-holes\n             , ghcide-completions\n             , ghcide-type-lenses\n             , ghcide-core\n             , LSPRecorderCallback ]" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Logging heap statistics every 60.00s" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Staring LSP server...\nIf you are seeing this in a terminal, you probably should have run WITHOUT the --lsp option!" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Started LSP server in 0.00s" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Currently, HLS supports GHC 9 only partially. See [issue #297](https://github.com/haskell/haskell-language-server/issues/297) for more detail." :type 2))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Registering IDE configuration: IdeConfiguration {workspaceFolders = fromList [NormalizedUri (-2564608804569318620) \"file:///home/lukacsf/code/haskellcatthy\"], clientSettings = hashed (Just (Object (fromList [])))}" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Cradle path: ends-coends.hs" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "No [cradle](https://github.com/mpickering/hie-bios#hie-bios) found for ends-coends.hs.\nProceeding with [implicit cradle](https://hackage.haskell.org/package/implicit-hie).\nYou should ignore this message, unless you see a 'Multi Cradle: No prefixes matched' error." :type 2))
[stderr] 2022-09-20T17:44:33.188117Z | Info | Interface files cache directory: /home/lukacsf/.cache/ghcide/main-da39a3ee5e6b4b0d3255bfef95601890afd80709
[stderr] 2022-09-20T17:44:33.188337Z | Info | Making new HscEnv. In-place unit ids: [main]
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Interface files cache directory: /home/lukacsf/.cache/ghcide/main-da39a3ee5e6b4b0d3255bfef95601890afd80709" :type 3))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Making new HscEnv. In-place unit ids: [main]" :type 3))
[client-request] (id:2) Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :id 2 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 0 :character 0)))
[client-request] (id:3) Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :id 3 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 0 :character 0)))
[server-reply] (id:3) Tue Sep 20 19:44:33 2022:
(:id 3 :jsonrpc "2.0" :result
     [])
[server-reply] (id:2) Tue Sep 20 19:44:33 2022:
(:id 2 :jsonrpc "2.0" :result nil)
[server-request] (id:1) Tue Sep 20 19:44:33 2022:
(:id 1 :jsonrpc "2.0" :method "window/workDoneProgress/create" :params
     (:token "14"))
[client-reply] (id:1) Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :id 1 :result nil)
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "$/progress" :params
      (:token "14" :value
          (:kind "begin" :title "Indexing")))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "$/progress" :params
      (:token "14" :value
          (:kind "report" :message " (0/1)...")))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "textDocument/publishDiagnostics" :params
      (:diagnostics
       [(:code "refact:Avoid lambda using `infix`" :message "Avoid lambda using `infix`\nFound:\n  (\\ h -> fmap h fa)\nWhy not:\n  (`fmap` fa)\n" :range
           (:end
            (:character 35 :line 73)
            :start
            (:character 18 :line 73))
           :severity 3 :source "hlint")
        (:code "refact:Use second" :message "Use second\nFound:\n  bimap id l1\nWhy not:\n  second l1\n" :range
           (:end
            (:character 29 :line 151)
            :start
            (:character 18 :line 151))
           :severity 3 :source "hlint")
        (:code "refact:Use second" :message "Use second\nFound:\n  bimap id r1\nWhy not:\n  second r1\n" :range
           (:end
            (:character 25 :line 152)
            :start
            (:character 14 :line 152))
           :severity 3 :source "hlint")
        (:code "refact:Redundant bracket" :message "Redundant bracket\nFound:\n  fromList . (fmap f)\nWhy not:\n  fromList . fmap f\n" :range
           (:end
            (:character 30 :line 173)
            :start
            (:character 22 :line 173))
           :severity 3 :source "hlint")]
       :uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0))
[server-notification] Tue Sep 20 19:44:33 2022:
(:jsonrpc "2.0" :method "$/progress" :params
      (:token "14" :value
          (:kind "end" :message "Finished indexing 1 files")))
[client-request] (id:4) Tue Sep 20 19:44:34 2022:
(:jsonrpc "2.0" :id 4 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 174 :character 0)))
[client-request] (id:5) Tue Sep 20 19:44:34 2022:
(:jsonrpc "2.0" :id 5 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 174 :character 0)))
[server-reply] (id:4) Tue Sep 20 19:44:34 2022:
(:id 4 :jsonrpc "2.0" :result nil)
[server-reply] (id:5) Tue Sep 20 19:44:34 2022:
(:id 5 :jsonrpc "2.0" :result
     [])
[client-request] (id:6) Tue Sep 20 19:44:36 2022:
(:jsonrpc "2.0" :id 6 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[client-request] (id:7) Tue Sep 20 19:44:36 2022:
(:jsonrpc "2.0" :id 7 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[server-reply] (id:6) Tue Sep 20 19:44:36 2022:
(:id 6 :jsonrpc "2.0" :result
     (:contents
      (:kind "markdown" :value "\n```haskell\nfromList :: forall a. [a] -> MyList a\n```\n\n*Defined at /home/lukacsf/code/haskellcatthy/ends-coends.hs:171:1*\n")
      :range
      (:end
       (:character 8 :line 169)
       :start
       (:character 0 :line 169))))
[server-reply] (id:7) Tue Sep 20 19:44:36 2022:
(:id 7 :jsonrpc "2.0" :result
     [(:kind 2 :range
         (:end
          (:character 8 :line 169)
          :start
          (:character 0 :line 169)))
      (:kind 3 :range
         (:end
          (:character 8 :line 170)
          :start
          (:character 0 :line 170)))
      (:kind 2 :range
         (:end
          (:character 19 :line 173)
          :start
          (:character 11 :line 173)))])
[client-request] (id:8) Tue Sep 20 19:44:44 2022:
(:jsonrpc "2.0" :id 8 :method "textDocument/rename" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)
       :newName "toMyList"))
[server-reply] (id:8) Tue Sep 20 19:44:44 2022:
(:id 8 :jsonrpc "2.0" :result
     (:documentChanges
      [(:edits
    [(:newText "toMyList :: forall a. [a] -> MyList a\ntoMyList = foldr Cons Empty" :range
           (:end
            (:character 27 :line 170)
            :start
            (:character 0 :line 169)))
     (:newText "valami f = toMyList . (fmap f)" :range
           (:end
            (:character 30 :line 173)
            :start
            (:character 0 :line 173)))]
    :textDocument
    (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0))]))
[internal] (id:9) Tue Sep 20 19:44:44 2022:
(:deferring :textDocument/hover :id 9 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[internal] (id:10) Tue Sep 20 19:44:44 2022:
(:deferring :textDocument/documentHighlight :id 10 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[client-notification] Tue Sep 20 19:44:45 2022:
(:jsonrpc "2.0" :method "textDocument/didChange" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 2)
       :contentChanges
       [(:range
         (:start
          (:line 173 :character 0)
          :end
          (:line 173 :character 30))
         :rangeLength 30 :text "valami f = toMyList . (fmap f)")
        (:range
         (:start
          (:line 169 :character 0)
          :end
          (:line 170 :character 27))
         :rangeLength 65 :text "toMyList :: forall a. [a] -> MyList a\ntoMyList = foldr Cons Empty")]))
[internal] Tue Sep 20 19:44:45 2022:
(:maybe-run-deferred
 (9 10))
[client-request] (id:9) Tue Sep 20 19:44:45 2022:
(:jsonrpc "2.0" :id 9 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[client-request] (id:10) Tue Sep 20 19:44:45 2022:
(:jsonrpc "2.0" :id 10 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[server-reply] (id:10) Tue Sep 20 19:44:45 2022:
(:id 10 :jsonrpc "2.0" :result
     [])
[server-reply] (id:9) Tue Sep 20 19:44:45 2022:
(:id 9 :jsonrpc "2.0" :result nil)
[server-notification] Tue Sep 20 19:44:45 2022:
(:jsonrpc "2.0" :method "textDocument/publishDiagnostics" :params
      (:diagnostics
       [(:code "refact:Avoid lambda using `infix`" :message "Avoid lambda using `infix`\nFound:\n  (\\ h -> fmap h fa)\nWhy not:\n  (`fmap` fa)\n" :range
           (:end
            (:character 35 :line 73)
            :start
            (:character 18 :line 73))
           :severity 3 :source "hlint")
        (:code "refact:Use second" :message "Use second\nFound:\n  bimap id l1\nWhy not:\n  second l1\n" :range
           (:end
            (:character 29 :line 151)
            :start
            (:character 18 :line 151))
           :severity 3 :source "hlint")
        (:code "refact:Use second" :message "Use second\nFound:\n  bimap id r1\nWhy not:\n  second r1\n" :range
           (:end
            (:character 25 :line 152)
            :start
            (:character 14 :line 152))
           :severity 3 :source "hlint")
        (:code "refact:Redundant bracket" :message "Redundant bracket\nFound:\n  toMyList . (fmap f)\nWhy not:\n  toMyList . fmap f\n" :range
           (:end
            (:character 30 :line 173)
            :start
            (:character 22 :line 173))
           :severity 3 :source "hlint")]
       :uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 2))
[internal] (id:9) Tue Sep 20 19:44:54 2022:
(:timed-out :textDocument/hover :id 9 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[internal] (id:10) Tue Sep 20 19:44:54 2022:
(:timed-out :textDocument/documentHighlight :id 10 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[client-request] (id:11) Tue Sep 20 19:44:59 2022:
(:jsonrpc "2.0" :id 11 :method "textDocument/rename" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)
       :newName "fromListToMyList"))
[server-reply] (id:11) Tue Sep 20 19:44:59 2022:
(:id 11 :jsonrpc "2.0" :result
     (:documentChanges
      [(:edits
    [(:newText "fromListToMyList :: forall a. [a] -> MyList a\nfromListToMyList = foldr Cons Empty" :range
           (:end
            (:character 27 :line 170)
            :start
            (:character 0 :line 169)))
     (:newText "valami f = fromListToMyList . (fmap f)" :range
           (:end
            (:character 30 :line 173)
            :start
            (:character 0 :line 173)))]
    :textDocument
    (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0))]))
[client-request] (id:12) Tue Sep 20 19:44:59 2022:
(:jsonrpc "2.0" :id 12 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[client-request] (id:13) Tue Sep 20 19:44:59 2022:
(:jsonrpc "2.0" :id 13 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[server-reply] (id:12) Tue Sep 20 19:44:59 2022:
(:id 12 :jsonrpc "2.0" :result
     (:contents
      (:kind "markdown" :value "\n```haskell\ntoMyList :: forall a. [a] -> MyList a\n```\n\n*Defined at /home/lukacsf/code/haskellcatthy/ends-coends.hs:171:1*\n")
      :range
      (:end
       (:character 8 :line 169)
       :start
       (:character 0 :line 169))))
[server-reply] (id:13) Tue Sep 20 19:44:59 2022:
(:id 13 :jsonrpc "2.0" :result
     [(:kind 2 :range
         (:end
          (:character 8 :line 169)
          :start
          (:character 0 :line 169)))
      (:kind 3 :range
         (:end
          (:character 8 :line 170)
          :start
          (:character 0 :line 170)))
      (:kind 2 :range
         (:end
          (:character 19 :line 173)
          :start
          (:character 11 :line 173)))])

Backtrace (mandatory, unless no error message seen or heard):

There is no error message

Recipe

  1. How is Emacs started? I started it from xterm with the command emacs -Q

  2. Where does the language server executable live in your machine and how should it be installed? I installed it using nix. It is located at /run/current-system/sw/bin/haskell-language-server

  3. What project files are needed to demonstrate the problem? Please don't say "just open any Zglorb source file". It is a simple git repo with only Haskell (.hs) files in it. There isn't really a project structure, just a bunch of files.

  4. How is Emacs operated/configured before you invoke Eglot? When I tried to reproduce the issue I created and evaluated the following elisp file:

    
    (require 'package)

(setq package-archives '(("elpa" . "https://elpa.gnu.org/packages/") ("melpa" . "https://melpa.org/packages/")))

(package-initialize) (unless package-archive-contents (package-refresh-contents))

(unless (package-installed-p 'use-package) (package-install 'use-package)) (require 'use-package)

(use-package eglot)

(use-package haskell-mode :hook (haskell-mode . eglot-ensure))


5. How is Emacs operated _after_ you invoke Eglot
I simply open a haskell file from the repo.

6. What actions must be taken for the problem to manifest itself?
I try to rename a function twice in a row.
7. What is the expected behaviour?
The ```eglot-rename``` command should be performed both times.
8. What is the observed behaviour?
The second one fails with this error message:

jsonrpc-error: jsonrpc-error: "Edits on ‘ends-coends.hs’ require version 0, you have 2", (jsonrpc-error-code . 32603), (jsonrpc-error-message . "Edits on ‘ends-coends.hs’ require version 0, you have 2")


If I run ```eglot-reconnect```, then it works again, once.
joaotavora commented 2 years ago

What project files are needed to demonstrate the problem? Please don't say "just open any Zglorb source file". It is a simple git repo with only Haskell (.hs) files in it. There isn't really a project structure, just a bunch of files.

And can we have a link to this simple git repo> The point of these questions are not to drill you, but to obtain information on how the problem can be reproduced on this side.

Maybe I can to reproduce this, even though haskell-language-server on my arch machine will eat about 1Gig which I can't really spare right now.

joaotavora commented 2 years ago

The second one fails with this error message:

This is very odd. In the log you posted I see two renames, and they both seem to succeed. I don't see the error message in the transcript.

Please try again, and edit the transcript to show the events spanning the two renames including the purportedly erronous rename.

Also note that before asking the server to rename again, you normally have to give it some time to process the changes proceeding from the first rename.

eth0rnhill commented 2 years ago

Thank you for your quick reply. The repo can be found here: https://codeberg.org/lukacsf/haskellcatthy

I tried it again, this time with toggle-debug-on-error, and this is the backtrace:

Debugger entered--Lisp error: (jsonrpc-error "Edits on ‘ends-coends.hs’ require version 0, you h..." (jsonrpc-error-code . 32603) (jsonrpc-error-message . "Edits on ‘ends-coends.hs’ require version 0, you h..."))
  signal(jsonrpc-error ("Edits on ‘ends-coends.hs’ require version 0, you h..." (jsonrpc-error-code . 32603) (jsonrpc-error-message . "Edits on ‘ends-coends.hs’ require version 0, you h...")))
  jsonrpc-error("Edits on `%s' require version %d, you have %d" #<buffer ends-coends.hs> 0 2)
  eglot--apply-text-edits([(:newText "valamiMas :: (a -> b) -> [a] -> MyList b\nvalamiMas..." :range (:end (:character 28 :line 173) :start (:character 0 :line 172)))] 0)
  eglot--apply-workspace-edit((:documentChanges [(:edits [(:newText "valamiMas :: (a -> b) -> [a] -> MyList b\nvalamiMas..." :range (:end (:character 28 :line 173) :start (:character 0 :line 172)))] :textDocument (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coend..." :version 0))]) nil)
  eglot-rename("valamiMas")
  funcall-interactively(eglot-rename "valamiMas")
  call-interactively(eglot-rename record nil)
  command-execute(eglot-rename record)
  execute-extended-command(nil "eglot-rename" "eglot-ren")
  funcall-interactively(execute-extended-command nil "eglot-rename" "eglot-ren")
  call-interactively(execute-extended-command nil nil)
  command-execute(execute-extended-command)

I tried waiting, but unless I run eglot-reconnect, every editing command keeps failing.

Please try again, and edit the transcript to show the events spanning the two renames including the purportedly erronous rename.

I'm not entirely sure what you mean by this, but I ran everything again, and this is what came out. I only performed 2 LSP actions, both of them were renames (of two different function names) and the second one failed. I can't find anything that looks like an error in the transcript either, nonetheless I do get the error I included above, and the renaming doesn't take place.

[internal] Tue Sep 20 20:04:09 2022:
(:message "Running language server: (haskell-language-server-wrapper --lsp)")
[client-request] (id:1) Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :id 1 :method "initialize" :params
      (:processId 349863 :rootPath "/home/lukacsf/code/haskellcatthy/" :rootUri "file:///home/lukacsf/code/haskellcatthy" :initializationOptions #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                                                                                   ())
              :capabilities
              (:workspace
               (:applyEdit t :executeCommand
                   (:dynamicRegistration :json-false)
                   :workspaceEdit
                   (:documentChanges t)
                   :didChangeWatchedFiles
                   (:dynamicRegistration t)
                   :symbol
                   (:dynamicRegistration :json-false)
                   :configuration t :workspaceFolders t)
               :textDocument
               (:synchronization
            (:dynamicRegistration :json-false :willSave t :willSaveWaitUntil t :didSave t)
            :completion
            (:dynamicRegistration :json-false :completionItem
                          (:snippetSupport :json-false :deprecatedSupport t :tagSupport
                                   (:valueSet
                                [1]))
                          :contextSupport t)
            :hover
            (:dynamicRegistration :json-false :contentFormat
                          ["markdown" "plaintext"])
            :signatureHelp
            (:dynamicRegistration :json-false :signatureInformation
                          (:parameterInformation
                           (:labelOffsetSupport t)
                           :activeParameterSupport t))
            :references
            (:dynamicRegistration :json-false)
            :definition
            (:dynamicRegistration :json-false :linkSupport t)
            :declaration
            (:dynamicRegistration :json-false :linkSupport t)
            :implementation
            (:dynamicRegistration :json-false :linkSupport t)
            :typeDefinition
            (:dynamicRegistration :json-false :linkSupport t)
            :documentSymbol
            (:dynamicRegistration :json-false :hierarchicalDocumentSymbolSupport t :symbolKind
                          (:valueSet
                           [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26]))
            :documentHighlight
            (:dynamicRegistration :json-false)
            :codeAction
            (:dynamicRegistration :json-false :codeActionLiteralSupport
                          (:codeActionKind
                           (:valueSet
                        ["quickfix" "refactor" "refactor.extract" "refactor.inline" "refactor.rewrite" "source" "source.organizeImports"]))
                          :isPreferredSupport t)
            :formatting
            (:dynamicRegistration :json-false)
            :rangeFormatting
            (:dynamicRegistration :json-false)
            :rename
            (:dynamicRegistration :json-false)
            :publishDiagnostics
            (:relatedInformation :json-false :codeDescriptionSupport :json-false :tagSupport
                         (:valueSet
                          [1 2])))
               :experimental #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                           ()))
              :workspaceFolders
              [(:uri "file:///home/lukacsf/code/haskellcatthy" :name "~/code/haskellcatthy/")]))
[stderr] nil
[stderr] No 'hie.yaml' found. Try to discover the project type!
[stderr] Run entered for haskell-language-server-wrapper(haskell-language-server-wrapper) Version 1.7.0.0 x86_64 ghc-9.0.2
[stderr] Current directory: /home/lukacsf/code/haskellcatthy
[stderr] Operating system: linux
[stderr] Arguments: ["--lsp"]
[stderr] Cradle directory: /home/lukacsf/code/haskellcatthy
[stderr] Cradle type: Default
[stderr] 
[stderr] 
[stderr] Tool versions found on the $PATH
[stderr] cabal:     Not found
[stderr] stack:     Not found
[stderr] ghc:       9.0.2
[stderr] 
[stderr] 
[stderr] Consulting the cradle to get project GHC version...
[stderr] Project GHC version: 9.0.2
[stderr] haskell-language-server exe candidates: ["haskell-language-server-9.0.2","haskell-language-server"]
[stderr] Launching haskell-language-server exe at:/run/current-system/sw/bin/haskell-language-server-9.0.2
[stderr] nil
[stderr] 2022-09-20T18:04:09.544492Z | Info | No log file specified; using stderr.
[stderr] 2022-09-20T18:04:09.544866Z | Info | haskell-language-server version: 1.7.0.0 (GHC: 9.0.2) (PATH: /nix/store/v4rc5ddym0lsmczl07yiqsa8pnid32j4-haskell-language-server-1.7.0.0/bin/haskell-language-server)
[stderr] 2022-09-20T18:04:09.545648Z | Info | Directory: /home/lukacsf/code/haskellcatthy
[stderr] 2022-09-20T18:04:09.545978Z | Info | Starting (haskell-language-server) LSP server...
[stderr]   GhcideArguments {argsCommand = LSP, argsCwd = Nothing, argsShakeProfiling = Nothing, argsTesting = False, argsExamplePlugin = False, argsDebugOn = False, argsLogFile = Nothing, argsThreads = 0, argsProjectGhcVersion = False}
[stderr]   PluginIds: [ pragmas
[stderr]              , floskell
[stderr]              , fourmolu
[stderr]              , ormolu
[stderr]              , rename
[stderr]              , retrie
[stderr]              , callHierarchy
[stderr]              , class
[stderr]              , haddockComments
[stderr]              , eval
[stderr]              , importLens
[stderr]              , qualifyImportedNames
[stderr]              , refineImports
[stderr]              , moduleName
[stderr]              , hlint
[stderr]              , splice
[stderr]              , alternateNumberFormat
[stderr]              , selectionRange
[stderr]              , changeTypeSignature
[stderr]              , ghcide-hover-and-symbols
[stderr]              , ghcide-code-actions-imports-exports
[stderr]              , ghcide-code-actions-type-signatures
[stderr]              , ghcide-code-actions-bindings
[stderr]              , ghcide-code-actions-fill-holes
[stderr]              , ghcide-completions
[stderr]              , ghcide-type-lenses
[stderr]              , ghcide-core
[stderr]              , LSPRecorderCallback ]
[stderr] 2022-09-20T18:04:09.549376Z | Info | Logging heap statistics every 60.00s
[stderr]  2022-09-20T18:04:09.552650Z | Info | Staring LSP server...
[stderr] If you are seeing this in a terminal, you probably should have run WITHOUT the --lsp option!
[stderr] 2022-09-20T18:04:09.554212Z | Info | Started LSP server in 0.00s
[stderr] 2022-09-20T18:04:09.626804Z | Warning | Currently, HLS supports GHC 9 only partially. See [issue #297](https://github.com/haskell/haskell-language-server/issues/297) for more detail.
[server-reply] (id:1) Tue Sep 20 20:04:09 2022:
(:id 1 :jsonrpc "2.0" :result
     (:capabilities
      (:callHierarchyProvider t :codeActionProvider t :codeLensProvider
                  (:resolveProvider :json-false :workDoneProgress :json-false)
                  :colorProvider :json-false :completionProvider
                  (:resolveProvider :json-false :triggerCharacters
                        ["."])
                  :declarationProvider :json-false :definitionProvider t :documentFormattingProvider t :documentHighlightProvider t :documentRangeFormattingProvider t :documentSymbolProvider t :executeCommandProvider
                  (:commands
                   ["350907:retrie:retrieCommand" "350907:class:addMinimalMethodPlaceholders" "350907:eval:evalCommand" "350907:importLens:ImportLensCommand" "350907:refineImports:RefineImportLensCommand" "350907:moduleName:updateModuleName" "350907:hlint:applyOne" "350907:hlint:applyAll" "350907:splice:expandTHSpliceInplace" "350907:ghcide-completions:extendImport" "350907:ghcide-type-lenses:typesignature.add"])
                  :foldingRangeProvider :json-false :hoverProvider t :implementationProvider :json-false :referencesProvider t :renameProvider t :selectionRangeProvider t :semanticTokensProvider
                  (:legend
                   (:tokenModifiers
                ["declaration" "definition" "readonly" "static" "deprecated" "abstract" "async" "modification" "documentation" "defaultLibrary"]
                :tokenTypes
                ["type" "class" "enum" "interface" "struct" "typeParameter" "parameter" "variable" "property" "enumMember" "event" "function" "method" "macro" "keyword" "modifier" "comment" "string" "number" "regexp" "operator"]))
                  :textDocumentSync
                  (:change 2 :openClose t :save nil)
                  :typeDefinitionProvider t :workspace
                  (:workspaceFolders
                   (:changeNotifications t :supported t))
                  :workspaceSymbolProvider t)))
[client-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "initialized" :params #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                                ()))
[client-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "textDocument/didOpen" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0 :languageId "haskell" :text "{-# LANGUAGE GADTs #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TupleSections #-}\n\n-- Ends and Coends\n\nclass Profunctor f where\n  dimap :: (a' -> a) -> (b -> b') -> (f a b -> f a' b')\n\ninstance Profunctor (->) where\n  dimap f g h = g . h . f\n\n-- We want to be able to compose profunctors\n-- Composition in this case means the following. Given two profunctors P and\n-- Q, the set P<a,b> is the proposition that a and b are related via P. Similarly\n-- for Q. Consequently, the set (PQ)(<a,b>) means that a and b are related via the\n-- two profunctors. So basically we are dealing with composition of relations.\n-- Now given two relations, P and Q, we have a(PQ)b iff there exists an x such\n-- that aPxQb.\n\n-- This is an existential type, meaning that in fact we are looking for an x st.\n-- q a x and p x b make sense, i.e. the types are nonempty\ndata Procompose p q a b where\n  -- To construct the composite, we need witness that the aforementioned x exists.\n  Procompose :: q a x -> p x b -> Procompose p q a b\n\n-- This is indeed results in a Profunctor\ninstance (Profunctor q, Profunctor p) => Profunctor (Procompose p q) where\n  dimap l r (Procompose qax pxb) = Procompose (dimap l id qax) (dimap id r pxb)\n\n-- This is similar to the mapOut function of the sum type: there we needed a\n-- function for each member of the sum, then a finite amount. Here, the situation\n-- is the same, but for infinitely many members.\nmapOut :: (forall x. q a x -> p x b -> c) -> (Procompose p q a b -> c)\nmapOut f (Procompose qax pxb) = f qax pxb\n\ndata Coend p where\n  Coend :: p x x -> Coend p\n\n-- Ex. 12.2.1.\nnewtype ProPair q p a b x y = ProPair (q a y, p x b)\n\ninstance (Profunctor p, Profunctor q) => Profunctor (ProPair q p a b) where\n  dimap l r (ProPair (qay, pxb)) = ProPair (dimap id r qay, dimap l id pxb)\n\n-- Ex. 17.2.2.\nnewtype CoEndCompose p q a b = CoEndCompose (Coend (ProPair q p a b))\n\ninstance (Profunctor p, Profunctor q) => Profunctor (CoEndCompose p q) where\n  -- Coend (ProPair q p a b) = ProPair q p a b x x = ProPair (q a x, p x b)\n  dimap l r (CoEndCompose (Coend (ProPair (qax, pxb)))) =\n    CoEndCompose $ Coend $ ProPair (dimap l id qax, dimap id r pxb)\n\n-- Ends\n\ntype End p = forall x. p x x\n\nnewtype ProF f g a b = ProF (f a -> g b)\n\ninstance (Functor f, Functor g) => Profunctor (ProF f g) where\n  dimap l r (ProF h) = ProF $ fmap r . h . fmap l\n\n-- This is in fact category theoretically correct:\n-- myHead :: End (ProF [] Maybe)\n-- myHead [] = Nothing\n-- myHead (x : xs) = Just x\n\nnewtype Yo f a x y = Yo ((a -> x) -> f y)\n\nyoneda :: Functor f => End (Yo f a) -> f a\nyoneda (Yo alpha) = alpha id\n\nyonedaInv :: Functor f => f a -> End (Yo f a)\nyonedaInv fa = Yo (\\h -> fmap h fa)\n\ndata CoY f a x y = CoY (x -> a) (f y)\n\ncoyoneda :: Functor f => Coend (CoY f a) -> f a\ncoyoneda (Coend (CoY g fa)) = fmap g fa\n\ncoyonedaInv :: Functor f => f a -> Coend (CoY f a)\ncoyonedaInv fa = Coend (CoY id fa)\n\n-- Ex 17.7.1.\ndata Day f g x where\n  Day :: ((a, b) -> x) -> f a -> g b -> Day f g x\n\ninstance (Functor f, Functor g) => Functor (Day f g) where\n  fmap f (Day h fa gb) = Day (f . h) fa gb\n\n-- Free Applicatives\n\ndata FreeA f x where\n  DoneA :: x -> FreeA f x\n  MoreA :: ((a, b) -> x) -> f a -> FreeA f b -> FreeA f x\n\nclass Monoidal f where\n  unit :: f ()\n  (>*<) :: f a -> f b -> f (a, b)\n\ninstance Functor f => Monoidal (FreeA f) where\n  unit = DoneA ()\n  (DoneA x) >*< fry = fmap (x,) fry\n  (MoreA abx fa frb) >*< fry = MoreA (reassoc abx) fa (frb >*< fry)\n\nreassoc :: ((a, b) -> x) -> (a, (b, y)) -> (x, y)\nreassoc abx (a, (b, y)) = (abx (a, b), y)\n\ninstance Functor f => Applicative (FreeA f) where\n  pure = DoneA\n  ff <*> fx = fmap app (ff >*< fx)\n\napp :: (a -> b, a) -> b\napp (f, x) = f x\n\ninstance Functor f => Functor (FreeA f) where\n  fmap f (DoneA x) = DoneA $ f x\n  fmap f (MoreA abx fa frb) = MoreA (f . abx) fa frb\n\n-- Monads in the bicategory of profunctors\nclass Profunctor p => PreArrow p where\n  (>>>) :: p a x -> p x b -> p a b\n  arr :: (a -> b) -> p a b\n\n-- Lenses\n\ndata Lens' s a where\n  Lens' :: (s -> (c, a), (c, a) -> s) -> Lens' s a\n\ntoGet' :: Lens' s a -> (s -> a)\ntoGet' (Lens' (l, r)) = snd . l\n\ntoSet' :: Lens' s a -> (s -> a -> s)\ntoSet' (Lens' (l, r)) s a = r (fst $ l s, a)\n\n-- Type-changing lens\ndata Lens s t a b where\n  Lens :: (s -> (c, a)) -> ((c, b) -> t) -> Lens s t a b\n\ntoGet :: Lens s t a b -> (s -> a)\ntoGet (Lens l r) = snd . l\n\ntoSet :: Lens s t a b -> (s -> b -> t)\ntoSet (Lens l r) s b = r (fst $ l s, b)\n\nprodLens :: Lens (c, a) (c, b) a b\nprodLens = Lens id id\n\ncompLens :: Lens a b a' b' -> Lens s t a b -> Lens s t a' b'\ncompLens (Lens l1 r1) (Lens l2 r2) = Lens l3 r3\n  where\n    l3 = assoc' . bimap id l1 . l2\n    r3 = r2 . bimap id r1 . assoc\n\n-- The associators of the product functor\nassoc :: ((c, c'), b') -> (c, (c', b'))\nassoc ((c, c'), b') = (c, (c', b'))\n\nassoc' :: (c, (c', a')) -> ((c, c'), a')\nassoc' (c, (c', a')) = ((c, c'), a')\n\nclass Bifunctor f where\n  bimap :: (a -> a') -> (b -> b') -> f a b -> f a' b'\n\ninstance Bifunctor (,) where\n  bimap f g (a, b) = (f a, g b)\n\ndata MyList a = Empty | Cons a (MyList a)\n\nfromList :: forall a. [a] -> MyList a\nfromList = foldr Cons Empty\n\nvalami :: (a -> b) -> [a] -> MyList b\nvalami f = fromList . fmap f\n")))
[client-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "workspace/didChangeConfiguration" :params
      (:settings #s(hash-table size 1 test eql rehash-size 1.5 rehash-threshold 0.8125 data
                   ())))
[stderr] 2022-09-20T18:04:09.627239Z | Info | Registering IDE configuration: IdeConfiguration {workspaceFolders = fromList [NormalizedUri (-2564608804569318620) "file:///home/lukacsf/code/haskellcatthy"], clientSettings = hashed (Just (Object (fromList [])))}
[stderr] 2022-09-20T18:04:09.637583Z | Info | Cradle path: ends-coends.hs
[stderr] 2022-09-20T18:04:09.637766Z | Warning | No [cradle](https://github.com/mpickering/hie-bios#hie-bios) found for ends-coends.hs.
[stderr] Proceeding with [implicit cradle](https://hackage.haskell.org/package/implicit-hie).
[stderr] You should ignore this message, unless you see a 'Multi Cradle: No prefixes matched' error.
[server-request] (id:0) Tue Sep 20 20:04:09 2022:
(:id 0 :jsonrpc "2.0" :method "client/registerCapability" :params
     (:registrations
      [(:id "globalFileWatches" :method "workspace/didChangeWatchedFiles" :registerOptions
        (:watchers
         [(:globPattern "**/*.hs" :kind 7)
          (:globPattern "**/*.hs-boot" :kind 7)
          (:globPattern "**/*.lhs" :kind 7)
          (:globPattern "**/*.lhs-boot" :kind 7)]))]))
[client-reply] (id:0) Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :id 0 :result nil)
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "haskell-language-server version: 1.7.0.0 (GHC: 9.0.2) (PATH: /nix/store/v4rc5ddym0lsmczl07yiqsa8pnid32j4-haskell-language-server-1.7.0.0/bin/haskell-language-server)" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Directory: /home/lukacsf/code/haskellcatthy" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Starting (haskell-language-server) LSP server...\n  GhcideArguments {argsCommand = LSP, argsCwd = Nothing, argsShakeProfiling = Nothing, argsTesting = False, argsExamplePlugin = False, argsDebugOn = False, argsLogFile = Nothing, argsThreads = 0, argsProjectGhcVersion = False}\n  PluginIds: [ pragmas\n             , floskell\n             , fourmolu\n             , ormolu\n             , rename\n             , retrie\n             , callHierarchy\n             , class\n             , haddockComments\n             , eval\n             , importLens\n             , qualifyImportedNames\n             , refineImports\n             , moduleName\n             , hlint\n             , splice\n             , alternateNumberFormat\n             , selectionRange\n             , changeTypeSignature\n             , ghcide-hover-and-symbols\n             , ghcide-code-actions-imports-exports\n             , ghcide-code-actions-type-signatures\n             , ghcide-code-actions-bindings\n             , ghcide-code-actions-fill-holes\n             , ghcide-completions\n             , ghcide-type-lenses\n             , ghcide-core\n             , LSPRecorderCallback ]" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Logging heap statistics every 60.00s" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Staring LSP server...\nIf you are seeing this in a terminal, you probably should have run WITHOUT the --lsp option!" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Started LSP server in 0.00s" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Currently, HLS supports GHC 9 only partially. See [issue #297](https://github.com/haskell/haskell-language-server/issues/297) for more detail." :type 2))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Registering IDE configuration: IdeConfiguration {workspaceFolders = fromList [NormalizedUri (-2564608804569318620) \"file:///home/lukacsf/code/haskellcatthy\"], clientSettings = hashed (Just (Object (fromList [])))}" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Cradle path: ends-coends.hs" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "No [cradle](https://github.com/mpickering/hie-bios#hie-bios) found for ends-coends.hs.\nProceeding with [implicit cradle](https://hackage.haskell.org/package/implicit-hie).\nYou should ignore this message, unless you see a 'Multi Cradle: No prefixes matched' error." :type 2))
[stderr] 2022-09-20T18:04:09.830934Z | Info | Interface files cache directory: /home/lukacsf/.cache/ghcide/main-da39a3ee5e6b4b0d3255bfef95601890afd80709
[stderr] 2022-09-20T18:04:09.831170Z | Info | Making new HscEnv. In-place unit ids: [main]
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Interface files cache directory: /home/lukacsf/.cache/ghcide/main-da39a3ee5e6b4b0d3255bfef95601890afd80709" :type 3))
[server-notification] Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :method "window/logMessage" :params
      (:message "Making new HscEnv. In-place unit ids: [main]" :type 3))
[client-request] (id:2) Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :id 2 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 0 :character 0)))
[client-request] (id:3) Tue Sep 20 20:04:09 2022:
(:jsonrpc "2.0" :id 3 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 0 :character 0)))
[server-reply] (id:3) Tue Sep 20 20:04:09 2022:
(:id 3 :jsonrpc "2.0" :result
     [])
[server-reply] (id:2) Tue Sep 20 20:04:09 2022:
(:id 2 :jsonrpc "2.0" :result nil)
[server-request] (id:1) Tue Sep 20 20:04:10 2022:
(:id 1 :jsonrpc "2.0" :method "window/workDoneProgress/create" :params
     (:token "14"))
[client-reply] (id:1) Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :id 1 :result nil)
[server-notification] Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :method "$/progress" :params
      (:token "14" :value
          (:kind "begin" :title "Indexing")))
[server-notification] Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :method "$/progress" :params
      (:token "14" :value
          (:kind "report" :message " (0/1)...")))
[server-notification] Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :method "textDocument/publishDiagnostics" :params
      (:diagnostics
       [(:code "refact:Avoid lambda using `infix`" :message "Avoid lambda using `infix`\nFound:\n  (\\ h -> fmap h fa)\nWhy not:\n  (`fmap` fa)\n" :range
           (:end
            (:character 35 :line 73)
            :start
            (:character 18 :line 73))
           :severity 3 :source "hlint")
        (:code "refact:Use second" :message "Use second\nFound:\n  bimap id l1\nWhy not:\n  second l1\n" :range
           (:end
            (:character 29 :line 151)
            :start
            (:character 18 :line 151))
           :severity 3 :source "hlint")
        (:code "refact:Use second" :message "Use second\nFound:\n  bimap id r1\nWhy not:\n  second r1\n" :range
           (:end
            (:character 25 :line 152)
            :start
            (:character 14 :line 152))
           :severity 3 :source "hlint")]
       :uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0))
[server-notification] Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :method "$/progress" :params
      (:token "14" :value
          (:kind "end" :message "Finished indexing 1 files")))
[client-request] (id:4) Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :id 4 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 174 :character 0)))
[client-request] (id:5) Tue Sep 20 20:04:10 2022:
(:jsonrpc "2.0" :id 5 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 174 :character 0)))
[server-reply] (id:4) Tue Sep 20 20:04:10 2022:
(:id 4 :jsonrpc "2.0" :result nil)
[server-reply] (id:5) Tue Sep 20 20:04:10 2022:
(:id 5 :jsonrpc "2.0" :result
     [])
[client-request] (id:6) Tue Sep 20 20:04:12 2022:
(:jsonrpc "2.0" :id 6 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[client-request] (id:7) Tue Sep 20 20:04:12 2022:
(:jsonrpc "2.0" :id 7 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[server-reply] (id:6) Tue Sep 20 20:04:12 2022:
(:id 6 :jsonrpc "2.0" :result
     (:contents
      (:kind "markdown" :value "\n```haskell\nfromList :: forall a. [a] -> MyList a\n```\n\n*Defined at /home/lukacsf/code/haskellcatthy/ends-coends.hs:171:1*\n")
      :range
      (:end
       (:character 8 :line 169)
       :start
       (:character 0 :line 169))))
[server-reply] (id:7) Tue Sep 20 20:04:12 2022:
(:id 7 :jsonrpc "2.0" :result
     [(:kind 2 :range
         (:end
          (:character 8 :line 169)
          :start
          (:character 0 :line 169)))
      (:kind 3 :range
         (:end
          (:character 8 :line 170)
          :start
          (:character 0 :line 170)))
      (:kind 2 :range
         (:end
          (:character 19 :line 173)
          :start
          (:character 11 :line 173)))])
[client-request] (id:8) Tue Sep 20 20:04:19 2022:
(:jsonrpc "2.0" :id 8 :method "textDocument/rename" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)
       :newName "toMyList"))
[server-reply] (id:8) Tue Sep 20 20:04:19 2022:
(:id 8 :jsonrpc "2.0" :result
     (:documentChanges
      [(:edits
    [(:newText "toMyList :: forall a. [a] -> MyList a\ntoMyList = foldr Cons Empty" :range
           (:end
            (:character 27 :line 170)
            :start
            (:character 0 :line 169)))
     (:newText "valami f = toMyList . fmap f" :range
           (:end
            (:character 28 :line 173)
            :start
            (:character 0 :line 173)))]
    :textDocument
    (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0))]))
[internal] (id:9) Tue Sep 20 20:04:19 2022:
(:deferring :textDocument/hover :id 9 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[internal] (id:10) Tue Sep 20 20:04:19 2022:
(:deferring :textDocument/documentHighlight :id 10 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[client-notification] Tue Sep 20 20:04:20 2022:
(:jsonrpc "2.0" :method "textDocument/didChange" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 2)
       :contentChanges
       [(:range
         (:start
          (:line 173 :character 0)
          :end
          (:line 173 :character 28))
         :rangeLength 28 :text "valami f = toMyList . fmap f")
        (:range
         (:start
          (:line 169 :character 0)
          :end
          (:line 170 :character 27))
         :rangeLength 65 :text "toMyList :: forall a. [a] -> MyList a\ntoMyList = foldr Cons Empty")]))
[internal] Tue Sep 20 20:04:20 2022:
(:maybe-run-deferred
 (9 10))
[client-request] (id:9) Tue Sep 20 20:04:20 2022:
(:jsonrpc "2.0" :id 9 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[client-request] (id:10) Tue Sep 20 20:04:20 2022:
(:jsonrpc "2.0" :id 10 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 169 :character 0)))
[server-reply] (id:9) Tue Sep 20 20:04:20 2022:
(:id 9 :jsonrpc "2.0" :result nil)
[server-reply] (id:10) Tue Sep 20 20:04:20 2022:
(:id 10 :jsonrpc "2.0" :result
     [])
[client-request] (id:11) Tue Sep 20 20:04:21 2022:
(:jsonrpc "2.0" :id 11 :method "textDocument/hover" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 172 :character 0)))
[client-request] (id:12) Tue Sep 20 20:04:21 2022:
(:jsonrpc "2.0" :id 12 :method "textDocument/documentHighlight" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 172 :character 0)))
[server-reply] (id:12) Tue Sep 20 20:04:21 2022:
(:id 12 :jsonrpc "2.0" :result
     [(:kind 2 :range
         (:end
          (:character 6 :line 172)
          :start
          (:character 0 :line 172)))
      (:kind 3 :range
         (:end
          (:character 6 :line 173)
          :start
          (:character 0 :line 173)))])
[server-reply] (id:11) Tue Sep 20 20:04:21 2022:
(:id 11 :jsonrpc "2.0" :result
     (:contents
      (:kind "markdown" :value "\n```haskell\nvalami :: forall a b. (a -> b) -> [a] -> MyList b\n```\n\n*Defined at /home/lukacsf/code/haskellcatthy/ends-coends.hs:174:1*\n")
      :range
      (:end
       (:character 6 :line 172)
       :start
       (:character 0 :line 172))))
[internal] (id:9) Tue Sep 20 20:04:29 2022:
(:timed-out :textDocument/hover :id 9 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[internal] (id:10) Tue Sep 20 20:04:29 2022:
(:timed-out :textDocument/documentHighlight :id 10 :params
        (:textDocument
         (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
         :position
         (:line 169 :character 0)))
[client-request] (id:13) Tue Sep 20 20:04:39 2022:
(:jsonrpc "2.0" :id 13 :method "textDocument/rename" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs")
       :position
       (:line 172 :character 0)
       :newName "valamiMas"))
[server-reply] (id:13) Tue Sep 20 20:04:39 2022:
(:id 13 :jsonrpc "2.0" :result
     (:documentChanges
      [(:edits
    [(:newText "valamiMas :: (a -> b) -> [a] -> MyList b\nvalamiMas f = toMyList . fmap f" :range
           (:end
            (:character 28 :line 173)
            :start
            (:character 0 :line 172)))]
    :textDocument
    (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 0))]))
joaotavora commented 2 years ago

I'm not entirely sure what you mean by this, but I ran everything again, and this is what came out.

Sorry, my bad. This error is being sprung by Eglot, because the server says that the edits apply to ends-coends.hs at its version 0.

"Edits on ‘ends-coends.hs’ require version 0, you have 2",

Looking closer at this, it makes sense that "you have [version] 2" because you did exactly two edits to the file since it was open (at version 0).

So I don't understand why the server says :version 0. It seems like a server bug. Maybe Eglot could be less strict about validating this, but still seems like a bug.

eth0rnhill commented 2 years ago

So I should just complain to the hls devs?

Is there an easy way to make eglot less strict about this stuff?

joaotavora commented 2 years ago

Not necessarily complain, but ask them to clarify or at least make them aware of this situation. Take the below example taken from pylsp, which behaves correctly:

(:jsonrpc "2.0" :id 15 :result
          (:documentChanges
           [(:textDocument
             (:uri "file:///home/capitaomorte/tmp/coiso.py" :version 1)
             :edits
             [(:range
               (:start
                (:line 0 :character 0)
                :end
                (:line 3 :character 0))
               :newText "def bla():\n    lets = 42\n    lets = 2")])]))

Probably sending the :version isn't even necessary and Eglot will not perform the check if it isn't present. But if you are the server are going to send one, Eglot assumes its purpose is to assure file consistency and will refuse to perform the edit. So sending an erroneous one isn't a good idea, especially if the client just informed you in the last didChange that it updated the version, like it shows in your transcript:

(:jsonrpc "2.0" :method "textDocument/didChange" :params
      (:textDocument
       (:uri "file:///home/lukacsf/code/haskellcatthy/ends-coends.hs" :version 2)
joaotavora commented 2 years ago

Is there an easy way to make eglot less strict about this stuff?

The "easy way", for now, is to patch eglot.el .... at your peril:

diff --git a/eglot.el b/eglot.el
index 718a42dbd7..4cd7e97808 100644
--- a/eglot.el
+++ b/eglot.el
@@ -3002,9 +3002,9 @@ Returns a list as described in docstring of `imenu--index-alist'."

 (defun eglot--apply-text-edits (edits &optional version)
   "Apply EDITS for current buffer if at VERSION, or if it's nil."
-  (unless (or (not version) (equal version eglot--versioned-identifier))
-    (jsonrpc-error "Edits on `%s' require version %d, you have %d"
-                   (current-buffer) version eglot--versioned-identifier))
+  ;; (unless (or (not version) (equal version eglot--versioned-identifier))
+  ;;   (jsonrpc-error "Edits on `%s' require version %d, you have %d"
+  ;;                  (current-buffer) version eglot--versioned-identifier))
   (atomic-change-group
     (let* ((change-group (prepare-change-group))
            (howmany (length edits))
jeslie0 commented 2 years ago

@eth0rnhill did you mention this to the HLS devs?

jameschensmith commented 1 year ago

Ran into this in Omnisharp Roslyn (OmniSharp/omnisharp-roslyn#2375), where the server resets the version to 0 on textDocument/didSave. You can find my analysis in the linked issue. Based on the LSP specification, it doesn't look like the version should reset on save, but I have reached out to the developer who made that change to get more details.

razzmatazz commented 1 year ago

@jameschensmith just to reply to your comment: I did not work on omnisharp-roslyn for a long time by now and I cannot provide you with a PR, omnisharp-roslyn devs should do the fix,–sorry.

And an extra note–I am getting similar problems (version out of sync when applying edits from code action) with eglot when using csharp-ls as well, so I think LSP implementation @ csharp-language-server is not fully compliant either.

juanjosegarciaripoll commented 11 months ago

Same problem here with jedi-language-server. It is so pervasive that it probably makes sense to add a flag to remove this check, right?

joaotavora commented 11 months ago

Same problem here with jedi-language-server. It is so pervasive that it probably makes sense to add a flag to remove this check, right?

The very same? Better post the event log, or at least the relevant parts, to make sure.

juanjosegarciaripoll commented 11 months ago

I get the same error message, which is solved similarly by reconnecting.

eglot--apply-text-edits: jsonrpc-error: "Edits on ‘cross.py’ require version 0, you have 16", (jsonrpc-error-code . 32603), (jsonrpc-error-message . "Edits on ‘cross.py’ require version 0, you have 16")

I don't manage to do the same bug report as above, as the eglot-events-buffer does not record anything, only the reconnect events.

joaotavora commented 11 months ago

I don't manage to do the same bug report as above, as the eglot-events-buffer does not record anything, only the reconnect events.

That's very odd, unless you have set eglot-events-buffer-size to a very low value or 0 (in which case it's perfectly understandable). If that's the case, please reset eglot-events-buffer-size to its normal value, and report its contents here.

It is of course possible to set a flag to avoid this server-bug, or simply to interpret "0" as skipping the check. But I'd also like to know if the LS server developers of the problematic are aware of this issue. Have you reported this to jedi-language-server?

juanjosegarciaripoll commented 11 months ago

No, the eglot-events-buffer-size has the default value which is quite large. What should I report specifically to jedi-language-server if it is not possible to record the problem from eglot?

joaotavora commented 11 months ago

if it is not possible to record the problem from eglot?

Well, it should be, it really should. So if it's like you say, you're looking at an Eglot bug, in which case I would ask you to try to give me a simple reproduction recipe, like described https://joaotavora.github.io/eglot/#Troubleshooting-Eglot

Maybe just fill something out like this?

# install jedi-language-server (but how?)

/path/to/emacs-master/src/emacs -Q some-python-file.py -f eglot`

; in emacs, whatever you do to start the server, do x, y, z then go to the eglot events buffer and find it completely empty.

Be sure to try out your own recipe after writing it! And thanks in advance.