Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix fill hole lost expected backquote #1694

Closed
wants to merge 1 commit into from
Closed
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
14 changes: 10 additions & 4 deletions ghcide/src/Development/IDE/Plugin/CodeAction.hs
Original file line number Diff line number Diff line change
Expand Up @@ -678,15 +678,21 @@ suggestFillHole :: Diagnostic -> [(T.Text, TextEdit)]
suggestFillHole Diagnostic{_range=_range,..}
| Just holeName <- extractHoleName _message
, (holeFits, refFits) <- processHoleSuggestions (T.lines _message)
= map (proposeHoleFit holeName False) holeFits
++ map (proposeHoleFit holeName True) refFits
= let hasInfixBackquote = checkInfixBackquote holeName _message in
map (proposeHoleFit holeName False hasInfixBackquote) holeFits
++ map (proposeHoleFit holeName True hasInfixBackquote) refFits
| otherwise = []
where
extractHoleName = fmap head . flip matchRegexUnifySpaces "Found hole: ([^ ]*)"
proposeHoleFit holeName parenthise name =
checkInfixBackquote holeName message = message =~ T.concat [T.singleton '`', holeName, T.singleton '`'] :: Bool
proposeHoleFit holeName parenthise hasInfixBackquote name =
( "replace " <> holeName <> " with " <> name
, TextEdit _range $ if parenthise then parens name else name)
, TextEdit (if hasInfixBackquote then fixInfixBackquoteRange _range else _range)
(if parenthise then parens name else name)
)
parens x = "(" <> x <> ")"
fixInfixBackquoteRange (Range (Position x1 y1) (Position x2 y2)) =
Range (Position x1 (y1 + 1)) (Position x2 (y2 - 1))

processHoleSuggestions :: [T.Text] -> ([T.Text], [T.Text])
processHoleSuggestions mm = (holeSuggestions, refSuggestions)
Expand Down
16 changes: 16 additions & 0 deletions ghcide/test/exe/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2386,6 +2386,22 @@ fillTypedHoleTests = let
executeCodeAction chosen
modifiedCode <- documentContents doc
liftIO $ mkDoc "E.toException" @=? modifiedCode
, testSession "fill hole with infix backquote keeps" $ do
let mkDoc x = T.unlines
[ "module Testing where"
, "data A = A"
, "foo :: A -> A -> A"
, "foo A A = A"
, "test :: A -> A -> A"
, "test a1 a2 = a1 `" <> x <> "` a2"
]
doc <- createDoc "Test.hs" "haskell" $ mkDoc "_"
_ <- waitForDiagnostics
actions <- getCodeActions doc (Range (Position 5 16) (Position 5 19))
chosen <- liftIO $ pickActionWithTitle "replace _ with foo" actions
executeCodeAction chosen
modifiedCode <- documentContents doc
liftIO $ mkDoc "foo" @=? modifiedCode
]

addInstanceConstraintTests :: TestTree
Expand Down