on master help sign in
Merge pull request #455 from RyanGlScott/master
29eeac4Adam Bergmark
Data/Aeson/TH.hs+6−4
@@ -1408,10 +1408,12 @@ dispatchFunByType jc jf conName tvMap list ty = do
1408 if any (`mentionsName` tyVarNames) lhsArgs
1408 if any (`mentionsName` tyVarNames) lhsArgs
1409 || itf && any (`mentionsName` tyVarNames) tyArgs
1409 || itf && any (`mentionsName` tyVarNames) tyArgs
1410 then outOfPlaceTyVarError jc conName
1410 then outOfPlaceTyVarError jc conName
1411+ else if any (`mentionsName` tyVarNames) rhsArgs
1411− else appsE $ varE (jsonFunValOrListName list jf $ toEnum numLastArgs)
1412+ then appsE $ varE (jsonFunValOrListName list jf $ toEnum numLastArgs)
1412− : zipWith (dispatchFunByType jc jf conName tvMap)
1413+ : zipWith (dispatchFunByType jc jf conName tvMap)
1413− (cycle [False,True])
1414+ (cycle [False,True])
1414− (interleave rhsArgs rhsArgs)
1415+ (interleave rhsArgs rhsArgs)
1416+ else varE $ jsonFunValOrListName list jf Arity0
1415
1417
1416dispatchToJSON, dispatchToEncoding, dispatchParseJSON
1418dispatchToJSON, dispatchToEncoding, dispatchParseJSON
1417 :: JSONClass -> Name -> TyVarMap -> Type -> Q Exp
1419 :: JSONClass -> Name -> TyVarMap -> Type -> Q Exp
tests/UnitTests.hs+18−3
@@ -15,10 +15,10 @@ import Instances ()
15
15
16import Control.Applicative (Const(..))
16import Control.Applicative (Const(..))
17import Control.Monad (forM)
17import Control.Monad (forM)
18−import Data.Aeson (FromJSONKeyFunction(..), FromJSONKey(..), decode, eitherDecode, encode, genericParseJSON, genericToJSON, genericToEncoding, object, FromJSON(..), withObject, (.=), (.:), (.:?), (.:!))
18+import Data.Aeson (FromJSONKeyFunction(..), FromJSONKey(..), decode, eitherDecode, encode, genericParseJSON, genericToJSON, genericToEncoding, object, FromJSON(..), withObject, ToJSON1(..), (.=), (.:), (.:?), (.:!))
19import Data.Aeson.Text (encodeToTextBuilder)
19import Data.Aeson.Text (encodeToTextBuilder)
20import Data.Aeson.Internal (JSONPathElement(..), formatError)
20import Data.Aeson.Internal (JSONPathElement(..), formatError)
21−import Data.Aeson.TH (deriveJSON)
21+import Data.Aeson.TH (deriveJSON, deriveToJSON, deriveToJSON1)
22import Data.Aeson.Types (ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields, Options(..), SumEncoding(..))
22import Data.Aeson.Types (ToJSON(..), Value, camelTo, camelTo2, defaultOptions, omitNothingFields, Options(..), SumEncoding(..))
23import Data.Char (toUpper)
23import Data.Char (toUpper)
24import Data.Hashable (hash)
24import Data.Hashable (hash)
@@ -93,6 +93,7 @@ tests = testGroup "unit" [
93 , testGroup "Issue #351" $ fmap (testCase "-") issue351
93 , testGroup "Issue #351" $ fmap (testCase "-") issue351
94 , testGroup "Nullary constructors" $ fmap (testCase "-") nullaryConstructors
94 , testGroup "Nullary constructors" $ fmap (testCase "-") nullaryConstructors
95 , testGroup "FromJSONKey" $ fmap (testCase "-") fromJSONKeyAssertions
95 , testGroup "FromJSONKey" $ fmap (testCase "-") fromJSONKeyAssertions
96+ , testCase "PR #455" pr455
96 ]
97 ]
97
98
98roundTripCamel :: String -> Assertion
99roundTripCamel :: String -> Assertion
@@ -544,10 +545,24 @@ encoderComparisonTests = do
544
545
545-- A regression test for: https://github.com/bos/aeson/issues/293
546-- A regression test for: https://github.com/bos/aeson/issues/293
546data MyRecord = MyRecord {_field1 :: Maybe Int, _field2 :: Maybe Bool}
547data MyRecord = MyRecord {_field1 :: Maybe Int, _field2 :: Maybe Bool}
547−deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord
548
548
549data MyRecord2 = MyRecord2 {_field3 :: Maybe Int, _field4 :: Maybe Bool}
549data MyRecord2 = MyRecord2 {_field3 :: Maybe Int, _field4 :: Maybe Bool}
550 deriving Generic
550 deriving Generic
551
551
552instance ToJSON MyRecord2
552instance ToJSON MyRecord2
553instance FromJSON MyRecord2
553instance FromJSON MyRecord2
554+
555+-- A regression test for: https://github.com/bos/aeson/pull/455
556+data Foo a = FooNil | FooCons (Foo Int)
557+
558+pr455 :: Assertion
559+pr455 = assertEqual "FooCons FooNil"
560+ (toJSON foo) (liftToJSON undefined undefined foo)
561+ where
562+ foo :: Foo Int
563+ foo = FooCons FooNil
564+
565+deriveJSON defaultOptions{omitNothingFields=True} ''MyRecord
566+
567+deriveToJSON defaultOptions ''Foo
568+deriveToJSON1 defaultOptions ''Foo