@@ -9,12 +9,13 @@ import Control.Lens (set, (^.))
9
9
import Control.Monad.Extra
10
10
import Data.Aeson
11
11
import Data.Functor ((<&>) )
12
- import Data.List (sort )
12
+ import Data.List (sort , tails )
13
13
import qualified Data.Map as M
14
14
import qualified Data.Text as T
15
15
import Ide.Plugin.CallHierarchy
16
16
import qualified Language.LSP.Test as Test
17
17
import qualified Language.LSP.Types.Lens as L
18
+ import Development.IDE.Test
18
19
import System.Directory.Extra
19
20
import System.FilePath
20
21
import qualified System.IO.Extra
@@ -198,7 +199,7 @@ incomingCallsTests =
198
199
testCase " xdata unavailable" $
199
200
runSessionWithServer plugin testDataDir $ do
200
201
doc <- createDoc " A.hs" " haskell" $ T. unlines [" a=3" , " b=a" ]
201
- waitForKickDone
202
+ waitForIndex (testDataDir </> " A.hs " )
202
203
[item] <- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 )
203
204
let expected = [CallHierarchyIncomingCall item (List [mkRange 1 2 1 3 ])]
204
205
Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 0 ) >>=
@@ -323,7 +324,7 @@ outgoingCallsTests =
323
324
testCase " xdata unavailable" $ withCanonicalTempDir $ \ dir ->
324
325
runSessionWithServer plugin dir $ do
325
326
doc <- createDoc " A.hs" " haskell" $ T. unlines [" a=3" , " b=a" ]
326
- waitForKickDone
327
+ waitForIndex (dir </> " A.hs " )
327
328
[item] <- Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 0 1 )
328
329
let expected = [CallHierarchyOutgoingCall item (List [mkRange 1 2 1 3 ])]
329
330
Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc 1 0 ) >>=
@@ -427,7 +428,7 @@ incomingCallTestCase :: T.Text -> Int -> Int -> [(Int, Int)] -> [Range] -> Asser
427
428
incomingCallTestCase contents queryX queryY positions ranges = withCanonicalTempDir $ \ dir ->
428
429
runSessionWithServer plugin dir $ do
429
430
doc <- createDoc " A.hs" " haskell" contents
430
- waitForKickDone
431
+ waitForIndex (dir </> " A.hs " )
431
432
items <- concatMapM (\ ((x, y), range) ->
432
433
Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc x y)
433
434
<&> map (, range)
@@ -447,7 +448,7 @@ incomingCallMultiFileTestCase :: FilePath -> Int -> Int -> M.Map FilePath [((Int
447
448
incomingCallMultiFileTestCase filepath queryX queryY mp =
448
449
runSessionWithServer plugin testDataDir $ do
449
450
doc <- openDoc filepath " haskell"
450
- waitForKickDone
451
+ waitForIndex (testDataDir </> filepath)
451
452
items <- fmap concat $ sequence $ M. elems $ M. mapWithKey (\ fp pr -> do
452
453
p <- openDoc fp " haskell"
453
454
waitForKickDone
@@ -469,7 +470,7 @@ outgoingCallTestCase :: T.Text -> Int -> Int -> [(Int, Int)] -> [Range] -> Asser
469
470
outgoingCallTestCase contents queryX queryY positions ranges = withCanonicalTempDir $ \ dir ->
470
471
runSessionWithServer plugin dir $ do
471
472
doc <- createDoc " A.hs" " haskell" contents
472
- waitForKickDone
473
+ waitForIndex (dir </> " A.hs " )
473
474
items <- concatMapM (\ ((x, y), range) ->
474
475
Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc x y)
475
476
<&> map (, range)
@@ -488,7 +489,7 @@ outgoingCallMultiFileTestCase :: FilePath -> Int -> Int -> M.Map FilePath [((Int
488
489
outgoingCallMultiFileTestCase filepath queryX queryY mp =
489
490
runSessionWithServer plugin testDataDir $ do
490
491
doc <- openDoc filepath " haskell"
491
- waitForKickDone
492
+ waitForIndex (testDataDir </> filepath)
492
493
items <- fmap concat $ sequence $ M. elems $ M. mapWithKey (\ fp pr -> do
493
494
p <- openDoc fp " haskell"
494
495
waitForKickDone
@@ -509,7 +510,7 @@ oneCaseWithCreate :: T.Text -> Int -> Int -> (Uri -> CallHierarchyItem) -> Asser
509
510
oneCaseWithCreate contents queryX queryY expected = withCanonicalTempDir $ \ dir ->
510
511
runSessionWithServer plugin dir $ do
511
512
doc <- createDoc " A.hs" " haskell" contents
512
- waitForKickDone
513
+ waitForIndex (dir </> " A.hs " )
513
514
Test. prepareCallHierarchy (mkPrepareCallHierarchyParam doc queryX queryY) >>=
514
515
\ case
515
516
[item] -> liftIO $ item @?= expected (doc ^. L. uri)
@@ -545,3 +546,16 @@ mkIncomingCallsParam = CallHierarchyIncomingCallsParams Nothing Nothing
545
546
546
547
mkOutgoingCallsParam :: CallHierarchyItem -> CallHierarchyOutgoingCallsParams
547
548
mkOutgoingCallsParam = CallHierarchyOutgoingCallsParams Nothing Nothing
549
+
550
+ -- Wait for a special test message emitted by ghcide when a file is indexed,
551
+ -- so that call hierarchy can safely query the database.
552
+ waitForIndex :: FilePath -> Session ()
553
+ waitForIndex fp1 = skipManyTill anyMessage $ void $ referenceReady lenientEquals
554
+ where
555
+ -- fp1 may be relative, in that case we check that it is a suffix of the
556
+ -- filepath from the message
557
+ lenientEquals :: FilePath -> Bool
558
+ lenientEquals fp2
559
+ | isRelative fp1 = any (equalFilePath fp1) (map (foldr (</>) " " ) $ tails $ splitDirectories fp2)
560
+ | otherwise = equalFilePath fp1 fp2
561
+
0 commit comments