3
3
4
4
module Ide.Plugin.Cabal.Dependencies (dependencyVersionHints , collectPackageDependencyVersions , dependencyVersionLens ) where
5
5
6
+ import Data.Array ((!) )
7
+ import Data.ByteString (ByteString )
6
8
import qualified Data.Char as Char
7
9
import qualified Data.List as List
8
10
import qualified Data.Maybe as Maybe
@@ -21,6 +23,8 @@ import Language.LSP.Protocol.Types (CodeLens (..), Command (..),
21
23
InlayHint (.. ),
22
24
InlayHintLabelPart (InlayHintLabelPart ),
23
25
Range (.. ), type (|? ) (.. ))
26
+ import Text.Regex.TDFA (Regex , makeRegex ,
27
+ matchAllText )
24
28
25
29
dependencyVersionLens :: [Syntax. Field Syntax. Position ] -> HscEnv -> [CodeLens ]
26
30
dependencyVersionLens cabalFields = fmap mkCodeLens . collectPackageDependencyVersions cabalFields
@@ -61,16 +65,13 @@ collectPackageDependencyVersions cabalFields hscEnv = cabalFields >>= collectPac
61
65
collectPackageVersions _ = []
62
66
63
67
fieldLinePackageVersions :: Syntax. FieldLine Syntax. Position -> [(Syntax. Position , Version )]
64
- fieldLinePackageVersions (Syntax. FieldLine pos x) =
65
- let splitted = T. splitOn " ," $ Encoding. decodeUtf8Lenient x
66
- calcStartPosition (prev, start) = T. length prev + 1 + start
67
- potentialPkgs = List. foldl' (\ a b -> a <> [(b, Maybe. maybe 0 calcStartPosition $ Maybe. listToMaybe $ reverse a)]) [] splitted
68
+ fieldLinePackageVersions (Syntax. FieldLine pos line) =
69
+ let linePackageNameRegex :: Regex = makeRegex (" (^|,)[[:space:]]*([a-zA-Z-]+)" :: ByteString )
70
+ packageNames = (\ x -> x ! 2 ) <$> matchAllText linePackageNameRegex (Encoding. decodeUtf8Lenient line)
68
71
versions = do
69
- (pkg', pkgStartOffset) <- potentialPkgs
70
- let pkgName = T. takeWhile (not . Char. isSpace) . T. strip $ pkg'
71
- endOfPackage = T. length pkgName + (T. length $ T. takeWhile Char. isSpace pkg')
72
- version <- Maybe. maybeToList $ lookupPackageVersion $ T. takeWhile (not . Char. isSpace) . T. strip $ pkg'
73
- pure (Syntax. Position (Syntax. positionRow pos) (Syntax. positionCol pos + pkgStartOffset + endOfPackage), version)
72
+ (pkgName, (pkgIndex, pkgOffset)) <- packageNames
73
+ version <- Maybe. maybeToList $ lookupPackageVersion pkgName
74
+ pure (Syntax. Position (Syntax. positionRow pos) (Syntax. positionCol pos + pkgIndex + pkgOffset), version)
74
75
in versions
75
76
76
77
printVersion :: Version -> T. Text
0 commit comments