Skip to content

Commit

Permalink
Improve parsing of import suggestions extending multiple multiline im…
Browse files Browse the repository at this point in the history
…ports (fixes #4175) (#4177)
  • Loading branch information
jhrcek authored Apr 15, 2024
1 parent 97aac54 commit 64e0acf
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1973,15 +1973,18 @@ regexSingleMatch msg regex = case matchRegexUnifySpaces msg regex of
_ -> Nothing

-- | Process a list of (module_name, filename:src_span) values
-- | Eg. [(Data.Map, app/ModuleB.hs:2:1-18), (Data.HashMap.Strict, app/ModuleB.hs:3:1-29)]
--
-- Eg. [(Data.Map, app/ModuleB.hs:2:1-18), (Data.HashMap.Strict, app/ModuleB.hs:3:1-29)]
regExImports :: T.Text -> Maybe [(T.Text, T.Text)]
regExImports msg
| Just mods' <- allMatchRegex msg "‘([^’]*)’"
, Just srcspans' <- allMatchRegex msg
-- This regex has to be able to deal both with single-line srcpans like "(/path/to/File.hs:2:1-18)"
-- as well as multi-line srcspans like "(/path/to/File.hs:(3,1)-(5,2))"
#if MIN_VERSION_ghc(9,7,0)
"\\(at ([^)]*)\\)"
"\\(at ([^:]+:[^ ]+)\\)"
#else
"\\(([^)]*)\\)"
"\\(([^:]+:[^ ]+)\\)"
#endif
, mods <- [mod | [_,mod] <- mods']
, srcspans <- [srcspan | [_,srcspan] <- srcspans']
Expand Down
24 changes: 24 additions & 0 deletions plugins/hls-refactor-plugin/test/Main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -1501,6 +1501,30 @@ extendImportTests = testGroup "extend import actions"
, "f :: Foo"
, "f = undefined"
])
, testSession "data constructor with two multiline import lists that can be extended with it" $ template
[]
("A.hs", T.unlines
[ "module A where"
, "import Prelude ("
, " )"
, "import Data.Maybe ("
, " )"
, "f = Nothing"
])
(Range (Position 5 5) (Position 5 6))
[ "Add Maybe(..) to the import list of Data.Maybe"
, "Add Maybe(..) to the import list of Prelude"
, "Add Maybe(Nothing) to the import list of Data.Maybe"
, "Add Maybe(Nothing) to the import list of Prelude"
]
(T.unlines
["module A where"
, "import Prelude ("
, " )"
, "import Data.Maybe (Maybe (..)"
, " )"
, "f = Nothing"
])
]
where
codeActionTitle CodeAction{_title=x} = x
Expand Down

0 comments on commit 64e0acf

Please sign in to comment.