packages feed

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

-- | Definitions for the @PrepareReparse@ pass
--
-- This module is intended to be imported unqualified.
--
-- > import HsBindgen.Frontend.Pass.PrepareReparse.IsPass
--
module HsBindgen.Frontend.Pass.PrepareReparse.IsPass (
    PrepareReparse
    -- * Tokens
  , FlatTokens (..)
  ) where

import Clang.HighLevel.Types (MultiLoc, SourcePath)

import HsBindgen.Frontend.Pass.Parse.IsPass
import HsBindgen.Frontend.Pass.PrepareReparse.IsPass.Msg (PrepareReparseMsg)
import HsBindgen.Frontend.Pass.TypecheckMacros.IsPass
import HsBindgen.Imports
import HsBindgen.IR.C qualified as C
import HsBindgen.IR.Pass

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

type PrepareReparse :: Pass
data PrepareReparse a

type family AnnPrepareReparse (ix :: Symbol) :: Star where
  AnnPrepareReparse "Function"      = ReparseInfo FlatTokens
  AnnPrepareReparse "Global"        = ReparseInfo FlatTokens
  AnnPrepareReparse "IndirectField" = ReparseInfo FlatTokens
  AnnPrepareReparse "RegularField"  = ReparseInfo FlatTokens
  AnnPrepareReparse "Typedef"       = ReparseInfo FlatTokens
  AnnPrepareReparse _               = NoAnn

instance IsPass PrepareReparse

instance PassId PrepareReparse

instance PassScopedName PrepareReparse

instance PassTypes PrepareReparse

instance PassMacro PrepareReparse where
  type MacroId   PrepareReparse = Id PrepareReparse
  type MacroBody PrepareReparse = TypecheckedMacro PrepareReparse

  macroIdId _ = id

instance PassExtBinding PrepareReparse

instance PassCommentDecl PrepareReparse where
  type CommentDecl PrepareReparse = Maybe (C.Comment PrepareReparse)

instance PassAnn PrepareReparse where
  type Ann ix PrepareReparse = AnnPrepareReparse ix

instance PassMsg PrepareReparse where
  type Msg PrepareReparse = PrepareReparseMsg

{-------------------------------------------------------------------------------
  Tokens
-------------------------------------------------------------------------------}

-- | @libclang@ tokens flattened into a single string
data FlatTokens = FlatTokens {
      -- | Location of the first token before flattening
      locStart :: MultiLoc SourcePath
      -- | Tokens flattened into a single string
    , flatten  :: String
    }
  deriving stock (Show, Eq)

{-------------------------------------------------------------------------------
  CoercePass: TypecheckMacros → PrepareReparse
-------------------------------------------------------------------------------}

instance CoercePassId                  TypecheckMacros PrepareReparse
instance CoercePassMacroId             TypecheckMacros PrepareReparse
instance CoercePassTypes               TypecheckMacros PrepareReparse
instance CoercePassAnn "TypeFunArg"    TypecheckMacros PrepareReparse

instance CoercePassCommentDecl TypecheckMacros PrepareReparse where
  coercePassCommentDecl _ = fmap coercePass

instance CoercePassMacroUnderlying TypecheckMacros PrepareReparse