1
1
{-# LANGUAGE CPP #-}
2
+ {-# LANGUAGE DataKinds #-}
2
3
{-# LANGUAGE DisambiguateRecordFields #-}
3
4
{-# LANGUAGE OverloadedStrings #-}
5
+ {-# LANGUAGE QuasiQuotes #-}
4
6
5
7
module Main (
6
8
main ,
@@ -17,14 +19,19 @@ import qualified Data.ByteString as BS
17
19
import Data.Either (isRight )
18
20
import Data.List.Extra (nubOrdOn )
19
21
import qualified Data.Maybe as Maybe
22
+ import Data.Text (Text )
20
23
import qualified Data.Text as T
24
+ import qualified Data.Text.IO as Text
21
25
import Definition (gotoDefinitionTests )
26
+ import Development.IDE.Test
22
27
import Ide.Plugin.Cabal.LicenseSuggest (licenseErrorSuggestion )
23
28
import qualified Ide.Plugin.Cabal.Parse as Lib
24
29
import qualified Language.LSP.Protocol.Lens as L
30
+ import qualified Language.LSP.Protocol.Message as L
25
31
import Outline (outlineTests )
26
32
import System.FilePath
27
33
import Test.Hls
34
+ import Test.Hls.FileSystem
28
35
import Utils
29
36
30
37
main :: IO ()
@@ -40,6 +47,7 @@ main = do
40
47
, codeActionTests
41
48
, gotoDefinitionTests
42
49
, hoverTests
50
+ , reloadOnCabalChangeTests
43
51
]
44
52
45
53
-- ------------------------------------------------------------------------
@@ -128,11 +136,6 @@ pluginTests =
128
136
_ <- applyEdit doc $ TextEdit (Range (Position 3 20 ) (Position 4 0 )) " BSD-3-Clause\n "
129
137
newDiags <- cabalCaptureKick
130
138
liftIO $ newDiags @?= []
131
- , runCabalTestCaseSession " No Diagnostics in .hs files from valid .cabal file" " simple-cabal" $ do
132
- hsDoc <- openDoc " A.hs" " haskell"
133
- expectNoMoreDiagnostics 1 hsDoc " typechecking"
134
- cabalDoc <- openDoc " simple-cabal.cabal" " cabal"
135
- expectNoMoreDiagnostics 1 cabalDoc " parsing"
136
139
]
137
140
]
138
141
-- ----------------------------------------------------------------------------
@@ -262,3 +265,63 @@ hoverOnDependencyTests = testGroup "Hover Dependency"
262
265
h <- getHover doc pos
263
266
liftIO $ assertBool (" Found hover `" <> show h <> " `" ) $ Maybe. isNothing h
264
267
closeDoc doc
268
+
269
+ -- ----------------------------------------------------------------------------
270
+ -- Reloading of Haskell files on .cabal changes
271
+ -- ----------------------------------------------------------------------------
272
+
273
+ simpleCabalVft :: [FileTree ]
274
+ simpleCabalVft =
275
+ [ copy " hie.yaml"
276
+ , copy " simple-reload.cabal"
277
+ , copy " Main.hs"
278
+ ]
279
+
280
+ simpleCabalFs :: VirtualFileTree
281
+ simpleCabalFs = mkVirtualFileTree
282
+ (testDataDir </> " simple-reload" )
283
+ simpleCabalVft
284
+
285
+ -- Slow tests
286
+ reloadOnCabalChangeTests :: TestTree
287
+ reloadOnCabalChangeTests = testGroup " Reload on .cabal changes"
288
+ [ runCabalTestCaseSessionVft " Change warnings when .cabal file changes" simpleCabalFs $ do
289
+ _ <- openDoc " Main.hs" " haskell"
290
+ expectDiagnostics [(" Main.hs" , [(DiagnosticSeverity_Warning , (8 , 0 ), " Top-level binding with no type signature" , Just " GHC-38417" )])]
291
+ waitForAllProgressDone
292
+ cabalDoc <- openDoc " simple-reload.cabal" " cabal"
293
+ skipManyTill anyMessage cabalKickDone
294
+ saveDoc cabalDoc
295
+ [trimming |
296
+ cabal-version: 3.4
297
+ name: simple-reload
298
+ version: 0.1.0.0
299
+ -- copyright:
300
+ build-type: Simple
301
+
302
+ common warnings
303
+ ghc-options: -Wall -Wno-missing-signatures
304
+
305
+ executable simple-reload
306
+ import: warnings
307
+ main-is: Main.hs
308
+ build-depends: base
309
+ default-language: Haskell2010
310
+ |]
311
+
312
+ expectDiagnostics [(" Main.hs" , [(DiagnosticSeverity_Warning , (2 , 0 ), " The import of \8216Data.List\8217 is redundant" , Nothing )])]
313
+ ]
314
+
315
+ -- | Persists the given contents to the 'TextDocumentIdentifier' on disk
316
+ -- and sends the @textDocument/didSave@ notification.
317
+ saveDoc :: TextDocumentIdentifier -> Text -> Session ()
318
+ saveDoc docId t = do
319
+ -- I couldn't figure out how to get the virtual file contents, so we write it
320
+ -- to disk and send the 'SMethod_TextDocumentDidSave' notification
321
+ case uriToFilePath (docId ^. L. uri) of
322
+ Nothing -> pure ()
323
+ Just fp -> do
324
+ liftIO $ Text. writeFile fp t
325
+
326
+ let params = DidSaveTextDocumentParams docId Nothing
327
+ sendNotification L. SMethod_TextDocumentDidSave params
0 commit comments