From ce9db5d40d658f0bb289a5f792215c044455ae2e Mon Sep 17 00:00:00 2001 From: Vitaly Bragilevsky Date: Sun, 6 May 2018 16:00:45 +0300 Subject: [PATCH 1/2] Fix #371, parse multiline LANGUAGE pragmas correctly Previously pragma lines started with non-whitespace characters at the first column produced ParseError. --- src/Language/Haskell/Exts/InternalParser.ly | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Language/Haskell/Exts/InternalParser.ly b/src/Language/Haskell/Exts/InternalParser.ly index 8a8ea96b..4c9ced63 100644 --- a/src/Language/Haskell/Exts/InternalParser.ly +++ b/src/Language/Haskell/Exts/InternalParser.ly @@ -362,8 +362,8 @@ TODO: Yuck, this is messy, needs fixing in the AST! > conids :: { ([Name L],[S]) } -> : conids ',' conid { (fst $1 ++ [$3], snd $1 ++ [$2]) } -> | optsemis conid { ([$2],[]) } +> : conids optsemis ',' optsemis conid { (fst $1 ++ [$5], snd $1 ++ [$3]) } +> | optsemis conid { ([$2],[]) } ----------------------------------------------------------------------------- Module Header From 809616ee8d74cf6f3f8ff518f636cd30ab15eec4 Mon Sep 17 00:00:00 2001 From: Vitaly Bragilevsky Date: Sun, 6 May 2018 16:06:58 +0300 Subject: [PATCH 2/2] Add test to #371 fix --- tests/examples/MultilineLanguagePragma.hs | 8 ++ ...ilineLanguagePragma.hs.exactprinter.golden | 1 + .../MultilineLanguagePragma.hs.parser.golden | 107 ++++++++++++++++++ ...ilineLanguagePragma.hs.prettyparser.golden | 1 + ...lineLanguagePragma.hs.prettyprinter.golden | 3 + 5 files changed, 120 insertions(+) create mode 100644 tests/examples/MultilineLanguagePragma.hs create mode 100644 tests/examples/MultilineLanguagePragma.hs.exactprinter.golden create mode 100644 tests/examples/MultilineLanguagePragma.hs.parser.golden create mode 100644 tests/examples/MultilineLanguagePragma.hs.prettyparser.golden create mode 100644 tests/examples/MultilineLanguagePragma.hs.prettyprinter.golden diff --git a/tests/examples/MultilineLanguagePragma.hs b/tests/examples/MultilineLanguagePragma.hs new file mode 100644 index 00000000..b88e4f4e --- /dev/null +++ b/tests/examples/MultilineLanguagePragma.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE +BangPatterns, +MagicHash +,OverloadedStrings +, LambdaCase + #-} + +main = undefined diff --git a/tests/examples/MultilineLanguagePragma.hs.exactprinter.golden b/tests/examples/MultilineLanguagePragma.hs.exactprinter.golden new file mode 100644 index 00000000..1796dc27 --- /dev/null +++ b/tests/examples/MultilineLanguagePragma.hs.exactprinter.golden @@ -0,0 +1 @@ +Match diff --git a/tests/examples/MultilineLanguagePragma.hs.parser.golden b/tests/examples/MultilineLanguagePragma.hs.parser.golden new file mode 100644 index 00000000..7c8e8ae7 --- /dev/null +++ b/tests/examples/MultilineLanguagePragma.hs.parser.golden @@ -0,0 +1,107 @@ +ParseOk + ( Module + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 1 1 9 1 + , srcInfoPoints = + [ SrcSpan "tests/examples/MultilineLanguagePragma.hs" 1 1 1 1 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 1 8 1 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 1 8 1 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 1 8 1 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 9 1 9 1 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 9 1 9 1 + ] + } + Nothing + [ LanguagePragma + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 1 1 6 6 + , srcInfoPoints = + [ SrcSpan "tests/examples/MultilineLanguagePragma.hs" 1 1 1 13 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 2 13 2 14 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 4 1 4 2 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 5 1 5 2 + , SrcSpan "tests/examples/MultilineLanguagePragma.hs" 6 3 6 6 + ] + } + [ Ident + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 2 1 2 13 + , srcInfoPoints = [] + } + "BangPatterns" + , Ident + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 3 1 3 10 + , srcInfoPoints = [] + } + "MagicHash" + , Ident + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 4 2 4 19 + , srcInfoPoints = [] + } + "OverloadedStrings" + , Ident + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 5 4 5 14 + , srcInfoPoints = [] + } + "LambdaCase" + ] + ] + [] + [ PatBind + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 1 8 17 + , srcInfoPoints = [] + } + (PVar + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 1 8 5 + , srcInfoPoints = [] + } + (Ident + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 1 8 5 + , srcInfoPoints = [] + } + "main")) + (UnGuardedRhs + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 6 8 17 + , srcInfoPoints = + [ SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 6 8 7 ] + } + (Var + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 8 8 17 + , srcInfoPoints = [] + } + (UnQual + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 8 8 17 + , srcInfoPoints = [] + } + (Ident + SrcSpanInfo + { srcInfoSpan = + SrcSpan "tests/examples/MultilineLanguagePragma.hs" 8 8 8 17 + , srcInfoPoints = [] + } + "undefined")))) + Nothing + ] + , [] + ) diff --git a/tests/examples/MultilineLanguagePragma.hs.prettyparser.golden b/tests/examples/MultilineLanguagePragma.hs.prettyparser.golden new file mode 100644 index 00000000..1796dc27 --- /dev/null +++ b/tests/examples/MultilineLanguagePragma.hs.prettyparser.golden @@ -0,0 +1 @@ +Match diff --git a/tests/examples/MultilineLanguagePragma.hs.prettyprinter.golden b/tests/examples/MultilineLanguagePragma.hs.prettyprinter.golden new file mode 100644 index 00000000..3a5123fc --- /dev/null +++ b/tests/examples/MultilineLanguagePragma.hs.prettyprinter.golden @@ -0,0 +1,3 @@ +{-# LANGUAGE BangPatterns, MagicHash, OverloadedStrings, LambdaCase + #-} +main = undefined