@@ -57,6 +57,7 @@ import qualified SrcLoc
57
57
#endif
58
58
import Lens.Family2 ((^.) )
59
59
import Text.Printf (printf )
60
+ import qualified Data.ProtoLens.Compiler.Parameter as Parameter
60
61
61
62
import Proto.Google.Protobuf.Descriptor
62
63
( EnumValueDescriptorProto
@@ -90,14 +91,16 @@ generateModule :: ModuleNameStr
90
91
-> Env OccNameStr -- ^ Definitions in this file
91
92
-> Env RdrNameStr -- ^ Definitions in the imported modules
92
93
-> [ServiceInfo ]
94
+ -> Parameter. Options
93
95
-> [CommentedModule ]
94
96
generateModule modName fdesc imports publicImports definitions importedEnv services
97
+ opts
95
98
= [ CommentedModule pragmas
96
99
(module' (Just modName)
97
100
(Just $ serviceExports
98
101
++ concatMap generateExports (Map. elems definitions)
99
102
++ map moduleContents publicImports)
100
- (mainImports ++ sharedImports
103
+ (mainImports ++ parameterImports ++ sharedImports
101
104
++ map importQualified (imports List. \\ publicImports)
102
105
++ map import' publicImports)
103
106
[] )
@@ -113,13 +116,17 @@ generateModule modName fdesc imports publicImports definitions importedEnv servi
113
116
where
114
117
fieldModName = fromString $ moduleNameString (unModuleNameStr modName) ++ " _Fields"
115
118
pragmas =
116
- [ languagePragma $ List. intercalate " , " $ map fromString
119
+ [ languagePragma
120
+ . List. intercalate " , "
121
+ . map fromString
122
+ . List. nub $
117
123
[" ScopedTypeVariables" , " DataKinds" , " TypeFamilies" ,
118
124
" UndecidableInstances" , " GeneralizedNewtypeDeriving" ,
119
125
" MultiParamTypeClasses" , " FlexibleContexts" , " FlexibleInstances" ,
120
126
" PatternSynonyms" , " MagicHash" , " NoImplicitPrelude" ,
121
127
" DataKinds" , " BangPatterns" , " TypeApplications" ,
122
128
" OverloadedStrings" , " DerivingStrategies" ]
129
+ ++ Parameter. pragmas' opts
123
130
-- Allow unused imports in case we don't import anything from
124
131
-- Data.Text, Data.Int, etc.
125
132
, optionsGhcPragma " -Wno-unused-imports"
@@ -131,6 +138,7 @@ generateModule modName fdesc imports publicImports definitions importedEnv servi
131
138
]
132
139
mainImports = map (reexported . importQualified)
133
140
[ " Control.DeepSeq" , " Data.ProtoLens.Prism" ]
141
+ parameterImports = map importQualified $ Parameter. imports' opts
134
142
sharedImports = map (reexported . importQualified)
135
143
[ " Prelude" , " Data.Int" , " Data.Monoid" , " Data.Word"
136
144
, " Data.ProtoLens"
@@ -151,9 +159,9 @@ generateModule modName fdesc imports publicImports definitions importedEnv servi
151
159
]
152
160
env = Map. union (unqualifyEnv definitions) importedEnv
153
161
generateDecls (protoName, Message m)
154
- = generateMessageDecls fieldModName env (stripDotPrefix protoName) m
162
+ = generateMessageDecls fieldModName env (stripDotPrefix protoName) m opts
155
163
++ map uncommented (concatMap (generatePrisms env) (messageOneofFields m))
156
- generateDecls (_, Enum e) = map uncommented $ generateEnumDecls e
164
+ generateDecls (_, Enum e) = map uncommented $ generateEnumDecls e opts
157
165
generateExports (Message m) = generateMessageExports m
158
166
++ concatMap generatePrismExports (messageOneofFields m)
159
167
generateExports (Enum e) = generateEnumExports e
@@ -305,8 +313,8 @@ generateServiceDecls env si =
305
313
Enum _ -> error " Service must have a message type"
306
314
307
315
308
- generateMessageDecls :: ModuleNameStr -> Env RdrNameStr -> T. Text -> MessageInfo OccNameStr -> [CommentedDecl ]
309
- generateMessageDecls fieldModName env protoName info =
316
+ generateMessageDecls :: ModuleNameStr -> Env RdrNameStr -> T. Text -> MessageInfo OccNameStr -> Parameter. Options -> [CommentedDecl ]
317
+ generateMessageDecls fieldModName env protoName info opts =
310
318
-- data Bar = Bar {
311
319
-- foo :: Baz
312
320
-- }
@@ -318,7 +326,10 @@ generateMessageDecls fieldModName env protoName info =
318
326
]
319
327
++ [(messageUnknownFields info, strict $ field $ var " Data.ProtoLens.FieldSet" )]
320
328
]
321
- [derivingStock [var " Prelude.Eq" , var " Prelude.Ord" ]]
329
+ [derivingStock $
330
+ [var " Prelude.Eq" , var " Prelude.Ord" ]
331
+ ++ Parameter. stockInstances' opts
332
+ ]
322
333
-- instance Show Bar where
323
334
-- showsPrec __x __s = showChar '{' (showString (showMessageShort __x) (showChar '}' s))
324
335
, uncommented $
@@ -329,6 +340,7 @@ generateMessageDecls fieldModName env protoName info =
329
340
@@ (var " Data.ProtoLens.showMessageShort" @@ var " __x" )
330
341
@@ (var " Prelude.showChar" @@ char ' }' @@ var " __s" ))]
331
342
] ++
343
+ (uncommented <$> Parameter. newDefaultInstances dataType opts) ++
332
344
-- oneof field data type declarations
333
345
-- proto: message Foo {
334
346
-- oneof bar {
@@ -344,9 +356,21 @@ generateMessageDecls fieldModName env protoName info =
344
356
, let f = caseField c
345
357
, let consName = caseConstructorName c
346
358
]
347
- [derivingStock [var " Prelude.Show" , var " Prelude.Eq" , var " Prelude.Ord" ]]
359
+ [derivingStock $
360
+ [var " Prelude.Show" , var " Prelude.Eq" , var " Prelude.Ord" ]
361
+ ++ Parameter. stockInstances' opts
362
+ ]
348
363
| oneofInfo <- messageOneofFields info
349
364
] ++
365
+ (
366
+ messageOneofFields info >>=
367
+ (\ oneofInfo ->
368
+ uncommented
369
+ <$> Parameter. newDefaultInstances
370
+ (var . unqual $ oneofTypeName oneofInfo)
371
+ opts
372
+ )
373
+ ) ++
350
374
-- instance HasField Foo "foo" Bar
351
375
-- fieldOf _ = ...
352
376
-- Note: for optional fields, this generates an instance both for "foo" and
@@ -458,18 +482,28 @@ generateEnumExports e = [thingAll n, thingWith n aliases] ++ proto3NewType
458
482
generateServiceExports :: ServiceInfo -> IE'
459
483
generateServiceExports si = thingAll $ unqual $ fromString $ T. unpack $ serviceName si
460
484
461
- generateEnumDecls :: EnumInfo OccNameStr -> [HsDecl' ]
462
- generateEnumDecls info =
485
+ generateEnumDecls :: EnumInfo OccNameStr -> Parameter. Options -> [HsDecl' ]
486
+ generateEnumDecls info opts =
463
487
-- Proto3-only:
464
488
-- newtype FooEnum'UnrecognizedValue = FooEnum'UnrecognizedValue Data.Int.Int32
465
489
-- deriving (Prelude.Eq, Prelude.Ord, Prelude.Show, Prelude.Read)
466
490
[ newtype' (unrecognizedValueName u) []
467
491
(prefixCon (unrecognizedValueName u) [field $ var " Data.Int.Int32" ])
468
- [derivingStock [var " Prelude.Eq" , var " Prelude.Ord" , var " Prelude.Show" ]]
492
+ [derivingStock $
493
+ [var " Prelude.Eq" , var " Prelude.Ord" , var " Prelude.Show" ]
494
+ ++ Parameter. stockInstances' opts
495
+ ]
469
496
| Just u <- [unrecognized]
470
497
]
471
498
++
472
-
499
+ (
500
+ case unrecognized of
501
+ Nothing -> []
502
+ Just u ->
503
+ Parameter. newDefaultInstances
504
+ (var . unqual $ unrecognizedValueName u)
505
+ opts
506
+ ) ++
473
507
-- data FooEnum
474
508
-- = Enum1
475
509
-- | Enum2
@@ -482,7 +516,10 @@ generateEnumDecls info =
482
516
| Just u <- [unrecognized]
483
517
]
484
518
)
485
- [derivingStock [var " Prelude.Show" , var " Prelude.Eq" , var " Prelude.Ord" ]]
519
+ [derivingStock $
520
+ [var " Prelude.Show" , var " Prelude.Eq" , var " Prelude.Ord" ]
521
+ ++ Parameter. stockInstances' opts
522
+ ]
486
523
487
524
-- instance Data.ProtoLens.MessageEnum FooEnum where
488
525
-- maybeToEnum 0 = Prelude.Just Enum1
@@ -608,7 +645,7 @@ generateEnumDecls info =
608
645
[ funBind " rnf" $ match [bvar " x__" ]
609
646
$ var " Prelude.seq" @@ var " x__" @@ var " ()" ]
610
647
] ++
611
-
648
+ Parameter. newDefaultInstances dataType opts ++
612
649
-- pattern Enum2a :: FooEnum
613
650
-- pattern Enum2a = Enum2
614
651
concat
0 commit comments