packages feed

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

module HsBindgen.Frontend.Pass.FillUnnamedIds.IsPass (
    FillUnnamedIds
  , ImmediateFillUnnamedIdsMsg(..)
  ) 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.Macro.Interface qualified as Macro
import HsBindgen.Util.Tracer

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

type FillUnnamedIds :: Pass
data FillUnnamedIds a

-- We preserve the annotations from the @Parse@ pass
type family AnnFillUnnamedIds ix where
  AnnFillUnnamedIds "Function"      = ReparseInfo Tokens
  AnnFillUnnamedIds "Global"        = ReparseInfo Tokens
  AnnFillUnnamedIds "IndirectField" = ReparseInfo Tokens
  AnnFillUnnamedIds "RegularField"  = ReparseInfo Tokens
  AnnFillUnnamedIds "Typedef"       = ReparseInfo Tokens
  AnnFillUnnamedIds _               = NoAnn

instance IsPass FillUnnamedIds

instance PassId FillUnnamedIds

instance PassScopedName FillUnnamedIds

instance PassTypes FillUnnamedIds

instance PassMacro FillUnnamedIds where
  type MacroBody FillUnnamedIds = Macro.Unresolved

instance PassExtBinding FillUnnamedIds

instance PassCommentDecl FillUnnamedIds

instance PassAnn FillUnnamedIds where
  type Ann ix FillUnnamedIds = AnnFillUnnamedIds ix

instance PassMsg FillUnnamedIds where
  type Msg FillUnnamedIds = ImmediateFillUnnamedIdsMsg

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

data ImmediateFillUnnamedIdsMsg =
    -- | Skipped unused unnamed declaration
    --
    -- @clang@ will produce a warning for this ("declaration does not declare
    -- anything"); we issue a separate message here in case we skip over
    -- something that we shouldn't.
    FillUnnamedIdsSkippedDecl C.UnnamedId
  deriving stock (Show, Generic)

instance PrettyForTrace ImmediateFillUnnamedIdsMsg where
  prettyForTrace = \case
      FillUnnamedIdsSkippedDecl unnamedId -> PP.hsep [
          "Skipped unused or unusable unnamed declaration"
        , prettyForTrace unnamedId
        ]

instance IsTrace Level ImmediateFillUnnamedIdsMsg where
  getDefaultLogLevel = \case
      FillUnnamedIdsSkippedDecl{} -> Debug -- clang already warned

  getSource  = const HsBindgen
  getTraceId = const "fill-unnamed-ids"