@@ -1,11 +1,10 @@
1−{-# LANGUAGE CPP #-}
21{-# LANGUAGE UndecidableInstances #-}
32{-# LANGUAGE FunctionalDependencies #-}
43
54module Data.THGen.XML.Internal where
65
76import Control.DeepSeq
8−import Control.Lens hiding (repeated, enum, (&), Strict)
7+import Control.Lens hiding (repeated, enum, (&))
98import Control.Lens.Internal.FieldTH (makeFieldOpticsForDec)
109import qualified Data.Char as C
1110import Data.List.NonEmpty (NonEmpty)
@@ -15,7 +14,7 @@ import Data.THGen.Compat as THC
1514import Data.THGen.Enum
1615import qualified Data.Text as T
1716import GHC.Generics (Generic)
18−import Language.Haskell.TH as TH hiding (Strict)
17+import Language.Haskell.TH as TH
1918import Prelude hiding ((+), (*), (^))
2019import qualified Text.XML as X
2120import Text.XML.DOM.Parser hiding (parseContent)
@@ -23,22 +22,8 @@ import Text.XML.DOM.Parser.Internal.Content
2322import Text.XML.ParentAttributes
2423import qualified Text.XML.Writer as XW
2524
26−data ParserMode
27− = Strict
28− | Lenient
2925
30−data GenType
31− = Parser
32− | Generator
33− | ParserAndGenerator
34− | LenientParser
35− | LenientParserAndGenerator
36−
37−isLenientType :: GenType -> Bool
38−isLenientType = \case
39− LenientParser -> True
40− LenientParserAndGenerator -> True
41− _ -> False
26+data GenType = Parser | Generator | Both
4227
4328data XmlFieldPlural
4429 = XmlFieldPluralMandatory -- Occurs exactly 1 time (Identity)
@@ -160,7 +145,7 @@ instance Description ExhaustivenessName IsoXmlDescEnum where
160145 exhaustivenessName =:= (IsoXmlDescEnum genType descEnumCons) =
161146 isoXmlGenerateEnum genType exhaustivenessName (reverse descEnumCons)
162147
163−instance (m ~ Q) => IsString (m TH.Type -> IsoXmlDescPreField) where
148+instance IsString (TH.TypeQ -> IsoXmlDescPreField) where
164149 fromString = IsoXmlDescPreField
165150
166151instance IsString IsoXmlDescPreField where
@@ -168,10 +153,10 @@ instance IsString IsoXmlDescPreField where
168153 where
169154 ty = (TH.conT . TH.mkName) ("Xml" ++ over _head C.toUpper (xmlLocalName name))
170155
171−instance (m ~ Q) => IsString (m TH.Type -> IsoXmlDescPreAttribute) where
156+instance IsString (TH.TypeQ -> IsoXmlDescPreAttribute) where
172157 fromString = IsoXmlDescPreAttribute
173158
174−instance (m ~ Q) => IsString (m Type -> IsoXmlDescPreContent) where
159+instance IsString (TH.TypeQ -> IsoXmlDescPreContent) where
175160 fromString = IsoXmlDescPreContent
176161
177162instance IsString IsoXmlDescPreAttribute where
@@ -197,7 +182,7 @@ instance IsString ExhaustivenessName where
197182 fromString strName = ExhaustivenessName strName NonExhaustive
198183
199184makeNamePrefix :: String -> String
200−makeNamePrefix = map C.toLower . filter (\c -> C.isUpper c || C.isDigit c)
185+makeNamePrefix = map C.toLower . filter C.isUpper
201186
202187funSimple :: TH.Name -> TH.ExpQ -> TH.DecQ
203188funSimple name body = TH.funD name [ TH.clause [] (TH.normalB body) [] ]
@@ -225,14 +210,11 @@ isoXmlGenerateEnum genType (ExhaustivenessName strName' exh) enumCons = do
225210 (return [])
226211 [t|ToXmlAttribute $(TH.conT name)|]
227212 [funSimple 'toXmlAttribute [e|T.pack . show|]]
228− genFromDomInst mode = do
213+ genFromDomInst = do
229214 TH.instanceD
230215 (return [])
231216 [t|FromDom $(TH.conT name)|]
232− [case mode of
233− Strict -> funSimple 'fromDom [e|parseContent readContent|]
234− Lenient -> funSimple 'fromDom [e|ignoreBlank $ parseContent readContent|]
235− ]
217+ [funSimple 'fromDom [e|parseContent readContent|]]
236218 genFromAttributeInst = do
237219 TH.instanceD
238220 (return [])
@@ -244,24 +226,13 @@ isoXmlGenerateEnum genType (ExhaustivenessName strName' exh) enumCons = do
244226 toXmlAttributeInst <- genToXmlAttributeInst
245227 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst]
246228 Parser -> do
247− fromDomInst <- genFromDomInst Strict
248− fromAttributeInst <- genFromAttributeInst
249− return $ enumDecls ++ [fromDomInst, fromAttributeInst]
250− LenientParser -> do
251− fromDomInst <- genFromDomInst Lenient
229+ fromDomInst <- genFromDomInst
252230 fromAttributeInst <- genFromAttributeInst
253231 return $ enumDecls ++ [fromDomInst, fromAttributeInst]
254− ParserAndGenerator -> do
255− toXmlInst <- genToXmlInst
256− toXmlAttributeInst <- genToXmlAttributeInst
257− fromDomInst <- genFromDomInst Strict
258− fromAttributeInst <- genFromAttributeInst
259− return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
260− fromDomInst, fromAttributeInst]
261− LenientParserAndGenerator -> do
232+ Both -> do
262233 toXmlInst <- genToXmlInst
263234 toXmlAttributeInst <- genToXmlAttributeInst
264− fromDomInst <- genFromDomInst Lenient
235+ fromDomInst <- genFromDomInst
265236 fromAttributeInst <- genFromAttributeInst
266237 return $ enumDecls ++ [toXmlInst, toXmlAttributeInst,
267238 fromDomInst, fromAttributeInst]
@@ -284,14 +255,11 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
284255 IsoXmlDescField fieldPlural rawName fieldType = descField
285256 fieldStrName = xmlLocalName rawName
286257 fName = TH.mkName (fieldName fieldStrName)
287− fType' = case fieldPlural of
258+ fType = case fieldPlural of
288259 XmlFieldPluralMandatory -> fieldType
289260 XmlFieldPluralOptional -> [t| Maybe $fieldType |]
290261 XmlFieldPluralRepeated -> [t| [$fieldType] |]
291262 XmlFieldPluralMultiplied -> [t| NonEmpty $fieldType |]
292− fType = if isLenientType genType
293− then [t| Maybe $fType' |]
294− else fType'
295263 in if isNewtype
296264 then THC.varStrictType fName (THC.nonStrictType fType)
297265 else THC.varStrictType fName (THC.strictType fType)
@@ -326,7 +294,7 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
326294 [ ]
327295
328296 let
329− genFromDomInst mode = do
297+ genFromDomInst = do
330298 let
331299 exprHeader = [e|pure $(TH.conE name)|]
332300 exprRecordParts = do
@@ -340,9 +308,8 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
340308 fieldParse = case fieldPlural of
341309 XmlFieldPluralMandatory -> [e|inElem|]
342310 _ -> [e|inElemTrav|]
343− in case mode of
344− Strict -> [e|$fieldParse $exprFieldStrName fromDom|]
345− Lenient -> [e|$fieldParse $exprFieldStrName (ignoreBlank fromDom)|]
311+ in
312+ [e|$fieldParse $exprFieldStrName fromDom|]
346313 IsoXmlDescRecordAttribute descAttribute ->
347314 let
348315 IsoXmlDescAttribute attributePlural attributeStrName _ = descAttribute
@@ -412,11 +379,11 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
412379 toXmlParentAttributesExpr
413380 = TH.lamE [if null exprAttributes then TH.wildP else TH.varP objName]
414381 $ [e|mapMaybe distribPair $(TH.listE exprAttributes)|]
415−#if __GLASGOW_HASKELL__ < 800
382+ #if __GLASGOW_HASKELL__ < 800
416383 TH.instanceD
417−#else
384+ #else
418385 TH.instanceWithOverlapD (Just TH.Overlapping)
419−#endif
386+ #endif
420387 (return [])
421388 [t|ToXmlParentAttributes $(TH.conT name)|]
422389 [funSimple 'toXmlParentAttributes toXmlParentAttributesExpr]
@@ -428,21 +395,12 @@ isoXmlGenerateDatatype genType (PrefixName strName' strPrefix') descRecordParts
428395 return $ [termDecl] ++ lensDecls ++
429396 [toXmlInst, toXmlParentAttributesInst, nfDataInst]
430397 Parser -> do
431− fromDomInst <- genFromDomInst Strict
398+ fromDomInst <- genFromDomInst
432399 return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
433− LenientParser -> do
434− fromDomInst <- genFromDomInst Lenient
435− return $ [termDecl] ++ lensDecls ++ [fromDomInst, nfDataInst]
436− ParserAndGenerator -> do
437− toXmlInst <- genToXmlInst
438− toXmlParentAttributesInst <- genToXmlParentAttributeInst
439− fromDomInst <- genFromDomInst Strict
440− return $ [termDecl] ++ lensDecls ++
441− [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
442− LenientParserAndGenerator -> do
400+ Both -> do
443401 toXmlInst <- genToXmlInst
444402 toXmlParentAttributesInst <- genToXmlParentAttributeInst
445− fromDomInst <- genFromDomInst Lenient
403+ fromDomInst <- genFromDomInst
446404 return $ [termDecl] ++ lensDecls ++
447405 [fromDomInst, toXmlInst, toXmlParentAttributesInst, nfDataInst]
448406