|
1 | 1 | {-# LANGUAGE DuplicateRecordFields #-}
|
2 | 2 | {-# LANGUAGE OverloadedStrings #-}
|
3 | 3 |
|
4 |
| -module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints, collectPackageDependencyVersions, dependencyVersionLens, printVersion) where |
| 4 | +module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints, dependencyVersionLens, dependencyHover) where |
5 | 5 |
|
6 |
| -import Control.Lens ((^.)) |
7 |
| -import Data.Array ((!)) |
8 |
| -import Data.ByteString (ByteString) |
| 6 | +import Control.Lens ((^.)) |
| 7 | +import Data.Array ((!)) |
| 8 | +import Data.ByteString (ByteString) |
9 | 9 | import Data.List
|
10 |
| -import qualified Data.Maybe as Maybe |
11 |
| -import qualified Data.Text as T |
12 |
| -import qualified Data.Text.Encoding as Encoding |
13 |
| -import Data.Version (Version (..)) |
14 |
| -import Development.IDE.GHC.Compat (HscEnv, filterUniqMap, |
15 |
| - getUnitInfoMap, |
16 |
| - nonDetEltsUniqMap, |
17 |
| - unitPackageNameString, |
18 |
| - unitPackageVersion) |
19 |
| -import qualified Distribution.Fields as Syntax |
20 |
| -import qualified Distribution.Parsec.Position as Syntax |
21 |
| -import qualified Ide.Plugin.Cabal.Completion.Types as Types |
22 |
| -import qualified Language.LSP.Protocol.Lens as JL |
23 |
| -import Language.LSP.Protocol.Types (CodeLens (..), Command (..), |
24 |
| - InlayHint (..), Range (..), |
25 |
| - type (|?) (..)) |
26 |
| -import Text.Regex.TDFA (Regex, makeRegex, |
27 |
| - matchAllText) |
| 10 | +import qualified Data.List as List |
| 11 | +import qualified Data.Maybe as Maybe |
| 12 | +import qualified Data.Text as T |
| 13 | +import qualified Data.Text.Encoding as Encoding |
| 14 | +import Data.Version (Version (..)) |
| 15 | +import Development.IDE.GHC.Compat (HscEnv, filterUniqMap, |
| 16 | + getUnitInfoMap, |
| 17 | + nonDetEltsUniqMap, |
| 18 | + unitPackageNameString, |
| 19 | + unitPackageVersion) |
| 20 | +import Development.IDE.LSP.HoverDefinition (foundHover) |
| 21 | +import qualified Distribution.Fields as Syntax |
| 22 | +import qualified Distribution.Parsec.Position as Syntax |
| 23 | +import qualified Ide.Plugin.Cabal.Completion.Types as Types |
| 24 | +import qualified Language.LSP.Protocol.Lens as JL |
| 25 | +import Language.LSP.Protocol.Types (CodeLens (..), |
| 26 | + Command (..), Hover, |
| 27 | + InlayHint (..), Null (..), |
| 28 | + Position, Range (..), |
| 29 | + positionInRange, |
| 30 | + type (|?) (..)) |
| 31 | +import Text.Regex.TDFA (Regex, makeRegex, |
| 32 | + matchAllText) |
28 | 33 |
|
29 | 34 | dependencyVersionLens :: [Syntax.Field Syntax.Position] -> HscEnv -> [CodeLens]
|
30 | 35 | dependencyVersionLens cabalFields = (>>= foo) . groupBy (\(a,_,_) (b,_,_)-> (a ^. JL.start . JL.line) == (b ^. JL.start . JL.line)) . collectPackageDependencyVersions cabalFields
|
@@ -61,6 +66,16 @@ dependencyVersionHints cabalFields = fmap mkHint . collectPackageDependencyVersi
|
61 | 66 | , _data_ = Nothing
|
62 | 67 | }
|
63 | 68 |
|
| 69 | +dependencyHover :: [Syntax.Field Syntax.Position] -> HscEnv -> Position -> Hover |? Null |
| 70 | +dependencyHover cabalFields hsc cursorPosition = |
| 71 | + let hoveredDep = List.find (positionInRange cursorPosition . (\(x, _, _) -> x)) $ collectPackageDependencyVersions cabalFields hsc |
| 72 | + in case hoveredDep of |
| 73 | + Just (_, pkgName, version) -> foundHover (Nothing, [pkgName <> " (" <> printVersion version <> ")\n", documentationText (pkgName <> "-" <> printVersion version)]) |
| 74 | + Nothing -> InR Null |
| 75 | + where |
| 76 | + documentationText :: T.Text -> T.Text |
| 77 | + documentationText package = "[Documentation](https://hackage.haskell.org/package/" <> package <> ")" |
| 78 | + |
64 | 79 | collectPackageDependencyVersions :: [Syntax.Field Syntax.Position] -> HscEnv -> [(Range, T.Text, Version)]
|
65 | 80 | collectPackageDependencyVersions cabalFields hscEnv = cabalFields >>= collectPackageVersions
|
66 | 81 | where
|
|
0 commit comments