diff --git a/plugins/hls-refine-imports-plugin/src/Ide/Plugin/RefineImports.hs b/plugins/hls-refine-imports-plugin/src/Ide/Plugin/RefineImports.hs index 375009af53..27659ff626 100644 --- a/plugins/hls-refine-imports-plugin/src/Ide/Plugin/RefineImports.hs +++ b/plugins/hls-refine-imports-plugin/src/Ide/Plugin/RefineImports.hs @@ -16,7 +16,7 @@ import Control.Monad.IO.Class (liftIO) import Data.Aeson.Types import qualified Data.HashMap.Strict as HashMap import Data.IORef (readIORef) -import Data.List (intercalate) +import Data.List (intercalate, isSuffixOf) import qualified Data.Map.Strict as Map import Data.Maybe (catMaybes, fromMaybe) import qualified Data.Set as S @@ -187,13 +187,20 @@ refineImportsRule = define $ \RefineImports nfp -> do -- for modules/symbols actually got used (imports, mbMinImports) <- liftIO $ extractMinimalImports hsc tmr + -- Internal module is the convention that no module should import + -- directly + let notContainInternalModule :: [AvailInfo] -> Bool + notContainInternalModule = not . any (\a -> + "Internal" `isSuffixOf` prettyPrint (availName a)) + let filterByImport :: LImportDecl GhcRn -> Map.Map ModuleName [AvailInfo] -> Maybe (Map.Map ModuleName [AvailInfo]) filterByImport (L _ ImportDecl{ideclHiding = Just (_, L _ names)}) avails = let importedNames = S.fromList $ map (ieName . unLoc) names - res = flip Map.filter avails $ \a -> + availsExcludingInternal = Map.filter notContainInternalModule avails + res = flip Map.filter availsExcludingInternal $ \a -> any (`S.member` importedNames) $ concatMap availNamesWithSelectors a allFilteredAvailsNames = S.fromList diff --git a/plugins/hls-refine-imports-plugin/test/Main.hs b/plugins/hls-refine-imports-plugin/test/Main.hs index 90c294cc24..96744c4b41 100644 --- a/plugins/hls-refine-imports-plugin/test/Main.hs +++ b/plugins/hls-refine-imports-plugin/test/Main.hs @@ -21,6 +21,7 @@ main = defaultTestRunner $ "Refine Imports" [ codeActionGoldenTest "WithOverride" 3 1 , codeLensGoldenTest "UsualCase" 1 + , codeLensGoldenTest "DontUseInternal" 1 ] refineImportsPlugin :: PluginDescriptor IdeState diff --git a/plugins/hls-refine-imports-plugin/test/testdata/DontUseInternal.expected.hs b/plugins/hls-refine-imports-plugin/test/testdata/DontUseInternal.expected.hs new file mode 100644 index 0000000000..48575eb952 --- /dev/null +++ b/plugins/hls-refine-imports-plugin/test/testdata/DontUseInternal.expected.hs @@ -0,0 +1,10 @@ +module Main where + +import H +import E ( e2 ) +import Data.List (intercalate) + +main :: IO () +main = putStrLn + $ "hello " + <> intercalate ", " [h, e2] diff --git a/plugins/hls-refine-imports-plugin/test/testdata/DontUseInternal.hs b/plugins/hls-refine-imports-plugin/test/testdata/DontUseInternal.hs new file mode 100644 index 0000000000..254f1a8fbb --- /dev/null +++ b/plugins/hls-refine-imports-plugin/test/testdata/DontUseInternal.hs @@ -0,0 +1,10 @@ +module Main where + +import H +import D +import Data.List (intercalate) + +main :: IO () +main = putStrLn + $ "hello " + <> intercalate ", " [h, e2] diff --git a/plugins/hls-refine-imports-plugin/test/testdata/H.hs b/plugins/hls-refine-imports-plugin/test/testdata/H.hs new file mode 100644 index 0000000000..4c73bf605a --- /dev/null +++ b/plugins/hls-refine-imports-plugin/test/testdata/H.hs @@ -0,0 +1,3 @@ +module H (module H.Internal) where + +import H.Internal diff --git a/plugins/hls-refine-imports-plugin/test/testdata/H/Internal.hs b/plugins/hls-refine-imports-plugin/test/testdata/H/Internal.hs new file mode 100644 index 0000000000..076e1b08d4 --- /dev/null +++ b/plugins/hls-refine-imports-plugin/test/testdata/H/Internal.hs @@ -0,0 +1,4 @@ +module H.Internal where + +h :: String +h = "h" \ No newline at end of file diff --git a/plugins/hls-refine-imports-plugin/test/testdata/hie.yaml b/plugins/hls-refine-imports-plugin/test/testdata/hie.yaml index 4770978cb2..c33b636931 100644 --- a/plugins/hls-refine-imports-plugin/test/testdata/hie.yaml +++ b/plugins/hls-refine-imports-plugin/test/testdata/hie.yaml @@ -3,10 +3,13 @@ cradle: arguments: - UsualCase.hs - WithOverride.hs + - DontUseInternal.hs - A.hs - B.hs - C.hs - D.hs - E.hs - F.hs - - G.hs \ No newline at end of file + - G.hs + - H.hs + - H/Internal.hs \ No newline at end of file