Skip to content

Commit c00eca0

Browse files
committed
Add more test-cases
1 parent 6e1153c commit c00eca0

File tree

7 files changed

+175
-34
lines changed

7 files changed

+175
-34
lines changed

hls-test-utils/src/Test/Hls.hs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module Test.Hls
1616
defaultTestRunner,
1717
goldenGitDiff,
1818
goldenWithHaskellDoc,
19+
goldenWithCabalDoc,
1920
goldenWithHaskellDocFormatter,
2021
def,
2122
runSessionWithServer,
@@ -120,12 +121,35 @@ goldenWithHaskellDoc
120121
-> FilePath
121122
-> (TextDocumentIdentifier -> Session ())
122123
-> TestTree
123-
goldenWithHaskellDoc plugin title testDataDir path desc ext act =
124+
goldenWithHaskellDoc = goldenWithDoc "haskell"
125+
126+
goldenWithCabalDoc
127+
:: PluginDescriptor IdeState
128+
-> TestName
129+
-> FilePath
130+
-> FilePath
131+
-> FilePath
132+
-> FilePath
133+
-> (TextDocumentIdentifier -> Session ())
134+
-> TestTree
135+
goldenWithCabalDoc = goldenWithDoc "cabal"
136+
137+
goldenWithDoc
138+
:: T.Text
139+
-> PluginDescriptor IdeState
140+
-> TestName
141+
-> FilePath
142+
-> FilePath
143+
-> FilePath
144+
-> FilePath
145+
-> (TextDocumentIdentifier -> Session ())
146+
-> TestTree
147+
goldenWithDoc fileType plugin title testDataDir path desc ext act =
124148
goldenGitDiff title (testDataDir </> path <.> desc <.> ext)
125149
$ runSessionWithServer plugin testDataDir
126150
$ TL.encodeUtf8 . TL.fromStrict
127151
<$> do
128-
doc <- openDoc (path <.> ext) "haskell"
152+
doc <- openDoc (path <.> ext) fileType
129153
void waitForBuildQueue
130154
act doc
131155
documentContents doc

plugins/hls-cabal-plugin/hls-cabal-plugin.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ category: Development
1414
extra-source-files:
1515
CHANGELOG.md
1616
test/testdata/simple.cabal
17-
test/testdata/simple.cabal.golden.txt
1817

1918
common warnings
2019
ghc-options: -Wall
@@ -64,7 +63,9 @@ test-suite tests
6463
, filepath
6564
, hls-cabal-plugin
6665
, hls-test-utils ^>=1.3
66+
, lens
6767
, lsp
68+
, ghcide
6869
, lsp-types
6970
, tasty-hunit
7071
, text

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ data Log
3838
= LogModificationTime NormalizedFilePath (Maybe FileVersion)
3939
| LogDiagnostics NormalizedFilePath [FileDiagnostic]
4040
| LogShake Shake.Log
41+
| LogDocOpened Uri
42+
| LogDocModified Uri
43+
| LogDocSaved Uri
44+
| LogDocClosed Uri
4145
deriving Show
4246

4347
instance Pretty Log where
@@ -47,6 +51,14 @@ instance Pretty Log where
4751
"Modified:" <+> pretty (fromNormalizedFilePath nfp) <+> pretty (show modTime)
4852
LogDiagnostics nfp diags ->
4953
"Diagnostics for " <+> pretty (fromNormalizedFilePath nfp) <> ":" <+> pretty (show diags)
54+
LogDocOpened uri ->
55+
"Opened text document:" <+> pretty (getUri uri)
56+
LogDocModified uri ->
57+
"Modified text document:" <+> pretty (getUri uri)
58+
LogDocSaved uri ->
59+
"Saved text document:" <+> pretty (getUri uri)
60+
LogDocClosed uri ->
61+
"Closed text document:" <+> pretty (getUri uri)
5062

5163
descriptor :: Recorder (WithPriority Log) -> PluginId -> PluginDescriptor IdeState
5264
descriptor recorder plId = (defaultCabalPluginDescriptor plId)
@@ -56,39 +68,39 @@ descriptor recorder plId = (defaultCabalPluginDescriptor plId)
5668
[ mkPluginNotificationHandler LSP.STextDocumentDidOpen $
5769
\ide vfs _ (DidOpenTextDocumentParams TextDocumentItem{_uri,_version}) -> liftIO $ do
5870
whenUriFile _uri $ \file -> do
59-
logDebug (ideLogger ide) $ "Opened text document: " <> getUri _uri
71+
log' Debug $ LogDocOpened _uri
6072
join $ atomically $ Shake.recordDirtyKeys (shakeExtras ide) GetModificationTime [file]
6173
restartShakeSession (shakeExtras ide) (VFSModified vfs) (fromNormalizedFilePath file ++ " (opened)") []
6274
join $ Shake.shakeEnqueue (shakeExtras ide) $ Shake.mkDelayedAction "cabal parse modified" Info $ void $ use ParseCabal file
6375

6476
, mkPluginNotificationHandler LSP.STextDocumentDidChange $
6577
\ide vfs _ (DidChangeTextDocumentParams VersionedTextDocumentIdentifier{_uri} _) -> liftIO $ do
6678
whenUriFile _uri $ \file -> do
67-
logDebug (ideLogger ide) $ "Modified text document: " <> getUri _uri
68-
logDebug (ideLogger ide) $ "VFS State: " <> T.pack (show vfs)
79+
log' Debug $ LogDocModified _uri
6980
join $ atomically $ Shake.recordDirtyKeys (shakeExtras ide) GetModificationTime [file]
7081
restartShakeSession (shakeExtras ide) (VFSModified vfs) (fromNormalizedFilePath file ++ " (modified)") []
7182
join $ Shake.shakeEnqueue (shakeExtras ide) $ Shake.mkDelayedAction "cabal parse modified" Info $ void $ use ParseCabal file
7283

7384
, mkPluginNotificationHandler LSP.STextDocumentDidSave $
7485
\ide vfs _ (DidSaveTextDocumentParams TextDocumentIdentifier{_uri} _) -> liftIO $ do
7586
whenUriFile _uri $ \file -> do
76-
logDebug (ideLogger ide) $ "Saved text document: " <> getUri _uri
87+
log' Debug $ LogDocSaved _uri
7788
join $ atomically $ Shake.recordDirtyKeys (shakeExtras ide) GetModificationTime [file]
7889
restartShakeSession (shakeExtras ide) (VFSModified vfs) (fromNormalizedFilePath file ++ " (saved)") []
7990
join $ Shake.shakeEnqueue (shakeExtras ide) $ Shake.mkDelayedAction "cabal parse modified" Info $ void $ use ParseCabal file
8091

8192
, mkPluginNotificationHandler LSP.STextDocumentDidClose $
8293
\ide vfs _ (DidCloseTextDocumentParams TextDocumentIdentifier{_uri}) -> liftIO $ do
8394
whenUriFile _uri $ \file -> do
84-
let msg = "Closed text document: " <> getUri _uri
85-
logDebug (ideLogger ide) msg
95+
log' Debug $ LogDocClosed _uri
8696
join $ atomically $ Shake.recordDirtyKeys (shakeExtras ide) GetModificationTime [file]
8797
restartShakeSession (shakeExtras ide) (VFSModified vfs) (fromNormalizedFilePath file ++ " (closed)") []
8898
join $ Shake.shakeEnqueue (shakeExtras ide) $ Shake.mkDelayedAction "cabal parse modified" Info $ void $ use ParseCabal file
8999
]
90100
}
91101
where
102+
log' = logWith recorder
103+
92104
whenUriFile :: Uri -> (NormalizedFilePath -> IO ()) -> IO ()
93105
whenUriFile uri act = whenJust (LSP.uriToFilePath uri) $ act . toNormalizedFilePath'
94106

plugins/hls-cabal-plugin/test/Main.hs

Lines changed: 112 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,125 @@
11
{-# LANGUAGE OverloadedStrings #-}
2+
{-# OPTIONS_GHC -Wno-orphans #-}
3+
{-# LANGUAGE NamedFieldPuns #-}
4+
{-# LANGUAGE ViewPatterns #-}
25
module Main
36
( main
47
) where
58

6-
import qualified Ide.Plugin.Cabal.Parse as Lib
7-
import qualified Data.Text as T
8-
import qualified Language.LSP.Types.Lens as L
9+
import Control.Lens ((^.))
10+
import Data.Function
11+
import qualified Data.Text as Text
12+
import Development.IDE.Types.Logger
913
import Ide.Plugin.Cabal
14+
import qualified Ide.Plugin.Cabal.Parse as Lib
15+
import qualified Language.LSP.Types.Lens as J
1016
import System.FilePath
1117
import Test.Hls
12-
import Test.Hls.Util (onlyWorkForGhcVersions)
13-
import Test.Tasty.HUnit (assertFailure, testCase, (@?=))
18+
import Data.Either (isRight)
19+
20+
cabalPlugin :: Recorder (WithPriority Log) -> PluginDescriptor IdeState
21+
cabalPlugin recorder = descriptor recorder "cabal"
1422

1523
main :: IO ()
16-
main = defaultTestRunner tests
17-
18-
pragmasPlugin :: PluginDescriptor IdeState
19-
pragmasPlugin = descriptor mempty "cabal"
20-
21-
tests :: TestTree
22-
tests =
23-
testGroup "cabal"
24-
[ testCase "parsing works" $ do
25-
parseRes <- Lib.parseCabalFile "test/testdata/simple.cabal"
26-
goldenShowStr <- readFile "test/testdata/simple.cabal.golden.txt"
27-
show parseRes @?= goldenShowStr
24+
main = do
25+
recorder <- initialiseRecorder True
26+
defaultTestRunner $
27+
testGroup "Cabal Plugin Tests"
28+
[ unitTests
29+
, pluginTests recorder
30+
]
31+
32+
-- | @initialiseRecorder silent@
33+
--
34+
-- If @'silent' == True@, then don't log anything, otherwise
35+
-- the recorder is the standard recorder of HLS. Useful for debugging.
36+
initialiseRecorder :: Bool -> IO (Recorder (WithPriority Log))
37+
initialiseRecorder True = pure mempty
38+
initialiseRecorder False = do
39+
docWithPriorityRecorder <- makeDefaultStderrRecorder Nothing Debug
40+
41+
let docWithFilteredPriorityRecorder =
42+
docWithPriorityRecorder
43+
& cfilter (\WithPriority{ priority } -> priority >= Debug)
44+
pure $ docWithFilteredPriorityRecorder
45+
& cmapWithPrio pretty
46+
47+
-- ------------------------------------------------------------------------
48+
-- Unit Tests
49+
-- ------------------------------------------------------------------------
50+
51+
unitTests :: TestTree
52+
unitTests =
53+
testGroup "Unit Tests"
54+
[ testCase "Simple Parsing works" $ do
55+
(warnings, pm) <- Lib.parseCabalFile $ testDataDir </> "simple.cabal"
56+
liftIO $ do
57+
null warnings @? "Found unexpected warnings"
58+
isRight pm @? "Failed to parse GenericPackageDescription"
2859
]
2960

30-
-- Orphans
31-
instance Eq Lib.PWarning where
32-
Lib.PWarning pWarnType1 pos1 str1 == Lib.PWarning pWarnType2 pos2 str2 =
33-
pWarnType1 == pWarnType2 && pos1 == pos2 && str1 == str2
61+
-- ------------------------------------------------------------------------
62+
-- Integration Tests
63+
-- ------------------------------------------------------------------------
64+
65+
pluginTests :: Recorder (WithPriority Log) -> TestTree
66+
pluginTests recorder = testGroup "Plugin Tests"
67+
[ testGroup "Diagnostics"
68+
[ runCabalTestCaseSession "Publishes Diagnostics on Error" recorder "" $ do
69+
doc <- openDoc "invalid.cabal" "cabal"
70+
diags <- waitForDiagnosticsFromSource doc "parsing"
71+
reduceDiag <- liftIO $ inspectDiagnostic diags ["Unknown SPDX license identifier: 'BSD3'"]
72+
liftIO $ do
73+
length diags @?= 1
74+
reduceDiag ^. J.range @?= Range (Position 3 24) (Position 4 0)
75+
reduceDiag ^. J.severity @?= Just DsError
76+
, runCabalTestCaseSession "Clears diagnostics" recorder "" $ do
77+
doc <- openDoc "invalid.cabal" "cabal"
78+
diags <- waitForDiagnosticsFrom doc
79+
reduceDiag <- liftIO $ inspectDiagnostic diags ["Unknown SPDX license identifier: 'BSD3'"]
80+
liftIO $ do
81+
length diags @?= 1
82+
reduceDiag ^. J.range @?= Range (Position 3 24) (Position 4 0)
83+
reduceDiag ^. J.severity @?= Just DsError
84+
_ <- applyEdit doc $ TextEdit (Range (Position 3 20) (Position 4 0)) "BSD-3-Clause\n"
85+
newDiags <- waitForDiagnosticsFrom doc
86+
liftIO $ newDiags @?= []
87+
]
88+
, testGroup "Code Actions"
89+
[ runCabalTestCaseSession "BSD-3" recorder "" $ do
90+
doc <- openDoc "licenseCodeAction.cabal" "cabal"
91+
diags <- waitForDiagnosticsFromSource doc "parsing"
92+
reduceDiag <- liftIO $ inspectDiagnostic diags ["Unknown SPDX license identifier: 'BSD3'"]
93+
liftIO $ do
94+
length diags @?= 1
95+
reduceDiag ^. J.range @?= Range (Position 3 24) (Position 4 0)
96+
reduceDiag ^. J.severity @?= Just DsError
97+
[InR codeAction] <- getCodeActions doc (Range (Position 3 24) (Position 4 0))
98+
executeCodeAction codeAction
99+
contents <- documentContents doc
100+
liftIO $ contents @?= Text.unlines
101+
[ "cabal-version: 3.0"
102+
, "name: licenseCodeAction"
103+
, "version: 0.1.0.0"
104+
, "license: BSD-3-Clause"
105+
, ""
106+
, "library"
107+
, " build-depends: base"
108+
, " default-language: Haskell2010"
109+
]
110+
]
111+
]
112+
113+
-- ------------------------------------------------------------------------
114+
-- Runner utils
115+
-- ------------------------------------------------------------------------
116+
117+
runCabalTestCaseSession :: TestName -> Recorder (WithPriority Log) -> FilePath -> Session () -> TestTree
118+
runCabalTestCaseSession title recorder subdir act = testCase title $ runCabalSession recorder subdir act
119+
120+
runCabalSession :: Recorder (WithPriority Log) -> FilePath -> Session a -> IO a
121+
runCabalSession recorder subdir =
122+
failIfSessionTimeout . runSessionWithServer (cabalPlugin recorder) (testDataDir </> subdir)
34123

35-
instance Eq Lib.PError where
36-
Lib.PError pos1 str1 == Lib.PError pos2 str2 =
37-
pos1 == pos2 && str1 == str2
124+
testDataDir :: FilePath
125+
testDataDir = "test" </> "testdata"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
cabal-version: 3.0
2+
name: invalid
3+
version: 0.1.0.0
4+
license: BSD3
5+
6+
library
7+
build-depends: base
8+
default-language: Haskell2010
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
cabal-version: 3.0
2+
name: licenseCodeAction
3+
version: 0.1.0.0
4+
license: BSD3
5+
6+
library
7+
build-depends: base
8+
default-language: Haskell2010
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
([],Right (GenericPackageDescription {packageDescription = PackageDescription {specVersion = CabalSpecV3_0, package = PackageIdentifier {pkgName = PackageName "hls-cabal-plugin", pkgVersion = mkVersion [0,1,0,0]}, licenseRaw = Left (License (ELicense (ELicenseId MIT) Nothing)), licenseFiles = [SymbolicPath "LICENSE"], copyright = "", maintainer = "fendor@posteo.de", author = "Fendor", stability = "", testedWith = [], homepage = "", pkgUrl = "", bugReports = "", sourceRepos = [], synopsis = "", description = "", category = "Development", customFieldsPD = [], buildTypeRaw = Nothing, setupBuildInfo = Nothing, library = Nothing, subLibraries = [], executables = [], foreignLibs = [], testSuites = [], benchmarks = [], dataFiles = [], dataDir = ".", extraSrcFiles = ["CHANGELOG.md"], extraTmpFiles = [], extraDocFiles = []}, gpdScannedVersion = Nothing, genPackageFlags = [], condLibrary = Just (CondNode {condTreeData = Library {libName = LMainLibName, exposedModules = [ModuleName "IDE.Plugin.Cabal"], reexportedModules = [], signatures = [], libExposed = True, libVisibility = LibraryVisibilityPublic, libBuildInfo = BuildInfo {buildable = True, buildTools = [], buildToolDepends = [], cppOptions = [], asmOptions = [], cmmOptions = [], ccOptions = [], cxxOptions = [], ldOptions = [], hsc2hsOptions = [], pkgconfigDepends = [], frameworks = [], extraFrameworkDirs = [], asmSources = [], cmmSources = [], cSources = [], cxxSources = [], jsSources = [], hsSourceDirs = [SymbolicPath "src"], otherModules = [], virtualModules = [], autogenModules = [], defaultLanguage = Just Haskell2010, otherLanguages = [], defaultExtensions = [], otherExtensions = [], oldExtensions = [], extraLibs = [], extraGHCiLibs = [], extraBundledLibs = [], extraLibFlavours = [], extraDynLibFlavours = [], extraLibDirs = [], includeDirs = [], includes = [], autogenIncludes = [], installIncludes = [], options = PerCompilerFlavor [] [], profOptions = PerCompilerFlavor [] [], sharedOptions = PerCompilerFlavor [] [], staticOptions = PerCompilerFlavor [] [], customFieldsBI = [], targetBuildDepends = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromNonEmpty (LMainLibName :| []))], mixins = []}}, condTreeConstraints = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromNonEmpty (LMainLibName :| []))], condTreeComponents = []}), condSubLibraries = [], condForeignLibs = [], condExecutables = [], condTestSuites = [(UnqualComponentName "hls-cabal-plugin-test",CondNode {condTreeData = TestSuite {testName = UnqualComponentName "", testInterface = TestSuiteExeV10 (mkVersion [1,0]) "Main.hs", testBuildInfo = BuildInfo {buildable = True, buildTools = [], buildToolDepends = [], cppOptions = [], asmOptions = [], cmmOptions = [], ccOptions = [], cxxOptions = [], ldOptions = [], hsc2hsOptions = [], pkgconfigDepends = [], frameworks = [], extraFrameworkDirs = [], asmSources = [], cmmSources = [], cSources = [], cxxSources = [], jsSources = [], hsSourceDirs = [SymbolicPath "test"], otherModules = [], virtualModules = [], autogenModules = [], defaultLanguage = Just Haskell2010, otherLanguages = [], defaultExtensions = [], otherExtensions = [], oldExtensions = [], extraLibs = [], extraGHCiLibs = [], extraBundledLibs = [], extraLibFlavours = [], extraDynLibFlavours = [], extraLibDirs = [], includeDirs = [], includes = [], autogenIncludes = [], installIncludes = [], options = PerCompilerFlavor [] [], profOptions = PerCompilerFlavor [] [], sharedOptions = PerCompilerFlavor [] [], staticOptions = PerCompilerFlavor [] [], customFieldsBI = [], targetBuildDepends = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromNonEmpty (LMainLibName :| []))], mixins = []}}, condTreeConstraints = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromNonEmpty (LMainLibName :| []))], condTreeComponents = []})], condBenchmarks = []}))
1+
([],Right (GenericPackageDescription {packageDescription = PackageDescription {specVersionRaw = Left (mkVersion [3,0]), package = PackageIdentifier {pkgName = PackageName "hls-cabal-plugin", pkgVersion = mkVersion [0,1,0,0]}, licenseRaw = Left (License (ELicense (ELicenseId MIT) Nothing)), licenseFiles = ["LICENSE"], copyright = "", maintainer = "fendor@posteo.de", author = "Fendor", stability = "", testedWith = [], homepage = "", pkgUrl = "", bugReports = "", sourceRepos = [], synopsis = "", description = "", category = "Development", customFieldsPD = [], buildTypeRaw = Nothing, setupBuildInfo = Nothing, library = Nothing, subLibraries = [], executables = [], foreignLibs = [], testSuites = [], benchmarks = [], dataFiles = [], dataDir = ".", extraSrcFiles = ["CHANGELOG.md"], extraTmpFiles = [], extraDocFiles = []}, genPackageFlags = [], condLibrary = Just (CondNode {condTreeData = Library {libName = LMainLibName, exposedModules = [ModuleName ["IDE","Plugin","Cabal"]], reexportedModules = [], signatures = [], libExposed = True, libVisibility = LibraryVisibilityPublic, libBuildInfo = BuildInfo {buildable = True, buildTools = [], buildToolDepends = [], cppOptions = [], asmOptions = [], cmmOptions = [], ccOptions = [], cxxOptions = [], ldOptions = [], pkgconfigDepends = [], frameworks = [], extraFrameworkDirs = [], asmSources = [], cmmSources = [], cSources = [], cxxSources = [], jsSources = [], hsSourceDirs = ["src"], otherModules = [], virtualModules = [], autogenModules = [], defaultLanguage = Just Haskell2010, otherLanguages = [], defaultExtensions = [], otherExtensions = [], oldExtensions = [], extraLibs = [], extraGHCiLibs = [], extraBundledLibs = [], extraLibFlavours = [], extraDynLibFlavours = [], extraLibDirs = [], includeDirs = [], includes = [], autogenIncludes = [], installIncludes = [], options = PerCompilerFlavor [] [], profOptions = PerCompilerFlavor [] [], sharedOptions = PerCompilerFlavor [] [], staticOptions = PerCompilerFlavor [] [], customFieldsBI = [], targetBuildDepends = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromList [LMainLibName])], mixins = []}}, condTreeConstraints = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromList [LMainLibName])], condTreeComponents = []}), condSubLibraries = [], condForeignLibs = [], condExecutables = [], condTestSuites = [(UnqualComponentName "hls-cabal-plugin-test",CondNode {condTreeData = TestSuite {testName = UnqualComponentName "", testInterface = TestSuiteExeV10 (mkVersion [1,0]) "Main.hs", testBuildInfo = BuildInfo {buildable = True, buildTools = [], buildToolDepends = [], cppOptions = [], asmOptions = [], cmmOptions = [], ccOptions = [], cxxOptions = [], ldOptions = [], pkgconfigDepends = [], frameworks = [], extraFrameworkDirs = [], asmSources = [], cmmSources = [], cSources = [], cxxSources = [], jsSources = [], hsSourceDirs = ["test"], otherModules = [], virtualModules = [], autogenModules = [], defaultLanguage = Just Haskell2010, otherLanguages = [], defaultExtensions = [], otherExtensions = [], oldExtensions = [], extraLibs = [], extraGHCiLibs = [], extraBundledLibs = [], extraLibFlavours = [], extraDynLibFlavours = [], extraLibDirs = [], includeDirs = [], includes = [], autogenIncludes = [], installIncludes = [], options = PerCompilerFlavor [] [], profOptions = PerCompilerFlavor [] [], sharedOptions = PerCompilerFlavor [] [], staticOptions = PerCompilerFlavor [] [], customFieldsBI = [], targetBuildDepends = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromList [LMainLibName])], mixins = []}}, condTreeConstraints = [Dependency (PackageName "base") (MajorBoundVersion (mkVersion [4,14,3,0])) (fromList [LMainLibName])], condTreeComponents = []})], condBenchmarks = []}))

0 commit comments

Comments
 (0)