hls-stylish-haskell-plugin 1.0.1.0 → 1.0.1.1
raw patch · 3 files changed
+85/−85 lines, 3 filesdep ~ghcidedep ~hls-plugin-apidep ~hls-test-utilsnew-uploaderPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: ghcide, hls-plugin-api, hls-test-utils, stylish-haskell
API changes (from Hackage documentation)
Files
- hls-stylish-haskell-plugin.cabal +5/−5
- src/Ide/Plugin/StylishHaskell.hs +79/−79
- test/Main.hs +1/−1
hls-stylish-haskell-plugin.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: hls-stylish-haskell-plugin-version: 1.0.1.0+version: 1.0.1.1 synopsis: Integration with the Stylish Haskell code formatter description: Please see the README on GitHub at <https://github.com/haskell/haskell-language-server#readme>@@ -24,10 +24,10 @@ , filepath , ghc , ghc-boot-th- , ghcide ^>=1.6- , hls-plugin-api ^>=1.3+ , ghcide ^>=1.7+ , hls-plugin-api ^>=1.4 , lsp-types- , stylish-haskell ^>=0.12 || ^>=0.13+ , stylish-haskell ^>=0.12 || ^>=0.13 || ^>=0.14 , text default-language: Haskell2010@@ -42,4 +42,4 @@ , base , filepath , hls-stylish-haskell-plugin- , hls-test-utils ^>=1.2+ , hls-test-utils ^>=1.3
src/Ide/Plugin/StylishHaskell.hs view
@@ -1,79 +1,79 @@-{-# LANGUAGE OverloadedStrings #-} -module Ide.Plugin.StylishHaskell - ( descriptor - , provider - ) -where - -import Control.Monad.IO.Class -import Data.Text (Text) -import qualified Data.Text as T -import Development.IDE hiding (pluginHandlers) -import Development.IDE.GHC.Compat (ModSummary (ms_hspp_opts), - extensionFlags) -import qualified Development.IDE.GHC.Compat.Util as Util -import GHC.LanguageExtensions.Type -import Ide.PluginUtils -import Ide.Types -import Language.Haskell.Stylish -import Language.LSP.Types as J -import System.Directory -import System.FilePath - -descriptor :: PluginId -> PluginDescriptor IdeState -descriptor plId = (defaultPluginDescriptor plId) - { pluginHandlers = mkFormattingHandlers provider - } - --- | Formatter provider of stylish-haskell. --- Formats the given source in either a given Range or the whole Document. --- If the provider fails an error is returned that can be displayed to the user. -provider :: FormattingHandler IdeState -provider ide typ contents fp _opts = do - dyn <- fmap (ms_hspp_opts . msrModSummary) $ liftIO $ runAction "stylish-haskell" ide $ use_ GetModSummary fp - let file = fromNormalizedFilePath fp - config <- liftIO $ loadConfigFrom file - mergedConfig <- liftIO $ getMergedConfig dyn config - let (range, selectedContents) = case typ of - FormatText -> (fullRange contents, contents) - FormatRange r -> (normalize r, extractRange r contents) - result = runStylishHaskell file mergedConfig selectedContents - case result of - Left err -> return $ Left $ responseError $ T.pack $ "stylishHaskellCmd: " ++ err - Right new -> return $ Right $ J.List [TextEdit range new] - where - getMergedConfig dyn config - | null (configLanguageExtensions config) - = do - logInfo (ideLogger ide) "stylish-haskell uses the language extensions from DynFlags" - pure - $ config - { configLanguageExtensions = getExtensions dyn } - | otherwise - = pure config - - getExtensions = map showExtension . Util.toList . extensionFlags - - showExtension Cpp = "CPP" - showExtension other = show other - --- | Recursively search in every directory of the given filepath for .stylish-haskell.yaml. --- If no such file has been found, return default config. -loadConfigFrom :: FilePath -> IO Config -loadConfigFrom file = do - currDir <- getCurrentDirectory - setCurrentDirectory (takeDirectory file) - config <- loadConfig (makeVerbose False) Nothing - setCurrentDirectory currDir - pure config - --- | Run stylish-haskell on the given text with the given configuration. -runStylishHaskell :: FilePath -- ^ Location of the file being formatted. Used for error message - -> Config -- ^ Configuration for stylish-haskell - -> Text -- ^ Text to format - -> Either String Text -- ^ Either formatted Text or an error message -runStylishHaskell file config = fmap fromLines . fmt . toLines - where - fromLines = T.pack . unlines - fmt = runSteps (configLanguageExtensions config) (Just file) (configSteps config) - toLines = lines . T.unpack +{-# LANGUAGE OverloadedStrings #-}+module Ide.Plugin.StylishHaskell+ ( descriptor+ , provider+ )+where++import Control.Monad.IO.Class+import Data.Text (Text)+import qualified Data.Text as T+import Development.IDE hiding (pluginHandlers)+import Development.IDE.GHC.Compat (ModSummary (ms_hspp_opts),+ extensionFlags)+import qualified Development.IDE.GHC.Compat.Util as Util+import GHC.LanguageExtensions.Type+import Ide.PluginUtils+import Ide.Types+import Language.Haskell.Stylish+import Language.LSP.Types as J+import System.Directory+import System.FilePath++descriptor :: PluginId -> PluginDescriptor IdeState+descriptor plId = (defaultPluginDescriptor plId)+ { pluginHandlers = mkFormattingHandlers provider+ }++-- | Formatter provider of stylish-haskell.+-- Formats the given source in either a given Range or the whole Document.+-- If the provider fails an error is returned that can be displayed to the user.+provider :: FormattingHandler IdeState+provider ide typ contents fp _opts = do+ dyn <- fmap (ms_hspp_opts . msrModSummary) $ liftIO $ runAction "stylish-haskell" ide $ use_ GetModSummary fp+ let file = fromNormalizedFilePath fp+ config <- liftIO $ loadConfigFrom file+ mergedConfig <- liftIO $ getMergedConfig dyn config+ let (range, selectedContents) = case typ of+ FormatText -> (fullRange contents, contents)+ FormatRange r -> (normalize r, extractRange r contents)+ result = runStylishHaskell file mergedConfig selectedContents+ case result of+ Left err -> return $ Left $ responseError $ T.pack $ "stylishHaskellCmd: " ++ err+ Right new -> return $ Right $ J.List [TextEdit range new]+ where+ getMergedConfig dyn config+ | null (configLanguageExtensions config)+ = do+ logInfo (ideLogger ide) "stylish-haskell uses the language extensions from DynFlags"+ pure+ $ config+ { configLanguageExtensions = getExtensions dyn }+ | otherwise+ = pure config++ getExtensions = map showExtension . Util.toList . extensionFlags++ showExtension Cpp = "CPP"+ showExtension other = show other++-- | Recursively search in every directory of the given filepath for .stylish-haskell.yaml.+-- If no such file has been found, return default config.+loadConfigFrom :: FilePath -> IO Config+loadConfigFrom file = do+ currDir <- getCurrentDirectory+ setCurrentDirectory (takeDirectory file)+ config <- loadConfig (makeVerbose False) Nothing+ setCurrentDirectory currDir+ pure config++-- | Run stylish-haskell on the given text with the given configuration.+runStylishHaskell :: FilePath -- ^ Location of the file being formatted. Used for error message+ -> Config -- ^ Configuration for stylish-haskell+ -> Text -- ^ Text to format+ -> Either String Text -- ^ Either formatted Text or an error message+runStylishHaskell file config = fmap fromLines . fmt . toLines+ where+ fromLines = T.pack . unlines+ fmt = runSteps (configLanguageExtensions config) (Just file) (configSteps config)+ toLines = lines . T.unpack
test/Main.hs view
@@ -22,7 +22,7 @@ ] goldenWithStylishHaskell :: TestName -> FilePath -> FilePath -> (TextDocumentIdentifier -> Session ()) -> TestTree-goldenWithStylishHaskell title fp desc = goldenWithHaskellDocFormatter stylishHaskellPlugin "stylishHaskell" title testDataDir fp desc "hs"+goldenWithStylishHaskell title fp desc = goldenWithHaskellDocFormatter stylishHaskellPlugin "stylishHaskell" def title testDataDir fp desc "hs" testDataDir :: FilePath testDataDir = "test" </> "testdata"