Skip to content

Commit 5257dc7

Browse files
committed
Add QualifiedImportStyle
1 parent 3390f9f commit 5257dc7

File tree

2 files changed

+34
-23
lines changed

2 files changed

+34
-23
lines changed

plugins/hls-refactor-plugin/src/Development/IDE/Plugin/CodeAction.hs

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ extendImportHandler' ideState ExtendImport {..}
240240
extendImport (T.unpack <$> thingParent) (T.unpack newThing) (makeDeltaAst imp)
241241

242242
Nothing -> do
243-
let n = newImport importName sym importQual False (isPostQualifiedImport df)
243+
let qns = (,) <$> importQual <*> Just (qualifiedImportStyle df)
244+
n = newImport importName sym qns False
244245
sym = if isNothing importQual then Just it else Nothing
245246
it = case thingParent of
246247
Nothing -> newThing
@@ -250,11 +251,6 @@ extendImportHandler' ideState ExtendImport {..}
250251
| otherwise =
251252
mzero
252253

253-
isPostQualifiedImport :: DynFlags -> Bool
254-
isPostQualifiedImport df = hasImportQualifedPostEnabled && hasPrePositiveQualifiedWarning
255-
where hasImportQualifedPostEnabled = xopt ImportQualifiedPost df
256-
hasPrePositiveQualifiedWarning = wopt Opt_WarnPrepositiveQualifiedModule df
257-
258254
isWantedModule :: ModuleName -> Maybe ModuleName -> GenLocated l (ImportDecl GhcPs) -> Bool
259255
isWantedModule wantedModule Nothing (L _ it@ImportDecl{ideclName, ideclHiding = Just (False, _)}) =
260256
not (isQualifiedImport it) && unLoc ideclName == wantedModule
@@ -1435,16 +1431,17 @@ suggestNewImport df packageExportsMap ps fileContents Diagnostic{_message}
14351431
, Just (range, indent) <- newImportInsertRange ps fileContents
14361432
, extendImportSuggestions <- matchRegexUnifySpaces msg
14371433
"Perhaps you want to add ‘[^’]*’ to the import list in the import of ‘([^’]*)’"
1438-
= let suggestions = nubSortBy simpleCompareImportSuggestion
1439-
(constructNewImportSuggestions df packageExportsMap (qual <|> qual', thingMissing) extendImportSuggestions) in
1434+
= let qis = qualifiedImportStyle df
1435+
suggestions = nubSortBy simpleCompareImportSuggestion
1436+
(constructNewImportSuggestions packageExportsMap (qual <|> qual', thingMissing) extendImportSuggestions qis) in
14401437
map (\(ImportSuggestion _ kind (unNewImport -> imp)) -> (imp, kind, TextEdit range (imp <> "\n" <> T.replicate indent " "))) suggestions
14411438
where
14421439
L _ HsModule {..} = astA ps
14431440
suggestNewImport _ _ _ _ _ = []
14441441

14451442
constructNewImportSuggestions
1446-
:: DynFlags -> ExportsMap -> (Maybe T.Text, NotInScope) -> Maybe [T.Text] -> [ImportSuggestion]
1447-
constructNewImportSuggestions df exportsMap (qual, thingMissing) notTheseModules = nubOrdBy simpleCompareImportSuggestion
1443+
:: ExportsMap -> (Maybe T.Text, NotInScope) -> Maybe [T.Text] -> QualifiedImportStyle -> [ImportSuggestion]
1444+
constructNewImportSuggestions exportsMap (qual, thingMissing) notTheseModules qis = nubOrdBy simpleCompareImportSuggestion
14481445
[ suggestion
14491446
| Just name <- [T.stripPrefix (maybe "" (<> ".") qual) $ notInScope thingMissing] -- strip away qualified module names from the unknown name
14501447
, identInfo <- maybe [] Set.toList $ (lookupOccEnv (getExportsMap exportsMap) (mkVarOrDataOcc name)) <> (lookupOccEnv (getExportsMap exportsMap) (mkTypeOcc name)) -- look up the modified unknown name in the export map
@@ -1456,7 +1453,7 @@ constructNewImportSuggestions df exportsMap (qual, thingMissing) notTheseModules
14561453
renderNewImport :: IdentInfo -> [ImportSuggestion]
14571454
renderNewImport identInfo
14581455
| Just q <- qual
1459-
= [ImportSuggestion importanceScore (quickFixImportKind "new.qualified") (newQualImport m q $ isPostQualifiedImport df)]
1456+
= [ImportSuggestion importanceScore (quickFixImportKind "new.qualified") (newQualImport m q qis)]
14601457
| otherwise
14611458
= [ImportSuggestion importanceScore (quickFixImportKind' "new" importStyle) (newUnqualImport m (renderImportStyle importStyle) False)
14621459
| importStyle <- NE.toList $ importStyles identInfo] ++
@@ -1634,11 +1631,10 @@ checkPragma name = check
16341631
newImport
16351632
:: T.Text -- ^ module name
16361633
-> Maybe T.Text -- ^ the symbol
1637-
-> Maybe T.Text -- ^ qualified name
1634+
-> Maybe (T.Text, QualifiedImportStyle) -- ^ qualified name and style
16381635
-> Bool -- ^ the symbol is to be imported or hidden
1639-
-> Bool -- ^ the qualified name is to be imported in postfix position
16401636
-> NewImport
1641-
newImport modName mSymbol mQual hiding postfix = NewImport impStmt
1637+
newImport modName mSymbol mQualNameStyle hiding = NewImport impStmt
16421638
where
16431639
symImp
16441640
| Just symbol <- mSymbol
@@ -1647,22 +1643,24 @@ newImport modName mSymbol mQual hiding postfix = NewImport impStmt
16471643
| otherwise = ""
16481644
impStmt =
16491645
"import "
1650-
<> qualifiedModName
1646+
<> qualifiedModName (snd <$> mQualNameStyle)
16511647
<> (if hiding then " hiding" else "")
16521648
<> symImp
16531649
<> maybe "" (\qual -> if modName == qual then "" else " as " <> qual) mQual
1654-
qualifiedModName | isJust mQual && postfix = modName <> " qualified"
1655-
| isJust mQual = "qualified " <> modName
1656-
| otherwise = ""
1650+
mQual = fst <$> mQualNameStyle
1651+
qualifiedModName Nothing = modName
1652+
qualifiedModName (Just QualifiedImportPrefix) = "qualified " <> modName
1653+
qualifiedModName (Just QualifiedImportPostfix) = modName <> " qualified"
1654+
16571655

1658-
newQualImport :: T.Text -> T.Text -> Bool -> NewImport
1659-
newQualImport modName qual postfix = newImport modName Nothing (Just qual) False postfix
1656+
newQualImport :: T.Text -> T.Text -> QualifiedImportStyle -> NewImport
1657+
newQualImport modName qual qis = newImport modName Nothing (Just (qual, qis)) False
16601658

16611659
newUnqualImport :: T.Text -> T.Text -> Bool -> NewImport
1662-
newUnqualImport modName symbol hiding = newImport modName (Just symbol) Nothing hiding False
1660+
newUnqualImport modName symbol = newImport modName (Just symbol) Nothing
16631661

16641662
newImportAll :: T.Text -> NewImport
1665-
newImportAll modName = newImport modName Nothing Nothing False False
1663+
newImportAll modName = newImport modName Nothing Nothing False
16661664

16671665
hideImplicitPreludeSymbol :: T.Text -> NewImport
16681666
hideImplicitPreludeSymbol symbol = newUnqualImport "Prelude" symbol True

plugins/hls-refactor-plugin/src/Development/IDE/Plugin/Plugins/ImportUtils.hs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@ module Development.IDE.Plugin.Plugins.ImportUtils
44
quickFixImportKind,
55
renderImportStyle,
66
unImportStyle,
7-
importStyles
7+
importStyles,
8+
QualifiedImportStyle(..),
9+
qualifiedImportStyle
810
) where
911

1012
import Data.List.NonEmpty (NonEmpty ((:|)))
1113
import qualified Data.Text as T
14+
import Development.IDE.GHC.Compat
1215
import Development.IDE.Plugin.CodeAction.ExactPrint (wildCardSymbol)
1316
import Development.IDE.Types.Exports
1417
import Language.LSP.Types (CodeActionKind (..))
@@ -83,3 +86,13 @@ quickFixImportKind' x (ImportAllConstructors _) = CodeActionUnknown $ "quickfix.
8386

8487
quickFixImportKind :: T.Text -> CodeActionKind
8588
quickFixImportKind x = CodeActionUnknown $ "quickfix.import." <> x
89+
90+
-- | Possible import styles for qualified imports
91+
data QualifiedImportStyle = QualifiedImportPostfix | QualifiedImportPrefix
92+
deriving Show
93+
94+
qualifiedImportStyle :: DynFlags -> QualifiedImportStyle
95+
qualifiedImportStyle df | hasImportQualifedPostEnabled && hasPrePositiveQualifiedWarning = QualifiedImportPostfix
96+
| otherwise = QualifiedImportPrefix
97+
where hasImportQualifedPostEnabled = xopt ImportQualifiedPost df
98+
hasPrePositiveQualifiedWarning = wopt Opt_WarnPrepositiveQualifiedModule df

0 commit comments

Comments
 (0)