packages feed

hs-bindgen-1.0.0.0: src-internal/HsBindgen/Frontend/Pass/SimplifyAST/IsPass.hs

module HsBindgen.Frontend.Pass.SimplifyAST.IsPass (
    SimplifyAST
    -- * Trace messages
  , SimplifyASTMsg(..)
  ) where

import Text.SimplePrettyPrint qualified as PP

import HsBindgen.Frontend.Pass.Parse.IsPass
import HsBindgen.Imports
import HsBindgen.IR.C qualified as C
import HsBindgen.IR.Pass
import HsBindgen.IR.Pass.Types (CoercePassAnonRef)
import HsBindgen.Macro.Interface qualified as Macro
import HsBindgen.Util.Tracer

{-------------------------------------------------------------------------------
  Definition
-------------------------------------------------------------------------------}

type SimplifyAST :: Pass
data SimplifyAST a

-- Preserve annotations from @Parse@ pass
type family AnnSimplifyAST (ix :: Symbol) where
  AnnSimplifyAST "Function"      = ReparseInfo Tokens
  AnnSimplifyAST "Global"        = ReparseInfo Tokens
  AnnSimplifyAST "ImplicitField" = FieldOrigin
  AnnSimplifyAST "IndirectField" = ReparseInfo Tokens
  AnnSimplifyAST "RegularField"  = ReparseInfo Tokens
  AnnSimplifyAST "Struct"        = IsAnon
  AnnSimplifyAST "Typedef"       = ReparseInfo Tokens
  AnnSimplifyAST "Union"         = IsAnon
  AnnSimplifyAST _               = NoAnn

instance IsPass SimplifyAST

instance PassId SimplifyAST where
  type Id SimplifyAST = C.PrelimDeclId

  idNameKind     _ = C.prelimDeclIdNameKind
  idSourceName   _ = C.prelimDeclIdSourceName
  idLocationInfo _ = C.prelimDeclIdLocationInfo

instance PassScopedName SimplifyAST

instance PassTypes SimplifyAST

instance PassMacro SimplifyAST where
  type MacroBody SimplifyAST = Macro.Unresolved

instance PassExtBinding SimplifyAST

instance PassCommentDecl SimplifyAST

instance PassAnn SimplifyAST where
  type Ann ix SimplifyAST = AnnSimplifyAST ix

instance PassMsg SimplifyAST where
  type Msg SimplifyAST = SimplifyASTMsg

{-------------------------------------------------------------------------------
  CoercePass: Parse
-------------------------------------------------------------------------------}

instance CoercePassAnonRef             Parse SimplifyAST
instance CoercePassId                  Parse SimplifyAST
instance CoercePassMacroBody           Parse SimplifyAST
instance CoercePassMacroId             Parse SimplifyAST
instance CoercePassMacroUnderlying     Parse SimplifyAST
instance CoercePassTypes               Parse SimplifyAST
instance CoercePassAnn "Global"        Parse SimplifyAST
instance CoercePassAnn "IndirectField" Parse SimplifyAST
instance CoercePassAnn "TypeFunArg"    Parse SimplifyAST
instance CoercePassCommentDecl         Parse SimplifyAST

{-------------------------------------------------------------------------------
  Trace messages
-------------------------------------------------------------------------------}

data SimplifyASTMsg =
    SimplifyASTUntaggedEnum C.UnnamedId
  deriving stock (Show, Generic)

instance PrettyForTrace SimplifyASTMsg where
  prettyForTrace = \case
      SimplifyASTUntaggedEnum unnamedId -> PP.hsep [
          "Transformed untagged enum: "
        , prettyForTrace unnamedId
        , "into constant patterns."
        ]

instance IsTrace Level SimplifyASTMsg where
  getDefaultLogLevel = \case
      SimplifyASTUntaggedEnum{} -> Info

  getSource  = const HsBindgen
  getTraceId = const "simplify-ast"