Skip to content

Commit 6cb4760

Browse files
committed
Add package name to CodeLens if there are mutliple in line
1 parent 274ae10 commit 6cb4760

File tree

1 file changed

+23
-13
lines changed

1 file changed

+23
-13
lines changed

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

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints, collectPackageDependencyVersions, dependencyVersionLens) where
55

66
import Data.Array ((!))
7-
import Data.ByteString (ByteString)
7+
import Data.ByteString (ByteString, singleton)
8+
import Data.List
89
import qualified Data.Maybe as Maybe
910
import qualified Data.Text as T
1011
import qualified Data.Text.Encoding as Encoding
@@ -18,18 +19,27 @@ import qualified Distribution.Fields as Syntax
1819
import qualified Distribution.Parsec.Position as Syntax
1920
import qualified Ide.Plugin.Cabal.Completion.Types as Types
2021
import Language.LSP.Protocol.Types (CodeLens (..), Command (..),
21-
InlayHint (..),
22-
Range (..), type (|?) (..))
22+
InlayHint (..), Range (..),
23+
type (|?) (..))
2324
import Text.Regex.TDFA (Regex, makeRegex,
2425
matchAllText)
2526

2627
dependencyVersionLens :: [Syntax.Field Syntax.Position] -> HscEnv -> [CodeLens]
27-
dependencyVersionLens cabalFields = fmap mkCodeLens . collectPackageDependencyVersions cabalFields
28+
dependencyVersionLens cabalFields = (>>= foo) . groupBy (\(Syntax.Position line1 _, _, _) (Syntax.Position line2 _, _, _) -> line1 == line2) . collectPackageDependencyVersions cabalFields
2829
where
29-
mkCodeLens :: (Syntax.Position, Version) -> CodeLens
30-
mkCodeLens (pos, dependencyVersion) =
30+
foo :: [(Syntax.Position, T.Text, Version)] -> [CodeLens]
31+
foo [] = []
32+
foo [single] = [mkCodeLens False single]
33+
foo multi = mkCodeLens True <$> multi
34+
35+
mkCodeLens :: Bool -> (Syntax.Position, T.Text, Version) -> CodeLens
36+
mkCodeLens includePkgName (pos, pkgName, dependencyVersion) =
3137
let cPos = Types.cabalPositionToLSPPosition pos
32-
command = Command (printVersion dependencyVersion) mempty Nothing
38+
dependencyText =
39+
if includePkgName
40+
then pkgName <> " (" <> printVersion dependencyVersion <> ")"
41+
else printVersion dependencyVersion
42+
command = Command dependencyText mempty Nothing
3343
in CodeLens
3444
{ _range = Range cPos cPos
3545
, _command = Just command
@@ -38,8 +48,8 @@ dependencyVersionLens cabalFields = fmap mkCodeLens . collectPackageDependencyVe
3848
dependencyVersionHints :: [Syntax.Field Syntax.Position] -> HscEnv -> [InlayHint]
3949
dependencyVersionHints cabalFields = fmap mkHint . collectPackageDependencyVersions cabalFields
4050
where
41-
mkHint :: (Syntax.Position, Version) -> InlayHint
42-
mkHint (pos, dependencyVersion) =
51+
mkHint :: (Syntax.Position, T.Text, Version) -> InlayHint
52+
mkHint (pos, _, dependencyVersion) =
4353
InlayHint { _position = Types.cabalPositionToLSPPosition pos
4454
, _label = InL $ " (" <> printVersion dependencyVersion <> ")"
4555
, _kind = Nothing
@@ -50,24 +60,24 @@ dependencyVersionHints cabalFields = fmap mkHint . collectPackageDependencyVersi
5060
, _data_ = Nothing
5161
}
5262

53-
collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Syntax.Position, Version)]
63+
collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Syntax.Position, T.Text, Version)]
5464
collectPackageDependencyVersions cabalFields hscEnv = cabalFields >>= collectPackageVersions
5565
where
5666
lookupPackageVersion pkgName = Maybe.listToMaybe $ nonDetEltsUniqMap $ fmap unitPackageVersion $ filterUniqMap ((==) (T.unpack pkgName) . unitPackageNameString) $ getUnitInfoMap hscEnv
5767

58-
collectPackageVersions :: Syntax.Field Syntax.Position -> [(Syntax.Position, Version)]
68+
collectPackageVersions :: Syntax.Field Syntax.Position -> [(Syntax.Position, T.Text, Version)]
5969
collectPackageVersions (Syntax.Field (Syntax.Name _ "build-depends") pos) = concatMap fieldLinePackageVersions pos
6070
collectPackageVersions (Syntax.Section _ _ fields) = concatMap collectPackageVersions fields
6171
collectPackageVersions _ = []
6272

63-
fieldLinePackageVersions :: Syntax.FieldLine Syntax.Position -> [(Syntax.Position, Version)]
73+
fieldLinePackageVersions :: Syntax.FieldLine Syntax.Position -> [(Syntax.Position, T.Text, Version)]
6474
fieldLinePackageVersions (Syntax.FieldLine pos line) =
6575
let linePackageNameRegex :: Regex = makeRegex ("(^|,)[[:space:]]*([a-zA-Z-]+)" :: ByteString)
6676
packageNames = (\x -> x ! 2) <$> matchAllText linePackageNameRegex (Encoding.decodeUtf8Lenient line)
6777
versions = do
6878
(pkgName, (pkgIndex, pkgOffset)) <- packageNames
6979
version <- Maybe.maybeToList $ lookupPackageVersion pkgName
70-
pure (Syntax.Position (Syntax.positionRow pos) (Syntax.positionCol pos + pkgIndex + pkgOffset), version)
80+
pure (Syntax.Position (Syntax.positionRow pos) (Syntax.positionCol pos + pkgIndex + pkgOffset), pkgName, version)
7181
in versions
7282

7383
printVersion :: Version -> T.Text

0 commit comments

Comments
 (0)