on master help sign in
Respect the ‘ImportQualifiedPost’ language extension
100fa44Utku Demir
data/examples/import/qualified-post-out.hsnew file+5
@@ -0,0 +1,5 @@
1+{-# LANGUAGE ImportQualifiedPost #-}
2+
3+import Data.Text qualified as T
4+import Data.Text qualified (a, b, c)
5+import Data.Text qualified hiding (a, b, c)
data/examples/import/qualified-post.hsnew file+5
@@ -0,0 +1,5 @@
1+{-# LANGUAGE ImportQualifiedPost #-}
2+
3+import qualified Data.Text as T
4+import qualified Data.Text (a, c, b)
5+import Data.Text qualified hiding (c, b, a)
src/Ormolu/Diff.hs+8
@@ -71,6 +71,7 @@ matchIgnoringSrcSpans = genericQuery
71 `extQ` hsModuleEq
71 `extQ` hsModuleEq
72 `extQ` sourceTextEq
72 `extQ` sourceTextEq
73 `extQ` hsDocStringEq
73 `extQ` hsDocStringEq
74+ `extQ` importDeclQualifiedStyleEq
74 `ext2Q` forLocated
75 `ext2Q` forLocated
75 )
76 )
76 x
77 x
@@ -88,6 +89,13 @@ matchIgnoringSrcSpans = genericQuery
88 hs1 {hsmodImports = sortImports (hsmodImports hs1)}
89 hs1 {hsmodImports = sortImports (hsmodImports hs1)}
89 sourceTextEq :: SourceText -> GenericQ Diff
90 sourceTextEq :: SourceText -> GenericQ Diff
90 sourceTextEq _ _ = Same
91 sourceTextEq _ _ = Same
92+ importDeclQualifiedStyleEq :: ImportDeclQualifiedStyle -> GenericQ Diff
93+ importDeclQualifiedStyleEq d0 d1' =
94+ case (d0, cast d1' :: Maybe ImportDeclQualifiedStyle) of
95+ (x, Just x') | x == x' -> Same
96+ (QualifiedPre, Just QualifiedPost) -> Same
97+ (QualifiedPost, Just QualifiedPre) -> Same
98+ _ -> Different []
91 hsDocStringEq :: HsDocString -> GenericQ Diff
99 hsDocStringEq :: HsDocString -> GenericQ Diff
92 hsDocStringEq str0 str1' =
100 hsDocStringEq str0 str1' =
93 case cast str1' :: Maybe HsDocString of
101 case cast str1' :: Maybe HsDocString of
src/Ormolu/Parser.hs+6−2
@@ -101,7 +101,9 @@ parseModule Config {..} path input' = liftIO $ do
101 prCommentStream = comments,
101 prCommentStream = comments,
102 prExtensions = exts,
102 prExtensions = exts,
103 prShebangs = shebangs,
103 prShebangs = shebangs,
104− prUseRecordDot = useRecordDot
104+ prUseRecordDot = useRecordDot,
105+ prImportQualifiedPost =
106+ GHC.xopt ImportQualifiedPost dynFlags
105 }
107 }
106 return (warnings, r)
108 return (warnings, r)
107
109
@@ -124,9 +126,11 @@ manualExts =
124 MonadComprehensions,
126 MonadComprehensions,
125 UnboxedSums,
127 UnboxedSums,
126 UnicodeSyntax, -- gives special meanings to operators like (→)
128 UnicodeSyntax, -- gives special meanings to operators like (→)
127− TemplateHaskellQuotes -- enables TH subset of quasi-quotes, this
129+ TemplateHaskellQuotes, -- enables TH subset of quasi-quotes, this
128 -- apparently interferes with QuasiQuotes in
130 -- apparently interferes with QuasiQuotes in
129 -- weird ways
131 -- weird ways
132+ ImportQualifiedPost -- affects how Ormolu renders imports, so the
133+ -- decision of enabling this style is left to the user
130 ]
134 ]
131
135
132----------------------------------------------------------------------------
136----------------------------------------------------------------------------
src/Ormolu/Parser/Result.hs+3−1
@@ -26,7 +26,9 @@ data ParseResult
26 -- | Shebangs found in the input
26 -- | Shebangs found in the input
27 prShebangs :: [Located String],
27 prShebangs :: [Located String],
28 -- | Whether or not record dot syntax is enabled
28 -- | Whether or not record dot syntax is enabled
29− prUseRecordDot :: Bool
29+ prUseRecordDot :: Bool,
30+ -- | Whether or not ImportQualifiedPost is enabled
31+ prImportQualifiedPost :: Bool
30 }
32 }
31
33
32-- | Pretty-print a 'ParseResult'.
34-- | Pretty-print a 'ParseResult'.
src/Ormolu/Printer.hs+6−1
@@ -20,7 +20,12 @@ printModule ::
20 Text
20 Text
21printModule ParseResult {..} =
21printModule ParseResult {..} =
22 runR
22 runR
23+ ( p_hsModule
24+ prShebangs
25+ prExtensions
26+ prImportQualifiedPost
23− (p_hsModule prShebangs prExtensions prParsedSource)
27+ prParsedSource
28+ )
24 (mkSpanStream prParsedSource)
29 (mkSpanStream prParsedSource)
25 prCommentStream
30 prCommentStream
26 prAnns
31 prAnns
src/Ormolu/Printer/Meat/ImportExport.hs+7−4
@@ -25,8 +25,8 @@ p_hsmodExports xs =
25 layout <- getLayout
25 layout <- getLayout
26 sep breakpoint (sitcc . located' (uncurry (p_lie layout))) (attachPositions xs)
26 sep breakpoint (sitcc . located' (uncurry (p_lie layout))) (attachPositions xs)
27
27
28−p_hsmodImport :: ImportDecl GhcPs -> R ()
28+p_hsmodImport :: Bool -> ImportDecl GhcPs -> R ()
29−p_hsmodImport ImportDecl {..} = do
29+p_hsmodImport useQualifiedPost ImportDecl {..} = do
30 txt "import"
30 txt "import"
31 space
31 space
32 when ideclSource (txt "{-# SOURCE #-}")
32 when ideclSource (txt "{-# SOURCE #-}")
@@ -34,7 +34,7 @@ p_hsmodImport ImportDecl {..} = do
34 when ideclSafe (txt "safe")
34 when ideclSafe (txt "safe")
35 space
35 space
36 when
36 when
37− (isImportDeclQualified ideclQualified)
37+ (isImportDeclQualified ideclQualified && not useQualifiedPost)
38 (txt "qualified")
38 (txt "qualified")
39 space
39 space
40 case ideclPkgQual of
40 case ideclPkgQual of
@@ -43,6 +43,9 @@ p_hsmodImport ImportDecl {..} = do
43 space
43 space
44 inci $ do
44 inci $ do
45 located ideclName atom
45 located ideclName atom
46+ when
47+ (isImportDeclQualified ideclQualified && useQualifiedPost)
48+ (space >> txt "qualified")
46 case ideclAs of
49 case ideclAs of
47 Nothing -> return ()
50 Nothing -> return ()
48 Just l -> do
51 Just l -> do
@@ -63,7 +66,7 @@ p_hsmodImport ImportDecl {..} = do
63 layout <- getLayout
66 layout <- getLayout
64 sep breakpoint (sitcc . located' (uncurry (p_lie layout))) (attachPositions xs)
67 sep breakpoint (sitcc . located' (uncurry (p_lie layout))) (attachPositions xs)
65 newline
68 newline
66−p_hsmodImport (XImportDecl x) = noExtCon x
69+p_hsmodImport _ (XImportDecl x) = noExtCon x
67
70
68p_lie :: Layout -> (Int, Int) -> IE GhcPs -> R ()
71p_lie :: Layout -> (Int, Int) -> IE GhcPs -> R ()
69p_lie encLayout (i, totalItems) = \case
72p_lie encLayout (i, totalItems) = \case
src/Ormolu/Printer/Meat/Module.hs+5−2
@@ -1,3 +1,4 @@
1+{-# LANGUAGE LambdaCase #-}
1{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE RecordWildCards #-}
3{-# LANGUAGE RecordWildCards #-}
3
4
@@ -26,10 +27,12 @@ p_hsModule ::
26 [Located String] ->
27 [Located String] ->
27 -- | Pragmas
28 -- | Pragmas
28 [Pragma] ->
29 [Pragma] ->
30+ -- | Whether to use postfix qualified imports
31+ Bool ->
29 -- | AST to print
32 -- | AST to print
30 ParsedSource ->
33 ParsedSource ->
31 R ()
34 R ()
32−p_hsModule shebangs pragmas (L moduleSpan HsModule {..}) = do
35+p_hsModule shebangs pragmas qualifiedPost (L moduleSpan HsModule {..}) = do
33 -- If span of exports in multiline, the whole thing is multiline. This is
36 -- If span of exports in multiline, the whole thing is multiline. This is
34 -- especially important because span of module itself always seems to have
37 -- especially important because span of module itself always seems to have
35 -- length zero, so it's not reliable for layout selection.
38 -- length zero, so it's not reliable for layout selection.
@@ -63,7 +66,7 @@ p_hsModule shebangs pragmas (L moduleSpan HsModule {..}) = do
63 txt "where"
66 txt "where"
64 newline
67 newline
65 newline
68 newline
66− forM_ (sortImports hsmodImports) (located' p_hsmodImport)
69+ forM_ (sortImports hsmodImports) (located' (p_hsmodImport qualifiedPost))
67 newline
70 newline
68 switchLayout (getLoc <$> hsmodDecls) $ do
71 switchLayout (getLoc <$> hsmodDecls) $ do
69 p_hsDecls Free hsmodDecls
72 p_hsDecls Free hsmodDecls