aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>2014-11-04 21:04:07 +0000
committerMateusz Kowalczyk <fuuzetsu@fuuzetsu.co.uk>2014-11-04 21:04:07 +0000
commit0891c568f645edcac35442576757ab6fcaa7b6ec (patch)
treed3c961f0fd0901f62b8f6c7c1c4a941527179968
parentfc462513143aa0ec3fbed879a3483e376173d9fc (diff)
Fix parsing of identifiers written in infix way
-rw-r--r--CHANGES2
-rw-r--r--doc/haddock.xml4
-rw-r--r--haddock-library/src/Documentation/Haddock/Parser.hs23
-rw-r--r--haddock-library/test/Documentation/Haddock/ParserSpec.hs6
4 files changed, 23 insertions, 12 deletions
diff --git a/CHANGES b/CHANGES
index 3a08424c..79a7e657 100644
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,8 @@ Changes in version 2.15.1
* Fix re-exports of built-in type families (#310)
+ * Fix parsing of infix identifiers such as ``elem``.
+
Changes in version 2.15.0
* Always read in prologue files as UTF8 (#286 and Cabal #1721)
diff --git a/doc/haddock.xml b/doc/haddock.xml
index 618e19f2..3b58f824 100644
--- a/doc/haddock.xml
+++ b/doc/haddock.xml
@@ -1897,7 +1897,9 @@ module A where
<para>Nothing special is needed to hyperlink identifiers which
contain apostrophes themselves: to hyperlink
<literal>foo'</literal> one would simply type
- <literal>'foo''</literal>.</para>
+ <literal>'foo''</literal>. To hyperlink identifiers written in
+ infix form, simply put them in quotes as always:
+ <literal>'`elem`'</literal>.</para>
<para>For compatibility with other systems, the following
alternative form of markup is accepted<footnote><para>
diff --git a/haddock-library/src/Documentation/Haddock/Parser.hs b/haddock-library/src/Documentation/Haddock/Parser.hs
index 99010897..bea1803a 100644
--- a/haddock-library/src/Documentation/Haddock/Parser.hs
+++ b/haddock-library/src/Documentation/Haddock/Parser.hs
@@ -507,25 +507,26 @@ autoUrl = mkLink <$> url
-- deems to be valid in an identifier. Note that it simply blindly consumes
-- characters and does no actual validation itself.
parseValid :: Parser String
-parseValid = do
- vs' <- many' $ utf8String "⋆" <|> return <$> idChar
- let vs = concat vs'
- c <- peekChar
- case c of
- Just '`' -> return vs
- Just '\'' -> (\x -> vs ++ "'" ++ x) <$> ("'" *> parseValid)
- <|> return vs
- _ -> fail "outofvalid"
+parseValid = p some
where
idChar = satisfy (`elem` "_.!#$%&*+/<=>?@\\|-~:^")
<|> digit <|> letter_ascii
+ p p' = do
+ vs' <- p' $ utf8String "⋆" <|> return <$> idChar
+ let vs = concat vs'
+ c <- peekChar
+ case c of
+ Just '`' -> return vs
+ Just '\'' -> (\x -> vs ++ "'" ++ x) <$> ("'" *> p many')
+ <|> return vs
+ _ -> fail "outofvalid"
-- | Parses UTF8 strings from ByteString streams.
utf8String :: String -> Parser String
utf8String x = decodeUtf8 <$> string (encodeUtf8 x)
--- | Parses identifiers with help of 'parseValid'. Asks GHC for 'String' from the
--- string it deems valid.
+-- | Parses identifiers with help of 'parseValid'. Asks GHC for
+-- 'String' from the string it deems valid.
identifier :: Parser (DocH mod Identifier)
identifier = do
o <- idDelim
diff --git a/haddock-library/test/Documentation/Haddock/ParserSpec.hs b/haddock-library/test/Documentation/Haddock/ParserSpec.hs
index a228a956..5550e836 100644
--- a/haddock-library/test/Documentation/Haddock/ParserSpec.hs
+++ b/haddock-library/test/Documentation/Haddock/ParserSpec.hs
@@ -85,6 +85,12 @@ spec = do
" don't use apostrophe's in the wrong place's" `shouldParseTo`
"don't use apostrophe's in the wrong place's"
+ it "doesn't parse empty identifiers" $ do
+ "``" `shouldParseTo` "``"
+
+ it "can parse infix identifiers" $ do
+ "``infix``" `shouldParseTo` "`" <> DocIdentifier "infix" <> "`"
+
context "when parsing URLs" $ do
it "parses a URL" $ do
"<http://example.com/>" `shouldParseTo` hyperlink "http://example.com/" Nothing