{-# LANGUAGE CPP                       #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE OverloadedStrings         #-}
module HlsPlugins where

import           Development.IDE.Types.Logger      (Pretty (pretty), Recorder,
                                                    WithPriority, cmapWithPrio)
import           Ide.PluginUtils                   (pluginDescToIdePlugins)
import           Ide.Types                         (IdePlugins,
                                                    PluginId (PluginId))

-- fixed plugins
import           Development.IDE                   (IdeState)
import qualified Development.IDE.Plugin.HLS.GhcIde as GhcIde

-- haskell-language-server optional plugins
#if hls_qualifyImportedNames
import qualified Ide.Plugin.QualifyImportedNames   as QualifyImportedNames
#endif

#if hls_callHierarchy
import qualified Ide.Plugin.CallHierarchy          as CallHierarchy
#endif
#if hls_cabal
import qualified Ide.Plugin.Cabal                  as Cabal
#endif
#if hls_class
import qualified Ide.Plugin.Class                  as Class
#endif

#if hls_haddockComments
import qualified Ide.Plugin.HaddockComments        as HaddockComments
#endif

#if hls_eval
import qualified Ide.Plugin.Eval                   as Eval
#endif

#if hls_importLens
import qualified Ide.Plugin.ExplicitImports        as ExplicitImports
#endif

#if hls_refineImports
import qualified Ide.Plugin.RefineImports          as RefineImports
#endif

#if hls_rename
import qualified Ide.Plugin.Rename                 as Rename
#endif

#if hls_retrie
import qualified Ide.Plugin.Retrie                 as Retrie
#endif

#if hls_tactic
import qualified Ide.Plugin.Tactic                 as Tactic
#endif

#if hls_hlint
import qualified Ide.Plugin.Hlint                  as Hlint
#endif

#if hls_stan
import qualified Ide.Plugin.Stan                   as Stan
#endif

#if hls_moduleName
import qualified Ide.Plugin.ModuleName             as ModuleName
#endif

#if hls_pragmas
import qualified Ide.Plugin.Pragmas                as Pragmas
#endif

#if hls_splice
import qualified Ide.Plugin.Splice                 as Splice
#endif

#if hls_alternateNumberFormat
import qualified Ide.Plugin.AlternateNumberFormat  as AlternateNumberFormat
#endif

#if hls_codeRange
import qualified Ide.Plugin.CodeRange              as CodeRange
#endif

#if hls_changeTypeSignature
import qualified Ide.Plugin.ChangeTypeSignature    as ChangeTypeSignature
#endif

#if hls_gadt
import qualified Ide.Plugin.GADT                   as GADT
#endif

#if explicitFixity
import qualified Ide.Plugin.ExplicitFixity         as ExplicitFixity
#endif

#if explicitFields
import qualified Ide.Plugin.ExplicitFields         as ExplicitFields
#endif

-- formatters

#if hls_floskell
import qualified Ide.Plugin.Floskell               as Floskell
#endif

#if hls_fourmolu
import qualified Ide.Plugin.Fourmolu               as Fourmolu
#endif

#if hls_cabalfmt
import qualified Ide.Plugin.CabalFmt               as CabalFmt
#endif

#if hls_ormolu
import qualified Ide.Plugin.Ormolu                 as Ormolu
#endif

#if hls_stylishHaskell
import qualified Ide.Plugin.StylishHaskell         as StylishHaskell
#endif

#if hls_refactor
import qualified Development.IDE.Plugin.CodeAction as Refactor
#endif

data Log = forall a. (Pretty a) => Log PluginId a

instance Pretty Log where
  pretty :: forall ann. Log -> Doc ann
pretty (Log (PluginId Text
pId) a
a) = forall a ann. Pretty a => a -> Doc ann
pretty Text
pId forall a. Semigroup a => a -> a -> a
<> Doc ann
": " forall a. Semigroup a => a -> a -> a
<> forall a ann. Pretty a => a -> Doc ann
pretty a
a

-- ---------------------------------------------------------------------

-- | The plugins configured for use in this instance of the language
-- server.
-- These can be freely added or removed to tailor the available
-- features of the server.

idePlugins :: Recorder (WithPriority Log) -> IdePlugins IdeState
idePlugins :: Recorder (WithPriority Log) -> IdePlugins IdeState
idePlugins Recorder (WithPriority Log)
recorder = forall ideState. [PluginDescriptor ideState] -> IdePlugins ideState
pluginDescToIdePlugins [PluginDescriptor IdeState]
allPlugins
  where
    pluginRecorder :: forall log. (Pretty log) => PluginId -> Recorder (WithPriority log)
    pluginRecorder :: forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pluginId = forall a b.
(a -> b) -> Recorder (WithPriority b) -> Recorder (WithPriority a)
cmapWithPrio (forall a. Pretty a => PluginId -> a -> Log
Log PluginId
pluginId) Recorder (WithPriority Log)
recorder
    allPlugins :: [PluginDescriptor IdeState]
allPlugins =
#if hls_cabal
      let pId :: PluginId
pId = PluginId
"cabal" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Cabal.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
#endif
#if hls_pragmas
      PluginId -> PluginDescriptor IdeState
Pragmas.descriptor  PluginId
"pragmas" forall a. a -> [a] -> [a]
:
#endif
#if hls_floskell
      PluginId -> PluginDescriptor IdeState
Floskell.descriptor PluginId
"floskell" forall a. a -> [a] -> [a]
:
#endif
#if hls_fourmolu
      let pId :: PluginId
pId = PluginId
"fourmolu" in Recorder (WithPriority LogEvent)
-> PluginId -> PluginDescriptor IdeState
Fourmolu.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_cabalfmt
      let pId :: PluginId
pId = PluginId
"cabalfmt" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
CabalFmt.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_tactic
      let pId = "tactics" in Tactic.descriptor (pluginRecorder pId) pId:
#endif
#if hls_ormolu
      PluginId -> PluginDescriptor IdeState
Ormolu.descriptor   PluginId
"ormolu" forall a. a -> [a] -> [a]
:
#endif
#if hls_stylishHaskell
      PluginId -> PluginDescriptor IdeState
StylishHaskell.descriptor PluginId
"stylish-haskell" forall a. a -> [a] -> [a]
:
#endif
#if hls_rename
      let pId :: PluginId
pId = PluginId
"rename" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Rename.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_retrie
      PluginId -> PluginDescriptor IdeState
Retrie.descriptor PluginId
"retrie" forall a. a -> [a] -> [a]
:
#endif
#if hls_callHierarchy
      PluginId -> PluginDescriptor IdeState
CallHierarchy.descriptor PluginId
"callHierarchy" forall a. a -> [a] -> [a]
:
#endif
#if hls_class
      let pId :: PluginId
pId = PluginId
"class" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Class.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_haddockComments
      let pId = "haddockComments" in HaddockComments.descriptor (pluginRecorder pId) pId:
#endif
#if hls_eval
      let pId :: PluginId
pId = PluginId
"eval" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Eval.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_importLens
      let pId :: PluginId
pId = PluginId
"importLens" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
ExplicitImports.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_qualifyImportedNames
      PluginId -> PluginDescriptor IdeState
QualifyImportedNames.descriptor PluginId
"qualifyImportedNames" forall a. a -> [a] -> [a]
:
#endif
#if hls_refineImports
      let pId :: PluginId
pId = PluginId
"refineImports" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
RefineImports.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_moduleName
      let pId :: PluginId
pId = PluginId
"moduleName" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
ModuleName.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_hlint
      let pId :: PluginId
pId = PluginId
"hlint" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Hlint.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_stan
      let pId = "stan" in Stan.descriptor (pluginRecorder pId) pId :
#endif
#if hls_splice
      PluginId -> PluginDescriptor IdeState
Splice.descriptor PluginId
"splice" forall a. a -> [a] -> [a]
:
#endif
#if hls_alternateNumberFormat
      let pId :: PluginId
pId = PluginId
"alternateNumberFormat" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
AlternateNumberFormat.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
#endif
#if hls_codeRange
      let pId :: PluginId
pId = PluginId
"codeRange" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
CodeRange.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pIdforall a. a -> [a] -> [a]
:
#endif
#if hls_changeTypeSignature
      PluginId -> PluginDescriptor IdeState
ChangeTypeSignature.descriptor PluginId
"changeTypeSignature" forall a. a -> [a] -> [a]
:
#endif
#if hls_gadt
      PluginId -> PluginDescriptor IdeState
GADT.descriptor PluginId
"gadt" forall a. a -> [a] -> [a]
:
#endif
#if hls_refactor
      let pId :: PluginId
pId = PluginId
"ghcide-code-actions-imports-exports" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Refactor.iePluginDescriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
      let pId :: PluginId
pId = PluginId
"ghcide-code-actions-type-signatures" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Refactor.typeSigsPluginDescriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder     PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
      let pId :: PluginId
pId = PluginId
"ghcide-code-actions-bindings" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Refactor.bindingsPluginDescriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
      let pId :: PluginId
pId = PluginId
"ghcide-code-actions-fill-holes" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Refactor.fillHolePluginDescriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
      let pId :: PluginId
pId = PluginId
"ghcide-extend-import-action" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
Refactor.extendImportPluginDescriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId forall a. a -> [a] -> [a]
:
#endif
      Recorder (WithPriority Log) -> [PluginDescriptor IdeState]
GhcIde.descriptors (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
"ghcide")
#if explicitFixity
      forall a. [a] -> [a] -> [a]
++ [let pId :: PluginId
pId = PluginId
"explicit-fixity" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
ExplicitFixity.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId]
#endif
#if explicitFields
      forall a. [a] -> [a] -> [a]
++ [let pId :: PluginId
pId = PluginId
"explicit-fields" in Recorder (WithPriority Log)
-> PluginId -> PluginDescriptor IdeState
ExplicitFields.descriptor (forall log. Pretty log => PluginId -> Recorder (WithPriority log)
pluginRecorder PluginId
pId) PluginId
pId]
#endif