module PyF.Internal.Extensions
  ( thExtToMetaExt
  ) where

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


-- | Associate a template haskell extension to an haskell-src-ext extension
thExtToMetaExt :: TH.Extension -> Maybe Exts.Extension
thExtToMetaExt e = Exts.EnableExtension <$> case e of
  TH.Cpp -> Just Exts.CPP -- LOL, different case ;)
  TH.OverlappingInstances -> Just Exts.OverlappingInstances
  TH.UndecidableInstances -> Just Exts.UndecidableInstances
  TH.IncoherentInstances -> Just Exts.IncoherentInstances
  TH.MonomorphismRestriction -> Just Exts.MonomorphismRestriction
  TH.MonoPatBinds -> Just Exts.MonoPatBinds
  TH.MonoLocalBinds -> Just Exts.MonoLocalBinds
  TH.RelaxedPolyRec -> Just Exts.RelaxedPolyRec
  TH.ExtendedDefaultRules -> Just Exts.ExtendedDefaultRules
  TH.ForeignFunctionInterface -> Just Exts.ForeignFunctionInterface
  TH.UnliftedFFITypes -> Just Exts.UnliftedFFITypes
  TH.InterruptibleFFI -> Just Exts.InterruptibleFFI
  TH.CApiFFI -> Just Exts.CApiFFI
  TH.GHCForeignImportPrim -> Just Exts.GHCForeignImportPrim
  TH.JavaScriptFFI -> Just Exts.JavaScriptFFI
  TH.ParallelArrays -> Just Exts.ParallelArrays
  TH.Arrows -> Just Exts.Arrows
  TH.TemplateHaskell -> Just Exts.TemplateHaskell
  TH.QuasiQuotes -> Just Exts.QuasiQuotes
  TH.ImplicitParams -> Just Exts.ImplicitParams
  TH.ImplicitPrelude -> Just Exts.ImplicitPrelude
  TH.ScopedTypeVariables -> Just Exts.ScopedTypeVariables
  TH.UnboxedSums -> Just Exts.UnboxedSums
  TH.BangPatterns -> Just Exts.BangPatterns
  TH.TypeFamilies -> Just Exts.TypeFamilies
  TH.TypeFamilyDependencies -> Just Exts.TypeFamilyDependencies
  TH.OverloadedStrings -> Just Exts.OverloadedStrings
  TH.DisambiguateRecordFields -> Just Exts.DisambiguateRecordFields
  TH.RecordWildCards -> Just Exts.RecordWildCards
  TH.RecordPuns -> Just Exts.RecordPuns
  TH.ViewPatterns -> Just Exts.ViewPatterns
  TH.GADTs -> Just Exts.GADTs
  TH.NPlusKPatterns -> Just Exts.NPlusKPatterns
  TH.DoAndIfThenElse -> Just Exts.DoAndIfThenElse
  TH.RebindableSyntax -> Just Exts.RebindableSyntax
  TH.ConstraintKinds -> Just Exts.ConstraintKinds
  TH.PolyKinds -> Just Exts.PolyKinds
  TH.DataKinds -> Just Exts.DataKinds
  TH.InstanceSigs -> Just Exts.InstanceSigs
  TH.StandaloneDeriving -> Just Exts.StandaloneDeriving
  TH.DeriveDataTypeable -> Just Exts.DeriveDataTypeable
  TH.DeriveFunctor -> Just Exts.DeriveFunctor
  TH.DeriveTraversable -> Just Exts.DeriveTraversable
  TH.DeriveFoldable -> Just Exts.DeriveFoldable
  TH.DeriveGeneric -> Just Exts.DeriveGeneric
  TH.DefaultSignatures -> Just Exts.DefaultSignatures
  TH.DeriveAnyClass -> Just Exts.DeriveAnyClass
  TH.DerivingStrategies -> Just Exts.DerivingStrategies
  TH.TypeSynonymInstances -> Just Exts.TypeSynonymInstances
  TH.FlexibleContexts -> Just Exts.FlexibleContexts
  TH.FlexibleInstances -> Just Exts.FlexibleInstances
  TH.ConstrainedClassMethods -> Just Exts.ConstrainedClassMethods
  TH.MultiParamTypeClasses -> Just Exts.MultiParamTypeClasses
  TH.FunctionalDependencies -> Just Exts.FunctionalDependencies
  TH.UnicodeSyntax -> Just Exts.UnicodeSyntax
  TH.ExistentialQuantification -> Just Exts.ExistentialQuantification
  TH.MagicHash -> Just Exts.MagicHash
  TH.EmptyDataDecls -> Just Exts.EmptyDataDecls
  TH.KindSignatures -> Just Exts.KindSignatures
  TH.RoleAnnotations -> Just Exts.RoleAnnotations
  TH.ParallelListComp -> Just Exts.ParallelListComp
  TH.TransformListComp -> Just Exts.TransformListComp
  TH.GeneralizedNewtypeDeriving -> Just Exts.GeneralizedNewtypeDeriving
  TH.RecursiveDo -> Just Exts.RecursiveDo
  TH.PostfixOperators -> Just Exts.PostfixOperators
  TH.TupleSections -> Just Exts.TupleSections
  TH.PatternGuards -> Just Exts.PatternGuards
  TH.LiberalTypeSynonyms -> Just Exts.LiberalTypeSynonyms
  TH.RankNTypes -> Just Exts.RankNTypes
  TH.ImpredicativeTypes -> Just Exts.ImpredicativeTypes
  TH.TypeOperators -> Just Exts.TypeOperators
  TH.ExplicitNamespaces -> Just Exts.ExplicitNamespaces
  TH.PackageImports -> Just Exts.PackageImports
  TH.ExplicitForAll -> Just Exts.ExplicitForAll
  TH.DatatypeContexts -> Just Exts.DatatypeContexts
  TH.NondecreasingIndentation -> Just Exts.NondecreasingIndentation
  TH.LambdaCase -> Just Exts.LambdaCase
  TH.MultiWayIf -> Just Exts.MultiWayIf
  TH.BinaryLiterals -> Just Exts.BinaryLiterals
  TH.OverloadedLabels -> Just Exts.OverloadedLabels
  TH.EmptyCase -> Just Exts.EmptyCase
  TH.PatternSynonyms -> Just Exts.PatternSynonyms
  TH.PartialTypeSignatures -> Just Exts.PartialTypeSignatures
  TH.NamedWildCards -> Just Exts.NamedWildCards
  TH.TypeApplications -> Just Exts.TypeApplications

  -- Theses extensions have no associated extensions in haskell-src-exts
  TH.UndecidableSuperClasses -> Nothing
  TH.TemplateHaskellQuotes -> Nothing
  TH.AllowAmbiguousTypes -> Nothing
  TH.UnboxedTuples -> Nothing
  TH.TypeInType -> Nothing
  TH.OverloadedLists -> Nothing
  TH.NumDecimals -> Nothing
  TH.GADTSyntax -> Nothing
  TH.BlockArguments -> Nothing
  TH.ApplicativeDo -> Nothing
  TH.AutoDeriveTypeable -> Nothing
  TH.DeriveLift -> Nothing
  TH.DerivingVia -> Nothing
  TH.NullaryTypeClasses -> Nothing
  TH.MonadComprehensions -> Nothing
  TH.AlternativeLayoutRule -> Nothing
  TH.AlternativeLayoutRuleTransitional -> Nothing
  TH.RelaxedLayout -> Nothing
  TH.TraditionalRecordSyntax -> Nothing
  TH.NegativeLiterals -> Nothing
  TH.HexFloatLiterals -> Nothing
  TH.DuplicateRecordFields -> Nothing
  TH.StaticPointers -> Nothing
  TH.Strict -> Nothing
  TH.StrictData -> Nothing
  TH.MonadFailDesugaring -> Nothing
  TH.EmptyDataDeriving -> Nothing
  TH.NumericUnderscores -> Nothing
  TH.QuantifiedConstraints -> Nothing
  TH.StarIsType -> Nothing
