Skip to content

Commit 1c1719b

Browse files
committed
Introduce explicit type for found dependency
1 parent ec5191d commit 1c1719b

File tree

1 file changed

+38
-27
lines changed

1 file changed

+38
-27
lines changed

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

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints, dependencyVersionLens, dependencyHover) where
55

6-
import Control.Lens ((^.))
6+
import Control.Lens (to, (^.))
77
import Data.Array ((!))
88
import Data.ByteString (ByteString)
99
import Data.List
@@ -32,71 +32,82 @@ import Text.Regex.TDFA (Regex, makeRegex,
3232
matchAllText)
3333

3434
dependencyVersionLens :: [Syntax.Field Syntax.Position] -> HscEnv -> [CodeLens]
35-
dependencyVersionLens cabalFields = (>>= foo) . groupBy (\(a,_,_) (b,_,_)-> (a ^. JL.start . JL.line) == (b ^. JL.start . JL.line)) . collectPackageDependencyVersions cabalFields
35+
dependencyVersionLens cabalFields = Maybe.catMaybes . (>>= foo) . groupBy (\a b-> (a ^. to range . JL.start . JL.line) == (b ^. to range . JL.start . JL.line)) . collectPackageDependencyVersions cabalFields
3636
where
37-
foo :: [(Range, T.Text, Version)] -> [CodeLens]
37+
foo :: [DependencyInfo] -> [Maybe CodeLens]
3838
foo [] = []
3939
foo [single] = [mkCodeLens False single]
4040
foo multi = mkCodeLens True <$> multi
4141

42-
mkCodeLens :: Bool -> (Range, T.Text, Version) -> CodeLens
43-
mkCodeLens includePkgName (range, pkgName, dependencyVersion) =
42+
mkCodeLens :: Bool -> DependencyInfo -> Maybe CodeLens
43+
mkCodeLens includePkgName DependencyInfo{range, packageName, installedVersion = Just version} =
4444
let dependencyText =
4545
if includePkgName
46-
then pkgName <> " (" <> printVersion dependencyVersion <> ")"
47-
else printVersion dependencyVersion
46+
then packageName <> " (" <> printVersion version <> ")"
47+
else printVersion version
4848
command = Command dependencyText mempty Nothing
49-
in CodeLens
49+
in Just $ CodeLens
5050
{ _range = range
5151
, _command = Just command
5252
, _data_ = Nothing }
53+
mkCodeLens _ _ = Nothing
5354

5455
dependencyVersionHints :: [Syntax.Field Syntax.Position] -> HscEnv -> [InlayHint]
55-
dependencyVersionHints cabalFields = fmap mkHint . collectPackageDependencyVersions cabalFields
56+
dependencyVersionHints cabalFields = Maybe.mapMaybe mkHint . collectPackageDependencyVersions cabalFields
5657
where
57-
mkHint :: (Range, T.Text, Version) -> InlayHint
58-
mkHint (Range _ pos, _, dependencyVersion) =
59-
InlayHint { _position = pos
60-
, _label = InL $ " (" <> printVersion dependencyVersion <> ")"
61-
, _kind = Nothing
62-
, _textEdits = Nothing
63-
, _tooltip = Nothing
64-
, _paddingLeft = Nothing
65-
, _paddingRight = Nothing
66-
, _data_ = Nothing
67-
}
58+
mkHint :: DependencyInfo -> Maybe InlayHint
59+
mkHint (DependencyInfo range _ (Just installedVersion)) =
60+
Just $
61+
InlayHint { _position = range ^. JL.end
62+
, _label = InL $ " (" <> printVersion installedVersion <> ")"
63+
, _kind = Nothing
64+
, _textEdits = Nothing
65+
, _tooltip = Nothing
66+
, _paddingLeft = Nothing
67+
, _paddingRight = Nothing
68+
, _data_ = Nothing
69+
}
70+
mkHint _ = Nothing
6871

6972
dependencyHover :: [Syntax.Field Syntax.Position] -> HscEnv -> Position -> Hover |? Null
7073
dependencyHover cabalFields hsc cursorPosition =
71-
let hoveredDep = List.find (positionInRange cursorPosition . (\(x, _, _) -> x)) $ collectPackageDependencyVersions cabalFields hsc
74+
let hoveredDep = List.find (positionInRange cursorPosition . range) $ collectPackageDependencyVersions cabalFields hsc
7275
in case hoveredDep of
73-
Just (_, pkgName, version) -> foundHover (Nothing, [pkgName <> " (" <> printVersion version <> ")\n", documentationText (pkgName <> "-" <> printVersion version)])
76+
Just (DependencyInfo {packageName, installedVersion}) ->
77+
let showVersion f = maybe T.empty (f . printVersion) installedVersion
78+
in foundHover (Nothing, [packageName <> showVersion (\v -> " (" <> v <> ")") <> "\n", documentationText (packageName <> showVersion ("-" <>))])
7479
Nothing -> InR Null
7580
where
7681
documentationText :: T.Text -> T.Text
7782
documentationText package = "[Documentation](https://hackage.haskell.org/package/" <> package <> ")"
7883

79-
collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Range, T.Text, Version)]
84+
collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [DependencyInfo]
8085
collectPackageDependencyVersions cabalFields hscEnv = cabalFields >>= collectPackageVersions
8186
where
8287
lookupPackageVersion pkgName = Maybe.listToMaybe $ nonDetEltsUniqMap $ fmap unitPackageVersion $ filterUniqMap ((==) (T.unpack pkgName) . unitPackageNameString) $ getUnitInfoMap hscEnv
8388

84-
collectPackageVersions :: Syntax.Field Syntax.Position -> [(Range, T.Text, Version)]
89+
collectPackageVersions :: Syntax.Field Syntax.Position -> [DependencyInfo]
8590
collectPackageVersions (Syntax.Field (Syntax.Name _ "build-depends") pos) = concatMap fieldLinePackageVersions pos
8691
collectPackageVersions (Syntax.Section _ _ fields) = concatMap collectPackageVersions fields
8792
collectPackageVersions _ = []
8893

89-
fieldLinePackageVersions :: Syntax.FieldLine Syntax.Position -> [(Range, T.Text, Version)]
94+
fieldLinePackageVersions :: Syntax.FieldLine Syntax.Position -> [DependencyInfo]
9095
fieldLinePackageVersions (Syntax.FieldLine pos line) =
9196
let linePackageNameRegex :: Regex = makeRegex ("(^|,)[[:space:]]*([a-zA-Z-]+)" :: ByteString)
9297
packageNames = (\x -> x ! 2) <$> matchAllText linePackageNameRegex (Encoding.decodeUtf8Lenient line)
9398
versions = do
9499
(pkgName, (pkgIndex, pkgOffset)) <- packageNames
95-
version <- Maybe.maybeToList $ lookupPackageVersion pkgName
96100
let pkgPosStart = Types.cabalPositionToLSPPosition $ Syntax.Position (Syntax.positionRow pos) (Syntax.positionCol pos + pkgIndex)
97101
pkgPosEnd = Types.cabalPositionToLSPPosition $ Syntax.Position (Syntax.positionRow pos) (Syntax.positionCol pos + pkgIndex + pkgOffset)
98-
pure (Range pkgPosStart pkgPosEnd, pkgName, version)
102+
version = lookupPackageVersion pkgName
103+
pure $ DependencyInfo (Range pkgPosStart pkgPosEnd) pkgName version
99104
in versions
100105

106+
data DependencyInfo = DependencyInfo
107+
{ range :: Range
108+
, packageName :: T.Text
109+
, installedVersion :: Maybe Version
110+
}
111+
101112
printVersion :: Version -> T.Text
102113
printVersion v = T.intercalate "." (fmap (T.pack . show) $ versionBranch v)

0 commit comments

Comments
 (0)