From d965e02ac602f12ff592e7671724fb6a31d1671b Mon Sep 17 00:00:00 2001 From: Brandon Chinn Date: Fri, 5 Aug 2022 18:58:54 -0700 Subject: [PATCH 1/4] Break out fmap --- plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs index d1d8565dad..f22b64d020 100644 --- a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs +++ b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs @@ -16,7 +16,7 @@ import Control.Exception (IOException, try) import Control.Lens ((^.)) import Control.Monad import Control.Monad.IO.Class -import Data.Bifunctor (first) +import Data.Bifunctor (bimap, first) import Data.Maybe import Data.Text (Text) import qualified Data.Text as T @@ -100,8 +100,8 @@ provider recorder plId ideState typ contents fp fo = withIndefiniteProgress titl pure . Left . responseError $ "Fourmolu failed with exit code " <> T.pack (show n) else do let format fourmoluConfig = - first (mkError . show) - <$> try @OrmoluException (makeDiffTextEdit contents <$> ormolu config fp' (T.unpack contents)) + bimap (mkError . show) (makeDiffTextEdit contents) + <$> try @OrmoluException (ormolu config fp' (T.unpack contents)) where printerOpts = #if MIN_VERSION_fourmolu(0,7,0) From 425763a589cbafcdd8bb1b09597845cf12fe33ab Mon Sep 17 00:00:00 2001 From: Brandon Chinn Date: Fri, 5 Aug 2022 19:19:44 -0700 Subject: [PATCH 2/4] Consolidate shims --- .../hls-fourmolu-plugin.cabal | 4 +- .../src/Ide/Plugin/Fourmolu.hs | 39 ++--------- .../src/Ide/Plugin/Fourmolu/Shim.hs | 68 +++++++++++++++++++ 3 files changed, 77 insertions(+), 34 deletions(-) create mode 100644 plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs diff --git a/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal b/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal index 96eaf7dc64..43c6a83377 100644 --- a/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal +++ b/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal @@ -23,7 +23,9 @@ source-repository head location: git://github.com/haskell/haskell-language-server.git library - exposed-modules: Ide.Plugin.Fourmolu + exposed-modules: + Ide.Plugin.Fourmolu + , Ide.Plugin.Fourmolu.Shim hs-source-dirs: src ghc-options: -Wall build-depends: diff --git a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs index f22b64d020..f477b97d29 100644 --- a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs +++ b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DisambiguateRecordFields #-} {-# LANGUAGE LambdaCase #-} @@ -25,6 +24,7 @@ import Development.IDE.GHC.Compat as Compat hiding (Cpp, Warning, hang, vcat) import qualified Development.IDE.GHC.Compat.Util as S import GHC.LanguageExtensions.Type (Extension (Cpp)) +import Ide.Plugin.Fourmolu.Shim import Ide.Plugin.Properties import Ide.PluginUtils (makeDiffTextEdit, usePropertyLsp) @@ -33,7 +33,6 @@ import Language.LSP.Server hiding (defaultConfig) import Language.LSP.Types hiding (line) import Language.LSP.Types.Lens (HasTabSize (tabSize)) import Ormolu -import Ormolu.Config import System.Exit import System.FilePath import System.Process.Run (cwd, proc) @@ -103,14 +102,9 @@ provider recorder plId ideState typ contents fp fo = withIndefiniteProgress titl bimap (mkError . show) (makeDiffTextEdit contents) <$> try @OrmoluException (ormolu config fp' (T.unpack contents)) where - printerOpts = -#if MIN_VERSION_fourmolu(0,7,0) - cfgFilePrinterOpts fourmoluConfig -#else - fourmoluConfig - -#endif + printerOpts = cfgFilePrinterOpts fourmoluConfig config = + addFixityOverrides (cfgFileFixities fourmoluConfig) $ defaultConfig { cfgDynOptions = map DynOption fileOpts , cfgRegion = region @@ -119,29 +113,14 @@ provider recorder plId ideState typ contents fp fo = withIndefiniteProgress titl fillMissingPrinterOpts (printerOpts <> lspPrinterOpts) defaultPrinterOpts -#if MIN_VERSION_fourmolu(0,7,0) - , cfgFixityOverrides = - cfgFileFixities fourmoluConfig -#endif } in liftIO (loadConfigFile fp') >>= \case ConfigLoaded file opts -> liftIO $ do logWith recorder Info $ ConfigPath file - format opts + format (toConfig opts) ConfigNotFound searchDirs -> liftIO $ do logWith recorder Info $ NoConfigPath searchDirs - format emptyOptions - where - emptyOptions = -#if MIN_VERSION_fourmolu(0,7,0) - FourmoluConfig - { cfgFilePrinterOpts = mempty - , cfgFileFixities = mempty - } -#else - mempty -#endif - + format emptyConfig ConfigParseError f err -> do sendNotification SWindowShowMessage $ ShowMessageParams @@ -150,13 +129,7 @@ provider recorder plId ideState typ contents fp fo = withIndefiniteProgress titl } return . Left $ responseError errorMessage where - errorMessage = "Failed to load " <> T.pack f <> ": " <> T.pack (convertErr err) - convertErr = -#if MIN_VERSION_fourmolu(0,7,0) - show -#else - snd -#endif + errorMessage = "Failed to load " <> T.pack f <> ": " <> T.pack (showParseError err) where fp' = fromNormalizedFilePath fp title = "Formatting " <> T.pack (takeFileName fp') diff --git a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs new file mode 100644 index 0000000000..7859666aaf --- /dev/null +++ b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs @@ -0,0 +1,68 @@ +{-# LANGUAGE CPP #-} + +module Ide.Plugin.Fourmolu.Shim ( + -- * FourmoluConfig + FourmoluConfig (..), + toConfig, + emptyConfig, + + -- * FixityMap + addFixityOverrides, + + -- * ConfigParseError + showParseError, +) where + +import Ormolu.Config + +#if MIN_VERSION_fourmolu(0,7,0) +import Ormolu.Fixity +#endif + +{-- Backport FourmoluConfig --} + +#if MIN_VERSION_fourmolu(0,7,0) +toConfig :: FourmoluConfig -> FourmoluConfig +toConfig = id +#else +data FourmoluConfig = FourmoluConfig + { cfgFilePrinterOpts :: PrinterOptsPartial + , cfgFileFixities :: FixityMap + } + +toConfig :: PrinterOptsPartial -> FourmoluConfig +toConfig opts = + FourmoluConfig + { cfgFilePrinterOpts = opts + , cfgFileFixities = mempty + } +#endif + +emptyConfig :: FourmoluConfig +emptyConfig = + FourmoluConfig + { cfgFilePrinterOpts = mempty + , cfgFileFixities = mempty + } + +{-- Backport FixityMap --} + +#if MIN_VERSION_fourmolu(0,7,0) +addFixityOverrides :: FixityMap -> Config region -> Config region +addFixityOverrides fixities cfg = cfg{cfgFixityOverrides = fixities} +#else +type FixityMap = () + +addFixityOverrides :: FixityMap -> Config region -> Config region +addFixityOverrides _ = id +#endif + +{-- Backport ConfigParseError --} + +#if MIN_VERSION_fourmolu(0,7,0) +showParseError :: Show parseException => parseException -> String +showParseError = show +#else +showParseError :: (pos, String) -> String +showParseError = snd +#endif From 59415bb8f7618e071394816206531b7af7a417ba Mon Sep 17 00:00:00 2001 From: Brandon Chinn Date: Fri, 5 Aug 2022 20:09:19 -0700 Subject: [PATCH 3/4] Add support for fourmolu-0.8.0.0 --- plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal b/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal index 43c6a83377..bb4e0b687a 100644 --- a/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal +++ b/plugins/hls-fourmolu-plugin/hls-fourmolu-plugin.cabal @@ -31,7 +31,7 @@ library build-depends: , base >=4.12 && <5 , filepath - , fourmolu ^>=0.3 || ^>=0.4 || ^>= 0.6 || ^>= 0.7 + , fourmolu ^>=0.3 || ^>=0.4 || ^>= 0.6 || ^>= 0.7 || ^>= 0.8 , ghc , ghc-boot-th , ghcide ^>=1.7 From abd7a1955c09129cbc2a394ad3b9f057aed2937e Mon Sep 17 00:00:00 2001 From: Brandon Chinn Date: Fri, 5 Aug 2022 20:15:34 -0700 Subject: [PATCH 4/4] Make even more forwards-compatible --- .../src/Ide/Plugin/Fourmolu.hs | 2 +- .../src/Ide/Plugin/Fourmolu/Shim.hs | 30 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs index f477b97d29..d62210d71e 100644 --- a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs +++ b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu.hs @@ -117,7 +117,7 @@ provider recorder plId ideState typ contents fp fo = withIndefiniteProgress titl in liftIO (loadConfigFile fp') >>= \case ConfigLoaded file opts -> liftIO $ do logWith recorder Info $ ConfigPath file - format (toConfig opts) + format opts ConfigNotFound searchDirs -> liftIO $ do logWith recorder Info $ NoConfigPath searchDirs format emptyConfig diff --git a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs index 7859666aaf..976e522d93 100644 --- a/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs +++ b/plugins/hls-fourmolu-plugin/src/Ide/Plugin/Fourmolu/Shim.hs @@ -2,8 +2,8 @@ module Ide.Plugin.Fourmolu.Shim ( -- * FourmoluConfig - FourmoluConfig (..), - toConfig, + cfgFilePrinterOpts, + cfgFileFixities, emptyConfig, -- * FixityMap @@ -21,29 +21,27 @@ import Ormolu.Fixity {-- Backport FourmoluConfig --} -#if MIN_VERSION_fourmolu(0,7,0) -toConfig :: FourmoluConfig -> FourmoluConfig -toConfig = id -#else -data FourmoluConfig = FourmoluConfig - { cfgFilePrinterOpts :: PrinterOptsPartial - , cfgFileFixities :: FixityMap - } +#if !MIN_VERSION_fourmolu(0,7,0) +type FourmoluConfig = PrinterOptsPartial -toConfig :: PrinterOptsPartial -> FourmoluConfig -toConfig opts = - FourmoluConfig - { cfgFilePrinterOpts = opts - , cfgFileFixities = mempty - } +cfgFilePrinterOpts :: FourmoluConfig -> PrinterOptsPartial +cfgFilePrinterOpts = id + +cfgFileFixities :: FourmoluConfig -> FixityMap +cfgFileFixities _ = mempty #endif +#if MIN_VERSION_fourmolu(0,7,0) emptyConfig :: FourmoluConfig emptyConfig = FourmoluConfig { cfgFilePrinterOpts = mempty , cfgFileFixities = mempty } +#else +emptyConfig :: FourmoluConfig +emptyConfig = mempty +#endif {-- Backport FixityMap --}