Skip to content

Commit 1808e3e

Browse files
committed
Fix unused variable warnings in TH-generated code for empty records
When a record has zero fields, the TH code generators for various tool instances would bind variables (e.g. lambda parameters) that were never referenced in the body. With -Wall/-Wunused-matches, GHC flags these as warnings in the generated splices. Fix by using wildcard patterns (wildP) instead of named bindings (varP) when srFields is empty, across all affected generators: - Tools/JSON.hs (ToJSON): \x -> object [] => \_ -> object [] - Tools/JSON.hs (FromJSONWithErrs): (Object x) => (Object _) - Tools/QuickCheck.hs (Arbitrary): sized (\x -> pure Con) => sized (\_ -> ...) - Tools/DeepSeq.hs (NFData): \x -> () => \_ -> () - Tools/Example.hs (Example): sized (\x -> pure Con) => sized (\_ -> ...) - Tools/Traversal.hs (traversal): \f r -> pure Con => \_ _ -> pure Con
1 parent 733a3b0 commit 1808e3e

5 files changed

Lines changed: 19 additions & 6 deletions

File tree

src/Data/API/Tools/DeepSeq.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ gen_sr = mkTool $ \ ts (an, sr) -> do
3131
x <- newName "x"
3232
optionalInstanceD ts ''NFData [nodeRepT an] [simpleD 'rnf (bdy an sr x)]
3333
where
34-
bdy an sr x = lamE [varP x] $ foldr f [e|()|] (srFields sr)
34+
bdy an sr x = lamE [pat] $ foldr f [e|()|] (srFields sr)
3535
where
36+
pat | null (srFields sr) = wildP
37+
| otherwise = varP x
3638
f (fn,_) r = [e| rnf ($(nodeFieldE an fn) $(varE x)) `seq` $r |]
3739

3840
gen_su :: Tool (APINode, SpecUnion)

src/Data/API/Tools/Example.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ gen_sr_ex :: Tool (APINode, SpecRecord)
108108
gen_sr_ex = mkTool $ \ ts (an, sr) -> optionalInstanceD ts ''Example [nodeRepT an] [simpleD 'example (bdy an sr)]
109109
where
110110
bdy an sr = do x <- newName "x"
111-
appE (varE 'QC.sized) $ lamE [varP x] $
111+
let pat | null (srFields sr) = wildP
112+
| otherwise = varP x
113+
appE (varE 'QC.sized) $ lamE [pat] $
112114
applicativeE (nodeConE an) $
113115
replicate (length $ srFields sr) $
114116
[e| QC.resize ($(varE x) `div` 2) example |]

src/Data/API/Tools/JSON.hs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,13 @@ gen_sr_to = mkTool $ \ ts (an, sr) -> do
118118
x <- newName "x"
119119
optionalInstanceD ts ''ToJSON [nodeRepT an] [simpleD 'toJSON (bdy an sr x)]
120120
where
121-
bdy an sr x = lamE [varP x] $
121+
bdy an sr x = lamE [pat] $
122122
varE 'object `appE`
123123
listE [ [e| $(fieldNameE fn) .= $(nodeFieldE an fn) $(varE x) |]
124124
| (fn, _) <- srFields sr ]
125+
where
126+
pat | null (srFields sr) = wildP
127+
| otherwise = varP x
125128

126129

127130
{-
@@ -142,8 +145,10 @@ gen_sr_fm = mkTool $ \ ts (an, sr) -> do
142145
optionalInstanceD ts ''FromJSONWithErrs [nodeRepT an]
143146
[funD 'parseJSONWithErrs [cl an sr x, clNull, cl' x]]
144147
where
145-
cl an sr x = clause [conP 'Object [varP x]] (normalB bdy) []
148+
cl an sr x = clause [conP 'Object [pat]] (normalB bdy) []
146149
where
150+
pat | null (srFields sr) = wildP
151+
| otherwise = varP x
147152
bdy = applicativeE (nodeConE an) $ map project (srFields sr)
148153
project (fn, ft) = [e| withDefaultField ro (fmap defaultValueAsJsValue mb_dv) $(fieldNameE fn) parseJSONWithErrs $(varE x) |]
149154
where ro = ftReadOnly ft

src/Data/API/Tools/QuickCheck.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@ gen_sr_ab = mkTool $ \ ts (an, sr) -> mkArbitraryInstance ts (nodeRepT an) (bdy
125125
-- by giving an arbitrary implementation like this:
126126
-- sized (\ x -> JobSpecId <$> resize (x `div` 2) arbitrary <*> ...)
127127
bdy an sr = do x <- newName "x"
128-
appE (varE 'QC.sized) $ lamE [varP x] $
128+
let pat | null (srFields sr) = wildP
129+
| otherwise = varP x
130+
appE (varE 'QC.sized) $ lamE [pat] $
129131
applicativeE (nodeConE an) $
130132
replicate (length $ srFields sr) $
131133
[e| QC.resize ($(varE x) `div` 2) arbitrary |]

src/Data/API/Tools/Traversal.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,9 @@ traversalRecord napi targets x an sr
112112
bdy = do
113113
f <- newName "f"
114114
r <- newName "r"
115-
lamE [varP f, varP r] $ applicativeE (nodeConE an) $ map (traverseField f r) (srFields sr)
115+
let (patF, patR) | null (srFields sr) = (wildP, wildP)
116+
| otherwise = (varP f, varP r)
117+
lamE [patF, patR] $ applicativeE (nodeConE an) $ map (traverseField f r) (srFields sr)
116118
traverseField f r (fn, fty) = [e| $(traverser napi targets x (ftType fty)) $(varE f) ($(nodeFieldE an fn) $(varE r)) |]
117119

118120

0 commit comments

Comments
 (0)