on master help sign in
Misc corrections
commit0233f6ddecc2521d5774d95765dbf7c618c60093 authormrkkrp <mark.karpov@tweag.io> dateSun 11 Aug 2019, 15:57 (7 years ago) parentb6c29bd
4 files changed+36−38
src/Ormolu/Parser/CommentStream.hs+6−6 src/Ormolu/Parser/Pragma.hs+17−20 src/Ormolu/Printer/Meat/Pragma.hs+4−6 tests/Ormolu/Parser/PragmaSpec.hs+9−6
src/Ormolu/Parser/CommentStream.hs+6−6
@@ -48,17 +48,17 @@ mkCommentStream
4848 :: [Located String] -- ^ Extra comments to include
4949 -> GHC.PState -- ^ Parser state to use for comment extraction
5050 -> (CommentStream, [Pragma])
51− -- ^ Comment stream and a set of extensions enabled
51+ -- ^ Comment stream and a set of extracted pragmas
5252mkCommentStream extraComments pstate =
5353 ( CommentStream $
5454 -- NOTE It's easier to normalize pragmas right when we construct comment
5555 -- streams. Because this way we need to do it only once and when we
5656 -- perform checking later they'll automatically match.
5757 mkComment <$> sortOn (realSrcSpanStart . getLoc) comments
58− , pragma
58+ , pragmas
5959 )
6060 where
61− (comments, pragma) = partitionEithers (partitionComments <$> rawComments)
61+ (comments, pragmas) = partitionEithers (partitionComments <$> rawComments)
6262 rawComments = mapMaybe toRealSpan $
6363 extraComments ++
6464 (fmap unAnnotationComment <$> GHC.comment_q pstate) ++
@@ -119,8 +119,8 @@ toRealSpan :: Located a -> Maybe (RealLocated a)
119119toRealSpan (L (RealSrcSpan l) a) = Just (L l a)
120120toRealSpan _ = Nothing
121121
122−-- | If a given comment is a pragma, return the set of extensions
123−-- it enables in 'Right'. Otherwise return the original comment unchanged.
122+-- | If a given comment is a pragma, return it in parsed form in 'Right'.
123+-- Otherwise return the original comment unchanged.
124124
125125partitionComments
126126 :: RealLocated String
@@ -128,4 +128,4 @@ partitionComments
128128partitionComments input =
129129 case parsePragma (unLoc input) of
130130 Nothing -> Left input
131− Just pr -> Right pr
131+ Just pragma -> Right pragma
src/Ormolu/Parser/Pragma.hs+17−20
@@ -1,4 +1,4 @@
1−-- | A module for parsing of language pragmas from comments.
1+-- | A module for parsing of pragmas from comments.
22
33{-# LANGUAGE LambdaCase #-}
44{-# LANGUAGE OverloadedStrings #-}
@@ -9,8 +9,9 @@ module Ormolu.Parser.Pragma
99 )
1010where
1111
12+import Control.Monad
1213import Data.Char (toLower, isSpace)
13−import Data.List (stripPrefix, dropWhileEnd)
14+import Data.List
1415import FastString (mkFastString, unpackFS)
1516import Module (newSimpleUnitId, ComponentId (..))
1617import SrcLoc
@@ -18,30 +19,31 @@ import StringBuffer
1819import qualified EnumSet as ES
1920import qualified Lexer as L
2021
22+-- | Ormolu's representation of pragmas.
23+
2124data Pragma
22− = PragmaLanguage [String]
23− | PragmaOptionsGHC String
24− | PragmaOptionsHaddock String
25+ = PragmaLanguage [String] -- ^ Language pragma
26+ | PragmaOptionsGHC String -- ^ GHC options pragma
27+ | PragmaOptionsHaddock String -- ^ Haddock options pragma
2528 deriving (Show, Eq)
2629
27−-- | Extract a Pragma from a comment if possible, or return 'Nothing'
30+-- | Extract a pragma from a comment if possible, or return 'Nothing'
2831-- otherwise.
2932
30−parsePragma :: String -> Maybe Pragma
33+parsePragma
34+ :: String -- ^ Comment to try to parse
35+ -> Maybe Pragma
3136parsePragma input = do
32− contents <- trimSpaces <$> stripEnclosing "{-#" "#-}" input
33− let (name, cs) = separateName contents
34− case map toLower name of
37+ inputNoPrefix <- stripPrefix "{-#" input
38+ guard ("#-}" `isSuffixOf` input)
39+ let contents = take (length inputNoPrefix - 3) inputNoPrefix
40+ (pragmaName, cs) = (break isSpace . dropWhile isSpace) contents
41+ case toLower <$> pragmaName of
3542 "language" -> PragmaLanguage <$> parseExtensions cs
3643 "options_ghc" -> Just $ PragmaOptionsGHC (trimSpaces cs)
3744 "options_haddock" -> Just $ PragmaOptionsHaddock (trimSpaces cs)
3845 _ -> Nothing
3946 where
40− -- stripEnclosing pre suf (pre ++ str ++ suf) == Just str
41− stripEnclosing :: String -> String -> String -> Maybe String
42− stripEnclosing pre suf str =
43− fmap reverse $ stripPrefix pre str >>= stripPrefix (reverse suf) . reverse
44−
4547 trimSpaces :: String -> String
4648 trimSpaces = dropWhileEnd isSpace . dropWhile isSpace
4749
@@ -56,11 +58,6 @@ parseExtensions str = tokenize str >>= go
5658 (L.ITconid ext : L.ITcomma : xs) -> (unpackFS ext :) <$> go xs
5759 _ -> Nothing
5860
59−-- | Split a pragma to name and contents
60−
61−separateName :: String -> (String, String)
62−separateName = span (not . isSpace) . dropWhile isSpace
63−
6461-- | Tokenize a given input using GHC's lexer.
6562
6663tokenize :: String -> Maybe [L.Token]
src/Ormolu/Printer/Meat/Pragma.hs+4−6
@@ -19,13 +19,11 @@ data PragmaTy = Language | OptionsGHC | OptionsHaddock
1919
2020p_pragmas :: [Pragma] -> R ()
2121p_pragmas ps =
22− let ps' = concatMap (\case
23− PragmaLanguage xs -> map (Language,) xs
22+ let prepare = concatMap $ \case
23+ PragmaLanguage xs -> (Language,) <$> xs
2424 PragmaOptionsGHC x -> [(OptionsGHC, x)]
2525 PragmaOptionsHaddock x -> [(OptionsHaddock, x)]
26− ) ps
27− sorted = S.toAscList . S.fromList $ ps'
28− in mapM_ (uncurry p_pragma) sorted
26+ in mapM_ (uncurry p_pragma) (S.toAscList . S.fromList . prepare $ ps)
2927
3028p_pragma :: PragmaTy -> String -> R ()
3129p_pragma ty c = line $ do
@@ -34,6 +32,6 @@ p_pragma ty c = line $ do
3432 Language -> "LANGUAGE"
3533 OptionsGHC -> "OPTIONS_GHC"
3634 OptionsHaddock -> "OPTIONS_HADDOCK"
37− txt " "
35+ space
3836 txt (T.pack c)
3937 txt " #-}"
tests/Ormolu/Parser/PragmaSpec.hs+9−6
@@ -6,16 +6,19 @@ import Test.Hspec
66spec :: Spec
77spec = do
88 describe "parsePragma" $ do
9− stdTest "{-# LANGUAGE Foo #-}" (Just $ PragmaLanguage ["Foo"])
10− stdTest "{-# language Foo #-}" (Just $ PragmaLanguage ["Foo"])
11− stdTest "{-# lAngUAGe Foo#-}" (Just $ PragmaLanguage ["Foo"])
12− stdTest "{-# LANGUAGE Foo, Bar #-}" (Just $ PragmaLanguage ["Foo", "Bar"])
13− stdTest "{-# OPTIONS_GHC foo bar baz #-}" (Just $ PragmaOptionsGHC "foo bar baz")
14− stdTest "{-#OPTIONS_HADDOCK foo, bar, baz #-}" (Just $ PragmaOptionsHaddock "foo, bar, baz")
9+ stdTest "{-# LANGUAGE Foo #-}" (Just (PragmaLanguage ["Foo"]))
10+ stdTest "{-# language Foo #-}" (Just (PragmaLanguage ["Foo"]))
11+ stdTest "{-#LANGUAGE Foo#-}" (Just (PragmaLanguage ["Foo"]))
12+ stdTest "{-# LANGUAGE Foo#-}" (Just (PragmaLanguage ["Foo"]))
13+ stdTest "{-#language Foo#-}" (Just (PragmaLanguage ["Foo"]))
14+ stdTest "{-# lAngUAGe Foo #-}" (Just (PragmaLanguage ["Foo"]))
15+ stdTest "{-# LANGUAGE Foo, Bar #-}" (Just (PragmaLanguage ["Foo", "Bar"]))
1516 stdTest "{-# LANGUAGE Foo Bar #-}" Nothing
1617 stdTest "{-# BOO Foo #-}" Nothing
1718 stdTest "something" Nothing
1819 stdTest "{-# LANGUAGE foo, Bar #-}" Nothing
20+ stdTest "{-# OPTIONS_GHC foo bar baz #-}" (Just $ PragmaOptionsGHC "foo bar baz")
21+ stdTest "{-#OPTIONS_HADDOCK foo, bar, baz #-}" (Just $ PragmaOptionsHaddock "foo, bar, baz")
1922
2023stdTest :: String -> Maybe Pragma -> Spec
2124stdTest input result = it input $