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

hlint misses -XNoForeignFunctionInterface in the cradle #3095

Open
lf- opened this issue Aug 11, 2022 · 2 comments
Open

hlint misses -XNoForeignFunctionInterface in the cradle #3095

lf- opened this issue Aug 11, 2022 · 2 comments
Labels
component: formatters component: hls-hlint-plugin status: blocked Not actionable, because blocked by upstream/GHC etc. type: bug Something isn't right: doesn't work as intended, documentation is missing/outdated, etc..

Comments

@lf-
Copy link
Contributor

lf- commented Aug 11, 2022

Here is an hls branch with a broken test case (only runs on ghc-9.2):

https://github.com/lf-/haskell-language-server/tree/hlint-flags-bug

and the commit, for convenience: lf-@8a90d27

The issue happens in this source:

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
module Foo (Node(..)) where

data Node = Node
  {
    label :: ()
  }

instance Semigroup Node where
  n1 <> n2 = Node
    { label = n1.label <> n2.label
    --            ^^^ this is a parse error because "label" is undocumentedly a reserved word when -XForeignFunctionInterface is enabled (which it is by default)
    }

The bug is that hls' hlint plugin will trigger parse errors, even if the hlint.yaml has -XNoForeignFunctionInterface in it, and also even if the cradle provides it.

It is "fixable" in a project by "haskell.plugin.hlint.config.flags": ["-XNoForeignFunctionInterface"].

The cause of this bug is that the disabled language extensions are not correctly propagated to hlint when hlint is called: only enabled extensions are propagated:

setExtensions flags = do
hlintExts <- getExtensions nfp
logWith recorder Debug $ LogUsingExtensions nfp (fmap show hlintExts)
return $ flags { enabledExtensions = hlintExts }

Unfortunately, actually retrieving disabled extensions is significantly frustrated by OnOff (https://hackage.haskell.org/package/ghc-9.2.4/docs/src/GHC.Driver.Session.html#OnOff) being a private member of GHC.Driver.Session, so it is impossible to get the disabled extensions out of DynFlags.extensions without more or less doing something like read . dropOnOffPrefix . show.

So what I am 99% sure is happening, based on putting traces in both sides, is that ForeignFunctionInterface is absent from the enabledExtensions passed to hlint if the cradle is configured with -XNoForeignFunctionInterface, but it is then reenabled because it is a default extension.

I got fairly far in fixing this, but ran up against this brick wall, and don't really have more time to commit to fixing it. So I am filing this report with the hopes that it will at least be easier to fix. I found some time :)

Your environment

..

Steps to reproduce

Run the test suite from https://github.com/lf-/haskell-language-server/tree/hlint-flags-bug

Expected behaviour

Should pass :)

Actual behaviour

      src/Test/Hls/Util.hs:317:
      Got unexpected diagnostics for Uri {getUri = "file:///Users/jade/co/haskell-language-server/plugins/hls-hlint-plugin/test/testdata/lab
elkeyword/LabelKeyword.hs"} got [Diagnostic {_range = Range {_start = Position {_line = 11, _character = 17}, _end = Position {_line = 11, _
character = 22}}, _severity = Just DsInfo, _code = Just (InR "parser"), _source = Just "hlint", _message = "/Users/jade/co/haskell-language-
server/plugins/hls-hlint-plugin/test/testdata/labelkeyword/LabelKeyword.hs:12:18: error:\n    parse error on input `label'\n  instance Semig
roup Node where\n    n1 <> n2 = Node\n>     { label = n1.label <> n2.label\n      }\n\n", _tags = Nothing, _relatedInformation = Nothing}]

Debug information

@lf- lf- added status: needs triage type: bug Something isn't right: doesn't work as intended, documentation is missing/outdated, etc.. labels Aug 11, 2022
@lf-
Copy link
Contributor Author

lf- commented Aug 11, 2022

https://gitlab.haskell.org/ghc/ghc/-/merge_requests/8817

i have filed a ghc MR to fix the export issue but it obviously would have to get released so it's a long term solution i guess

@lf-
Copy link
Contributor Author

lf- commented Aug 11, 2022

Just found out that the Fourmolu provider also contains this bug or a very similar one, as calling format in my editor causes a similar error to be logged but fourmolu from the command line is fine.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component: formatters component: hls-hlint-plugin status: blocked Not actionable, because blocked by upstream/GHC etc. type: bug Something isn't right: doesn't work as intended, documentation is missing/outdated, etc..
Projects
None yet
Development

No branches or pull requests

2 participants