Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Use implicit-hie #178

Closed
wants to merge 6 commits into from
Closed

Use implicit-hie #178

wants to merge 6 commits into from

Conversation

Avi-D-coder
Copy link
Contributor

Replaces implicit cradle logic with implicit-hie.
changes default to cabal over stack, since stack cannot load a cradle with a type error.

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 5, 2020

Fixed

This is not currently working. Using the generated hie.yaml files for optics and hls works, but using this, nested packages (install, ghcide) don't match prefixes in hls, and imports cannot be found with optics/optics (componentDependencies = []).

@Avi-D-coder Avi-D-coder marked this pull request as ready for review May 9, 2020 23:32
<|> (stackExecutable >> (Stack Nothing,) <$> stackWorkDir fp)
<|> ((Cabal Nothing,) <$> cabalWorkDir fp)

<|> (cabalExecutable >> cabalProjectDir fp >> cabalDistDir fp >>= cabal)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a major bug when I run this on the haskell-language-server repo hie-bios picks cabal before getting here. I tried changing the order so stack is first, but it picks before implicitConfig'

❯ rm -rf dist-newstyle
❯ stack build
❯ hie-bios debug src/Ide/Cradle.hs         
Cradle failed to load
Exit Code: ExitFailure 1
Stderr: Failed to parse result of calling cabal
Resolving dependencies...

From https://github.com/Avi-D-coder/hie-bios
 + 6d95e03...63e6e56 master     -> origin/master  (forced update)
Previous HEAD position was b67ebfd Use single file hie-implicit
HEAD is now at 63e6e56 Use single file hie-implicit
Warning: Requested index-state2020-05-05T17:33:00Z is newer than
'hackage.haskell.org'! Falling back to older state (2020-05-02T22:21:20Z).
cabal: Could not resolve dependencies:
[__0] trying: ghcide-0.1.0 (user goal)
[__1] next goal: haskell-lsp-types (dependency of ghcide)
[__1] rejecting: haskell-lsp-types-0.21.0.0, haskell-lsp-types-0.20.0.0,
haskell-lsp-types-0.19.0.0, haskell-lsp-types-0.18.0.0,
haskell-lsp-types-0.17.0.0, haskell-lsp-types-0.16.0.0,
haskell-lsp-types-0.15.0.0, haskell-lsp-types-0.14.0.1,
haskell-lsp-types-0.14.0.0, haskell-lsp-types-0.13.0.0,
haskell-lsp-types-0.12.1.0, haskell-lsp-types-0.12.0.0,
haskell-lsp-types-0.11.0.0, haskell-lsp-types-0.10.0.0,
haskell-lsp-types-0.9.0.0, haskell-lsp-types-0.8.2.0,
haskell-lsp-types-0.8.0.1, haskell-lsp-types-0.8.0.0,
haskell-lsp-types-0.7.0.0, haskell-lsp-types-0.6.0.0,
haskell-lsp-types-0.5.0.0, haskell-lsp-types-0.4.0.0,
haskell-lsp-types-0.2.2.0, haskell-lsp-types-0.2.1.0,
haskell-lsp-types-0.15.0.1 (conflict: ghcide => haskell-lsp-types==0.22.*)
[__1] fail (backjumping, conflict set: ghcide, haskell-lsp-types)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: ghcide, haskell-lsp-types

@Avi-D-coder
Copy link
Contributor Author

@mpickering @fendor @bubba @alanz
Until show-build-info, I would like this to serve as implicit cradle.
It works a lot better then the current mechanism in hie-bios.
It may or may not make sense to use this as a replacement for cabal-helper.
Either way this improves standalone hie-bios without adding any extra dependencies (implicit-hie's deps were already used by hie-bios).

@jneira
Copy link
Member

jneira commented May 10, 2020

I hope you dont mind i commented about:

  • I've tested the implicit-hie standalone and it produces nice configurations in most cases
  • I think it will be useful to collect all possible corner cases, even if it is merged, to being able to handle better the possible issues about:
    • Afaiu, it does not take in account packages from stack.yaml or cabal.project so if you have a subdirectory with a .cabal file that it is not listed in those files, it will included in the hie.yaml
    • Testing it in the dhall-haskell codebase it includes a incorrect line (not sure why):
- path: "dhall/.//"
      component: "dhall:bench:/deep-nested-large-record/*.dhall"
  • more to investigate...

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 10, 2020

@jneira Yes, There are a number of unsupported cases.

  1. Packages from cabal.project and stack.yaml are not used.
  2. common stanzas (not planned Common stanzas are not understood Avi-D-coder/implicit-hie#1)
  3. cabal conditionals (not planned)
  4. merging fields. (easy fix)
  5. hs-source-dirs is treated as single item. (easy fix)

Stack is easy, but Cabal excepts craziness like this:

packages:
  */*.cabal
  *-core/*.cabal
  *-extra/*.cabal
  *-sop/*.cabal
  *-th/*.cabal
  *-vl/*.cabal
  indexed-profunctors/*.cabal
  template-haskell-optics/*.cabal

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 10, 2020

To do packages properly we would have depend on glob or filepattern.

This looks easier than I though since filepattern is very nice.

@fendor
Copy link
Collaborator

fendor commented May 11, 2020

Do you handle package.yaml with this?
EDIT: also, how are overlapping source directories handled? Is that documented in your lib?

@Avi-D-coder
Copy link
Contributor Author

@fendor For now we require a cabal file, since stack build always creates one anyway.

@fendor
Copy link
Collaborator

fendor commented May 11, 2020

For now we require a cabal file, since stack build always creates one anyway.

True, but stack build is not necessarily called before hie-bios .

@Avi-D-coder
Copy link
Contributor Author

Adding support for package.yaml is pretty simple since it's just YAML, but it's not on my imitate todo list.

gen-hie produces an warrning message if it finds a stack.yaml, but no cabal files, we should probably do the same.

@Avi-D-coder
Copy link
Contributor Author

@jneira Could you try it again it should be fixed.

@Avi-D-coder
Copy link
Contributor Author

In the future we should check if a deeply nested cabal file is listed as stack.yaml or cabal.project package. Implicit-hie no longer erroneously adds them, but the logic at src/HIE/Bios/Cradle.hs:136 does no take this into account.

For example the haskell-language-server /install/ is not a package of the parent project. Currently on master and in this PR findFileUpwards is unbounded.

From the haskell-language-server/ this is broken.

haskell-language-server ❯ hie-bios debug install/src/Cabal.hs
Cradle failed to load
Exit Code: ExitSuccess
Stderr: Multi Cradle: No prefixes matched
pwd: /home/host/haskell-language-server
filepath: /home/host/haskell-language-server/install/src/Cabal.hs
prefixes:
("./src",Cabal {component = Just "lib:haskell-language-server"})
("./exe/Main.hs",Cabal {component = Just "haskell-language-server:exe:haskell-language-server"})
("./exe/Wrapper.hs",Cabal {component = Just "haskell-language-server:exe:haskell-language-server-wrapper"})
("./test/functional",Cabal {component = Just "haskell-language-server:test:func-test"})
("./test/utils",Cabal {component = Just "lib:haskell-language-server:hls-test-utils"})
("ghcide/src",Cabal {component = Just "lib:ghcide"})
("ghcide/src-ghc86",Cabal {component = Just "lib:ghcide"})
("ghcide/src-ghc88",Cabal {component = Just "lib:ghcide"})
("ghcide/src-ghc810",Cabal {component = Just "lib:ghcide"})
("ghcide/test/preprocessor/Main.hs",Cabal {component = Just "ghcide:exe:ghcide-test-preprocessor"})
("ghcide/exe/Main.hs",Cabal {component = Just "ghcide:exe:ghcide"})
("ghcide/test/cabal",Cabal {component = Just "ghcide:test:ghcide-tests"})
("ghcide/test/exe",Cabal {component = Just "ghcide:test:ghcide-tests"})
("ghcide/test/src",Cabal {component = Just "ghcide:test:ghcide-tests"})

From the install/ this it works

haskell-language-server/install ❯ hie-bios debug src/Cabal.hs 
Root directory:      /home/host/haskell-language-server/install
Component directory: /home/host/haskell-language-server/install
GHC options:         -fbuilding-cabal-package -O0 -outputdir /home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build -odir /home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build -hidir /home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build -stubdir /home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build -i -i/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build -isrc -i/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build/autogen -i/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build/global-autogen -I/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build/autogen -I/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build/global-autogen -I/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build -optP-include -optP/home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/build/autogen/cabal_macros.h -this-unit-id hls-install-0.8.0.0-inplace -hide-all-packages -Wmissing-home-modules -no-user-package-db -package-db /home/host/.cabal/store/ghc-8.8.3/package.db -package-db /home/host/haskell-language-server/install/dist-newstyle/packagedb/ghc-8.8.3 -package-db /home/host/haskell-language-server/install/dist-newstyle/build/x86_64-linux/ghc-8.8.3/hls-install-0.8.0.0/package.conf.inplace -package-id base-4.13.0.0 -package-id cabal-install-parsers-0.3.0.1-bf2c23a2e5f58aa31d88a36792451fe7eabe7b48962cf209167ab70e15b9edbe -package-id directory-1.3.6.0 -package-id extra-1.7.1-acdd3835354a9eb3db781548168efec45616130a72a342610f3c36ec5cf13211 -package-id filepath-1.4.2.1 -package-id shake-0.18.5-602f2cdbd3147204d88e77f8741bf241686d3245c138659b0f8f659103b171f2 -package-id text-1.2.4.0 -XHaskell2010 -XLambdaCase -XTupleSections -XRecordWildCards HlsInstall BuildSystem Stack Version Cabal Print Env Help -hide-all-packages
System libraries:    /home/host/.ghcup/ghc/8.8.3/lib/ghc-8.8.3
Config Location:     No explicit config found
Cradle:              Cradle {cradleRootDir = "/home/host/haskell-language-server/install", cradleOptsProg = CradleAction: Cabal}
Dependencies:        hls-install.cabal cabal.project cabal.project.local

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 13, 2020

Even for complex configs like hls and hie this now generates the correct configs. Only common stanzas and conditionals are not supported.

cradle:
  cabal:
    - path: "./src"
      component: "lib:haskell-ide-engine"

    - path: "./app/MainHie.hs"
      component: "haskell-ide-engine:exe:hie"

    - path: "./app/HieWrapper.hs"
      component: "haskell-ide-engine:exe:hie-wrapper"

    - path: "./test/utils"
      component: "lib:haskell-ide-engine:hie-test-utils"

    - path: "./test/unit"
      component: "haskell-ide-engine:test:unit-test"

    - path: "./test/dispatcher"
      component: "haskell-ide-engine:test:dispatcher-test"

    - path: "./test/plugin-dispatcher"
      component: "haskell-ide-engine:test:plugin-dispatcher-test"

    - path: "./test/functional"
      component: "haskell-ide-engine:test:func-test"

    - path: "./test/wrapper"
      component: "haskell-ide-engine:test:wrapper-test"

    - path: "./hie-plugin-api/./"
      component: "lib:hie-plugin-api"
  stack:
    - path: "./src"
      component: "haskell-ide-engine:lib"

    - path: "./app/MainHie.hs"
      component: "haskell-ide-engine:exe:hie"

    - path: "./app/HieWrapper.hs"
      component: "haskell-ide-engine:exe:hie-wrapper"

    - path: "./test/utils"
      component: "haskell-ide-engine:lib:hie-test-utils"

    - path: "./test/unit"
      component: "haskell-ide-engine:test:unit-test"

    - path: "./test/dispatcher"
      component: "haskell-ide-engine:test:dispatcher-test"

    - path: "./test/plugin-dispatcher"
      component: "haskell-ide-engine:test:plugin-dispatcher-test"

    - path: "./test/functional"
      component: "haskell-ide-engine:test:func-test"

    - path: "./test/wrapper"
      component: "haskell-ide-engine:test:wrapper-test"

    - path: "hie-plugin-api/./"
      component: "hie-plugin-api:lib"

@fendor
Copy link
Collaborator

fendor commented May 13, 2020

Looking good! So, then for the cabal-helper source, I assume it will break? It has common stanzas, overlapping source directories and conditions for stanzas.

In depth review will come this week

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 13, 2020

@fendor Yes, implicit-hie generates an incomplete multi cradle config for the cabal-helper repo. Although it seems to work better than the cabal-helper cradle under hie.

cradle:
  cabal:
    - path: "./lib"
      component: "lib:cabal-helper"

    - path: "./tests"
      component: "cabal-helper:test:compile-test"

    - path: "./tests"
      component: "cabal-helper:test:programs-test"

    - path: "./tests"
      component: "cabal-helper:test:ghc-session"

    - path: "./tests"
      component: "cabal-helper:test:examples"

    - path: "./src/CabalHelper/Runtime/Main.hs"
      component: "cabal-helper:exe:cabal-helper-main"

Broken file under cabal-helper working with the above config/this pr.

2020-05-13 02:45:44.426388989 [ThreadId 30] - New cradle: /home/host/cabal-helper/lib/Distribution/Helper.hs
2020-05-13 02:45:44.427462332 [ThreadId 30] - Cabal-Helper decided to use: ProjLocV2File {plCabalProjectFile = "/home/host/cabal-helper/cabal.project", plProjectDirV2 = "/home/host/cabal-helper"}
Build profile: -w ghc-8.8.3 -O1
In order, the following would be built (use -v for more details):
 - cabal-helper-1.1.0.0 (lib) (configuration changed)
2020-05-13 02:45:45.231245671 [ThreadId 30] - Module "/home/host/cabal-helper/lib/Distribution/Helper.hs" is loaded by Cradle: Cradle {cradleRootDir = "/home/host/cabal-helper", cradleOptsProg = CradleAction: Other CabalV2}
2020-05-13 02:45:45.231601197 [ThreadId 30] - Found cradle: Cradle {cradleRootDir = "/home/host/cabal-helper", cradleOptsProg = CradleAction: Other CabalV2}
Build profile: -w ghc-8.8.3 -O1
In order, the following will be built (use -v for more details):
 - cabal-helper-1.1.0.0 (test:programs-test) (first run)
Build profile: -w ghc-8.8.3 -O1
In order, the following will be built (use -v for more details):
 - cabal-helper-1.1.0.0 (test:ghc-session) (first run)
2020-05-13 02:45:46.405945189 [ThreadId 118] - Source error on cradle initialisation: can't find file: lib/GhcSession.hs
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
`gcc' failed in phase `C pre-processor'. (Exit code: 1)
module ‘Paths_cabal_helper’ cannot be found locally

2020-05-13 02:45:46.406128792 [ThreadId 118] - Cradle did not load succesfully

With this PR's implicit cradle (no hie.yaml file written).

❯ hie-bios debug lib/Distribution/Helper.hs                   
Root directory:      /home/host/cabal-helper
Component directory: /home/host/cabal-helper
GHC options:         -fbuilding-cabal-package -O0 -outputdir /home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build -odir /home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build -hidir /home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build -stubdir /home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build -i -i/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build -isrc -ilib -ios/posix -i/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build/autogen -i/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build/global-autogen -I/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build/autogen -I/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build/global-autogen -I/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build -optP-include -optP/home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/build/autogen/cabal_macros.h -this-unit-id cabal-helper-1.1.0.0-inplace -hide-all-packages -Wmissing-home-modules -no-user-package-db -package-db /home/host/.cabal/store/ghc-8.8.3/package.db -package-db /home/host/cabal-helper/dist-newstyle/packagedb/ghc-8.8.3 -package-db /home/host/cabal-helper/dist-newstyle/build/x86_64-linux/ghc-8.8.3/cabal-helper-1.1.0.0/package.conf.inplace -package-id Cabal-3.0.1.0 -package-id SHA-1.6.4.4-6ad947bf541fd1c7ba0a9a507a850bdd947d14706d15e05cbe43679acbb7722c -package-id base-4.13.0.0 -package-id bytestring-0.10.10.0 -package-id cabal-plan-0.6.2.0-90c3710bb45847ef10e5f758780ddf428c485922dd419676a04ea1d2d57ebe58 -package-id clock-0.7.2-0bfad4514aed1a95d054d942caeb5c653560619033ee18702463a6cb3b68ea70 -package-id containers-0.6.2.1 -package-id directory-1.3.6.0 -package-id filepath-1.4.2.1 -package-id mtl-2.2.2 -package-id process-1.6.8.0 -package-id semigroupoids-5.3.4-7226cd4b5e78260f4545a3da2f4a3d2998c0963cced7dcce370e6235724832ea -package-id semigroups-0.18.5-f04180ebf70d980630175e54a2a1971aa3d720745c13cbd922c0f4b349b66fac -package-id template-haskell-2.15.0.0 -package-id temporary-1.2.1.1-f283a86a41e301dc29330c2135e0231ea294f62da89a7b46a8661d20581910d3 -package-id text-1.2.4.0 -package-id time-1.9.3 -package-id transformers-0.5.6.2 -package-id unix-2.7.2.2 -package-id unix-compat-0.5.2-3fc18be3724185bd5aa584ffb09be40f68a2b33a6acb6ebd91c25590ec9d16bf -package-id utf8-string-1.0.1.1-d76bceb8bb7b728d50464ba115ea0e2b57e8c13d09f1eda1903cbaa723343d0f -XHaskell2010 -XNondecreasingIndentation -XImplicitParams -XNamedFieldPuns -XRecordWildCards -XFlexibleContexts -XConstraintKinds Distribution.Helper Distribution.Helper.Discover CabalHelper.Compiletime.Cabal CabalHelper.Compiletime.CompPrograms CabalHelper.Compiletime.Compat.Environment CabalHelper.Compiletime.Compat.Version CabalHelper.Compiletime.Compat.Parsec CabalHelper.Compiletime.Compile CabalHelper.Compiletime.Data CabalHelper.Compiletime.Log CabalHelper.Compiletime.Process CabalHelper.Compiletime.Program.CabalInstall CabalHelper.Compiletime.Program.Stack CabalHelper.Compiletime.Program.GHC CabalHelper.Compiletime.Sandbox CabalHelper.Compiletime.Types CabalHelper.Compiletime.Types.Cabal CabalHelper.Compiletime.Types.RelativePath CabalHelper.Runtime.Compat CabalHelper.Runtime.HelperMain CabalHelper.Shared.Common CabalHelper.Shared.InterfaceTypes Paths_cabal_helper Symlink -hide-all-packages
System libraries:    /home/host/.ghcup/ghc/8.8.3/lib/ghc-8.8.3
Config Location:     No explicit config found
Cradle:              Cradle {cradleRootDir = "/home/host/cabal-helper", cradleOptsProg = CradleAction: Cabal}
Dependencies:        cabal-helper.cabal cabal.project cabal.project.local

@jneira
Copy link
Member

jneira commented May 13, 2020

Nice improvements! Not sure if it is possible (or it is already done) but could we rely in the actual implicit mechanism (cabal/stack repl file) if the file is not under a path in the multi cradle (or generally if implicit-hie fails to build the multi-cradle)
The actual implicit way does not work in general but maybe it does it for cases implicit-hie doesn't work (there is a cabal issue to improve it).

@Avi-D-coder
Copy link
Contributor Author

@jneira I'm not quite sure what you mean. Could you elaborate or give an example?

@jneira
Copy link
Member

jneira commented May 13, 2020

Mmm, sorry for my quircky english, i wanted to mean that i would continue using:

 <|> (stackExecutable >> (Stack Nothing,) <$> stackWorkDir fp)
     <|> ((Cabal Nothing,) <$> cabalWorkDir fp)

as the last resort in the implicit config (with the appropiate adjustements) in two cases:

  • If the new implicit mechanism fails to create the cradle config
    • due an exception
    • or if all the new alternatives don't hold for any reason (even it is not an exception)
  • If the new implicit cradle config is created but the wfile in loadImplicitCradle does not match any of the paths of the multi cradle created by implicit-hie

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 13, 2020

@jneira good idea, I can't think of a reason why we couldn't do that.

@fendor
Copy link
Collaborator

fendor commented May 13, 2020

Although it seems to work better than the cabal-helper cradle under hie

That is interesting, I remember that I tested that thoroughly when implementing the Cabal Helper cradle.

@mpickering
Copy link
Collaborator

I do not think I want to merge this patch. I would rather remove all the implicit cradle searching from hie-bios and leave that to external libraries such as your own.

@ndmitchell
Copy link
Contributor

If that's the approach, it suggests we need a separate package hie-bios-implicit that wraps this one with magic implicitness, and then things like hls/ghcide would use that one. Or is another route the suggested one?

@Avi-D-coder
Copy link
Contributor Author

Avi-D-coder commented May 18, 2020

@ndmitchell We're debating whether or not hls should use implict-hie or cabal-helper and in what order haskell/haskell-language-server#110

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

Successfully merging this pull request may close these issues.

None yet

5 participants