module Refact
    ( toRefactSrcSpan
    , toSS, toSS'
    , toSrcSpan'
    ) where

import qualified Refact.Types as R
import HSE.All

import qualified SrcLoc as GHC

toRefactSrcSpan :: SrcSpan -> R.SrcSpan
toRefactSrcSpan :: SrcSpan -> SrcSpan
toRefactSrcSpan ss :: SrcSpan
ss = Int -> Int -> Int -> Int -> SrcSpan
R.SrcSpan (SrcSpan -> Int
srcSpanStartLine SrcSpan
ss)
                               (SrcSpan -> Int
srcSpanStartColumn SrcSpan
ss)
                               (SrcSpan -> Int
srcSpanEndLine SrcSpan
ss)
                               (SrcSpan -> Int
srcSpanEndColumn SrcSpan
ss)

toSS :: Annotated a => a S -> R.SrcSpan
toSS :: a S -> SrcSpan
toSS = SrcSpan -> SrcSpan
toRefactSrcSpan (SrcSpan -> SrcSpan) -> (a S -> SrcSpan) -> a S -> SrcSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. S -> SrcSpan
srcInfoSpan (S -> SrcSpan) -> (a S -> S) -> a S -> SrcSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a S -> S
forall (ast :: * -> *) l. Annotated ast => ast l -> l
ann

-- | Don't crash in case ghc gives us a \"fake\" span,
-- opting instead to show @0 0 0 0@ coordinates.
toSrcSpan' :: GHC.HasSrcSpan a => a -> R.SrcSpan
toSrcSpan' :: a -> SrcSpan
toSrcSpan' x :: a
x = case a -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
GHC.getLoc a
x of
    GHC.RealSrcSpan span :: RealSrcSpan
span ->
        Int -> Int -> Int -> Int -> SrcSpan
R.SrcSpan (RealSrcSpan -> Int
GHC.srcSpanStartLine RealSrcSpan
span)
                  (RealSrcSpan -> Int
GHC.srcSpanStartCol RealSrcSpan
span)
                  (RealSrcSpan -> Int
GHC.srcSpanEndLine RealSrcSpan
span)
                  (RealSrcSpan -> Int
GHC.srcSpanEndCol RealSrcSpan
span)
    GHC.UnhelpfulSpan _ ->
        Int -> Int -> Int -> Int -> SrcSpan
R.SrcSpan 0 0 0 0

toSS' :: GHC.HasSrcSpan e => e -> R.SrcSpan
toSS' :: e -> SrcSpan
toSS' = SrcSpan -> SrcSpan
toRefactSrcSpan (SrcSpan -> SrcSpan) -> (e -> SrcSpan) -> e -> SrcSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SrcSpan -> SrcSpan
ghcSpanToHSE (SrcSpan -> SrcSpan) -> (e -> SrcSpan) -> e -> SrcSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> SrcSpan
forall a. HasSrcSpan a => a -> SrcSpan
GHC.getLoc