Skip to content

Commit 05cabaf

Browse files
committed
disable qq warnings for megaparsec <9.5
1 parent 3ff4b66 commit 05cabaf

File tree

6 files changed

+78
-20
lines changed

6 files changed

+78
-20
lines changed

persistent/Database/Persist/Quasi/Internal.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ module Database.Persist.Quasi.Internal
2121
, sourceLocFromTHLoc
2222
, parseFieldType
2323
, takeColsEx
24-
, CumulativeParseResult (..)
24+
, CumulativeParseResult
2525
, renderErrors
2626
, parserWarningMessage
2727

persistent/Database/Persist/Quasi/Internal/ModelParser.hs

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
{-# LANGUAGE LambdaCase #-}
66
{-# LANGUAGE OverloadedStrings #-}
77
{-# LANGUAGE TupleSections #-}
8+
{-# LANGUAGE CPP #-}
89

910
module Database.Persist.Quasi.Internal.ModelParser
1011
( SourceLoc (..)
@@ -75,7 +76,11 @@ initialExtraState =
7576
, esLastDocumentablePosition = Nothing
7677
}
7778

78-
-- @since 2.16.0.0
79+
-- megaparsec <9.5 lacks a MonadWriter instance for ParsecT.
80+
-- We must continue supporting megaparsec <9.5 in order to support
81+
-- GHC <9, so we will work around this by disabling warning functionality
82+
-- on old megaparsecs.
83+
#if MIN_VERSION_megaparsec(9,5,0)
7984
newtype Parser a = Parser
8085
{ unParser
8186
:: ReaderT
@@ -103,6 +108,31 @@ newtype Parser a = Parser
103108
, MonadParsec Void String
104109
, MonadWriter (Set ParserWarning)
105110
)
111+
#else
112+
newtype Parser a = Parser
113+
{ unParser
114+
:: ReaderT
115+
PersistSettings
116+
( StateT
117+
ExtraState
118+
( Parsec
119+
Void
120+
String
121+
)
122+
)
123+
a
124+
}
125+
deriving newtype
126+
( Functor
127+
, Applicative
128+
, Monad
129+
, Alternative
130+
, MonadPlus
131+
, MonadState ExtraState
132+
, MonadReader PersistSettings
133+
, MonadParsec Void String
134+
)
135+
#endif
106136

107137
type EntityParseError = ParseErrorBundle String Void
108138

@@ -139,10 +169,16 @@ runConfiguredParser
139169
-> InternalParseResult a
140170
runConfiguredParser ps acc parser fp s = (warnings, either)
141171
where
172+
#if MIN_VERSION_megaparsec(9,5,0)
142173
sm = runReaderT (unParser parser) ps
143174
pm = runStateT sm acc
144175
wm = runParserT' pm initialInternalState
145176
((_is, either), warnings) = runWriter wm
177+
#else
178+
sm = runReaderT (unParser parser) ps
179+
pm = runStateT sm acc
180+
((_is, either), warnings) = (runParser' pm initialInternalState, mempty)
181+
#endif
146182

147183
initialSourcePos =
148184
SourcePos
@@ -186,23 +222,25 @@ tryOrWarn msg p l r = do
186222
parserState <- getParserState
187223
withRecovery (warnAndRetry $ statePosState parserState) l
188224
where
189-
warnAndRetry posState err = do
190-
if p err
191-
then do
192-
let
193-
(pairs, _) = attachSourcePos errorOffset [err] posState
194-
tell . Set.fromList $
195-
map
196-
( \(e, _pos) ->
197-
ParserWarning
198-
{ parserWarningExtraMessage = msg <> "\n"
199-
, parserWarningUnderlyingError = e
200-
, parserWarningPosState = posState
201-
}
202-
)
203-
pairs
204-
r
205-
else parseError err
225+
warnAndRetry posState err =
226+
if not (p err)
227+
then parseError err
228+
else do
229+
#if MIN_VERSION_megaparsec(9,5,0)
230+
let
231+
(pairs, _) = attachSourcePos errorOffset [err] posState
232+
tell . Set.fromList $
233+
map
234+
( \(e, _pos) ->
235+
ParserWarning
236+
{ parserWarningExtraMessage = msg <> "\n"
237+
, parserWarningUnderlyingError = e
238+
, parserWarningPosState = posState
239+
}
240+
)
241+
pairs
242+
#endif
243+
r
206244

207245
-- | Attempts to parse with a provided parser. If it fails with an error matching
208246
-- the provided predicate, it registers a delayed error with the provided message and falls

persistent/Database/Persist/Quasi/PersistSettings.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Database.Persist.Quasi.PersistSettings
55
, lowerCaseSettings
66
, ParserErrorLevel (..)
77
, ParserWarning
8+
, unableToReportConfiguredWarnings
89
, warningPos
910
, parserWarningMessage
1011

persistent/Database/Persist/Quasi/PersistSettings/Internal.hs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
{-# LANGUAGE CPP #-}
2+
13
module Database.Persist.Quasi.PersistSettings.Internal where
24

35
import Data.Char (isDigit, isLower, isSpace, isUpper, toLower)
@@ -98,6 +100,13 @@ parserWarningMessage pw =
98100
}
99101
)
100102

103+
unableToReportConfiguredWarnings :: PersistSettings -> Bool
104+
#if MIN_VERSION_megaparsec(9,5,0)
105+
unableToReportConfiguredWarnings _ps = False
106+
#else
107+
unableToReportConfiguredWarnings = (Just LevelWarning ==) . psTabErrorLevel
108+
#endif
109+
101110
toFKNameInfixed :: Text -> EntityNameHS -> ConstraintNameHS -> Text
102111
toFKNameInfixed inf (EntityNameHS entName) (ConstraintNameHS conName) =
103112
entName <> inf <> conName

persistent/Database/Persist/TH/Internal.hs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,15 @@ embedEntityDefsMap existingEnts rawEnts =
285285
parseReferences :: PersistSettings -> [(Maybe SourceLoc, Text)] -> Q Exp
286286
parseReferences ps s = do
287287
let (warnings, res) = parse ps s
288-
traverse_ (reportWarning . parserWarningMessage) $ warnings
288+
if unableToReportConfiguredWarnings ps
289+
then
290+
reportWarning $ unlines
291+
[ "At least one quasiquoter warning has been enabled, but these warnings cannot be reported."
292+
, "Please upgrade to megaparsec >= 9.5 to enable warning reports."
293+
, "Support for megaparsec < 9.5 will eventually be removed."
294+
]
295+
else
296+
traverse_ (reportWarning . parserWarningMessage) $ warnings
289297
case res of
290298
Left errs -> fail $ renderErrors errs
291299
Right r -> lift r

persistent/test/Database/Persist/QuasiSpec.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,13 @@ spec = describe "Quasi" $ do
303303
it "permits tab indentation" $
304304
getUnboundEntityNameHS user `shouldBe` EntityNameHS "User"
305305

306+
#if MIN_VERSION_megaparsec(9,5,0)
306307
it "generates warnings" $
307308
Set.map parserWarningMessage warnings
308309
`shouldBe` [ "use spaces instead of tabs\n2:1:\n |\n2 | Id Text\n | ^\nunexpected tab\nexpecting valid whitespace\n"
309310
, "use spaces instead of tabs\n3:1:\n |\n3 | name String\n | ^\nunexpected tab\nexpecting valid whitespace\n"
310311
]
312+
#endif
311313

312314
describe "when configured to disallow tabs" $ do
313315
let

0 commit comments

Comments
 (0)