packages feed

hs-bindgen-1.0.0.0: src-internal/HsBindgen/Frontend/Analysis/DeclUseGraph/Definition.hs

module HsBindgen.Frontend.Analysis.DeclUseGraph.Definition (
    DeclUseGraph(..)
  , toDigraph
    -- * Visualization
  , renderMermaid
  ) where

import Data.Digraph (Digraph)
import Data.Digraph qualified as Digraph

import HsBindgen.Frontend.Analysis
import HsBindgen.IR.C qualified as C

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

-- | Declaration definition-usage graph
--
-- This graph has edges from definition sites to use sites.
data DeclUseGraph = DeclUseGraph {
      graph :: Digraph Dependency C.DeclId
    }
  deriving stock (Eq, Show)

toDigraph :: DeclUseGraph -> Digraph Dependency C.DeclId
toDigraph declUseGraph = declUseGraph.graph

{-------------------------------------------------------------------------------
  Visualization
-------------------------------------------------------------------------------}

renderMermaid :: DeclUseGraph -> String
renderMermaid declUseGraph = Digraph.renderMermaid opts declUseGraph.graph
  where
    opts :: Digraph.VisOptions Dependency C.DeclId
    opts = Digraph.VisOptions{
        visVertex = \v -> Digraph.VisVertex{
            label = Just (show v)
          }
      , visEdge   = \e -> Digraph.VisEdge{
            label = Just (show e)
          , style = Digraph.Solid
          }
      , reverseEdges = False
      }