1
1
mirror of https://github.com/github/semantic.git synced 2024-12-27 00:44:57 +03:00
semantic/src/Data/AST.hs

34 lines
862 B
Haskell
Raw Normal View History

{-# LANGUAGE DataKinds #-}
module Data.AST where
import Data.Range
import Data.Record
import Data.Span
import Data.Term
2018-05-01 19:51:34 +03:00
import Data.Aeson
2018-06-04 17:59:31 +03:00
import Data.Text (pack)
2018-05-01 19:51:34 +03:00
import Data.JSON.Fields
-- | An AST node labelled with symbols and source location.
type AST syntax grammar = Term syntax (Node grammar)
data Node grammar = Node
2018-06-04 17:59:31 +03:00
{ nodeSymbol :: !grammar
, nodeByteRange :: {-# UNPACK #-} !Range
2018-06-04 17:59:31 +03:00
, nodeSpan :: {-# UNPACK #-} !Span
}
2018-06-28 20:20:44 +03:00
deriving (Eq, Ord, Show)
2018-05-01 19:51:34 +03:00
instance Show grammar => ToJSONFields (Node grammar) where
toJSONFields Node{..} =
2018-06-04 17:59:31 +03:00
[ "symbol" .= pack (show nodeSymbol)
, "span" .= nodeSpan
]
2018-05-01 19:51:34 +03:00
-- | A location specified as possibly-empty intervals of bytes and line/column positions.
type Location = '[Range, Span]
nodeLocation :: Node grammar -> Record Location
nodeLocation Node{..} = nodeByteRange :. nodeSpan :. Nil