module HIndent.Ast.Declaration.Instance.Class.OverlapMode
  ( OverlapMode
  , mkOverlapMode
  ) where

import qualified GHC.Types.Basic as GHC
import HIndent.Ast.NodeComments
import {-# SOURCE #-} HIndent.Pretty
import HIndent.Pretty.Combinators.String
import HIndent.Pretty.NodeComments

data OverlapMode
  = Overlappable
  | Overlapping
  | Overlaps
  | Incoherent

instance CommentExtraction OverlapMode where
  nodeComments :: OverlapMode -> NodeComments
nodeComments OverlapMode
Overlappable = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments OverlapMode
Overlapping = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments OverlapMode
Overlaps = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []
  nodeComments OverlapMode
Incoherent = [LEpaComment] -> [LEpaComment] -> [LEpaComment] -> NodeComments
NodeComments [] [] []

instance Pretty OverlapMode where
  pretty' :: OverlapMode -> Printer ()
pretty' OverlapMode
Overlappable = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"{-# OVERLAPPABLE #-}"
  pretty' OverlapMode
Overlapping = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"{-# OVERLAPPING #-}"
  pretty' OverlapMode
Overlaps = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"{-# OVERLAPS #-}"
  pretty' OverlapMode
Incoherent = HasCallStack => String -> Printer ()
String -> Printer ()
string String
"{-# INCOHERENT #-}"

mkOverlapMode :: GHC.OverlapMode -> OverlapMode
mkOverlapMode :: OverlapMode -> OverlapMode
mkOverlapMode GHC.NoOverlap {} =
  String -> OverlapMode
forall a. HasCallStack => String -> a
error String
"This AST node should never appear in the tree"
mkOverlapMode GHC.Overlappable {} = OverlapMode
Overlappable
mkOverlapMode GHC.Overlapping {} = OverlapMode
Overlapping
mkOverlapMode GHC.Overlaps {} = OverlapMode
Overlaps
mkOverlapMode GHC.Incoherent {} = OverlapMode
Incoherent