nwolverson/vscode-ide-purescript

No definition found for

milesfrain opened this issue · 16 comments

I'm having issues with unreliable [F12] - go to definition behavior. I tried various rebuilds and IDE restarts with no success.

In one of my projects:

  • F12 on functions from spago-installed modules produces a No definition found for ... error.
  • F12 on functions from local modules works.
  • "Hover for definition" and autocomplete work for all functions.

In another project:

  • F12 works on functions from both local and spago-installed modules.

I believe each project is configured similarly. I could go down a troubleshooting path of bisecting differences between each project, but would rather troubleshoot this more directly.

Is there a dev guide with workflow tips to help me get to the root of this problem quickly?
Edit: Found dev guide in language-server repo. Perhaps this should be linked to from this repo: https://github.com/nwolverson/purescript-language-server/blob/master/README.md#development

Did you set the addSpagoSources setting in both cases? That's what lets the language server know about the location of spago installed dependencies.

Yes, that setting is enabled in both cases (set globally via user settings).

Interestingly, the previously-broken project now works. Only difference I can think of is that my machine was suspended overnight.

But it would be great to gain some more insight into what leads to these No definition found errors because this happens fairly regularly, and right now it just seems like random chance whether I'll have all IDE features working on any given day.

I also notice lots of purs ide server processes running even after all vscode instances are shut down. Not sure if that's related.

Go to definition is linked to the source file globs that purs ide server is started with, so any installed packages after starting the server etc will not be picked up - you can see if the command line is correct on the running instance.

Lots of servers running sounds bad - are you on windows by any chance? A close command is issued on shutdown but these should otherwise exit by virtue of their parent going away

are you on windows by any chance?

Ubuntu 20.04

so any installed packages after starting the server etc will not be picked up

But restarting the server within vscode should refresh things, right?

you can see if the command line is correct on the running instance.

I'll report back with logs from Output / IDE PureScript when I encounter this problem again.

But restarting the server within vscode should refresh things, right?

Yes, the restart IDE server command should refresh goto-def and friends after installing new packages

If you're able to reproduce stale purs ide server instances and create an issue for that with requisite detail, would also be appreciated, there may be either something in your setup or the way the editor closed/project closed/reloaded/whatever that is leading to the behaviour

Finally figured out how to reproduce this issue!

The summary is:

  • Clone project
  • Open in vscode - F12 works fine
  • Close and reopen project - F12 now broken

Here are the specific steps to reproduce:

git clone https://github.com/milesfrain/tps-save-gist.git
cd tps-save-gist
spago build
code .

open src/Main.purs
move cursor on to runHalogenAff
F12 - success!

purs ide process correctly points to spago paths

pgrep purs | xargs ps -ww
    PID TTY      STAT   TIME COMMAND
  24518 ?        Sl     0:14 /home/miles/.local/bin/purs ide server -p 15847 --editor-mode src/**/*.purs .spago/ace/master/src/**/*.purs .spago/aff/v5.1.2/src/**/*.purs ...

Close vscode
No dangling purs ide processes:

pgrep purs # shows nothing. Indicates successful exit.

Reopen vscode

code .

open src/Main.purs
move cursor on to runHalogenAff
F12 - failure!

purs ide uses bower paths now :(

pgrep purs | xargs ps -ww
    PID TTY      STAT   TIME COMMAND
  24980 ?        Sl     0:08 /home/miles/.local/bin/purs ide server -p 15557 src/**/*.purs bower_components/**/*.purs

Close vscode
purs ide processes still running

pgrep purs
24980

Those steps do not reproduce the issue for me. Is the parent of that purs still running? (check its ppid)

If you can reproduce the "purs ide with wrong paths" issue, please include the output window messages - it looks like for some reason the vscode config is not applied

Processes and parents.
Initial state, no purs processes running.

pgrep purs | xargs ps -f -ww

Setup:

git clone https://github.com/milesfrain/tps-save-gist.git p1
cd p1
spago build
code .

Logs in vscode.
Initial working state.

Launching new language client for file:///home/miles/temp/tt/p1
PureScript Language Server started
[Info  - 10:18:19 AM] {"processId":55075,"clientInfo":{"name":"vscode","version":"1.45.1"},"rootPath":"/home/miles/temp/tt/p1","rootUri":"file:///home/miles/temp/tt/p1","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional"},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"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]}},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]}},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]}},"completionItemKind":{"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]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true}},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"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]},"hierarchicalDocumentSymbolSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["comment","keyword","number","regexp","operator","namespace","type","struct","class","interface","enum","typeParameter","function","member","macro","variable","parameter","property","label"],"tokenModifiers":["declaration","documentation","static","abstract","deprecated","async","readonly"]}},"window":{"workDoneProgress":true}},"initializationOptions":{"executeCommandProvider":false},"trace":"off","workspaceFolders":[{"uri":"file:///home/miles/temp/tt/p1","name":"p1"}]}
Starting with args: ["/usr/share/code/code","/home/miles/.vscode/extensions/nwolverson.ide-purescript-0.21.1/node_modules/purescript-language-server/server.js","--node-ipc","--clientProcessId=55075"]
Starting with cwd: /home/miles/temp/tt/p1 and using root path: /home/miles/temp/tt/p1
Activated lc for file:///home/miles/temp/tt/p1
Got updated settings (client push)
[Info  - 10:18:19 AM] Starting IDE server
[Info  - 10:18:19 AM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 10:18:19 AM] Resolved IDE server paths (npm-bin: true) from PATH of /home/miles/temp/tt/p1/node_modules/.bin:/home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 10:18:19 AM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 10:18:19 AM] Starting IDE server on port 15732 with cwd /home/miles/temp/tt/p1
Started IDE server (port 15732)
[Info  - 10:18:21 AM] The --editor-mode flag is deprecated and ignored. It's now the default behaviour and the flag will be removed in a future version
[Info] cachedb was changed from: Nothing, to: Just 2020-07-22 17:18:07.213930898 UTC @(main:Command.Ide app/Command/Ide.hs:205:25)

[Info  - 10:18:22 AM] [Warn] Failed to resolve reexports for Type.Data.BooleanPrim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "False"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "True"}) (Just [])Prim.BooleanKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "Boolean"})
[Warn] Failed to resolve reexports for Type.Data.OrderingPrim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "EQ"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "GT"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "LT"}) (Just [])Prim.OrderingKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "Ordering"})
[Warn] Failed to resolve reexports for Type.Data.SymbolPrim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Append"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Compare"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Cons"})
[Warn] Failed to resolve reexports for Type.PreludePrim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "EQ"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "False"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "GT"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "LT"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "True"}) (Just [])Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Append"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Compare"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Lacks"})Prim.RowListTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "RowToList"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Union"})Prim.BooleanKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Boolean"})Prim.OrderingKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Ordering"})
[Warn] Failed to resolve reexports for Type.RowPrim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Cons"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Lacks"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Nub"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Union"})

[Info  - 10:18:22 AM] [Warn] Failed to resolve reexports for Type.RowListPrim.RowListTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "Cons"}) (Just [])Prim.RowListTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "Nil"}) (Just [])Prim.RowListTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "RowToList"})Prim.RowListKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "RowList"})

Processes and parents.
Working state (initial launch), two purs processes running.

➜  p1 git:(master) pgrep purs | xargs ps -f -ww

UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles      54730    2796  9 10:16 ?        Sl     0:14 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15736 src/**/*.purs bower_components/**/*.purs
miles      55494   55439 25 10:18 ?        Sl     0:09 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15732 --editor-mode src/**/*.purs .spago/ace/master/src/**/*.purs .spago/aff/v5.1.2/src/**/*.purs ...

➜  p1 git:(master) ps -f -ww 2796
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles       2796       1  0 Jul21 ?        Ss     0:01 /lib/systemd/systemd --user
➜  p1 git:(master) ps -f -ww 55439    
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles      55439   55075  0 10:18 ?        Sl     0:00 /usr/share/code/code /home/miles/.vscode/extensions/nwolverson.ide-purescript-0.21.1/node_modules/purescript-language-server/server.js --node-ipc --clientProcessId=55075

Shutdown vscode.

Processes and parents.
After initial working state, one purs process running.

➜  p1 git:(master) pgrep purs | xargs ps -f -ww
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles      54730    2796  5 10:16 ?        Sl     0:14 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15736 src/**/*.purs bower_components/**/*.purs

➜  p1 git:(master) ps -f -ww 2796              
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles       2796       1  0 Jul21 ?        Ss     0:01 /lib/systemd/systemd --user

Second vscode launch

Logs in vscode.
Broken state.
(Compare in diff viewer - I like meld)

Launching new language client for file:///home/miles/temp/tt/p1
PureScript Language Server started
[Info  - 10:22:05 AM] {"processId":55843,"clientInfo":{"name":"vscode","version":"1.45.1"},"rootPath":"/home/miles/temp/tt/p1","rootUri":"file:///home/miles/temp/tt/p1","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional"},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"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]}},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]}},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]}},"completionItemKind":{"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]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true}},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"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]},"hierarchicalDocumentSymbolSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["comment","keyword","number","regexp","operator","namespace","type","struct","class","interface","enum","typeParameter","function","member","macro","variable","parameter","property","label"],"tokenModifiers":["declaration","documentation","static","abstract","deprecated","async","readonly"]}},"window":{"workDoneProgress":true}},"initializationOptions":{"executeCommandProvider":false},"trace":"off","workspaceFolders":[{"uri":"file:///home/miles/temp/tt/p1","name":"p1"}]}
Starting with args: ["/usr/share/code/code","/home/miles/.vscode/extensions/nwolverson.ide-purescript-0.21.1/node_modules/purescript-language-server/server.js","--node-ipc","--clientProcessId=55843"]
Starting with cwd: /home/miles/temp/tt/p1 and using root path: /home/miles/temp/tt/p1
Activated lc for file:///home/miles/temp/tt/p1
Got updated settings (client push)
[Info  - 10:22:06 AM] Starting IDE server
[Info  - 10:22:06 AM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
Got updated settings (by request)
[Info  - 10:22:06 AM] Starting IDE server
[Info  - 10:22:06 AM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 10:22:06 AM] Resolved IDE server paths (npm-bin: false) from PATH of /home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 10:22:06 AM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 10:22:06 AM] Starting IDE server on port 15762 with cwd /home/miles/temp/tt/p1
Started IDE server (port 15762)
[Info  - 10:22:07 AM] Resolved IDE server paths (npm-bin: true) from PATH of /home/miles/temp/tt/p1/node_modules/.bin:/home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 10:22:07 AM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 10:22:09 AM] [Info] cachedb was changed from: Nothing, to: Just 2020-07-22 17:18:07.213930898 UTC @(main:Command.Ide app/Command/Ide.hs:205:25)

[Info  - 10:22:09 AM] Found existing port from file: 15762, cwd: /home/miles/temp/tt/p1
[Info  - 10:22:09 AM] Found IDE server on port 15762 with correct path: /home/miles/temp/tt/p1
[Info  - 10:22:09 AM] Found existing IDE server with correct path on port 15762
[Info  - 10:22:10 AM] [Warn] Failed to resolve reexports for Type.Data.BooleanPrim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "False"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "True"}) (Just [])Prim.BooleanKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "Boolean"})
[Warn] Failed to resolve reexports for Type.Data.OrderingPrim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "EQ"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "GT"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "LT"}) (Just [])Prim.OrderingKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "Ordering"})
[Warn] Failed to resolve reexports for Type.Data.SymbolPrim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Append"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Compare"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Cons"})
[Warn] Failed to resolve reexports for Type.PreludePrim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "EQ"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "False"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "GT"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "LT"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "True"}) (Just [])Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Append"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Compare"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Lacks"})Prim.RowListTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "RowToList"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Union"})Prim.BooleanKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Boolean"})Prim.OrderingKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Ordering"})
[Warn] Failed to resolve reexports for Type.RowPrim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Cons"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Lacks"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Nub"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Union"})

[Info  - 10:22:10 AM] [Warn] Failed to resolve reexports for Type.RowListPrim.RowListTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "Cons"}) (Just [])Prim.RowListTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "Nil"}) (Just [])Prim.RowListTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "RowToList"})Prim.RowListKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "RowList"})

[Info  - 10:22:11 AM] [Warn] Failed to resolve reexports for Type.Data.BooleanPrim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "False"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "True"}) (Just [])Prim.BooleanKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Boolean.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 77, sourcePosColumn = 18}}) (ProperName {runProperName = "Boolean"})
[Warn] Failed to resolve reexports for Type.Data.OrderingPrim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "EQ"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "GT"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "LT"}) (Just [])Prim.OrderingKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Ordering.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 76, sourcePosColumn = 20}}) (ProperName {runProperName = "Ordering"})
[Warn] Failed to resolve reexports for Type.Data.SymbolPrim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Append"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Compare"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Data/Symbol.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 37, sourcePosColumn = 20}}) (ProperName {runProperName = "Cons"})
[Warn] Failed to resolve reexports for Type.PreludePrim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "EQ"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "False"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "GT"}) (Just [])Prim.OrderingTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "LT"}) (Just [])Prim.BooleanTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "True"}) (Just [])Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Append"})Prim.SymbolTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Compare"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Lacks"})Prim.RowListTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "RowToList"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Union"})Prim.BooleanKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Boolean"})Prim.OrderingKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Prelude.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 17, sourcePosColumn = 68}}) (ProperName {runProperName = "Ordering"})
[Warn] Failed to resolve reexports for Type.RowPrim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Cons"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Lacks"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Nub"})Prim.RowTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/Row.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 23, sourcePosColumn = 28}}) (ProperName {runProperName = "Union"})

[Info  - 10:22:16 AM] [Warn] Failed to resolve reexports for Type.RowListPrim.RowListTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "Cons"}) (Just [])Prim.RowListTypeRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "Nil"}) (Just [])Prim.RowListTypeClassRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "RowToList"})Prim.RowListKindRef (SourceSpan {spanName = ".spago/typelevel-prelude/v5.0.2/src/Type/RowList.purs", spanStart = SourcePos {sourcePosLine = 1, sourcePosColumn = 1}, spanEnd = SourcePos {sourcePosLine = 94, sourcePosColumn = 50}}) (ProperName {runProperName = "RowList"})

Processes and parents.
Broken state (2nd launch), two purs processes running.

➜  p1 git:(master) pgrep purs | xargs ps -f -ww
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles      54730    2796  3 10:16 ?        Sl     0:14 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15736 src/**/*.purs bower_components/**/*.purs
miles      56003   55929 30 10:22 ?        Sl     0:12 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15762 src/**/*.purs bower_components/**/*.purs

➜  p1 git:(master) ps -f -ww 2796              
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles       2796       1  0 Jul21 ?        Ss     0:01 /lib/systemd/systemd --user
➜  p1 git:(master) ps -f -ww 55929    
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles      55929   55843  0 10:22 ?        Sl     0:00 /usr/share/code/code /home/miles/.vscode/extensions/nwolverson.ide-purescript-0.21.1/node_modules/purescript-language-server/server.js --node-ipc --clientProcessId=55843

Shutdown vscode

Processes and parents.
After broken state, purs process still running.

➜  p1 git:(master) pgrep purs | xargs ps -f -ww
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles      54730    2796  3 10:16 ?        Sl     0:14 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15736 src/**/*.purs bower_components/**/*.purs
miles      56003    2796 12 10:22 ?        Sl     0:12 /home/miles/.nvm/versions/node/v13.12.0/bin/purs ide server -p 15762 src/**/*.purs bower_components/**/*.purs

➜  p1 git:(master) ps -f -ww 2796              
UID          PID    PPID  C STIME TTY      STAT   TIME CMD
miles       2796       1  0 Jul21 ?        Ss     0:01 /lib/systemd/systemd --user

This looks like a race condition with the config Ref:
https://github.com/nwolverson/purescript-language-server/blob/0466d755aaca131d96e18ad17f3a8df019c55ea8/src/LanguageServer/IdePurescript/Main.purs#L95

There are lots of places where this might be read or written to in Aff, and interestingly, when I add spy messages to all these ref access points, I cannot reproduce the issue. Likely due to change in timings. I don't know the best way to fix this.

Here's a debugging build with fewer prints, which can reproduce the issue (at least on my system), and generates some interesting logs:
milesfrain/purescript-language-server@edfdc7c

Some things to observe in the below snippet:

  • addSpagoSources is set to true for both logs of settings with spy
  • One of the settings is nested in a purescript key, but the other isn't. I assume this means one of the settings is not parsed correctly.
  • addSpagoSources is interpreted as disabled one out of two times.
  • npm-bin is interpreted as false one out of two times.

Log snippet:

settings: : {
  purescript: {
    ...
    addSpagoSources: �[33mtrue�[39m,
    ...
  }
}
settings: : {
  ...
  addSpagoSources: �[33mtrue�[39m,
  ...
}

Got updated settings (client push)
[Info  - 10:03:49 PM] Starting IDE server
[Info  - 10:03:49 PM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 10:03:49 PM] spago IS enabled in getPackagerPaths
Got updated settings (by request)
[Info  - 10:03:49 PM] Starting IDE server
[Info  - 10:03:49 PM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 10:03:49 PM] spago not enabled in getPackagerPaths
[Info  - 10:03:49 PM] spagoGlob []
[Info  - 10:03:49 PM] Resolved IDE server paths (npm-bin: false) from PATH of /home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 10:03:49 PM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 10:03:49 PM] Starting IDE server on port 15150 with cwd /home/miles/temp/tt/p1
Started IDE server (port 15150)
[Info  - 10:03:50 PM] spagoGlob [".spago/ace/master/src/**/*.purs",".spago/aff/v5.1.2/src/**/*.purs",...
[Info  - 10:03:50 PM] Resolved IDE server paths (npm-bin: true) from PATH of /home/miles/temp/tt/p1/node_modules/.bin:/home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):

Full logs:

Launching new language client for file:///home/miles/temp/tt/p1
Debugger listening on ws://127.0.0.1:6009/90c24c34-6fb5-434d-b9f7-c4745dd7d822
For help, see: https://nodejs.org/en/docs/inspector
PureScript Language Server started
[Info  - 10:03:49 PM] {"processId":141372,"clientInfo":{"name":"vscode","version":"1.47.2"},"rootPath":"/home/miles/temp/tt/p1","rootUri":"file:///home/miles/temp/tt/p1","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional"},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"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]}},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]}},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]}},"completionItemKind":{"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]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true}},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"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]},"hierarchicalDocumentSymbolSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["comment","keyword","number","regexp","operator","namespace","type","struct","class","interface","enum","typeParameter","function","member","macro","variable","parameter","property","label"],"tokenModifiers":["declaration","documentation","static","abstract","deprecated","async","readonly"]}},"window":{"workDoneProgress":true}},"initializationOptions":{"executeCommandProvider":false},"trace":"off","workspaceFolders":[{"uri":"file:///home/miles/temp/tt/p1","name":"p1"}]}
Starting with args: ["/snap/code/38/usr/share/code/code","/home/miles/projects/purescript/language-server/server.js","--node-ipc","--clientProcessId=141372"]
Starting with cwd: /home/miles/temp/tt/p1 and using root path: /home/miles/temp/tt/p1
Activated lc for file:///home/miles/temp/tt/p1
settings: : {
  purescript: {
    pursExe: �[32m'purs'�[39m,
    pscIdePort: �[1mnull�[22m,
    autoStartPscIde: �[33mtrue�[39m,
    packagePath: �[32m''�[39m,
    addPscPackageSources: �[33mfalse�[39m,
    addSpagoSources: �[33mtrue�[39m,
    sourcePath: �[32m'src'�[39m,
    buildCommand: �[32m'spago build --purs-args --json-errors'�[39m,
    fastRebuild: �[33mtrue�[39m,
    censorWarnings: [],
    autocompleteAllModules: �[33mtrue�[39m,
    autocompleteAddImport: �[33mtrue�[39m,
    autocompleteLimit: �[1mnull�[22m,
    autocompleteGrouped: �[33mtrue�[39m,
    importsPreferredModules: [ �[32m'Prelude'�[39m ],
    preludeModule: �[32m'Prelude'�[39m,
    addNpmPath: �[33mtrue�[39m,
    pscIdelogLevel: �[32m''�[39m,
    editorMode: �[33mfalse�[39m,
    polling: �[33mfalse�[39m,
    outputDirectory: �[32m''�[39m,
    trace: { server: �[32m'off'�[39m },
    codegenTargets: �[1mnull�[22m
  }
}
settings: : {
  pursExe: �[32m'purs'�[39m,
  pscIdePort: �[1mnull�[22m,
  autoStartPscIde: �[33mtrue�[39m,
  packagePath: �[32m''�[39m,
  addPscPackageSources: �[33mfalse�[39m,
  addSpagoSources: �[33mtrue�[39m,
  sourcePath: �[32m'src'�[39m,
  buildCommand: �[32m'spago build --purs-args --json-errors'�[39m,
  fastRebuild: �[33mtrue�[39m,
  censorWarnings: [],
  autocompleteAllModules: �[33mtrue�[39m,
  autocompleteAddImport: �[33mtrue�[39m,
  autocompleteLimit: �[1mnull�[22m,
  autocompleteGrouped: �[33mtrue�[39m,
  importsPreferredModules: [ �[32m'Prelude'�[39m ],
  preludeModule: �[32m'Prelude'�[39m,
  addNpmPath: �[33mtrue�[39m,
  pscIdelogLevel: �[32m''�[39m,
  editorMode: �[33mfalse�[39m,
  polling: �[33mfalse�[39m,
  outputDirectory: �[32m''�[39m,
  trace: { server: �[32m'off'�[39m },
  codegenTargets: �[1mnull�[22m
}
Got updated settings (client push)
[Info  - 10:03:49 PM] Starting IDE server
[Info  - 10:03:49 PM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 10:03:49 PM] psc-package not enabled in getPackagerPaths
[Info  - 10:03:49 PM] pscpGlob []
[Info  - 10:03:49 PM] spago IS enabled in getPackagerPaths
Got updated settings (by request)
[Info  - 10:03:49 PM] Starting IDE server
[Info  - 10:03:49 PM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 10:03:49 PM] psc-package not enabled in getPackagerPaths
[Info  - 10:03:49 PM] pscpGlob []
[Info  - 10:03:49 PM] spago not enabled in getPackagerPaths
[Info  - 10:03:49 PM] spagoGlob []
[Info  - 10:03:49 PM] Resolved IDE server paths (npm-bin: false) from PATH of /home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 10:03:49 PM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 10:03:49 PM] Starting IDE server on port 15150 with cwd /home/miles/temp/tt/p1
Started IDE server (port 15150)
[Info  - 10:03:50 PM] spagoGlob [".spago/ace/master/src/**/*.purs",".spago/aff/v5.1.2/src/**/*.purs",".spago/affjax/v10.1.0/src/**/*.purs",".spago/argonaut/v6.0.0/src/**/*.purs",".spago/argonaut-codecs/v6.1.0/src/**/*.purs",".spago/argonaut-core/v5.0.2/src/**/*.purs",".spago/argonaut-traversals/v7.0.0/src/**/*.purs",".spago/arraybuffer-types/v2.0.0/src/**/*.purs",".spago/arrays/v5.3.1/src/**/*.purs",".spago/avar/v3.0.0/src/**/*.purs",".spago/bifunctors/v4.0.0/src/**/*.purs",".spago/catenable-lists/v5.0.1/src/**/*.purs",".spago/colors/v5.0.0/src/**/*.purs",".spago/console/v4.4.0/src/**/*.purs",".spago/const/v4.1.0/src/**/*.purs",".spago/contravariant/v4.0.1/src/**/*.purs",".spago/control/v4.2.0/src/**/*.purs",".spago/coroutines/v5.0.1/src/**/*.purs",".spago/css/v4.0.0/src/**/*.purs",".spago/datetime/v4.1.1/src/**/*.purs",".spago/distributive/v4.0.0/src/**/*.purs",".spago/dom-indexed/v7.0.0/src/**/*.purs",".spago/effect/v2.0.1/src/**/*.purs",".spago/either/v4.1.1/src/**/*.purs",".spago/enums/v4.0.1/src/**/*.purs",".spago/exceptions/v4.0.0/src/**/*.purs",".spago/exists/v4.0.0/src/**/*.purs",".spago/foldable-traversable/v4.1.1/src/**/*.purs",".spago/foreign/v5.0.0/src/**/*.purs",".spago/foreign-object/v2.0.3/src/**/*.purs",".spago/fork/v4.0.0/src/**/*.purs",".spago/form-urlencoded/v5.0.0/src/**/*.purs",".spago/free/v5.2.0/src/**/*.purs",".spago/freeap/v5.0.1/src/**/*.purs",".spago/freet/v5.0.0/src/**/*.purs",".spago/functions/v4.0.0/src/**/*.purs",".spago/functors/v3.1.1/src/**/*.purs",".spago/gen/v2.1.1/src/**/*.purs",".spago/generics-rep/v6.1.1/src/**/*.purs",".spago/globals/v4.1.0/src/**/*.purs",".spago/halogen/v5.0.1/src/**/*.purs",".spago/halogen-css/v8.0.0/src/**/*.purs",".spago/halogen-hooks/v0.4.2/src/**/*.purs",".spago/halogen-hooks-extra/v0.6.0/src/**/*.purs",".spago/halogen-vdom/v6.1.3/src/**/*.purs",".spago/http-methods/v4.0.2/src/**/*.purs",".spago/identity/v4.1.0/src/**/*.purs",".spago/indexed-monad/v1.2.0/src/**/*.purs",".spago/integers/v4.0.0/src/**/*.purs",".spago/invariant/v4.1.0/src/**/*.purs",".spago/js-date/v6.0.0/src/**/*.purs",".spago/lazy/v4.0.0/src/**/*.purs",".spago/lists/v5.4.1/src/**/*.purs",".spago/math/v2.1.1/src/**/*.purs",".spago/maybe/v4.0.1/src/**/*.purs",".spago/media-types/v4.0.1/src/**/*.purs",".spago/newtype/v3.0.0/src/**/*.purs",".spago/nonempty/v5.0.0/src/**/*.purs",".spago/now/v4.0.0/src/**/*.purs",".spago/nullable/v4.1.1/src/**/*.purs",".spago/ordered-collections/v1.6.1/src/**/*.purs",".spago/orders/v4.0.0/src/**/*.purs",".spago/parallel/v4.0.0/src/**/*.purs",".spago/partial/v2.0.1/src/**/*.purs",".spago/prelude/v4.1.1/src/**/*.purs",".spago/profunctor/v4.1.0/src/**/*.purs",".spago/profunctor-lenses/v6.3.0/src/**/*.purs",".spago/proxy/v3.0.0/src/**/*.purs",".spago/psci-support/v4.0.0/src/**/*.purs",".spago/record/v2.0.2/src/**/*.purs",".spago/refs/v4.1.0/src/**/*.purs",".spago/routing/v9.0.1/src/**/*.purs",".spago/semirings/v5.0.0/src/**/*.purs",".spago/st/v4.1.1/src/**/*.purs",".spago/strings/v4.0.2/src/**/*.purs",".spago/tailrec/v4.1.1/src/**/*.purs",".spago/these/v4.0.0/src/**/*.purs",".spago/transformers/v4.2.0/src/**/*.purs",".spago/tuples/v5.1.0/src/**/*.purs",".spago/type-equality/v3.0.0/src/**/*.purs",".spago/typelevel-prelude/v5.0.2/src/**/*.purs",".spago/unfoldable/v4.1.0/src/**/*.purs",".spago/unsafe-coerce/v4.0.0/src/**/*.purs",".spago/unsafe-reference/v3.0.1/src/**/*.purs",".spago/validation/v4.2.0/src/**/*.purs",".spago/web-clipboard/v2.0.0/src/**/*.purs",".spago/web-dom/v4.1.0/src/**/*.purs",".spago/web-events/v2.0.1/src/**/*.purs",".spago/web-file/v2.3.0/src/**/*.purs",".spago/web-html/v2.3.0/src/**/*.purs",".spago/web-storage/v3.0.0/src/**/*.purs",".spago/web-touchevents/v2.0.0/src/**/*.purs",".spago/web-uievents/v2.0.0/src/**/*.purs",".spago/web-xhr/v3.0.2/src/**/*.purs","src/**/*.purs","test/**/*.purs",""]
[Info  - 10:03:50 PM] Resolved IDE server paths (npm-bin: true) from PATH of /home/miles/temp/tt/p1/node_modules/.bin:/home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 10:03:50 PM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 10:03:52 PM] [Info] cachedb was changed from: Nothing, to: Just 2020-07-25 22:50:54.957409907 UTC @(main:Command.Ide app/Command/Ide.hs:205:25)

[Info  - 10:03:52 PM] Found existing port from file: 15150, cwd: /home/miles/temp/tt/p1
[Info  - 10:03:52 PM] Found IDE server on port 15150 with correct path: /home/miles/temp/tt/p1
[Info  - 10:03:52 PM] Found existing IDE server with correct path on port 15150

Oh, I could see the race condition on your 2nd run, but nothing logs starting a 2nd server on the first run.

But yes it looks like one of the settings mechanisms is busted (and I bet I know which one)

OK, so I have a way forward.

  1. I check the various settings mechanisms are actually setting the right config
  2. I move the "have we started up yet" logic to 1 place (ie that onConfig) and make it actually work

Would it be safer to parse the settings/config object with Argonaut (or similar) to ensure all expected fields exist? It looks like one of these issues is that if addSpagoSources is not found, then it's simply interpreted as false, rather than throwing an error.

it's simply interpreted as false, rather than throwing an error

I think that is in fact the correct behaviour, I think in terms of a generic LSP client sending config all are optional.

@milesfrain I've updated but not released purescript-language-server, as I think you have a dev setup working, would you mind testing it works for you?

Hoping the use of AVar means we have a reliable single-start now, intentionally leaving the config as a Ref to avoid changes roaming too far, and basically the behaviour is already in that sense as desired - the config is updated to the latest pushed, some of which may be read and used next time something happens (other parts being "sticky" as they are read once).

Looks good. Here are logs with my debugging prints added to your change, which shows a single start:

Launching new language client for file:///home/miles/temp/tt/p1
Debugger listening on ws://127.0.0.1:6009/ba40e3b7-dee9-4416-a918-6c744f544ed9
For help, see: https://nodejs.org/en/docs/inspector
[Info  - 11:22:57 AM] {"processId":167033,"clientInfo":{"name":"vscode","version":"1.47.2"},"rootPath":"/home/miles/temp/tt/p1","rootUri":"file:///home/miles/temp/tt/p1","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional"},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"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]}},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]}},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]}},"completionItemKind":{"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]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true}},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"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]},"hierarchicalDocumentSymbolSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["comment","keyword","number","regexp","operator","namespace","type","struct","class","interface","enum","typeParameter","function","member","macro","variable","parameter","property","label"],"tokenModifiers":["declaration","documentation","static","abstract","deprecated","async","readonly"]}},"window":{"workDoneProgress":true}},"initializationOptions":{"executeCommandProvider":false},"trace":"off","workspaceFolders":[{"uri":"file:///home/miles/temp/tt/p1","name":"p1"}]}
Starting with args: ["/snap/code/38/usr/share/code/code","/home/miles/projects/purescript/language-server/server.js","--node-ipc","--clientProcessId=167033"]
Starting with cwd: /home/miles/temp/tt/p1 and using root path: /home/miles/temp/tt/p1
Activated lc for file:///home/miles/temp/tt/p1
settings: : {
  purescript: {
    pursExe: �[32m'purs'�[39m,
    pscIdePort: �[1mnull�[22m,
    autoStartPscIde: �[33mtrue�[39m,
    packagePath: �[32m''�[39m,
    addPscPackageSources: �[33mfalse�[39m,
    addSpagoSources: �[33mtrue�[39m,
    sourcePath: �[32m'src'�[39m,
    buildCommand: �[32m'spago build --purs-args --json-errors'�[39m,
    fastRebuild: �[33mtrue�[39m,
    censorWarnings: [],
    autocompleteAllModules: �[33mtrue�[39m,
    autocompleteAddImport: �[33mtrue�[39m,
    autocompleteLimit: �[1mnull�[22m,
    autocompleteGrouped: �[33mtrue�[39m,
    importsPreferredModules: [ �[32m'Prelude'�[39m ],
    preludeModule: �[32m'Prelude'�[39m,
    addNpmPath: �[33mtrue�[39m,
    pscIdelogLevel: �[32m''�[39m,
    editorMode: �[33mfalse�[39m,
    polling: �[33mfalse�[39m,
    outputDirectory: �[32m''�[39m,
    trace: { server: �[32m'off'�[39m },
    codegenTargets: �[1mnull�[22m
  }
}
Got new config (client push)
[Info  - 11:22:57 AM] Starting IDE server
[Info  - 11:22:57 AM] Using sources from psc-package/spago packages (PURS_IDE_SOURCES not set)
[Info  - 11:22:57 AM] psc-package not enabled in getPackagerPaths
[Info  - 11:22:57 AM] pscpGlob []
[Info  - 11:22:57 AM] spago IS enabled in getPackagerPaths
PureScript Language Server started
[Info  - 11:22:58 AM] spagoGlob [".spago/ace/master/src/**/*.purs",".spago/aff/v5.1.2/src/**/*.purs",".spago/affjax/v10.1.0/src/**/*.purs",".spago/argonaut/v6.0.0/src/**/*.purs",".spago/argonaut-codecs/v6.1.0/src/**/*.purs",".spago/argonaut-core/v5.0.2/src/**/*.purs",".spago/argonaut-traversals/v7.0.0/src/**/*.purs",".spago/arraybuffer-types/v2.0.0/src/**/*.purs",".spago/arrays/v5.3.1/src/**/*.purs",".spago/avar/v3.0.0/src/**/*.purs",".spago/bifunctors/v4.0.0/src/**/*.purs",".spago/catenable-lists/v5.0.1/src/**/*.purs",".spago/colors/v5.0.0/src/**/*.purs",".spago/console/v4.4.0/src/**/*.purs",".spago/const/v4.1.0/src/**/*.purs",".spago/contravariant/v4.0.1/src/**/*.purs",".spago/control/v4.2.0/src/**/*.purs",".spago/coroutines/v5.0.1/src/**/*.purs",".spago/css/v4.0.0/src/**/*.purs",".spago/datetime/v4.1.1/src/**/*.purs",".spago/distributive/v4.0.0/src/**/*.purs",".spago/dom-indexed/v7.0.0/src/**/*.purs",".spago/effect/v2.0.1/src/**/*.purs",".spago/either/v4.1.1/src/**/*.purs",".spago/enums/v4.0.1/src/**/*.purs",".spago/exceptions/v4.0.0/src/**/*.purs",".spago/exists/v4.0.0/src/**/*.purs",".spago/foldable-traversable/v4.1.1/src/**/*.purs",".spago/foreign/v5.0.0/src/**/*.purs",".spago/foreign-object/v2.0.3/src/**/*.purs",".spago/fork/v4.0.0/src/**/*.purs",".spago/form-urlencoded/v5.0.0/src/**/*.purs",".spago/free/v5.2.0/src/**/*.purs",".spago/freeap/v5.0.1/src/**/*.purs",".spago/freet/v5.0.0/src/**/*.purs",".spago/functions/v4.0.0/src/**/*.purs",".spago/functors/v3.1.1/src/**/*.purs",".spago/gen/v2.1.1/src/**/*.purs",".spago/generics-rep/v6.1.1/src/**/*.purs",".spago/globals/v4.1.0/src/**/*.purs",".spago/halogen/v5.0.1/src/**/*.purs",".spago/halogen-css/v8.0.0/src/**/*.purs",".spago/halogen-hooks/v0.4.2/src/**/*.purs",".spago/halogen-hooks-extra/v0.6.0/src/**/*.purs",".spago/halogen-vdom/v6.1.3/src/**/*.purs",".spago/http-methods/v4.0.2/src/**/*.purs",".spago/identity/v4.1.0/src/**/*.purs",".spago/indexed-monad/v1.2.0/src/**/*.purs",".spago/integers/v4.0.0/src/**/*.purs",".spago/invariant/v4.1.0/src/**/*.purs",".spago/js-date/v6.0.0/src/**/*.purs",".spago/lazy/v4.0.0/src/**/*.purs",".spago/lists/v5.4.1/src/**/*.purs",".spago/math/v2.1.1/src/**/*.purs",".spago/maybe/v4.0.1/src/**/*.purs",".spago/media-types/v4.0.1/src/**/*.purs",".spago/newtype/v3.0.0/src/**/*.purs",".spago/nonempty/v5.0.0/src/**/*.purs",".spago/now/v4.0.0/src/**/*.purs",".spago/nullable/v4.1.1/src/**/*.purs",".spago/ordered-collections/v1.6.1/src/**/*.purs",".spago/orders/v4.0.0/src/**/*.purs",".spago/parallel/v4.0.0/src/**/*.purs",".spago/partial/v2.0.1/src/**/*.purs",".spago/prelude/v4.1.1/src/**/*.purs",".spago/profunctor/v4.1.0/src/**/*.purs",".spago/profunctor-lenses/v6.3.0/src/**/*.purs",".spago/proxy/v3.0.0/src/**/*.purs",".spago/psci-support/v4.0.0/src/**/*.purs",".spago/record/v2.0.2/src/**/*.purs",".spago/refs/v4.1.0/src/**/*.purs",".spago/routing/v9.0.1/src/**/*.purs",".spago/semirings/v5.0.0/src/**/*.purs",".spago/st/v4.1.1/src/**/*.purs",".spago/strings/v4.0.2/src/**/*.purs",".spago/tailrec/v4.1.1/src/**/*.purs",".spago/these/v4.0.0/src/**/*.purs",".spago/transformers/v4.2.0/src/**/*.purs",".spago/tuples/v5.1.0/src/**/*.purs",".spago/type-equality/v3.0.0/src/**/*.purs",".spago/typelevel-prelude/v5.0.2/src/**/*.purs",".spago/unfoldable/v4.1.0/src/**/*.purs",".spago/unsafe-coerce/v4.0.0/src/**/*.purs",".spago/unsafe-reference/v3.0.1/src/**/*.purs",".spago/validation/v4.2.0/src/**/*.purs",".spago/web-clipboard/v2.0.0/src/**/*.purs",".spago/web-dom/v4.1.0/src/**/*.purs",".spago/web-events/v2.0.1/src/**/*.purs",".spago/web-file/v2.3.0/src/**/*.purs",".spago/web-html/v2.3.0/src/**/*.purs",".spago/web-storage/v3.0.0/src/**/*.purs",".spago/web-touchevents/v2.0.0/src/**/*.purs",".spago/web-uievents/v2.0.0/src/**/*.purs",".spago/web-xhr/v3.0.2/src/**/*.purs","src/**/*.purs","test/**/*.purs",""]
[Info  - 11:22:58 AM] Resolved IDE server paths (npm-bin: true) from PATH of /home/miles/temp/tt/p1/node_modules/.bin:/home/miles/.nvm/versions/node/v13.12.0/bin:/home/miles/.nix-profile/bin:/home/miles/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin (1st is used):
[Info  - 11:22:58 AM] /home/miles/.nvm/versions/node/v13.12.0/bin/purs: 0.13.8

[Info  - 11:22:58 AM] Found existing port from file: 15150, cwd: /home/miles/temp/tt/p1
[Info  - 11:22:58 AM] Found IDE server on port 15150 with correct path: /home/miles/temp/tt/p1
[Info  - 11:22:58 AM] Found existing IDE server with correct path on port 1515

Above fix released in 0.21.2 - thanks for the work tracking down the issue

When I did my testing, I was only looking for a single start with the correct spago glob, and didn't actually test if F12 worked or not.
Turns out that now F12 doesn't work for either the official release, or the built-from-source extension.