Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC

Commits:

2 changed files:

Changes:

  • utils/haddock/haddock-library/src/Documentation/Haddock/Parser.hs
    ... ... @@ -795,31 +795,33 @@ stripSpace = fromMaybe <*> mapM strip'
    795 795
     -- | Parses examples. Examples are a paragraph level entity (separated by an empty line).
    
    796 796
     -- Consecutive examples are accepted.
    
    797 797
     examples :: Parser (DocH mod a)
    
    798
    -examples = DocExamples <$> (many (try (skipHorizontalSpace *> "\n")) *> go)
    
    798
    +examples = DocExamples <$> (many (try (skipHorizontalSpace *> "\n")) *> go Nothing)
    
    799 799
       where
    
    800
    -    go :: Parser [Example]
    
    801
    -    go = do
    
    800
    +    go :: Maybe Text -> Parser [Example]
    
    801
    +    go mbInitialIndent = do
    
    802 802
           prefix <- takeHorizontalSpace <* ">>>"
    
    803
    +      initialIndent <- maybe takeHorizontalSpace pure mbInitialIndent
    
    803 804
           expr <- takeLine
    
    804
    -      (rs, es) <- resultAndMoreExamples
    
    805
    -      return (makeExample prefix expr rs : es)
    
    805
    +      (rs, es) <- resultAndMoreExamples (Just initialIndent)
    
    806
    +      return (makeExample prefix initialIndent expr rs : es)
    
    807
    +
    
    808
    +    resultAndMoreExamples :: Maybe Text -> Parser ([Text], [Example])
    
    809
    +    resultAndMoreExamples mbInitialIndent = choice' [moreExamples, result, pure ([], [])]
    
    806 810
           where
    
    807
    -        resultAndMoreExamples :: Parser ([Text], [Example])
    
    808
    -        resultAndMoreExamples = choice' [moreExamples, result, pure ([], [])]
    
    809
    -          where
    
    810
    -            moreExamples :: Parser ([Text], [Example])
    
    811
    -            moreExamples = (,) [] <$> go
    
    811
    +        moreExamples :: Parser ([Text], [Example])
    
    812
    +        moreExamples = (,) [] <$> go mbInitialIndent
    
    812 813
     
    
    813
    -            result :: Parser ([Text], [Example])
    
    814
    -            result = first . (:) <$> nonEmptyLine <*> resultAndMoreExamples
    
    814
    +        result :: Parser ([Text], [Example])
    
    815
    +        result = first . (:) <$> nonEmptyLine <*> resultAndMoreExamples Nothing
    
    815 816
     
    
    816
    -    makeExample :: Text -> Text -> [Text] -> Example
    
    817
    -    makeExample prefix expression res =
    
    818
    -      Example (T.unpack (T.strip expression)) result
    
    817
    +    makeExample :: Text -> Text -> Text -> [Text] -> Example
    
    818
    +    makeExample prefix indent expression res =
    
    819
    +      Example (T.unpack (tryStripIndent (T.stripEnd expression))) result
    
    819 820
           where
    
    820 821
             result = map (T.unpack . substituteBlankLine . tryStripPrefix) res
    
    821 822
     
    
    822 823
             tryStripPrefix xs = fromMaybe xs (T.stripPrefix prefix xs)
    
    824
    +        tryStripIndent = liftA2 fromMaybe T.stripStart (T.stripPrefix indent)
    
    823 825
     
    
    824 826
             substituteBlankLine "<BLANKLINE>" = ""
    
    825 827
             substituteBlankLine xs = xs
    

  • utils/haddock/haddock-library/test/Documentation/Haddock/ParserSpec.hs
    ... ... @@ -864,6 +864,29 @@ spec = do
    864 864
           it "accepts unicode in examples" $ do
    
    865 865
             ">>> 灼眼\nシャナ" `shouldParseTo` DocExamples [Example "灼眼" ["シャナ"]]
    
    866 866
     
    
    867
    +      it "preserves indentation in consecutive example lines" $ do
    
    868
    +        unlines
    
    869
    +          [ ">>> line 1"
    
    870
    +          , ">>>   line 2"
    
    871
    +          , ">>> line 3"
    
    872
    +          ]
    
    873
    +          `shouldParseTo` DocExamples
    
    874
    +            [ Example "line 1" []
    
    875
    +            , Example "  line 2" []
    
    876
    +            , Example "line 3" []
    
    877
    +            ]
    
    878
    +
    
    879
    +      it "resets indentation after results" $ do
    
    880
    +        unlines
    
    881
    +          [ ">>> line 1"
    
    882
    +          , "result"
    
    883
    +          , ">>>   line 2"
    
    884
    +          ]
    
    885
    +          `shouldParseTo` DocExamples
    
    886
    +            [ Example "line 1" ["result"]
    
    887
    +            , Example "line 2" []
    
    888
    +            ]
    
    889
    +
    
    867 890
           context "when prompt is prefixed by whitespace" $ do
    
    868 891
             it "strips the exact same amount of whitespace from result lines" $ do
    
    869 892
               unlines