Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
241 changes: 180 additions & 61 deletions plugins/hls-rename-plugin/src/Ide/Plugin/Rename.hs

Large diffs are not rendered by default.

68 changes: 67 additions & 1 deletion plugins/hls-rename-plugin/test/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,78 @@ tests = testGroup "Rename"

-- Make sure renaming succeeds
rename doc (Position 3 0) "foo'"
, goldenWithCrossModuleRename True "Cross Module (Declaration)" "CrossMaster" "CrossFunctionClient" (Position 2 2) "fooRenamed"
, goldenWithCrossModuleRename True "Cross Module (Referenced)" "CrossFunctionClient" "CrossMaster" (Position 4 11) "crossfooRenamed"
, goldenWithCrossModuleRename True "Cross Module Qualified (Declaration)" "CrossMaster" "CrossQualifiedClient" (Position 2 2) "newFoo"
, goldenWithCrossModuleRename True "Cross Module Qualified (Referenced)" "CrossQualifiedClient" "CrossMaster" (Position 4 22) "crossfooRenamed"
, goldenWithCrossModuleSession True "Cross Error : No export list" "CrossMasterTwo" "CrossFunctionClientTwo" $ \masterDoc _clientDoc -> do
let expectedError = TResponseError
(InR ErrorCodes_InvalidParams)
"rename: Invalid Params: Cannot rename symbol: module has no explicit export list and the symbol is referenced from other modules."
Nothing

renameExpectError expectedError masterDoc (Position 2 0) "ImpossibleRename"
, goldenWithCrossModuleSession False "Cross Error : Cross Moduel disabled" "CrossMaster" "CrossFunctionError" $ \masterDoc _clientDoc -> do
let expectedError = TResponseError
(InR ErrorCodes_InternalError)
"rename: Internal Error: Cross-module rename is disabled."
Nothing

renameExpectError expectedError masterDoc (Position 2 0) "ImpossibleRename"
]

goldenWithRename :: TestName-> FilePath -> (TextDocumentIdentifier -> Session ()) -> TestTree
goldenWithRename title path act =
goldenWithHaskellDoc (def { plugins = M.fromList [("rename", def { plcConfig = "crossModule" .= True })] })
renamePlugin title testDataDir path "expected" "hs" act
renamePlugin title testDataDir path "expected" "hs"
$ \_ -> do
doc <- openDoc (path <.> "hs") "haskell"
_ <- getDocumentSymbols doc
_ <- waitForBuildQueue
act doc

goldenWithCrossModuleRename :: Bool -> TestName -> FilePath -> FilePath -> Position -> String -> TestTree
goldenWithCrossModuleRename crossModuleEnabled title primaryFile secondaryFile pos newName =
goldenWithHaskellDoc
(def { plugins = M.fromList [("rename", def { plcConfig = "crossModule" .= crossModuleEnabled })] })
renamePlugin
title
testDataDir
secondaryFile
"expected"
"hs"
$ \_ -> do

primaryDoc <- openDoc (primaryFile <.> "hs") "haskell"
secondaryDoc <- openDoc (secondaryFile <.> "hs") "haskell"

_ <- getDocumentSymbols primaryDoc
_ <- getDocumentSymbols secondaryDoc
_ <- waitForBuildQueue


rename primaryDoc pos newName

goldenWithCrossModuleSession :: Bool -> TestName -> FilePath -> FilePath -> (TextDocumentIdentifier -> TextDocumentIdentifier -> Session ()) -> TestTree
goldenWithCrossModuleSession crossModuleEnabled title primaryFile secondaryFile action =
goldenWithHaskellDoc
(def { plugins = M.fromList [("rename", def { plcConfig = "crossModule" .= crossModuleEnabled })] })
renamePlugin
title
testDataDir
secondaryFile
"expected"
"hs"
$ \_ -> do

primaryDoc <- openDoc (primaryFile <.> "hs") "haskell"
secondaryDoc <- openDoc (secondaryFile <.> "hs") "haskell"

_ <- getDocumentSymbols primaryDoc
_ <- getDocumentSymbols secondaryDoc
_ <- waitForBuildQueue

action primaryDoc secondaryDoc

renameExpectError :: TResponseError Method_TextDocumentRename -> TextDocumentIdentifier -> Position -> Text -> Session ()
renameExpectError expectedError doc pos newName = do
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CrossFunctionClient where

import CrossMaster

bar = fooRenamed
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CrossFunctionClient where

import CrossMaster

bar = crossfoo
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CrossFunctionClientTwo where

import CrossMasterTwo

bar = crossfooTwo
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CrossFunctionClientTwo where

import CrossMasterTwo

bar = crossfooTwo
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CrossFunctionError where

import CrossMaster

bar = crossfoo
5 changes: 5 additions & 0 deletions plugins/hls-rename-plugin/test/testdata/CrossFunctionError.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module CrossFunctionError where

import CrossMaster

bar = crossfoo
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module CrossMaster (crossfooRenamed) where

crossfooRenamed :: Int
crossfooRenamed = 42
4 changes: 4 additions & 0 deletions plugins/hls-rename-plugin/test/testdata/CrossMaster.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module CrossMaster (crossfoo) where

crossfoo :: Int
crossfoo = 42
4 changes: 4 additions & 0 deletions plugins/hls-rename-plugin/test/testdata/CrossMasterTwo.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module CrossMasterTwo where

crossfooTwo :: Int
crossfooTwo = 42
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module CrossQualified where

import qualified CrossMaster

bar = let crossfoo = CrossMaster.newFoo in
crossfoo * crossfoo

crossfoo :: Int
crossfoo = 7
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module CrossQualified where

import qualified CrossMaster

bar = let crossfoo = CrossMaster.crossfoo in
crossfoo * crossfoo

crossfoo :: Int
crossfoo = 7
6 changes: 6 additions & 0 deletions plugins/hls-rename-plugin/test/testdata/hie.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
cradle:
direct:
arguments:
- "CrossFunctionClient"
- "CrossFunctionClientTwo"
- "CrossFunctionError"
- "CrossMaster"
- "CrossMasterTwo"
- "CrossQualified"
- "DataConstructor"
- "ExportedFunction"
- "FieldPuns"
Expand Down
Loading