1- {-# LANGUAGE DeriveAnyClass #-}
2- {-# LANGUAGE TypeFamilies #-}
1+ {-# LANGUAGE DeriveAnyClass #-}
2+ {-# LANGUAGE OverloadedLabels #-}
3+ {-# LANGUAGE TypeFamilies #-}
34
45-- | An HLS plugin to provide code lenses for type signatures
56module Development.IDE.Plugin.TypeLenses (
@@ -13,16 +14,12 @@ module Development.IDE.Plugin.TypeLenses (
1314
1415import Avail (availsToNameSet )
1516import Control.DeepSeq (rwhnf )
16- import Control.Monad (join )
1717import Control.Monad.Extra (whenMaybe )
1818import Control.Monad.IO.Class (MonadIO (liftIO ))
19- import qualified Data.Aeson as A
2019import Data.Aeson.Types (Value (.. ), toJSON )
21- import qualified Data.Aeson.Types as A
2220import qualified Data.HashMap.Strict as Map
2321import Data.List (find )
24- import Data.Maybe (catMaybes , fromJust ,
25- fromMaybe )
22+ import Data.Maybe (catMaybes , fromJust )
2623import qualified Data.Text as T
2724import Development.IDE (GhcSession (.. ),
2825 HscEnvEq (hscEnv ),
@@ -52,16 +49,17 @@ import GhcPlugins (GlobalRdrEnv,
5249 realSrcLocSpan ,
5350 tidyOpenType )
5451import HscTypes (mkPrintUnqualified )
55- import Ide.Plugin.Config (Config ,
56- PluginConfig ( plcConfig ))
57- import Ide.PluginUtils (getPluginConfig ,
58- mkLspCommand )
52+ import Ide.Plugin.Config (Config )
53+ import Ide.Plugin.Properties
54+ import Ide.PluginUtils (mkLspCommand ,
55+ usePropertyLsp )
5956import Ide.Types (CommandFunction ,
6057 CommandId (CommandId ),
6158 PluginCommand (PluginCommand ),
6259 PluginDescriptor (.. ),
6360 PluginId ,
6461 defaultPluginDescriptor ,
62+ mkCustomConfig ,
6563 mkPluginHandler )
6664import qualified Language.LSP.Server as LSP
6765import Language.LSP.Types (ApplyWorkspaceEditParams (ApplyWorkspaceEditParams ),
@@ -90,15 +88,24 @@ descriptor plId =
9088 { pluginHandlers = mkPluginHandler STextDocumentCodeLens codeLensProvider
9189 , pluginCommands = [PluginCommand (CommandId typeLensCommandId) " adds a signature" commandHandler]
9290 , pluginRules = rules
91+ , pluginCustomConfig = mkCustomConfig properties
9392 }
9493
94+ properties :: Properties '[ 'PropertyKey " mode" 'TEnum]
95+ properties = emptyProperties
96+ & defineEnumProperty # mode " Control how type lenses are shown"
97+ [ (" always" , " Always displays type lenses of global bindings" )
98+ , (" exported" , " Only display type lenses of exported global bindings" )
99+ , (" diagnostics" , " Follows error messages produced by GHC about missing signatures" )
100+ ] " always"
101+
95102codeLensProvider ::
96103 IdeState ->
97104 PluginId ->
98105 CodeLensParams ->
99106 LSP. LspM Config (Either ResponseError (List CodeLens ))
100107codeLensProvider ideState pId CodeLensParams {_textDocument = TextDocumentIdentifier uri} = do
101- (fromMaybe Always . join -> mode) <- fmap (parseCustomConfig . plcConfig) <$> getPluginConfig pId
108+ mode <- readMode <$> usePropertyLsp # mode pId properties
102109 fmap (Right . List ) $ case uriToFilePath' uri of
103110 Just (toNormalizedFilePath' -> filePath) -> liftIO $ do
104111 tmr <- runAction " codeLens.TypeCheck" ideState (use TypeCheck filePath)
@@ -202,14 +209,6 @@ data Mode
202209 Diagnostics
203210 deriving (Eq , Ord , Show , Read , Enum )
204211
205- instance A. FromJSON Mode where
206- parseJSON = A. withText " Mode" $ \ s ->
207- case T. toLower s of
208- " always" -> pure Always
209- " exported" -> pure Exported
210- " diagnostics" -> pure Diagnostics
211- _ -> A. unexpected (A. String s)
212-
213212--------------------------------------------------------------------------------
214213
215214showDocRdrEnv :: DynFlags -> GlobalRdrEnv -> SDoc -> String
@@ -246,8 +245,13 @@ rules = do
246245 result <- liftIO $ gblBindingType (hscEnv <$> hsc) (tmrTypechecked <$> tmr)
247246 pure ([] , result)
248247
249- parseCustomConfig :: A. Object -> Maybe Mode
250- parseCustomConfig = A. parseMaybe (A. .: " mode" )
248+ readMode :: T. Text -> Mode
249+ readMode = \ case
250+ " always" -> Always
251+ " exported" -> Exported
252+ " diagnostics" -> Diagnostics
253+ -- actually it never happens because of 'usePropertyLsp'
254+ _ -> error " failed to parse type lenses mode"
251255
252256gblBindingType :: Maybe HscEnv -> Maybe TcGblEnv -> IO (Maybe GlobalBindingTypeSigsResult )
253257gblBindingType (Just hsc) (Just gblEnv) = do
0 commit comments