{-# LANGUAGE CPP #-}
{- |
  Module      :  Language.Haskell.Meta.Parse
  Copyright   :  (c) Serokell 2022, Adam Bergmark 2022
  License     :  BSD3
  Maintainer  :  Adam Bergmark <adam@bergmark.nl>
  Stability   :  experimental
  Portability :  portable (template-haskell)
-}

module Language.Haskell.Meta.Extensions (
  toExtension,
  fromExtension
 ) where

import qualified Language.Haskell.Exts.Extension as Exts
import qualified Language.Haskell.TH.Syntax      as TH


-----------------------------------------------------------------------------

-- * To template-haskell

-- | Returns @Nothing@ when the extension is not supported by template-haskell.
toExtension :: Exts.KnownExtension -> Maybe TH.Extension
toExtension :: KnownExtension -> Maybe Extension
toExtension KnownExtension
e = case KnownExtension
e of
  KnownExtension
Exts.OverlappingInstances       -> forall a. a -> Maybe a
Just Extension
TH.OverlappingInstances
  KnownExtension
Exts.UndecidableInstances       -> forall a. a -> Maybe a
Just Extension
TH.UndecidableInstances
  KnownExtension
Exts.IncoherentInstances        -> forall a. a -> Maybe a
Just Extension
TH.IncoherentInstances
  KnownExtension
Exts.InstanceSigs               -> forall a. a -> Maybe a
Just Extension
TH.InstanceSigs
  KnownExtension
Exts.DoRec                      -> forall a. Maybe a
Nothing
  KnownExtension
Exts.RecursiveDo                -> forall a. a -> Maybe a
Just Extension
TH.RecursiveDo
  KnownExtension
Exts.ParallelListComp           -> forall a. a -> Maybe a
Just Extension
TH.ParallelListComp
  KnownExtension
Exts.MultiParamTypeClasses      -> forall a. a -> Maybe a
Just Extension
TH.MultiParamTypeClasses
  KnownExtension
Exts.MonomorphismRestriction    -> forall a. a -> Maybe a
Just Extension
TH.MonomorphismRestriction
  KnownExtension
Exts.FunctionalDependencies     -> forall a. a -> Maybe a
Just Extension
TH.FunctionalDependencies
  KnownExtension
Exts.Rank2Types                 -> forall a. Maybe a
Nothing
  KnownExtension
Exts.RankNTypes                 -> forall a. a -> Maybe a
Just Extension
TH.RankNTypes
  KnownExtension
Exts.PolymorphicComponents      -> forall a. Maybe a
Nothing
  KnownExtension
Exts.ExistentialQuantification  -> forall a. a -> Maybe a
Just Extension
TH.ExistentialQuantification
  KnownExtension
Exts.ScopedTypeVariables        -> forall a. a -> Maybe a
Just Extension
TH.ScopedTypeVariables
  KnownExtension
Exts.PatternSignatures          -> forall a. Maybe a
Nothing
  KnownExtension
Exts.ImplicitParams             -> forall a. a -> Maybe a
Just Extension
TH.ImplicitParams
  KnownExtension
Exts.FlexibleContexts           -> forall a. a -> Maybe a
Just Extension
TH.FlexibleContexts
  KnownExtension
Exts.FlexibleInstances          -> forall a. a -> Maybe a
Just Extension
TH.FlexibleInstances
  KnownExtension
Exts.EmptyDataDecls             -> forall a. a -> Maybe a
Just Extension
TH.EmptyDataDecls
  KnownExtension
Exts.CPP                        -> forall a. a -> Maybe a
Just Extension
TH.Cpp
  KnownExtension
Exts.KindSignatures             -> forall a. a -> Maybe a
Just Extension
TH.KindSignatures
  KnownExtension
Exts.BangPatterns               -> forall a. a -> Maybe a
Just Extension
TH.BangPatterns
  KnownExtension
Exts.TypeSynonymInstances       -> forall a. a -> Maybe a
Just Extension
TH.TypeSynonymInstances
  KnownExtension
Exts.TemplateHaskell            -> forall a. a -> Maybe a
Just Extension
TH.TemplateHaskell
  KnownExtension
Exts.ForeignFunctionInterface   -> forall a. a -> Maybe a
Just Extension
TH.ForeignFunctionInterface
  KnownExtension
Exts.Arrows                     -> forall a. a -> Maybe a
Just Extension
TH.Arrows
  KnownExtension
Exts.Generics                   -> forall a. Maybe a
Nothing
  KnownExtension
Exts.ImplicitPrelude            -> forall a. a -> Maybe a
Just Extension
TH.ImplicitPrelude
  KnownExtension
Exts.NamedFieldPuns             -> forall a. Maybe a
Nothing
  KnownExtension
Exts.PatternGuards              -> forall a. a -> Maybe a
Just Extension
TH.PatternGuards
  KnownExtension
Exts.GeneralizedNewtypeDeriving -> forall a. a -> Maybe a
Just Extension
TH.GeneralizedNewtypeDeriving
  KnownExtension
Exts.DeriveAnyClass             -> forall a. a -> Maybe a
Just Extension
TH.DeriveAnyClass
  KnownExtension
Exts.ExtensibleRecords          -> forall a. Maybe a
Nothing
  KnownExtension
Exts.RestrictedTypeSynonyms     -> forall a. Maybe a
Nothing
  KnownExtension
Exts.HereDocuments              -> forall a. Maybe a
Nothing
  KnownExtension
Exts.MagicHash                  -> forall a. a -> Maybe a
Just Extension
TH.MagicHash
  KnownExtension
Exts.BinaryLiterals             -> forall a. a -> Maybe a
Just Extension
TH.BinaryLiterals
  KnownExtension
Exts.TypeFamilies               -> forall a. a -> Maybe a
Just Extension
TH.TypeFamilies
  KnownExtension
Exts.StandaloneDeriving         -> forall a. a -> Maybe a
Just Extension
TH.StandaloneDeriving
  KnownExtension
Exts.UnicodeSyntax              -> forall a. a -> Maybe a
Just Extension
TH.UnicodeSyntax
  KnownExtension
Exts.UnliftedFFITypes           -> forall a. a -> Maybe a
Just Extension
TH.UnliftedFFITypes
  KnownExtension
Exts.LiberalTypeSynonyms        -> forall a. a -> Maybe a
Just Extension
TH.LiberalTypeSynonyms
  KnownExtension
Exts.TypeOperators              -> forall a. a -> Maybe a
Just Extension
TH.TypeOperators
  KnownExtension
Exts.ParallelArrays             -> forall a. a -> Maybe a
Just Extension
TH.ParallelArrays
  KnownExtension
Exts.RecordWildCards            -> forall a. a -> Maybe a
Just Extension
TH.RecordWildCards
#if __GLASGOW_HASKELL__ >= 904
  Exts.RecordPuns                 -> Just TH.NamedFieldPuns
#else
  KnownExtension
Exts.RecordPuns                 -> forall a. a -> Maybe a
Just Extension
TH.RecordPuns
#endif
  KnownExtension
Exts.DisambiguateRecordFields   -> forall a. a -> Maybe a
Just Extension
TH.DisambiguateRecordFields
  KnownExtension
Exts.OverloadedStrings          -> forall a. a -> Maybe a
Just Extension
TH.OverloadedStrings
  KnownExtension
Exts.GADTs                      -> forall a. a -> Maybe a
Just Extension
TH.GADTs
  KnownExtension
Exts.MonoPatBinds               ->
#if !MIN_VERSION_template_haskell(2,18,0)
    Just TH.MonoPatBinds
#else
    forall a. Maybe a
Nothing
#endif
  KnownExtension
Exts.RelaxedPolyRec             -> forall a. a -> Maybe a
Just Extension
TH.RelaxedPolyRec
  KnownExtension
Exts.ExtendedDefaultRules       -> forall a. a -> Maybe a
Just Extension
TH.ExtendedDefaultRules
  KnownExtension
Exts.UnboxedTuples              -> forall a. a -> Maybe a
Just Extension
TH.UnboxedTuples
  KnownExtension
Exts.DeriveDataTypeable         -> forall a. a -> Maybe a
Just Extension
TH.DeriveDataTypeable
  KnownExtension
Exts.ConstrainedClassMethods    -> forall a. a -> Maybe a
Just Extension
TH.ConstrainedClassMethods
  KnownExtension
Exts.PackageImports             -> forall a. a -> Maybe a
Just Extension
TH.PackageImports
  KnownExtension
Exts.LambdaCase                 -> forall a. a -> Maybe a
Just Extension
TH.LambdaCase
  KnownExtension
Exts.EmptyCase                  -> forall a. a -> Maybe a
Just Extension
TH.EmptyCase
  KnownExtension
Exts.ImpredicativeTypes         -> forall a. a -> Maybe a
Just Extension
TH.ImpredicativeTypes
  KnownExtension
Exts.NewQualifiedOperators      -> forall a. Maybe a
Nothing
  KnownExtension
Exts.PostfixOperators           -> forall a. a -> Maybe a
Just Extension
TH.PostfixOperators
  KnownExtension
Exts.QuasiQuotes                -> forall a. a -> Maybe a
Just Extension
TH.QuasiQuotes
  KnownExtension
Exts.TransformListComp          -> forall a. a -> Maybe a
Just Extension
TH.TransformListComp
  KnownExtension
Exts.ViewPatterns               -> forall a. a -> Maybe a
Just Extension
TH.ViewPatterns
  KnownExtension
Exts.XmlSyntax                  -> forall a. Maybe a
Nothing
  KnownExtension
Exts.RegularPatterns            -> forall a. Maybe a
Nothing
  KnownExtension
Exts.TupleSections              -> forall a. a -> Maybe a
Just Extension
TH.TupleSections
  KnownExtension
Exts.GHCForeignImportPrim       -> forall a. a -> Maybe a
Just Extension
TH.GHCForeignImportPrim
  KnownExtension
Exts.NPlusKPatterns             -> forall a. a -> Maybe a
Just Extension
TH.NPlusKPatterns
  KnownExtension
Exts.DoAndIfThenElse            -> forall a. a -> Maybe a
Just Extension
TH.DoAndIfThenElse
  KnownExtension
Exts.RebindableSyntax           -> forall a. a -> Maybe a
Just Extension
TH.RebindableSyntax
  KnownExtension
Exts.ExplicitForAll             -> forall a. a -> Maybe a
Just Extension
TH.ExplicitForAll
  KnownExtension
Exts.DatatypeContexts           -> forall a. a -> Maybe a
Just Extension
TH.DatatypeContexts
  KnownExtension
Exts.MonoLocalBinds             -> forall a. a -> Maybe a
Just Extension
TH.MonoLocalBinds
  KnownExtension
Exts.DeriveFunctor              -> forall a. a -> Maybe a
Just Extension
TH.DeriveFunctor
  KnownExtension
Exts.DeriveGeneric              -> forall a. a -> Maybe a
Just Extension
TH.DeriveGeneric
  KnownExtension
Exts.DeriveTraversable          -> forall a. a -> Maybe a
Just Extension
TH.DeriveTraversable
  KnownExtension
Exts.DeriveFoldable             -> forall a. a -> Maybe a
Just Extension
TH.DeriveFoldable
  KnownExtension
Exts.NondecreasingIndentation   -> forall a. a -> Maybe a
Just Extension
TH.NondecreasingIndentation
  KnownExtension
Exts.InterruptibleFFI           -> forall a. a -> Maybe a
Just Extension
TH.InterruptibleFFI
  KnownExtension
Exts.CApiFFI                    -> forall a. a -> Maybe a
Just Extension
TH.CApiFFI
  KnownExtension
Exts.JavaScriptFFI              -> forall a. a -> Maybe a
Just Extension
TH.JavaScriptFFI
  KnownExtension
Exts.ExplicitNamespaces         -> forall a. a -> Maybe a
Just Extension
TH.ExplicitNamespaces
  KnownExtension
Exts.DataKinds                  -> forall a. a -> Maybe a
Just Extension
TH.DataKinds
  KnownExtension
Exts.PolyKinds                  -> forall a. a -> Maybe a
Just Extension
TH.PolyKinds
  KnownExtension
Exts.MultiWayIf                 -> forall a. a -> Maybe a
Just Extension
TH.MultiWayIf
  KnownExtension
Exts.SafeImports                -> forall a. Maybe a
Nothing
  KnownExtension
Exts.Safe                       -> forall a. Maybe a
Nothing
  KnownExtension
Exts.Trustworthy                -> forall a. Maybe a
Nothing
  KnownExtension
Exts.DefaultSignatures          -> forall a. a -> Maybe a
Just Extension
TH.DefaultSignatures
  KnownExtension
Exts.ConstraintKinds            -> forall a. a -> Maybe a
Just Extension
TH.ConstraintKinds
  KnownExtension
Exts.RoleAnnotations            -> forall a. a -> Maybe a
Just Extension
TH.RoleAnnotations
  KnownExtension
Exts.PatternSynonyms            -> forall a. a -> Maybe a
Just Extension
TH.PatternSynonyms
  KnownExtension
Exts.PartialTypeSignatures      -> forall a. a -> Maybe a
Just Extension
TH.PartialTypeSignatures
  KnownExtension
Exts.NamedWildCards             -> forall a. a -> Maybe a
Just Extension
TH.NamedWildCards
  KnownExtension
Exts.TypeApplications           -> forall a. a -> Maybe a
Just Extension
TH.TypeApplications
  KnownExtension
Exts.TypeFamilyDependencies     -> forall a. a -> Maybe a
Just Extension
TH.TypeFamilyDependencies
  KnownExtension
Exts.OverloadedLabels           -> forall a. a -> Maybe a
Just Extension
TH.OverloadedLabels
  KnownExtension
Exts.DerivingStrategies         -> forall a. a -> Maybe a
Just Extension
TH.DerivingStrategies
  KnownExtension
Exts.UnboxedSums                -> forall a. a -> Maybe a
Just Extension
TH.UnboxedSums
#if MIN_VERSION_haskell_src_exts(1,21,0)
  KnownExtension
Exts.TypeInType                 -> forall a. a -> Maybe a
Just Extension
TH.TypeInType
#endif
  KnownExtension
Exts.Strict                     -> forall a. a -> Maybe a
Just Extension
TH.Strict
  KnownExtension
Exts.StrictData                 -> forall a. a -> Maybe a
Just Extension
TH.StrictData

#if MIN_VERSION_haskell_src_exts(1,21,0)
  KnownExtension
Exts.DerivingVia                ->
#if MIN_VERSION_template_haskell(2,14,0)
    forall a. a -> Maybe a
Just Extension
TH.DerivingVia
#else
    Nothing
#endif
#endif

#if MIN_VERSION_haskell_src_exts(1,22,0)
  KnownExtension
Exts.QuantifiedConstraints      ->
#if MIN_VERSION_template_haskell(2,14,0)
    forall a. a -> Maybe a
Just Extension
TH.QuantifiedConstraints
#else
    Nothing
#endif
#endif

#if MIN_VERSION_haskell_src_exts(1,23,0)
  KnownExtension
Exts.BlockArguments             ->
#if MIN_VERSION_template_haskell(2,14,0)
    forall a. a -> Maybe a
Just Extension
TH.BlockArguments
#else
    Nothing
#endif
#endif

  -- NB: when adding a case here, you may also need to update `fromExtension`


-----------------------------------------------------------------------------

-- * From template-haskell

-- | Returns @Nothing@ when the extension is not supported by haskell-src-exts.
fromExtension :: TH.Extension -> Maybe Exts.KnownExtension
fromExtension :: Extension -> Maybe KnownExtension
fromExtension Extension
e = case Extension
e of
  Extension
TH.Cpp                               -> forall a. a -> Maybe a
Just KnownExtension
Exts.CPP
  Extension
TH.OverlappingInstances              -> forall a. a -> Maybe a
Just KnownExtension
Exts.OverlappingInstances
  Extension
TH.UndecidableInstances              -> forall a. a -> Maybe a
Just KnownExtension
Exts.UndecidableInstances
  Extension
TH.IncoherentInstances               -> forall a. a -> Maybe a
Just KnownExtension
Exts.IncoherentInstances
  Extension
TH.UndecidableSuperClasses           -> forall a. Maybe a
Nothing
  Extension
TH.MonomorphismRestriction           -> forall a. a -> Maybe a
Just KnownExtension
Exts.MonomorphismRestriction
#if !MIN_VERSION_template_haskell(2,18,0)
  TH.MonoPatBinds                      -> Just Exts.MonoPatBinds
#endif
  Extension
TH.MonoLocalBinds                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.MonoLocalBinds
  Extension
TH.RelaxedPolyRec                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.RelaxedPolyRec
  Extension
TH.ExtendedDefaultRules              -> forall a. a -> Maybe a
Just KnownExtension
Exts.ExtendedDefaultRules
  Extension
TH.ForeignFunctionInterface          -> forall a. a -> Maybe a
Just KnownExtension
Exts.ForeignFunctionInterface
  Extension
TH.UnliftedFFITypes                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.UnliftedFFITypes
  Extension
TH.InterruptibleFFI                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.InterruptibleFFI
  Extension
TH.CApiFFI                           -> forall a. a -> Maybe a
Just KnownExtension
Exts.CApiFFI
  Extension
TH.GHCForeignImportPrim              -> forall a. a -> Maybe a
Just KnownExtension
Exts.GHCForeignImportPrim
  Extension
TH.JavaScriptFFI                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.JavaScriptFFI
  Extension
TH.ParallelArrays                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.ParallelArrays
  Extension
TH.Arrows                            -> forall a. a -> Maybe a
Just KnownExtension
Exts.Arrows
  Extension
TH.TemplateHaskell                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.TemplateHaskell
  Extension
TH.TemplateHaskellQuotes             -> forall a. Maybe a
Nothing
  Extension
TH.QuasiQuotes                       -> forall a. a -> Maybe a
Just KnownExtension
Exts.QuasiQuotes
  Extension
TH.ImplicitParams                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.ImplicitParams
  Extension
TH.ImplicitPrelude                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.ImplicitPrelude
  Extension
TH.ScopedTypeVariables               -> forall a. a -> Maybe a
Just KnownExtension
Exts.ScopedTypeVariables
  Extension
TH.AllowAmbiguousTypes               -> forall a. Maybe a
Nothing
  Extension
TH.UnboxedTuples                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.UnboxedTuples
  Extension
TH.UnboxedSums                       -> forall a. a -> Maybe a
Just KnownExtension
Exts.UnboxedSums
  Extension
TH.BangPatterns                      -> forall a. a -> Maybe a
Just KnownExtension
Exts.BangPatterns
  Extension
TH.TypeFamilies                      -> forall a. a -> Maybe a
Just KnownExtension
Exts.TypeFamilies
  Extension
TH.TypeFamilyDependencies            -> forall a. a -> Maybe a
Just KnownExtension
Exts.TypeFamilyDependencies
  Extension
TH.TypeInType                        ->
#if MIN_VERSION_haskell_src_exts(1,21,0)
    forall a. a -> Maybe a
Just KnownExtension
Exts.TypeInType
#else
    Nothing
#endif
  Extension
TH.OverloadedStrings                 -> forall a. a -> Maybe a
Just KnownExtension
Exts.OverloadedStrings
  Extension
TH.OverloadedLists                   -> forall a. Maybe a
Nothing
  Extension
TH.NumDecimals                       -> forall a. Maybe a
Nothing
  Extension
TH.DisambiguateRecordFields          -> forall a. a -> Maybe a
Just KnownExtension
Exts.DisambiguateRecordFields
  Extension
TH.RecordWildCards                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.RecordWildCards
#if __GLASGOW_HASKELL__ >= 904
  TH.NamedFieldPuns                    -> Just Exts.RecordPuns
  TH.QualifiedDo                       -> Nothing
  TH.UnliftedDatatypes -> Nothing
  TH.LinearTypes -> Nothing
  TH.LexicalNegation -> Nothing
  TH.FieldSelectors -> Nothing
  TH.OverloadedRecordDot -> Nothing
  TH.OverloadedRecordUpdate -> Nothing
#else
  Extension
TH.RecordPuns                        -> forall a. a -> Maybe a
Just KnownExtension
Exts.RecordPuns
#endif
  Extension
TH.ViewPatterns                      -> forall a. a -> Maybe a
Just KnownExtension
Exts.ViewPatterns
  Extension
TH.GADTs                             -> forall a. a -> Maybe a
Just KnownExtension
Exts.GADTs
  Extension
TH.GADTSyntax                        -> forall a. Maybe a
Nothing
  Extension
TH.NPlusKPatterns                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.NPlusKPatterns
  Extension
TH.DoAndIfThenElse                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.DoAndIfThenElse
  Extension
TH.RebindableSyntax                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.RebindableSyntax
  Extension
TH.ConstraintKinds                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.ConstraintKinds
  Extension
TH.PolyKinds                         -> forall a. a -> Maybe a
Just KnownExtension
Exts.PolyKinds
  Extension
TH.DataKinds                         -> forall a. a -> Maybe a
Just KnownExtension
Exts.DataKinds
  Extension
TH.InstanceSigs                      -> forall a. a -> Maybe a
Just KnownExtension
Exts.InstanceSigs
  Extension
TH.ApplicativeDo                     -> forall a. Maybe a
Nothing
  Extension
TH.StandaloneDeriving                -> forall a. a -> Maybe a
Just KnownExtension
Exts.StandaloneDeriving
  Extension
TH.DeriveDataTypeable                -> forall a. a -> Maybe a
Just KnownExtension
Exts.DeriveDataTypeable
  Extension
TH.AutoDeriveTypeable                -> forall a. Maybe a
Nothing
  Extension
TH.DeriveFunctor                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.DeriveFunctor
  Extension
TH.DeriveTraversable                 -> forall a. a -> Maybe a
Just KnownExtension
Exts.DeriveTraversable
  Extension
TH.DeriveFoldable                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.DeriveFoldable
  Extension
TH.DeriveGeneric                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.DeriveGeneric
  Extension
TH.DefaultSignatures                 -> forall a. a -> Maybe a
Just KnownExtension
Exts.DefaultSignatures
  Extension
TH.DeriveAnyClass                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.DeriveAnyClass
  Extension
TH.DeriveLift                        -> forall a. Maybe a
Nothing
  Extension
TH.DerivingStrategies                -> forall a. a -> Maybe a
Just KnownExtension
Exts.DerivingStrategies
  Extension
TH.TypeSynonymInstances              -> forall a. a -> Maybe a
Just KnownExtension
Exts.TypeSynonymInstances
  Extension
TH.FlexibleContexts                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.FlexibleContexts
  Extension
TH.FlexibleInstances                 -> forall a. a -> Maybe a
Just KnownExtension
Exts.FlexibleInstances
  Extension
TH.ConstrainedClassMethods           -> forall a. a -> Maybe a
Just KnownExtension
Exts.ConstrainedClassMethods
  Extension
TH.MultiParamTypeClasses             -> forall a. a -> Maybe a
Just KnownExtension
Exts.MultiParamTypeClasses
  Extension
TH.NullaryTypeClasses                -> forall a. Maybe a
Nothing
  Extension
TH.FunctionalDependencies            -> forall a. a -> Maybe a
Just KnownExtension
Exts.FunctionalDependencies
  Extension
TH.UnicodeSyntax                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.UnicodeSyntax
  Extension
TH.ExistentialQuantification         -> forall a. a -> Maybe a
Just KnownExtension
Exts.ExistentialQuantification
  Extension
TH.MagicHash                         -> forall a. a -> Maybe a
Just KnownExtension
Exts.MagicHash
  Extension
TH.EmptyDataDecls                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.EmptyDataDecls
  Extension
TH.KindSignatures                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.KindSignatures
  Extension
TH.RoleAnnotations                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.RoleAnnotations
  Extension
TH.ParallelListComp                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.ParallelListComp
  Extension
TH.TransformListComp                 -> forall a. a -> Maybe a
Just KnownExtension
Exts.TransformListComp
  Extension
TH.MonadComprehensions               -> forall a. Maybe a
Nothing
  Extension
TH.GeneralizedNewtypeDeriving        -> forall a. a -> Maybe a
Just KnownExtension
Exts.GeneralizedNewtypeDeriving
  Extension
TH.RecursiveDo                       -> forall a. a -> Maybe a
Just KnownExtension
Exts.RecursiveDo
  Extension
TH.PostfixOperators                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.PostfixOperators
  Extension
TH.TupleSections                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.TupleSections
  Extension
TH.PatternGuards                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.PatternGuards
  Extension
TH.LiberalTypeSynonyms               -> forall a. a -> Maybe a
Just KnownExtension
Exts.LiberalTypeSynonyms
  Extension
TH.RankNTypes                        -> forall a. a -> Maybe a
Just KnownExtension
Exts.RankNTypes
  Extension
TH.ImpredicativeTypes                -> forall a. a -> Maybe a
Just KnownExtension
Exts.ImpredicativeTypes
  Extension
TH.TypeOperators                     -> forall a. a -> Maybe a
Just KnownExtension
Exts.TypeOperators
  Extension
TH.ExplicitNamespaces                -> forall a. a -> Maybe a
Just KnownExtension
Exts.ExplicitNamespaces
  Extension
TH.PackageImports                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.PackageImports
  Extension
TH.ExplicitForAll                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.ExplicitForAll
  Extension
TH.AlternativeLayoutRule             -> forall a. Maybe a
Nothing
  Extension
TH.AlternativeLayoutRuleTransitional -> forall a. Maybe a
Nothing
  Extension
TH.DatatypeContexts                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.DatatypeContexts
  Extension
TH.NondecreasingIndentation          -> forall a. a -> Maybe a
Just KnownExtension
Exts.NondecreasingIndentation
  Extension
TH.RelaxedLayout                     -> forall a. Maybe a
Nothing
  Extension
TH.TraditionalRecordSyntax           -> forall a. Maybe a
Nothing
  Extension
TH.LambdaCase                        -> forall a. a -> Maybe a
Just KnownExtension
Exts.LambdaCase
  Extension
TH.MultiWayIf                        -> forall a. a -> Maybe a
Just KnownExtension
Exts.MultiWayIf
  Extension
TH.BinaryLiterals                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.BinaryLiterals
  Extension
TH.NegativeLiterals                  -> forall a. Maybe a
Nothing
  Extension
TH.DuplicateRecordFields             -> forall a. Maybe a
Nothing
  Extension
TH.OverloadedLabels                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.OverloadedLabels
  Extension
TH.EmptyCase                         -> forall a. a -> Maybe a
Just KnownExtension
Exts.EmptyCase
  Extension
TH.PatternSynonyms                   -> forall a. a -> Maybe a
Just KnownExtension
Exts.PatternSynonyms
  Extension
TH.PartialTypeSignatures             -> forall a. a -> Maybe a
Just KnownExtension
Exts.PartialTypeSignatures
  Extension
TH.NamedWildCards                    -> forall a. a -> Maybe a
Just KnownExtension
Exts.NamedWildCards
  Extension
TH.StaticPointers                    -> forall a. Maybe a
Nothing
  Extension
TH.TypeApplications                  -> forall a. a -> Maybe a
Just KnownExtension
Exts.TypeApplications
  Extension
TH.Strict                            -> forall a. a -> Maybe a
Just KnownExtension
Exts.Strict
  Extension
TH.StrictData                        -> forall a. a -> Maybe a
Just KnownExtension
Exts.StrictData
#if !MIN_VERSION_template_haskell(2,18,0)
  TH.MonadFailDesugaring               -> Nothing
#endif

-- 2.13.0 ----------------------------------------
#if MIN_VERSION_template_haskell(2,13,0)
  Extension
TH.HexFloatLiterals                  -> forall a. Maybe a
Nothing
  Extension
TH.EmptyDataDeriving                 -> forall a. Maybe a
Nothing
#endif

-- 2.14.0 ----------------------------------------
#if MIN_VERSION_template_haskell(2,14,0)

  Extension
TH.DerivingVia                       ->
#if MIN_VERSION_haskell_src_exts(1,21,0)
    forall a. a -> Maybe a
Just KnownExtension
Exts.DerivingVia
#else
    Nothing
#endif

  Extension
TH.QuantifiedConstraints             ->
#if MIN_VERSION_haskell_src_exts(1,22,0)
    forall a. a -> Maybe a
Just KnownExtension
Exts.QuantifiedConstraints
#else
    Nothing
#endif

  Extension
TH.BlockArguments                    ->
#if MIN_VERSION_haskell_src_exts(1,23,0)
    forall a. a -> Maybe a
Just KnownExtension
Exts.BlockArguments
#else
    Nothing
#endif

  Extension
TH.NumericUnderscores                -> forall a. Maybe a
Nothing
  Extension
TH.StarIsType                        -> forall a. Maybe a
Nothing
#endif

-- 2.16.0 ----------------------------------------
#if MIN_VERSION_template_haskell(2,16,0)
  Extension
TH.UnliftedNewtypes                  -> forall a. Maybe a
Nothing
  Extension
TH.ImportQualifiedPost               -> forall a. Maybe a
Nothing
  Extension
TH.CUSKs                             -> forall a. Maybe a
Nothing
  Extension
TH.StandaloneKindSignatures          -> forall a. Maybe a
Nothing
#endif

-- 2.19.0 ---------------------------------------

#if MIN_VERSION_template_haskell(2,19,0)
  TH.DeepSubsumption                   -> Nothing
#endif

  -- NB: when adding a case here, you may also need to update `toExtension`


-----------------------------------------------------------------------------