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" 
9290    , pluginRules =  rules
91+     , pluginCustomConfig =  mkCustomConfig properties
9392    }
9493
94+ properties  ::  Properties  '[ 'PropertyKey " mode" 
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. LspMConfig  (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" TypeCheck  filePath)
@@ -202,14 +209,6 @@ data Mode
202209    Diagnostics 
203210  deriving  (Eq , Ord , Show , Read , Enum )
204211
205- instance  A. FromJSONMode  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
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