packages feed

hls-tactics-plugin-1.7.0.0: src/Wingman/Plugin.hs

-- | A plugin that uses tactics to synthesize code
module Wingman.Plugin where

import           Control.Monad
import           Development.IDE.Core.Shake (IdeState (..))
import           Development.IDE.Plugin.CodeAction
import qualified Development.IDE.GHC.ExactPrint                   as E
import           Ide.Types
import           Language.LSP.Types
import           Prelude hiding (span)
import           Wingman.AbstractLSP
import           Wingman.AbstractLSP.TacticActions (makeTacticInteraction)
import           Wingman.EmptyCase
import           Wingman.LanguageServer hiding (Log)
import qualified Wingman.LanguageServer as WingmanLanguageServer
import           Wingman.LanguageServer.Metaprogram (hoverProvider)
import           Wingman.StaticPlugin
import Development.IDE.Types.Logger (Recorder, cmapWithPrio, WithPriority, Pretty (pretty))

data Log
  = LogWingmanLanguageServer WingmanLanguageServer.Log 
  | LogExactPrint E.Log
  deriving Show

instance Pretty Log where
  pretty = \case
    LogWingmanLanguageServer log -> pretty log
    LogExactPrint exactPrintLog -> pretty exactPrintLog

descriptor :: Recorder (WithPriority Log) -> PluginId -> PluginDescriptor IdeState
descriptor recorder plId
  = mkExactprintPluginDescriptor (cmapWithPrio LogExactPrint recorder)
  $ installInteractions
      ( emptyCaseInteraction
      : fmap makeTacticInteraction [minBound .. maxBound]
      )
  $ (defaultPluginDescriptor plId)
      { pluginHandlers = mkPluginHandler STextDocumentHover hoverProvider
      , pluginRules = wingmanRules (cmapWithPrio LogWingmanLanguageServer recorder) plId
      , pluginConfigDescriptor =
          defaultConfigDescriptor
            { configCustomConfig = mkCustomConfig properties
            }
      , pluginModifyDynflags = staticPlugin
      }