Skip to content

Commit 35c38e5

Browse files
committed
runAction data lookup
1 parent b5956d6 commit 35c38e5

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import qualified Language.LSP.VFS as VFS
5050
import qualified Data.Text ()
5151
import qualified Ide.Plugin.Cabal.CabalAdd as CabalAdd
5252
import Debug.Trace
53-
import Distribution.PackageDescription.Configuration (flattenPackageDescription)
5453

5554
data Log
5655
= LogModificationTime NormalizedFilePath FileVersion
@@ -258,7 +257,7 @@ licenseSuggestCodeAction ideState _ (CodeActionParams _ _ (TextDocumentIdentifie
258257

259258
cabalAddCodeAction :: Recorder (WithPriority Log) -> PluginMethodHandler IdeState 'LSP.Method_TextDocumentCodeAction
260259
cabalAddCodeAction recorder state plId (CodeActionParams _ _ (TextDocumentIdentifier uri) _ CodeActionContext{_diagnostics=diags}) = do
261-
maxCompls <- fmap maxCompletions . liftIO $ runAction "cabal-plugin.cabalAdd" state getClientConfigAction
260+
maxCompls <- fmap maxCompletions . liftIO $ runAction "cabal.cabal-add" state getClientConfigAction
262261

263262
let mbHaskellFilePath = uriToFilePath uri
264263
case mbHaskellFilePath of
@@ -268,7 +267,7 @@ cabalAddCodeAction recorder state plId (CodeActionParams _ _ (TextDocumentIdenti
268267
case mbCabalFile of
269268
Nothing -> pure $ InL $ fmap InR [noCabalFileAction]
270269
Just cabalFilePath -> do
271-
mGPD <- liftIO $ runIdeAction "cabal-plugin.modulesCompleter.gpd" (shakeExtras state) $ useWithStaleFast ParseCabalFile $ toNormalizedFilePath cabalFilePath
270+
mGPD <- liftIO $ runAction "cabal.cabal-add" state $ useWithStale ParseCabalFile $ toNormalizedFilePath cabalFilePath
272271
case mGPD of
273272
Nothing -> pure $ InL []
274273
Just (gpd, _) -> do

plugins/hls-cabal-plugin/src/Ide/Plugin/Cabal/CabalAdd.hs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Control.Monad (filterM, void)
2020
import Control.Monad.IO.Class (liftIO)
2121
import Data.String (IsString)
2222
import qualified Data.Text as T
23-
import Development.IDE (IdeState, runIdeAction)
23+
import Development.IDE (IdeState (shakeExtras), runIdeAction, useWithStale)
2424
import Distribution.PackageDescription.Quirks (patchQuirks)
2525
import Ide.PluginUtils (mkLspCommand)
2626
import Ide.Types (CommandFunction,
@@ -30,7 +30,7 @@ import Language.LSP.Protocol.Types (CodeAction (Code
3030
CodeActionKind (CodeActionKind_QuickFix),
3131
Diagnostic (..),
3232
Null (Null),
33-
type (|?) (InR))
33+
type (|?) (InR), toNormalizedFilePath)
3434
import System.Directory (doesFileExist,
3535
listDirectory)
3636

@@ -43,7 +43,7 @@ import Data.List.NonEmpty (NonEmpty (..),
4343
import Distribution.Client.Add as Add
4444
import Distribution.Compat.Prelude (Generic)
4545
import Distribution.PackageDescription (packageDescription,
46-
specVersion, GenericPackageDescription)
46+
specVersion, GenericPackageDescription (GenericPackageDescription))
4747
import Distribution.PackageDescription.Configuration (flattenPackageDescription)
4848
import Distribution.Pretty (pretty)
4949
import Distribution.Simple.BuildTarget (BuildTarget,
@@ -59,7 +59,14 @@ import System.FilePath (dropFileName,
5959
import Text.PrettyPrint (render)
6060
import Text.Regex.TDFA
6161
import Distribution.Simple.Utils (safeHead)
62+
import Development.IDE.Core.Rules (runAction)
63+
import Ide.Plugin.Cabal.Completion.Types (ParseCabalFields (..),
64+
ParseCabalFile (..))
6265

66+
import Development.IDE.Core.RuleTypes (GetFileContents(..))
67+
import Data.Text.Encoding (encodeUtf8)
68+
import Ide.Plugin.Cabal.Orphans ()
69+
import Distribution.Fields.Field (fieldAnn)
6370

6471
-- | Given a path to a haskell file, returns the closest cabal file.
6572
-- If cabal file wasn't found, dives Nothing.
@@ -134,11 +141,11 @@ data CabalAddCommandParams =
134141
deriving anyclass (FromJSON, ToJSON)
135142

136143
command :: CommandFunction IdeState CabalAddCommandParams
137-
command _ _ (CabalAddCommandParams {cabalPath = path, buildTarget = target, dependency = dep, version = mbVer}) = do
144+
command state _ (CabalAddCommandParams {cabalPath = path, buildTarget = target, dependency = dep, version = mbVer}) = do
138145
let specifiedDep = case mbVer of
139146
Nothing -> dep
140147
Just ver -> dep <> " ^>=" <> ver
141-
void $ liftIO $ addDependency path target (fromList [T.unpack specifiedDep])
148+
void $ liftIO $ addDependency state path target (fromList [T.unpack specifiedDep])
142149
pure $ InR Null
143150

144151
-- | Gives cabal file's contents or throws error.
@@ -162,14 +169,29 @@ getBuildTargets gpd cabalFilePath haskellFilePath = do
162169
--
163170
-- Inspired by @main@ in cabal-add,
164171
-- Distribution.Client.Main
165-
addDependency :: FilePath -> Maybe String -> NonEmpty String -> IO ()
166-
addDependency cabalFilePath buildTarget dependency = do
167-
168-
cnfOrigContents <- readCabalFile cabalFilePath
169-
170-
(fields, packDescr) <- case parseCabalFile cabalFilePath cnfOrigContents of
171-
Left err -> error err
172-
Right pair -> pure pair
172+
addDependency :: IdeState -> FilePath -> Maybe String -> NonEmpty String -> IO ()
173+
addDependency state cabalFilePath buildTarget dependency = do
174+
(mbCnfOrigContents, mbFields, mbPackDescr) <- liftIO $ runAction "cabal.cabal-add" state $ do
175+
contents <- useWithStale GetFileContents $ toNormalizedFilePath cabalFilePath
176+
inFields <- useWithStale ParseCabalFields $ toNormalizedFilePath cabalFilePath
177+
inPackDescr <- useWithStale ParseCabalFile $ toNormalizedFilePath cabalFilePath
178+
let mbCnfOrigContents = case snd . fst <$> contents of
179+
Just (Just txt) -> Just $ encodeUtf8 txt
180+
_ -> Nothing
181+
let mbFields = fst <$> inFields
182+
let mbPackDescr :: Maybe GenericPackageDescription = fst <$> inPackDescr
183+
pure (mbCnfOrigContents, mbFields, mbPackDescr)
184+
185+
(cnfOrigContents, fields, packDescr) <- liftIO $ do
186+
cnfOrigContents <- case mbCnfOrigContents of
187+
(Just cnfOrigContents) -> pure cnfOrigContents
188+
Nothing -> readCabalFile cabalFilePath
189+
let (fields, packDescr) = case (mbFields, mbPackDescr) of
190+
(Just fields, Just packDescr) -> (fields, packDescr)
191+
(_, _) -> case parseCabalFile cabalFilePath cnfOrigContents of
192+
Left err -> error err
193+
Right (_ ,gpd) -> pure gpd
194+
pure (cnfOrigContents, fields, packDescr)
173195

174196
let inputs = do
175197
let rcnfComponent = buildTarget

0 commit comments

Comments
 (0)