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

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

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

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

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

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

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

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

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

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

-- 2.16.0 ----------------------------------------
#if MIN_VERSION_template_haskell(2,16,0)
  TH.UnliftedNewtypes                  -> Nothing
  TH.ImportQualifiedPost               -> Nothing
  TH.CUSKs                             -> Nothing
  TH.StandaloneKindSignatures          -> 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`


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