Skip to content

Commit 9918fae

Browse files
committed
Unify deps resolving function
1 parent 6ae64e8 commit 9918fae

File tree

2 files changed

+14
-33
lines changed

2 files changed

+14
-33
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ hover ide _ msgParam = do
334334
nfp <- getNormalizedFilePathE uri
335335
cabalFields <- runActionE "cabal.cabal-hover" ide $ useE ParseCabalFields nfp
336336
(hscEnv -> hsc) <- runActionE "cabal.cabal-hover" ide $ useE GhcSession nfp
337-
let hoveredDep = List.find (positionInRange (msgParam ^. JL.position) . (\(x, _, _) -> x)) $ Dependencies.collectPackageDependencyVersions' cabalFields hsc
337+
let hoveredDep = List.find (positionInRange (msgParam ^. JL.position) . (\(x, _, _) -> x)) $ Dependencies.collectPackageDependencyVersions cabalFields hsc
338338
pure $ case hoveredDep of
339339
Just (_, pkgName, version) -> foundHover (Nothing, [pkgName <> " (" <> Dependencies.printVersion version <> ")\n", documentationText (pkgName <> "-" <> Dependencies.printVersion version)])
340340
Nothing -> InR Null

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

Lines changed: 13 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
{-# LANGUAGE DuplicateRecordFields #-}
22
{-# LANGUAGE OverloadedStrings #-}
33

4-
module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints, collectPackageDependencyVersions, dependencyVersionLens, collectPackageDependencyVersions', printVersion) where
4+
module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints, collectPackageDependencyVersions, dependencyVersionLens, printVersion) where
55

6+
import Control.Lens ((^.))
67
import Data.Array ((!))
78
import Data.ByteString (ByteString)
89
import Data.List
@@ -18,39 +19,39 @@ import Development.IDE.GHC.Compat (HscEnv, filterUniqMap,
1819
import qualified Distribution.Fields as Syntax
1920
import qualified Distribution.Parsec.Position as Syntax
2021
import qualified Ide.Plugin.Cabal.Completion.Types as Types
22+
import qualified Language.LSP.Protocol.Lens as JL
2123
import Language.LSP.Protocol.Types (CodeLens (..), Command (..),
2224
InlayHint (..), Range (..),
2325
type (|?) (..))
2426
import Text.Regex.TDFA (Regex, makeRegex,
2527
matchAllText)
2628

2729
dependencyVersionLens :: [Syntax.Field Syntax.Position] -> HscEnv -> [CodeLens]
28-
dependencyVersionLens cabalFields = (>>= foo) . groupBy (\(Syntax.Position line1 _, _, _) (Syntax.Position line2 _, _, _) -> line1 == line2) . collectPackageDependencyVersions cabalFields
30+
dependencyVersionLens cabalFields = (>>= foo) . groupBy (\(a,_,_) (b,_,_)-> (a ^. JL.start . JL.line) == (b ^. JL.start . JL.line)) . collectPackageDependencyVersions cabalFields
2931
where
30-
foo :: [(Syntax.Position, T.Text, Version)] -> [CodeLens]
32+
foo :: [(Range, T.Text, Version)] -> [CodeLens]
3133
foo [] = []
3234
foo [single] = [mkCodeLens False single]
3335
foo multi = mkCodeLens True <$> multi
3436

35-
mkCodeLens :: Bool -> (Syntax.Position, T.Text, Version) -> CodeLens
36-
mkCodeLens includePkgName (pos, pkgName, dependencyVersion) =
37-
let cPos = Types.cabalPositionToLSPPosition pos
38-
dependencyText =
37+
mkCodeLens :: Bool -> (Range, T.Text, Version) -> CodeLens
38+
mkCodeLens includePkgName (range, pkgName, dependencyVersion) =
39+
let dependencyText =
3940
if includePkgName
4041
then pkgName <> " (" <> printVersion dependencyVersion <> ")"
4142
else printVersion dependencyVersion
4243
command = Command dependencyText mempty Nothing
4344
in CodeLens
44-
{ _range = Range cPos cPos
45+
{ _range = range
4546
, _command = Just command
4647
, _data_ = Nothing }
4748

4849
dependencyVersionHints :: [Syntax.Field Syntax.Position] -> HscEnv -> [InlayHint]
4950
dependencyVersionHints cabalFields = fmap mkHint . collectPackageDependencyVersions cabalFields
5051
where
51-
mkHint :: (Syntax.Position, T.Text, Version) -> InlayHint
52-
mkHint (pos, _, dependencyVersion) =
53-
InlayHint { _position = Types.cabalPositionToLSPPosition pos
52+
mkHint :: (Range, T.Text, Version) -> InlayHint
53+
mkHint (Range _ pos, _, dependencyVersion) =
54+
InlayHint { _position = pos
5455
, _label = InL $ " (" <> printVersion dependencyVersion <> ")"
5556
, _kind = Nothing
5657
, _textEdits = Nothing
@@ -60,28 +61,8 @@ dependencyVersionHints cabalFields = fmap mkHint . collectPackageDependencyVersi
6061
, _data_ = Nothing
6162
}
6263

63-
collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Syntax.Position, T.Text, Version)]
64+
collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Range, T.Text, Version)]
6465
collectPackageDependencyVersions cabalFields hscEnv = cabalFields >>= collectPackageVersions
65-
where
66-
lookupPackageVersion pkgName = Maybe.listToMaybe $ nonDetEltsUniqMap $ fmap unitPackageVersion $ filterUniqMap ((==) (T.unpack pkgName) . unitPackageNameString) $ getUnitInfoMap hscEnv
67-
68-
collectPackageVersions :: Syntax.Field Syntax.Position -> [(Syntax.Position, T.Text, Version)]
69-
collectPackageVersions (Syntax.Field (Syntax.Name _ "build-depends") pos) = concatMap fieldLinePackageVersions pos
70-
collectPackageVersions (Syntax.Section _ _ fields) = concatMap collectPackageVersions fields
71-
collectPackageVersions _ = []
72-
73-
fieldLinePackageVersions :: Syntax.FieldLine Syntax.Position -> [(Syntax.Position, T.Text, Version)]
74-
fieldLinePackageVersions (Syntax.FieldLine pos line) =
75-
let linePackageNameRegex :: Regex = makeRegex ("(^|,)[[:space:]]*([a-zA-Z-]+)" :: ByteString)
76-
packageNames = (\x -> x ! 2) <$> matchAllText linePackageNameRegex (Encoding.decodeUtf8Lenient line)
77-
versions = do
78-
(pkgName, (pkgIndex, pkgOffset)) <- packageNames
79-
version <- Maybe.maybeToList $ lookupPackageVersion pkgName
80-
pure (Syntax.Position (Syntax.positionRow pos) (Syntax.positionCol pos + pkgIndex + pkgOffset), pkgName, version)
81-
in versions
82-
83-
collectPackageDependencyVersions' :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Range, T.Text, Version)]
84-
collectPackageDependencyVersions' cabalFields hscEnv = cabalFields >>= collectPackageVersions
8566
where
8667
lookupPackageVersion pkgName = Maybe.listToMaybe $ nonDetEltsUniqMap $ fmap unitPackageVersion $ filterUniqMap ((==) (T.unpack pkgName) . unitPackageNameString) $ getUnitInfoMap hscEnv
8768

0 commit comments

Comments
 (0)