hls-explicit-imports-plugin 1.0.0.2 → 1.0.0.3
raw patch · 2 files changed
+46/−33 lines, 2 filesdep +ghc-api-compatdep −lsp-typesdep ~ghcidePVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
Dependencies added: ghc-api-compat
Dependencies removed: lsp-types
Dependency ranges changed: ghcide
API changes (from Hackage documentation)
+ Ide.Plugin.ExplicitImports: descriptorForModules :: (ModuleName -> Bool) -> PluginId -> PluginDescriptor IdeState
Files
hls-explicit-imports-plugin.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: hls-explicit-imports-plugin-version: 1.0.0.2+version: 1.0.0.3 synopsis: Explicit imports plugin for Haskell Language Server license: Apache-2.0 license-file: LICENSE@@ -8,23 +8,22 @@ maintainer: pepeiborra@gmail.com category: Development build-type: Simple-extra-source-files:- LICENSE+extra-source-files: LICENSE library exposed-modules: Ide.Plugin.ExplicitImports hs-source-dirs: src build-depends: , aeson- , base >=4.12 && <5+ , base >=4.12 && <5 , containers , deepseq , ghc- , ghcide ^>=1.3+ , ghc-api-compat+ , ghcide ^>=1.4+ , hls-graph , hls-plugin-api ^>=1.1 , lsp- , lsp-types- , hls-graph , text , unordered-containers
src/Ide/Plugin/ExplicitImports.hs view
@@ -1,17 +1,16 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveAnyClass #-}-{-# LANGUAGE DeriveGeneric #-}-{-# LANGUAGE DerivingStrategies #-}-{-# LANGUAGE DuplicateRecordFields #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveAnyClass #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DerivingStrategies #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE TypeFamilies #-} module Ide.Plugin.ExplicitImports ( descriptor+ , descriptorForModules , extractMinimalImports , within ) where@@ -26,7 +25,8 @@ import qualified Data.Map.Strict as Map import Data.Maybe (catMaybes, fromMaybe) import qualified Data.Text as T-import Development.IDE+import Development.IDE hiding (pluginHandlers,+ pluginRules) import Development.IDE.Core.PositionMapping import Development.IDE.GHC.Compat import Development.IDE.Graph.Classes@@ -35,9 +35,14 @@ import Ide.Types import Language.LSP.Server import Language.LSP.Types+#if MIN_VERSION_ghc(9,0,0)+import GHC.Builtin.Names (pRELUDE)+#else import PrelNames (pRELUDE)+#endif import RnNames (findImportUsage, getMinimalImports)+import qualified SrcLoc import TcRnMonad (initTcWithGbl) import TcRnTypes (TcGblEnv (tcg_used_gres)) @@ -46,7 +51,14 @@ -- | The "main" function of a plugin descriptor :: PluginId -> PluginDescriptor IdeState-descriptor plId =+descriptor = descriptorForModules (/= moduleName pRELUDE)++descriptorForModules+ :: (ModuleName -> Bool)+ -- ^ Predicate to select modules that will be annotated+ -> PluginId+ -> PluginDescriptor IdeState+descriptorForModules pred plId = (defaultPluginDescriptor plId) { -- This plugin provides a command handler@@ -55,9 +67,9 @@ pluginRules = minimalImportsRule, pluginHandlers = mconcat [ -- This plugin provides code lenses- mkPluginHandler STextDocumentCodeLens lensProvider+ mkPluginHandler STextDocumentCodeLens $ lensProvider pred -- This plugin provides code actions- , mkPluginHandler STextDocumentCodeAction codeActionProvider+ , mkPluginHandler STextDocumentCodeAction $ codeActionProvider pred ] } @@ -88,8 +100,9 @@ -- the provider should produce one code lens associated to the import statement: -- -- > import Data.List (intercalate, sortBy)-lensProvider :: PluginMethodHandler IdeState TextDocumentCodeLens+lensProvider :: (ModuleName -> Bool) -> PluginMethodHandler IdeState TextDocumentCodeLens lensProvider+ pred state -- ghcide state, used to retrieve typechecking artifacts pId -- plugin Id CodeLensParams {_textDocument = TextDocumentIdentifier {_uri}}@@ -106,7 +119,7 @@ sequence [ generateLens pId _uri edit | (imp, Just minImport) <- minImports,- Just edit <- [mkExplicitEdit posMapping imp minImport]+ Just edit <- [mkExplicitEdit pred posMapping imp minImport] ] return $ Right (List $ catMaybes commands) _ ->@@ -116,8 +129,8 @@ -- | If there are any implicit imports, provide one code action to turn them all -- into explicit imports.-codeActionProvider :: PluginMethodHandler IdeState TextDocumentCodeAction-codeActionProvider ideState _pId (CodeActionParams _ _ docId range _context)+codeActionProvider :: (ModuleName -> Bool) -> PluginMethodHandler IdeState TextDocumentCodeAction+codeActionProvider pred ideState _pId (CodeActionParams _ _ docId range _context) | TextDocumentIdentifier {_uri} <- docId, Just nfp <- uriToNormalizedFilePath $ toNormalizedUri _uri = liftIO $ do@@ -136,7 +149,7 @@ [ e | (imp, Just explicit) <- maybe [] getMinimalImportsResult minImports,- Just e <- [mkExplicitEdit zeroMapping imp explicit]+ Just e <- [mkExplicitEdit pred zeroMapping imp explicit] ] caExplicitImports = InR CodeAction {..} _title = "Make all imports explicit"@@ -184,12 +197,13 @@ (imports, mbMinImports) <- liftIO $ extractMinimalImports hsc tmr let importsMap = Map.fromList- [ (srcSpanStart l, T.pack (prettyPrint i))- | L l i <- fromMaybe [] mbMinImports+ [ (SrcLoc.realSrcSpanStart l, T.pack (prettyPrint i))+ | L (OldRealSrcSpan l) i <- fromMaybe [] mbMinImports ] res =- [ (i, Map.lookup (srcSpanStart (getLoc i)) importsMap)+ [ (i, Map.lookup (SrcLoc.realSrcSpanStart l) importsMap) | i <- imports+ , OldRealSrcSpan l <- [getLoc i] ] return ([], MinimalImportsResult res <$ mbMinImports) @@ -220,16 +234,16 @@ return (imports, minimalImports) extractMinimalImports _ _ = return ([], Nothing) -mkExplicitEdit :: PositionMapping -> LImportDecl pass -> T.Text -> Maybe TextEdit-mkExplicitEdit posMapping (L src imp) explicit+mkExplicitEdit :: (ModuleName -> Bool) -> PositionMapping -> LImportDecl pass -> T.Text -> Maybe TextEdit+mkExplicitEdit pred posMapping (L src imp) explicit -- Explicit import list case | ImportDecl {ideclHiding = Just (False, _)} <- imp = Nothing | not (isQualifiedImport imp),- RealSrcSpan l <- src,+ OldRealSrcSpan l <- src, L _ mn <- ideclName imp, -- (almost) no one wants to see an explicit import list for Prelude- mn /= moduleName pRELUDE,+ pred mn, Just rng <- toCurrentRange posMapping $ realSrcSpanToRange l = Just $ TextEdit rng explicit | otherwise =