-- | This module contains utilities for calculating positions and offsets. While
-- tokens are annotated with ranges, CST nodes are not, but they can be
-- dynamically derived with the functions in this module, which will return the
-- first and last tokens for a given node.

module Language.PureScript.CST.Positions where

import Prelude

import Data.Foldable (foldl')
import qualified Data.List.NonEmpty as NE
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import Data.Void (Void)
import qualified Data.Text as Text
import Language.PureScript.CST.Types

advanceToken :: SourcePos -> Token -> SourcePos
advanceToken :: SourcePos -> Token -> SourcePos
advanceToken SourcePos
pos = SourcePos -> (Int, Int) -> SourcePos
applyDelta SourcePos
pos forall b c a. (b -> c) -> (a -> b) -> a -> c
. Token -> (Int, Int)
tokenDelta

advanceLeading :: SourcePos -> [Comment LineFeed] -> SourcePos
advanceLeading :: SourcePos -> [Comment LineFeed] -> SourcePos
advanceLeading = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall a b. (a -> b) -> a -> b
$ \SourcePos
a -> SourcePos -> (Int, Int) -> SourcePos
applyDelta SourcePos
a forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> (Int, Int)) -> Comment a -> (Int, Int)
commentDelta LineFeed -> (Int, Int)
lineDelta

advanceTrailing :: SourcePos -> [Comment Void] -> SourcePos
advanceTrailing :: SourcePos -> [Comment Void] -> SourcePos
advanceTrailing = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' forall a b. (a -> b) -> a -> b
$ \SourcePos
a -> SourcePos -> (Int, Int) -> SourcePos
applyDelta SourcePos
a forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> (Int, Int)) -> Comment a -> (Int, Int)
commentDelta (forall a b. a -> b -> a
const (Int
0, Int
0))

tokenDelta :: Token -> (Int, Int)
tokenDelta :: Token -> (Int, Int)
tokenDelta = \case
  Token
TokLeftParen             -> (Int
0, Int
1)
  Token
TokRightParen            -> (Int
0, Int
1)
  Token
TokLeftBrace             -> (Int
0, Int
1)
  Token
TokRightBrace            -> (Int
0, Int
1)
  Token
TokLeftSquare            -> (Int
0, Int
1)
  Token
TokRightSquare           -> (Int
0, Int
1)
  TokLeftArrow SourceStyle
ASCII       -> (Int
0, Int
2)
  TokLeftArrow SourceStyle
Unicode     -> (Int
0, Int
1)
  TokRightArrow SourceStyle
ASCII      -> (Int
0, Int
2)
  TokRightArrow SourceStyle
Unicode    -> (Int
0, Int
1)
  TokRightFatArrow SourceStyle
ASCII   -> (Int
0, Int
2)
  TokRightFatArrow SourceStyle
Unicode -> (Int
0, Int
1)
  TokDoubleColon SourceStyle
ASCII     -> (Int
0, Int
2)
  TokDoubleColon SourceStyle
Unicode   -> (Int
0, Int
1)
  TokForall SourceStyle
ASCII          -> (Int
0, Int
6)
  TokForall SourceStyle
Unicode        -> (Int
0, Int
1)
  Token
TokEquals                -> (Int
0, Int
1)
  Token
TokPipe                  -> (Int
0, Int
1)
  Token
TokTick                  -> (Int
0, Int
1)
  Token
TokDot                   -> (Int
0, Int
1)
  Token
TokComma                 -> (Int
0, Int
1)
  Token
TokUnderscore            -> (Int
0, Int
1)
  Token
TokBackslash             -> (Int
0, Int
1)
  TokLowerName [Text]
qual Text
name   -> (Int
0, [Text] -> Int
qualDelta [Text]
qual forall a. Num a => a -> a -> a
+ Text -> Int
Text.length Text
name)
  TokUpperName [Text]
qual Text
name   -> (Int
0, [Text] -> Int
qualDelta [Text]
qual forall a. Num a => a -> a -> a
+ Text -> Int
Text.length Text
name)
  TokOperator [Text]
qual Text
sym     -> (Int
0, [Text] -> Int
qualDelta [Text]
qual forall a. Num a => a -> a -> a
+ Text -> Int
Text.length Text
sym)
  TokSymbolName [Text]
qual Text
sym   -> (Int
0, [Text] -> Int
qualDelta [Text]
qual forall a. Num a => a -> a -> a
+ Text -> Int
Text.length Text
sym forall a. Num a => a -> a -> a
+ Int
2)
  TokSymbolArr SourceStyle
Unicode     -> (Int
0, Int
3)
  TokSymbolArr SourceStyle
ASCII       -> (Int
0, Int
4)
  TokHole Text
hole             -> (Int
0, Text -> Int
Text.length Text
hole forall a. Num a => a -> a -> a
+ Int
1)
  TokChar Text
raw Char
_            -> (Int
0, Text -> Int
Text.length Text
raw forall a. Num a => a -> a -> a
+ Int
2)
  TokInt Text
raw Integer
_             -> (Int
0, Text -> Int
Text.length Text
raw)
  TokNumber Text
raw Double
_          -> (Int
0, Text -> Int
Text.length Text
raw)
  TokString Text
raw PSString
_          -> Int -> (Int, Int) -> (Int, Int)
multiLine Int
1 forall a b. (a -> b) -> a -> b
$ Text -> (Int, Int)
textDelta Text
raw
  TokRawString Text
raw         -> Int -> (Int, Int) -> (Int, Int)
multiLine Int
3 forall a b. (a -> b) -> a -> b
$ Text -> (Int, Int)
textDelta Text
raw
  Token
TokLayoutStart           -> (Int
0, Int
0)
  Token
TokLayoutSep             -> (Int
0, Int
0)
  Token
TokLayoutEnd             -> (Int
0, Int
0)
  Token
TokEof                   -> (Int
0, Int
0)

qualDelta :: [Text] -> Int
qualDelta :: [Text] -> Int
qualDelta = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall a. Num a => a -> a -> a
(+) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Num a => a -> a -> a
+ Int
1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Int
Text.length) Int
0

multiLine :: Int -> (Int, Int) -> (Int, Int)
multiLine :: Int -> (Int, Int) -> (Int, Int)
multiLine Int
n (Int
0, Int
c) = (Int
0, Int
c forall a. Num a => a -> a -> a
+ Int
n forall a. Num a => a -> a -> a
+ Int
n)
multiLine Int
n (Int
l, Int
c) = (Int
l, Int
c forall a. Num a => a -> a -> a
+ Int
n)

commentDelta :: (a -> (Int, Int)) -> Comment a -> (Int, Int)
commentDelta :: forall a. (a -> (Int, Int)) -> Comment a -> (Int, Int)
commentDelta a -> (Int, Int)
k = \case
  Comment Text
raw -> Text -> (Int, Int)
textDelta Text
raw
  Space Int
n -> (Int
0, Int
n)
  Line a
a -> a -> (Int, Int)
k a
a

lineDelta :: LineFeed -> (Int, Int)
lineDelta :: LineFeed -> (Int, Int)
lineDelta LineFeed
_ = (Int
1, Int
1)

textDelta :: Text -> (Int, Int)
textDelta :: Text -> (Int, Int)
textDelta = forall a. (a -> Char -> a) -> a -> Text -> a
Text.foldl' forall {a} {b}. (Num a, Num b) => (a, b) -> Char -> (a, b)
go (Int
0, Int
0)
  where
  go :: (a, b) -> Char -> (a, b)
go (!a
l, !b
c) = \case
    Char
'\n' -> (a
l forall a. Num a => a -> a -> a
+ a
1, b
1)
    Char
_    -> (a
l, b
c forall a. Num a => a -> a -> a
+ b
1)

applyDelta :: SourcePos -> (Int, Int) -> SourcePos
applyDelta :: SourcePos -> (Int, Int) -> SourcePos
applyDelta (SourcePos Int
l Int
c) = \case
  (Int
0, Int
n) -> Int -> Int -> SourcePos
SourcePos Int
l (Int
c forall a. Num a => a -> a -> a
+ Int
n)
  (Int
k, Int
d) -> Int -> Int -> SourcePos
SourcePos (Int
l forall a. Num a => a -> a -> a
+ Int
k) Int
d

sepLast :: Separated a -> a
sepLast :: forall a. Separated a -> a
sepLast (Separated a
hd []) = a
hd
sepLast (Separated a
_ [(SourceToken, a)]
tl) = forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [(SourceToken, a)]
tl

type TokenRange = (SourceToken, SourceToken)

toSourceRange :: TokenRange -> SourceRange
toSourceRange :: TokenRange -> SourceRange
toSourceRange (SourceToken
a, SourceToken
b) = SourceRange -> SourceRange -> SourceRange
widen (SourceToken -> SourceRange
srcRange SourceToken
a) (SourceToken -> SourceRange
srcRange SourceToken
b)

widen :: SourceRange -> SourceRange -> SourceRange
widen :: SourceRange -> SourceRange -> SourceRange
widen (SourceRange SourcePos
s1 SourcePos
_) (SourceRange SourcePos
_ SourcePos
e2) = SourcePos -> SourcePos -> SourceRange
SourceRange SourcePos
s1 SourcePos
e2

srcRange :: SourceToken -> SourceRange
srcRange :: SourceToken -> SourceRange
srcRange = TokenAnn -> SourceRange
tokRange forall b c a. (b -> c) -> (a -> b) -> a -> c
. SourceToken -> TokenAnn
tokAnn

nameRange :: Name a -> TokenRange
nameRange :: forall a. Name a -> TokenRange
nameRange Name a
a = (forall a. Name a -> SourceToken
nameTok Name a
a, forall a. Name a -> SourceToken
nameTok Name a
a)

qualRange :: QualifiedName a -> TokenRange
qualRange :: forall a. QualifiedName a -> TokenRange
qualRange QualifiedName a
a = (forall a. QualifiedName a -> SourceToken
qualTok QualifiedName a
a, forall a. QualifiedName a -> SourceToken
qualTok QualifiedName a
a)

wrappedRange :: Wrapped a -> TokenRange
wrappedRange :: forall a. Wrapped a -> TokenRange
wrappedRange Wrapped { SourceToken
wrpOpen :: forall a. Wrapped a -> SourceToken
wrpOpen :: SourceToken
wrpOpen, SourceToken
wrpClose :: forall a. Wrapped a -> SourceToken
wrpClose :: SourceToken
wrpClose } = (SourceToken
wrpOpen, SourceToken
wrpClose)

moduleRange :: Module a -> TokenRange
moduleRange :: forall a. Module a -> TokenRange
moduleRange Module { SourceToken
modKeyword :: forall a. Module a -> SourceToken
modKeyword :: SourceToken
modKeyword, SourceToken
modWhere :: forall a. Module a -> SourceToken
modWhere :: SourceToken
modWhere, [ImportDecl a]
modImports :: forall a. Module a -> [ImportDecl a]
modImports :: [ImportDecl a]
modImports, [Declaration a]
modDecls :: forall a. Module a -> [Declaration a]
modDecls :: [Declaration a]
modDecls } =
  case ([ImportDecl a]
modImports, [Declaration a]
modDecls) of
    ([], []) -> (SourceToken
modKeyword, SourceToken
modWhere)
    ([ImportDecl a]
is, []) -> (SourceToken
modKeyword, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. ImportDecl a -> TokenRange
importDeclRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [ImportDecl a]
is)
    ([ImportDecl a]
_,  [Declaration a]
ds) -> (SourceToken
modKeyword, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Declaration a -> TokenRange
declRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [Declaration a]
ds)

exportRange :: Export a -> TokenRange
exportRange :: forall a. Export a -> TokenRange
exportRange = \case
  ExportValue a
_ Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a
  ExportOp a
_ Name (OpName 'ValueOpName)
a -> forall a. Name a -> TokenRange
nameRange Name (OpName 'ValueOpName)
a
  ExportType a
_ Name (ProperName 'TypeName)
a Maybe (DataMembers a)
b
    | Just DataMembers a
b' <- Maybe (DataMembers a)
b -> (forall a. Name a -> SourceToken
nameTok Name (ProperName 'TypeName)
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. DataMembers a -> TokenRange
dataMembersRange DataMembers a
b')
    | Bool
otherwise -> forall a. Name a -> TokenRange
nameRange Name (ProperName 'TypeName)
a
  ExportTypeOp a
_ SourceToken
a Name (OpName 'TypeOpName)
b -> (SourceToken
a, forall a. Name a -> SourceToken
nameTok Name (OpName 'TypeOpName)
b)
  ExportClass a
_ SourceToken
a Name (ProperName 'ClassName)
b -> (SourceToken
a, forall a. Name a -> SourceToken
nameTok Name (ProperName 'ClassName)
b)
  ExportModule a
_ SourceToken
a Name ModuleName
b -> (SourceToken
a, forall a. Name a -> SourceToken
nameTok Name ModuleName
b)

importDeclRange :: ImportDecl a -> TokenRange
importDeclRange :: forall a. ImportDecl a -> TokenRange
importDeclRange ImportDecl { SourceToken
impKeyword :: forall a. ImportDecl a -> SourceToken
impKeyword :: SourceToken
impKeyword, Name ModuleName
impModule :: forall a. ImportDecl a -> Name ModuleName
impModule :: Name ModuleName
impModule, Maybe (Maybe SourceToken, DelimitedNonEmpty (Import a))
impNames :: forall a.
ImportDecl a
-> Maybe (Maybe SourceToken, DelimitedNonEmpty (Import a))
impNames :: Maybe (Maybe SourceToken, DelimitedNonEmpty (Import a))
impNames, Maybe (SourceToken, Name ModuleName)
impQual :: forall a. ImportDecl a -> Maybe (SourceToken, Name ModuleName)
impQual :: Maybe (SourceToken, Name ModuleName)
impQual }
  | Just (SourceToken
_, Name ModuleName
modName) <- Maybe (SourceToken, Name ModuleName)
impQual = (SourceToken
impKeyword, forall a. Name a -> SourceToken
nameTok Name ModuleName
modName)
  | Just (Maybe SourceToken
_, DelimitedNonEmpty (Import a)
imports) <- Maybe (Maybe SourceToken, DelimitedNonEmpty (Import a))
impNames = (SourceToken
impKeyword, forall a. Wrapped a -> SourceToken
wrpClose DelimitedNonEmpty (Import a)
imports)
  | Bool
otherwise = (SourceToken
impKeyword, forall a. Name a -> SourceToken
nameTok Name ModuleName
impModule)

importRange :: Import a -> TokenRange
importRange :: forall a. Import a -> TokenRange
importRange = \case
  ImportValue a
_ Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a
  ImportOp a
_ Name (OpName 'ValueOpName)
a -> forall a. Name a -> TokenRange
nameRange Name (OpName 'ValueOpName)
a
  ImportType a
_ Name (ProperName 'TypeName)
a Maybe (DataMembers a)
b
    | Just DataMembers a
b' <- Maybe (DataMembers a)
b -> (forall a. Name a -> SourceToken
nameTok Name (ProperName 'TypeName)
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. DataMembers a -> TokenRange
dataMembersRange DataMembers a
b')
    | Bool
otherwise -> forall a. Name a -> TokenRange
nameRange Name (ProperName 'TypeName)
a
  ImportTypeOp a
_ SourceToken
a Name (OpName 'TypeOpName)
b -> (SourceToken
a, forall a. Name a -> SourceToken
nameTok Name (OpName 'TypeOpName)
b)
  ImportClass a
_ SourceToken
a Name (ProperName 'ClassName)
b -> (SourceToken
a, forall a. Name a -> SourceToken
nameTok Name (ProperName 'ClassName)
b)

dataMembersRange :: DataMembers a -> TokenRange
dataMembersRange :: forall a. DataMembers a -> TokenRange
dataMembersRange = \case
  DataAll a
_ SourceToken
a -> (SourceToken
a, SourceToken
a)
  DataEnumerated a
_ (Wrapped SourceToken
a Maybe (Separated (Name (ProperName 'ConstructorName)))
_ SourceToken
b) -> (SourceToken
a, SourceToken
b)

declRange :: Declaration a -> TokenRange
declRange :: forall a. Declaration a -> TokenRange
declRange = \case
  DeclData a
_ DataHead a
hd Maybe (SourceToken, Separated (DataCtor a))
ctors
    | Just (SourceToken
_, Separated (DataCtor a)
cs) <- Maybe (SourceToken, Separated (DataCtor a))
ctors -> (forall a b. (a, b) -> a
fst TokenRange
start, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. DataCtor a -> TokenRange
dataCtorRange forall a b. (a -> b) -> a -> b
$ forall a. Separated a -> a
sepLast Separated (DataCtor a)
cs)
    | Bool
otherwise -> TokenRange
start
    where start :: TokenRange
start = forall a. DataHead a -> TokenRange
dataHeadRange DataHead a
hd
  DeclType a
_ DataHead a
a SourceToken
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. DataHead a -> TokenRange
dataHeadRange DataHead a
a,  forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  DeclNewtype a
_ DataHead a
a SourceToken
_ Name (ProperName 'ConstructorName)
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. DataHead a -> TokenRange
dataHeadRange DataHead a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  DeclClass a
_ ClassHead a
hd Maybe (SourceToken, NonEmpty (Labeled (Name Ident) (Type a)))
body
    | Just (SourceToken
_, NonEmpty (Labeled (Name Ident) (Type a))
ts) <- Maybe (SourceToken, NonEmpty (Labeled (Name Ident) (Type a)))
body -> (forall a b. (a, b) -> a
fst TokenRange
start, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Type a -> TokenRange
typeRange forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. Labeled a b -> b
lblValue forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (Labeled (Name Ident) (Type a))
ts)
    | Bool
otherwise -> TokenRange
start
    where start :: TokenRange
start = forall a. ClassHead a -> TokenRange
classHeadRange ClassHead a
hd
  DeclInstanceChain a
_ Separated (Instance a)
a -> (forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Instance a -> TokenRange
instanceRange forall a b. (a -> b) -> a -> b
$ forall a. Separated a -> a
sepHead Separated (Instance a)
a, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Instance a -> TokenRange
instanceRange forall a b. (a -> b) -> a -> b
$ forall a. Separated a -> a
sepLast Separated (Instance a)
a)
  DeclDerive a
_ SourceToken
a Maybe SourceToken
_ InstanceHead a
b -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. InstanceHead a -> TokenRange
instanceHeadRange InstanceHead a
b)
  DeclKindSignature a
_ SourceToken
a (Labeled Name (ProperName 'TypeName)
_ SourceToken
_ Type a
b) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  DeclSignature a
_ (Labeled Name Ident
a SourceToken
_ Type a
b) -> (forall a. Name a -> SourceToken
nameTok Name Ident
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  DeclValue a
_ ValueBindingFields a
a -> forall a. ValueBindingFields a -> TokenRange
valueBindingFieldsRange ValueBindingFields a
a
  DeclFixity a
_ (FixityFields (SourceToken, Fixity)
a (SourceToken, Integer)
_ (FixityValue QualifiedName (Either Ident (ProperName 'ConstructorName))
_ SourceToken
_ Name (OpName 'ValueOpName)
b)) -> (forall a b. (a, b) -> a
fst (SourceToken, Fixity)
a, forall a. Name a -> SourceToken
nameTok Name (OpName 'ValueOpName)
b)
  DeclFixity a
_ (FixityFields (SourceToken, Fixity)
a (SourceToken, Integer)
_ (FixityType SourceToken
_ QualifiedName (ProperName 'TypeName)
_ SourceToken
_ Name (OpName 'TypeOpName)
b)) -> (forall a b. (a, b) -> a
fst (SourceToken, Fixity)
a, forall a. Name a -> SourceToken
nameTok Name (OpName 'TypeOpName)
b)
  DeclForeign a
_ SourceToken
a SourceToken
_ Foreign a
b -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Foreign a -> TokenRange
foreignRange Foreign a
b)
  DeclRole a
_ SourceToken
a SourceToken
_ Name (ProperName 'TypeName)
_ NonEmpty Role
b -> (SourceToken
a, Role -> SourceToken
roleTok forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty Role
b)

dataHeadRange :: DataHead a -> TokenRange
dataHeadRange :: forall a. DataHead a -> TokenRange
dataHeadRange (DataHead SourceToken
kw Name (ProperName 'TypeName)
name [TypeVarBinding a]
vars)
  | [] <- [TypeVarBinding a]
vars = (SourceToken
kw, forall a. Name a -> SourceToken
nameTok Name (ProperName 'TypeName)
name)
  | Bool
otherwise = (SourceToken
kw, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TypeVarBinding a -> TokenRange
typeVarBindingRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [TypeVarBinding a]
vars)

dataCtorRange :: DataCtor a -> TokenRange
dataCtorRange :: forall a. DataCtor a -> TokenRange
dataCtorRange (DataCtor a
_ Name (ProperName 'ConstructorName)
name [Type a]
fields)
  | [] <- [Type a]
fields = forall a. Name a -> TokenRange
nameRange Name (ProperName 'ConstructorName)
name
  | Bool
otherwise = (forall a. Name a -> SourceToken
nameTok Name (ProperName 'ConstructorName)
name, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Type a -> TokenRange
typeRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [Type a]
fields)

classHeadRange :: ClassHead a -> TokenRange
classHeadRange :: forall a. ClassHead a -> TokenRange
classHeadRange (ClassHead SourceToken
kw Maybe (OneOrDelimited (Constraint a), SourceToken)
_ Name (ProperName 'ClassName)
name [TypeVarBinding a]
vars Maybe (SourceToken, Separated ClassFundep)
fdeps)
  | Just (SourceToken
_, Separated ClassFundep
fs) <- Maybe (SourceToken, Separated ClassFundep)
fdeps = (SourceToken
kw, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClassFundep -> TokenRange
classFundepRange forall a b. (a -> b) -> a -> b
$ forall a. Separated a -> a
sepLast Separated ClassFundep
fs)
  | [] <- [TypeVarBinding a]
vars = (SourceToken
kw, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Name a -> TokenRange
nameRange Name (ProperName 'ClassName)
name)
  | Bool
otherwise = (SourceToken
kw, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. TypeVarBinding a -> TokenRange
typeVarBindingRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [TypeVarBinding a]
vars)

classFundepRange :: ClassFundep -> TokenRange
classFundepRange :: ClassFundep -> TokenRange
classFundepRange = \case
  FundepDetermined SourceToken
arr NonEmpty (Name Ident)
bs -> (SourceToken
arr, forall a. Name a -> SourceToken
nameTok forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (Name Ident)
bs)
  FundepDetermines NonEmpty (Name Ident)
as SourceToken
_ NonEmpty (Name Ident)
bs -> (forall a. Name a -> SourceToken
nameTok forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.head NonEmpty (Name Ident)
as, forall a. Name a -> SourceToken
nameTok forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (Name Ident)
bs)

instanceRange :: Instance a -> TokenRange
instanceRange :: forall a. Instance a -> TokenRange
instanceRange (Instance InstanceHead a
hd Maybe (SourceToken, NonEmpty (InstanceBinding a))
bd)
  | Just (SourceToken
_, NonEmpty (InstanceBinding a)
ts) <- Maybe (SourceToken, NonEmpty (InstanceBinding a))
bd = (forall a b. (a, b) -> a
fst TokenRange
start, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. InstanceBinding a -> TokenRange
instanceBindingRange forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (InstanceBinding a)
ts)
  | Bool
otherwise = TokenRange
start
  where start :: TokenRange
start = forall a. InstanceHead a -> TokenRange
instanceHeadRange InstanceHead a
hd

instanceHeadRange :: InstanceHead a -> TokenRange
instanceHeadRange :: forall a. InstanceHead a -> TokenRange
instanceHeadRange (InstanceHead SourceToken
kw Maybe (Name Ident, SourceToken)
_ Maybe (OneOrDelimited (Constraint a), SourceToken)
_ QualifiedName (ProperName 'ClassName)
cls [Type a]
types)
  | [] <- [Type a]
types = (SourceToken
kw, forall a. QualifiedName a -> SourceToken
qualTok QualifiedName (ProperName 'ClassName)
cls)
  | Bool
otherwise = (SourceToken
kw, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Type a -> TokenRange
typeRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [Type a]
types)

instanceBindingRange :: InstanceBinding a -> TokenRange
instanceBindingRange :: forall a. InstanceBinding a -> TokenRange
instanceBindingRange = \case
  InstanceBindingSignature a
_ (Labeled Name Ident
a SourceToken
_ Type a
b) -> (forall a. Name a -> SourceToken
nameTok Name Ident
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  InstanceBindingName a
_ ValueBindingFields a
a -> forall a. ValueBindingFields a -> TokenRange
valueBindingFieldsRange ValueBindingFields a
a

foreignRange :: Foreign a -> TokenRange
foreignRange :: forall a. Foreign a -> TokenRange
foreignRange = \case
  ForeignValue (Labeled Name Ident
a SourceToken
_ Type a
b) -> (forall a. Name a -> SourceToken
nameTok Name Ident
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  ForeignData SourceToken
a (Labeled Name (ProperName 'TypeName)
_ SourceToken
_ Type a
b) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  ForeignKind SourceToken
a Name (ProperName 'TypeName)
b -> (SourceToken
a, forall a. Name a -> SourceToken
nameTok Name (ProperName 'TypeName)
b)

valueBindingFieldsRange :: ValueBindingFields a -> TokenRange
valueBindingFieldsRange :: forall a. ValueBindingFields a -> TokenRange
valueBindingFieldsRange (ValueBindingFields Name Ident
a [Binder a]
_ Guarded a
b) = (forall a. Name a -> SourceToken
nameTok Name Ident
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Guarded a -> TokenRange
guardedRange Guarded a
b)

guardedRange :: Guarded a -> TokenRange
guardedRange :: forall a. Guarded a -> TokenRange
guardedRange = \case
  Unconditional SourceToken
a Where a
b -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Where a -> TokenRange
whereRange Where a
b)
  Guarded NonEmpty (GuardedExpr a)
as -> (forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. GuardedExpr a -> TokenRange
guardedExprRange forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.head NonEmpty (GuardedExpr a)
as, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. GuardedExpr a -> TokenRange
guardedExprRange forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (GuardedExpr a)
as)

guardedExprRange :: GuardedExpr a -> TokenRange
guardedExprRange :: forall a. GuardedExpr a -> TokenRange
guardedExprRange (GuardedExpr SourceToken
a Separated (PatternGuard a)
_ SourceToken
_ Where a
b) = (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Where a -> TokenRange
whereRange Where a
b)

whereRange :: Where a -> TokenRange
whereRange :: forall a. Where a -> TokenRange
whereRange (Where Expr a
a Maybe (SourceToken, NonEmpty (LetBinding a))
bs)
  | Just (SourceToken
_, NonEmpty (LetBinding a)
ls) <- Maybe (SourceToken, NonEmpty (LetBinding a))
bs = (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. LetBinding a -> TokenRange
letBindingRange forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (LetBinding a)
ls)
  | Bool
otherwise = forall a. Expr a -> TokenRange
exprRange Expr a
a

typeRange :: Type a -> TokenRange
typeRange :: forall a. Type a -> TokenRange
typeRange = \case
  TypeVar a
_ Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a
  TypeConstructor a
_ QualifiedName (ProperName 'TypeName)
a -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName (ProperName 'TypeName)
a
  TypeWildcard a
_ SourceToken
a -> (SourceToken
a, SourceToken
a)
  TypeHole a
_ Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a
  TypeString a
_ SourceToken
a PSString
_ -> (SourceToken
a, SourceToken
a)
  TypeInt a
_ Maybe SourceToken
a SourceToken
b Integer
_ -> (forall a. a -> Maybe a -> a
fromMaybe SourceToken
b Maybe SourceToken
a, SourceToken
b)
  TypeRow a
_ Wrapped (Row a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Row a)
a
  TypeRecord a
_ Wrapped (Row a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Row a)
a
  TypeForall a
_ SourceToken
a NonEmpty (TypeVarBinding a)
_ SourceToken
_ Type a
b -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  TypeKinded a
_ Type a
a SourceToken
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  TypeApp a
_ Type a
a Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  TypeOp a
_ Type a
a QualifiedName (OpName 'TypeOpName)
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  TypeOpName a
_ QualifiedName (OpName 'TypeOpName)
a -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName (OpName 'TypeOpName)
a
  TypeArr a
_ Type a
a SourceToken
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  TypeArrName a
_ SourceToken
a -> (SourceToken
a, SourceToken
a)
  TypeConstrained a
_ Constraint a
a SourceToken
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Constraint a -> TokenRange
constraintRange Constraint a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  TypeParens a
_ Wrapped (Type a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Type a)
a
  TypeUnaryRow a
_ SourceToken
a Type a
b -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)

constraintRange :: Constraint a -> TokenRange
constraintRange :: forall a. Constraint a -> TokenRange
constraintRange = \case
  Constraint a
_ QualifiedName (ProperName 'ClassName)
name [Type a]
args
    | [] <- [Type a]
args -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName (ProperName 'ClassName)
name
    | Bool
otherwise -> (forall a. QualifiedName a -> SourceToken
qualTok QualifiedName (ProperName 'ClassName)
name, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Type a -> TokenRange
typeRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [Type a]
args)
  ConstraintParens a
_ Wrapped (Constraint a)
wrp -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Constraint a)
wrp

typeVarBindingRange :: TypeVarBinding a -> TokenRange
typeVarBindingRange :: forall a. TypeVarBinding a -> TokenRange
typeVarBindingRange = \case
  TypeVarKinded Wrapped (Labeled (Name Ident) (Type a))
a -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Labeled (Name Ident) (Type a))
a
  TypeVarName Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a

exprRange :: Expr a -> TokenRange
exprRange :: forall a. Expr a -> TokenRange
exprRange = \case
  ExprHole a
_ Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a
  ExprSection a
_ SourceToken
a -> (SourceToken
a, SourceToken
a)
  ExprIdent a
_ QualifiedName Ident
a -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName Ident
a
  ExprConstructor a
_ QualifiedName (ProperName 'ConstructorName)
a -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName (ProperName 'ConstructorName)
a
  ExprBoolean a
_ SourceToken
a Bool
_ -> (SourceToken
a, SourceToken
a)
  ExprChar a
_ SourceToken
a Char
_ -> (SourceToken
a, SourceToken
a)
  ExprString a
_ SourceToken
a PSString
_ -> (SourceToken
a, SourceToken
a)
  ExprNumber a
_ SourceToken
a Either Integer Double
_ -> (SourceToken
a, SourceToken
a)
  ExprArray a
_ Delimited (Expr a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Delimited (Expr a)
a
  ExprRecord a
_ Delimited (RecordLabeled (Expr a))
a -> forall a. Wrapped a -> TokenRange
wrappedRange Delimited (RecordLabeled (Expr a))
a
  ExprParens a
_ Wrapped (Expr a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Expr a)
a
  ExprTyped a
_ Expr a
a SourceToken
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  ExprInfix a
_ Expr a
a Wrapped (Expr a)
_ Expr a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprOp a
_ Expr a
a QualifiedName (OpName 'ValueOpName)
_ Expr a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprOpName a
_ QualifiedName (OpName 'ValueOpName)
a -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName (OpName 'ValueOpName)
a
  ExprNegate a
_ SourceToken
a Expr a
b -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprRecordAccessor a
_ (RecordAccessor Expr a
a SourceToken
_ Separated Label
b) -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, Label -> SourceToken
lblTok forall a b. (a -> b) -> a -> b
$ forall a. Separated a -> a
sepLast Separated Label
b)
  ExprRecordUpdate a
_ Expr a
a DelimitedNonEmpty (RecordUpdate a)
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Wrapped a -> TokenRange
wrappedRange DelimitedNonEmpty (RecordUpdate a)
b)
  ExprApp a
_ Expr a
a Expr a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprLambda a
_ (Lambda SourceToken
a NonEmpty (Binder a)
_ SourceToken
_ Expr a
b) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprIf a
_ (IfThenElse SourceToken
a Expr a
_ SourceToken
_ Expr a
_ SourceToken
_ Expr a
b) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprCase a
_ (CaseOf SourceToken
a Separated (Expr a)
_ SourceToken
_ NonEmpty (Separated (Binder a), Guarded a)
c) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Guarded a -> TokenRange
guardedRange forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (Separated (Binder a), Guarded a)
c)
  ExprLet a
_ (LetIn SourceToken
a NonEmpty (LetBinding a)
_ SourceToken
_ Expr a
b) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  ExprDo a
_ (DoBlock SourceToken
a NonEmpty (DoStatement a)
b) -> (SourceToken
a,  forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. DoStatement a -> TokenRange
doStatementRange forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (DoStatement a)
b)
  ExprAdo a
_ (AdoBlock SourceToken
a [DoStatement a]
_ SourceToken
_ Expr a
b) -> (SourceToken
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)

letBindingRange :: LetBinding a -> TokenRange
letBindingRange :: forall a. LetBinding a -> TokenRange
letBindingRange = \case
  LetBindingSignature a
_ (Labeled Name Ident
a SourceToken
_ Type a
b) -> (forall a. Name a -> SourceToken
nameTok Name Ident
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  LetBindingName a
_ ValueBindingFields a
a -> forall a. ValueBindingFields a -> TokenRange
valueBindingFieldsRange ValueBindingFields a
a
  LetBindingPattern a
_ Binder a
a SourceToken
_ Where a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Binder a -> TokenRange
binderRange Binder a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Where a -> TokenRange
whereRange Where a
b)

doStatementRange :: DoStatement a -> TokenRange
doStatementRange :: forall a. DoStatement a -> TokenRange
doStatementRange = \case
  DoLet SourceToken
a NonEmpty (LetBinding a)
bs -> (SourceToken
a, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. LetBinding a -> TokenRange
letBindingRange forall a b. (a -> b) -> a -> b
$ forall a. NonEmpty a -> a
NE.last NonEmpty (LetBinding a)
bs)
  DoDiscard Expr a
a -> forall a. Expr a -> TokenRange
exprRange Expr a
a
  DoBind Binder a
a SourceToken
_ Expr a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Binder a -> TokenRange
binderRange Binder a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)

binderRange :: Binder a -> TokenRange
binderRange :: forall a. Binder a -> TokenRange
binderRange = \case
  BinderWildcard a
_ SourceToken
a -> (SourceToken
a, SourceToken
a)
  BinderVar a
_ Name Ident
a -> forall a. Name a -> TokenRange
nameRange Name Ident
a
  BinderNamed a
_ Name Ident
a SourceToken
_ Binder a
b -> (forall a. Name a -> SourceToken
nameTok Name Ident
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Binder a -> TokenRange
binderRange Binder a
b)
  BinderConstructor a
_ QualifiedName (ProperName 'ConstructorName)
a [Binder a]
bs
    | [] <- [Binder a]
bs -> forall a. QualifiedName a -> TokenRange
qualRange QualifiedName (ProperName 'ConstructorName)
a
    | Bool
otherwise -> (forall a. QualifiedName a -> SourceToken
qualTok QualifiedName (ProperName 'ConstructorName)
a, forall a b. (a, b) -> b
snd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Binder a -> TokenRange
binderRange forall a b. (a -> b) -> a -> b
$ forall a. [a] -> a
last [Binder a]
bs)
  BinderBoolean a
_ SourceToken
a Bool
_ -> (SourceToken
a, SourceToken
a)
  BinderChar a
_ SourceToken
a Char
_ -> (SourceToken
a, SourceToken
a)
  BinderString a
_ SourceToken
a PSString
_ -> (SourceToken
a, SourceToken
a)
  BinderNumber a
_ Maybe SourceToken
a SourceToken
b Either Integer Double
_
    | Just SourceToken
a' <- Maybe SourceToken
a -> (SourceToken
a', SourceToken
b)
    | Bool
otherwise -> (SourceToken
b, SourceToken
b)
  BinderArray a
_ Delimited (Binder a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Delimited (Binder a)
a
  BinderRecord a
_ Delimited (RecordLabeled (Binder a))
a -> forall a. Wrapped a -> TokenRange
wrappedRange Delimited (RecordLabeled (Binder a))
a
  BinderParens a
_ Wrapped (Binder a)
a -> forall a. Wrapped a -> TokenRange
wrappedRange Wrapped (Binder a)
a
  BinderTyped a
_ Binder a
a SourceToken
_ Type a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Binder a -> TokenRange
binderRange Binder a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Type a -> TokenRange
typeRange Type a
b)
  BinderOp a
_ Binder a
a QualifiedName (OpName 'ValueOpName)
_ Binder a
b -> (forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall a. Binder a -> TokenRange
binderRange Binder a
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Binder a -> TokenRange
binderRange Binder a
b)

recordUpdateRange :: RecordUpdate a -> TokenRange
recordUpdateRange :: forall a. RecordUpdate a -> TokenRange
recordUpdateRange = \case
  RecordUpdateLeaf Label
a SourceToken
_ Expr a
b -> (Label -> SourceToken
lblTok Label
a, forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall a. Expr a -> TokenRange
exprRange Expr a
b)
  RecordUpdateBranch Label
a (Wrapped SourceToken
_ Separated (RecordUpdate a)
_ SourceToken
b) -> (Label -> SourceToken
lblTok Label
a, SourceToken
b)